BBS的型態雖然已進化成為網路論壇或網路社群等多元樣貌,但是telnet方式的BBS系統仍然盛行。能以單色或彩色之純文字畫面並由數據機撥接方式的BBS仍然存在,,甚至還有一些特殊的商業站台提供收費加值服務。
前置準備工作
第1行將文件宣告為JSP,內容為網頁格式。2、3行分別導入原廠的「java.sql」以及第三方提供的「org.sqlite」。<%@ 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)。request.setCharacterEncoding("UTF-8");//將輸入編碼設定為UTF-8 response.setCharacterEncoding("UTF-8");//將輸出編碼設定為UTF-8
主要的JSP程式碼
因為JSP為直譯式的語法,變數的處理有先後之分。因此,下列的程式碼必須接在「套件引用」的後面「body」內容的前面。<% 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」內。<%while(rs.next()){%> 標題: <%=rs.getString("title")%>
內容: <%=rs.getString("content")%>
<%}%>
透過表單傳遞參數 - POST
POST 是將表單資料放在 message-body 進行傳送,在網址列不顯示資料內容。而且還可以透過 multi-part 的方式,將檔案一併進行傳送。下列程式碼要放在「body」內,可放在資料列表的前面或後面都可以。關閉資料連線
若沒有正確的結束連線,很快就造成系統遲緩直到沒有回應。在網站流量少時可能因為JAVA本身的逾時機制釋放出一些連線,有可能只是回應慢而已。當同時併發多個沒有正確關閉旳連線時,就會造成系統停止回應。<% rs.close(); stat.close(); %>
正確的連線或保持連線,都是提升系統運行的有效方法。
或是花大錢砸機器和頻寬也行
完整的程式碼
50行文字能做什麼?一則笑話?一篇遊記?一張單色向量圖?
或是一個BBS?
<%@ 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>
沒有留言:
張貼留言