BBS的型態雖然已進化成為網路論壇或網路社群等多元樣貌,但是telnet方式的BBS系統仍然盛行。能以單色或彩色之純文字畫面並由數據機撥接方式的BBS仍然存在,,甚至還有一些特殊的商業站台提供收費加值服務。
前置準備工作
第1行將文件宣告為JSP,內容為網頁格式。2、3行分別導入原廠的「java.sql」以及第三方提供的「org.sqlite」。1 2 3 | <%@ page language= "java" contentType= "text/html; charset=UTF-8" pageEncoding= "UTF-8" %> <%@ page import = "java.sql.*" %> <%@ page import = "org.sqlite.*" %> |
編碼設定
跨平台的Java與Tomcat伺服器必須適應不同作業系統及語系中執行,因此有的時候輸入與輸出採用不同的編碼。 接收中文請求參數並在回應時於瀏覽器正確顯示中文,必須同時設定 HttpServletRequest 的 setCharacterEncoding() 以及 HttpServletResponse 的 setCharacterEncoding() 或 setContentType() 為正確的編碼(UTF-8)。1 2 | request.setCharacterEncoding( "UTF-8" ); //將輸入編碼設定為UTF-8 response.setCharacterEncoding( "UTF-8" ); //將輸出編碼設定為UTF-8 |
主要的JSP程式碼
因為JSP為直譯式的語法,變數的處理有先後之分。因此,下列的程式碼必須接在「套件引用」的後面「body」內容的前面。1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <% request.setCharacterEncoding( "UTF-8" ); //將輸入編碼設定為UTF-8 response.setCharacterEncoding( "UTF-8" ); //將輸出編碼設定為UTF-8 //資料庫連線字串 SQLiteConfig cfg = new SQLiteConfig(); SQLiteDataSource ds = new SQLiteDataSource(cfg); ds.setUrl( "jdbc:sqlite:F:\\JooP\\my.db(請改為實際的路徑)" ); String sql; //重複使用的SQL查詢變數 Statement stat; //資料庫發送指令變數 stat = ds.getConnection().createStatement(); try { //建立資料表以try,catch的方式,因CREATE TABLE IF NOT EXISTS在不同資料庫中有錯誤的風險 stat.executeUpdate( "CREATE TABLE bbs (Oid INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, title TEXT, content TEXT);" ); } catch (Exception e) {} //判斷有接收到表單中含有title則做資料庫新增資料 if (request.getParameter( "title" ) != null ) { if (!request.getParameter( "title" ).equals( "" )) { stat.executeUpdate( "INSERT INTO bbs(title, content)VALUES('" + request.getParameter( "title" )+ "', '" + request.getParameter( "content" ) + "')" ); } } sql = "SELECT * FROM bbs" ; //建立查詢字串 ResultSet rs = stat.executeQuery(sql); //將查詢結果放入容器 %> |
短短十多行程式,卻包含了三個階段的動作。
1.建立資料表雖然不屬於正常做法,但可視為預處理「init」。
2.讀取表單資料,寫入資料庫為表單處理。 3.載入資料庫資料。
顯示資料
網頁中以「%」前後包夾的文字都屬於伺服器執行的程式碼。為了顯示查詢結果,下列程式碼要放在「body」內。1 2 3 4 5 6 7 | <% while (rs.next()){%> 標題: <%=rs.getString( "title" )%> 內容: <%=rs.getString( "content" )%> <hr> <%}%> |
透過表單傳遞參數 - POST
POST 是將表單資料放在 message-body 進行傳送,在網址列不顯示資料內容。而且還可以透過 multi-part 的方式,將檔案一併進行傳送。下列程式碼要放在「body」內,可放在資料列表的前面或後面都可以。1 2 3 4 5 6 7 | <form action= "bbs.jsp" method= "POST" > 標題: <input type= "text" name= "title" > 內容: <input type= "text" name= "content" > <input type= "submit" value= "確定發佈" > </form> |
關閉資料連線
若沒有正確的結束連線,很快就造成系統遲緩直到沒有回應。在網站流量少時可能因為JAVA本身的逾時機制釋放出一些連線,有可能只是回應慢而已。當同時併發多個沒有正確關閉旳連線時,就會造成系統停止回應。1 2 3 | <% rs.close(); stat.close(); %> |
正確的連線或保持連線,都是提升系統運行的有效方法。
或是花大錢砸機器和頻寬也行
完整的程式碼
50行文字能做什麼?一則笑話?一篇遊記?一張單色向量圖?
或是一個BBS?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.sql.*"%> <%@ page import="org.sqlite.*"%> <% request.setCharacterEncoding("UTF-8");//將輸入編碼設定為UTF-8 response.setCharacterEncoding("UTF-8");//將輸出編碼設定為UTF-8 //資料庫連線字串 SQLiteConfig cfg = new SQLiteConfig(); SQLiteDataSource ds = new SQLiteDataSource(cfg); ds.setUrl("jdbc:sqlite:E:\\JooP\\my.db");//請改為實際的路徑 String sql;//重複使用的SQL查詢變數 Statement stat;//資料庫發送指令變數 stat = ds.getConnection().createStatement(); try {//建立資料表以try,catch的方式,因CREATE TABLE IF NOT EXISTS在不同資料庫中有錯誤的風險 stat.executeUpdate("CREATE TABLE bbs (Oid INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, title TEXT, content TEXT);"); } catch (Exception e) { } //判斷有接收到表單中含有title則做資料庫新增資料 if (request.getParameter("title") != null) { if (!request.getParameter("title").equals("")) { stat.executeUpdate("INSERT INTO bbs(title, content)VALUES('"+ request.getParameter("title")+ "', '"+ request.getParameter("content") + "')"); } } sql = "SELECT * FROM bbs";//建立查詢字串 ResultSet rs = stat.executeQuery(sql);//將查詢結果放入容器 %> <!--DOCTYPE html--> < html > < head > < meta http-equiv = "Content-Type" content = "text/html; charset=UTF-8" > < title >BBS</ title > </ head > < body > <%while (rs.next()) {%> 標題:<%=rs.getString("title")%>內容:<%=rs.getString("content")%>< hr > <%}%> < form action = "ch03.jsp" method = "POST" > < p >標題: < input type = "text" name = "title" > </ p > < p >內容: < textarea name = "content" ></ textarea ></ p > < input type = "submit" value = "確定發佈" > </ form > </ body > <% rs.close(); stat.close(); %> </ html > |
沒有留言:
張貼留言