ASP 開發者習慣於腳本式、進程內組件模型,而 J2EE 強調容器管理的多層架構。本文對應 ASP 模式,系統講解 Servlet、JSP、JDBC、狀態管理等核心技術。
service() → doGet/doPost()。/contextRoot/ServletName。HttpServletRequest:封裝請求參數、Header、Session 等。HttpServletResponse:控制回應碼、輸出流、Cookie、重導向。JSP 首次訪問編譯為 Servlet,後續直接執行。支援指令(`<%@ %>`)、宣告(`<%! %>`)、Scriptlet(`<% %>`)、表達式(`<%= %>`)。
| 變量 | 類型 | 用途 |
|---|---|---|
| request | HttpServletRequest | 請求參數與屬性 |
| response | HttpServletResponse | 回應控制 |
| out | PrintWriter | 輸出內容 |
| session | HttpSession | 會話屬性 |
| application | ServletContext | 應用層共享數據 |
| pageContext | PageContext | 頁面層級數據 |
同 ASP 混合 HTML/VBScript,僅供教學,生產環境禁止。
LoginServlet 處理 POST、驗證、重導向。login.jsp 僅含表單 HTML,action 指向 Servlet。缺點:驗證邏輯仍耦合在 Servlet,多頁復用需複製代碼。
// 獨立業務類
package com.ibm.businessobjects;
public class UserValidation {
public boolean validate(String username, String password) { ... }
}
// Servlet 僅作薄控制器
UserValidation validator = new UserValidation();
if (validator.validate(userName, password)) { ... }
優勢:邏輯可單測、可替換實現(JDBC/EJB/Web Service/JMS/JCA)、支援非 Web 環境復用。
Class.forName("driverClass") 載入驅動DriverManager.getConnection(url, user, pwd) 獲取連線Statement/PreparedStatement 執行 SQLResultSet 遍歷結果conn.close() 釋放資源應用伺服器配置 DataSource,經 JNDI 查找:
DataSource ds = (DataSource) new InitialContext().lookup("jdbc/MyDS");
Connection conn = ds.getConnection(); // 借用
// ... 操作
conn.close(); // 歸還池中
優點:效能、可管理性、洩漏回收、支援分散式事務(搭配 EJB/JTA)。
原則:數據存活越短越好。Servlet 需手動 req.getSession(),JSP 自動提供 session 隱含物件。
<%
session.setAttribute("user", userObj); // 會話層
application.setAttribute("config", cfg); // 應用層
request.setAttribute("msg", "歡迎"); // 請求層
pageContext.setAttribute("tmp", val); // 頁面層
%>
HttpSession session = req.getSession(true);
ServletContext app = getServletContext();
session.setAttribute("key", val);
app.setAttribute("key", val);
req.setAttribute("key", val);
| 方式 | 機制 | 數據共享 | URL 變化 |
|---|---|---|---|
sendRedirect | 客戶端 302 重導向 | 需 Session/Application | 改變 |
forward | 伺服器端轉發 | 共享 Request | 不變 |
include | 包含輸出 | 共享 Request | 不變 |
<jsp:forward page="target.jsp"/>
<jsp:include page="fragment.jsp" flush="true"/>
// 建立持久 Cookie
Cookie ck = new Cookie("pref", "darkMode");
ck.setMaxAge(60*60*24*30); // 30 天
response.addCookie(ck);
// 讀取
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie c : cookies) { ... }
}
掌握 Servlet/JSP 協作、MVC 分層、JDBC 連線池、作用域選擇與導航機制,ASP 開發者即可平滑過渡到 J2EE 企業級開發。後續建議深入 EJB、JMS、JTA、JCA 等企業級規格,構建高可用、可擴展的分散式系統。