承接第一部分的架構規劃,本文以圖書管理系統為例,深入實作中間層 BookServlet,展示 Servlet 如何處理資料庫連線、請求分派、查詢與寫入邏輯,並探討其相較 CGI 的效能與可攜性優勢。
public class BookServlet extends HttpServlet {
protected Connection dbConnection;
protected PreparedStatement readQuery, writeQuery;
protected String dbName = "jdbc:odbc:BookDatabase";
protected String bookName, bookISBN;
public void init(ServletConfig config) throws ServletException {
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
dbConnection = DriverManager.getConnection(dbName, "", "");
} catch (Exception e) {
System.out.println("Can not initialize database");
}
}
}
init() 在 Servlet 首次被喚醒時調用,此處建立 JDBC Connection 物件連接 ODBC 定義的 BookDatabase。連線物件作為實例變數保持,避免每請求重建連線開銷。
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
bookName = request.getParameter("BookName");
bookISBN = request.getParameter("BookISBN");
if (bookName == null && bookISBN == null) {
doQueryBook(request, response);
} else {
doNewBook(request, response);
}
}
根據前端表單參數決定執行查詢或新增:若無參數則顯示所有圖書,若有參數則寫入新紀錄。
public void doQueryBook(HttpServletRequest request, HttpServletResponse response) {
try {
readQuery = dbConnection.prepareStatement("SELECT * FROM BOOKTABLE");
String htmlHead = "查詢結果 ";
String htmlBody = "";
ResultSet rs = readQuery.executeQuery();
while (rs.next()) {
String name = rs.getString("BookName");
String isbn = rs.getString("ISBN");
htmlBody += name + " " + isbn + "
";
}
htmlBody += "";
PrintWriter out = new PrintWriter(response.getOutputStream());
response.setContentType("text/html");
out.println(htmlHead + htmlBody);
} catch (Exception e) { /* 錯誤處理 */ }
}
使用 PreparedStatement 執行查詢,逐筆讀取 ResultSet 並拼接 HTML 字串,最後透過 PrintWriter 輸出至瀏覽器。
String writeSql = "INSERT INTO BookTable (BookName, ISBN) Values('"
+ bookName + "','" + bookISBN + "')";
writeQuery = dbConnection.prepareStatement(writeSql);
writeQuery.executeUpdate();
構建動態 SQL 插入新紀錄,呼叫 executeUpdate() 執行。
透過上述範例可見,Servlet 技術實作中間層具備:
這使得 Servlet 成為 Java 技術棧下企業級三層 Web 架構中間層的首選方案。