電子佈告欄

電子布告欄「BBS Bulletin Board System」是一種資訊系統,過去僅限於單向非即時的訊息發佈。直到現在發展出現今各種類型的資料交換功能。 BBS目前已發展為討論區、電子郵件、新聞群組、聊天室、電子商務、社群網站等,這些溝通方式都具有多對多、便利性、不受時空限制、匿名等特性。

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>

注意
若瀏覽器屏蔽掉了「DOCTYPE 」、「head」、「body」等HTML標籤
請在相對應的位置加入這些標籤。
或直接下載原始碼
原始碼
下一步 switch 流程控制

沒有留言:

張貼留言