JavaServer Pages (JSP) 是基於 Java 的跨平台 Web 開發技術,語法類 HTML,邏輯用 Java 片段。優勢:
注意:JSP ≠ 伺服端 JavaScript (LiveWire 等舊技術)。
javac 編譯器。設定 JAVA_HOME 指向安裝目錄,PATH 加入 %JAVA_HOME%\bin。bin/startup.sh|bat),預設埠 8080。https://localhost:8080/examples/jsp/ 執行內建範例。JAVA_HOME 未設或設錯,用 set (Windows) / env (Linux) 檢查。<html>
<head><title>First JSP</title></head>
<body>
<h3>Today is: <%= new java.util.Date() %></h3>
</body>
</html>
存為 sample.jsp 放入 Web 應用根目錄(Tomcat 預設 webapps/ROOT/),瀏覽 https://localhost:8080/sample.jsp。首次訪問會觸發編譯,隨後顯示當前時間。
| 元素 | 語法 | 用途 | 範例 |
|---|---|---|---|
| 指令 | <%@ directive %> |
指示容器如何處理頁面(匯入、錯誤頁、Session 等) | <%@ page import="java.util.Date" %><%@ page errorPage="err.jsp" %><%@ include file="footer.jsp" %> |
| 宣告 | <%! declaration %> |
定義類層級變數、方法(對應 Servlet 成員) | <%! int counter = 0; %><%! void inc() { counter++; } %> |
| 表達式 | <%= expression %> |
計算結果直接輸出至響應(無分號) | <%= "Hello" %><%= counter %> |
| 腳本片段 | <% code fragment %> |
任意 Java 陳述式,可夾雜 HTML | <% for(int i=1;i<=4;i++) { %> |
| 註解 | <%-- comment --%> |
伺服器端註解,**不輸出至客戶端** | <%-- 這行不會出現在 HTML 原始碼 --%> |
JavaBean 是可重用元件,具備屬性存取器。JSP 提供標籤簡化操作:
<jsp:useBean id="user" class="com.example.User" scope="session" />
id:頁面內引用名稱class:完整類名scope:page(預設) / request / session / application。容器依作用域管理實例生命週期,首次使用才實例化。<jsp:getProperty name="user" property="name" />
<!-- 自動對應同名請求參數 -->
<jsp:setProperty name="user" property="*" />
<!-- 指定參數名 -->
<jsp:setProperty name="user" property="email" param="emailAddr" />
<!-- 直接指定值 -->
<jsp:setProperty name="user" property="role" value="admin" />
<jsp:setProperty name="user" property="score" value="<%= 100 %>" />
Tomcat: WEB-INF/classes/ (類別檔) 或 WEB-INF/lib/ (JAR)。JSWDK: 安裝目錄下的 classes/。
| 物件 | 類型 | 用途 |
|---|---|---|
| request | HttpServletRequest | 客戶端請求參數、Header、屬性 |
| response | HttpServletResponse | 控制響應:Header、Cookie、重定向 |
| session | HttpSession | 用戶會話狀態(購物車、登入態) |
| application | ServletContext | 全應用共享資源(配置、快取、計數器) |
| out | JspWriter | 輸出流,out.println() 等同表達式 |
| config | ServletConfig | Servlet 初始化參數 |
| pageContext | PageContext | 頁面層級屬性管理、轉發、包含 |
| page | Object | 當前 Servlet 實例 (this) |
| exception | Throwable | 錯誤頁面 (isErrorPage="true") 可用 |
<% out.println("Direct write via out"); %>
<% String name = request.getParameter("name"); %>
<% session.setAttribute("loginUser", userObj); %>
<c:forEach>、${user.name} 取代腳本片段,更安全、可維護。lib/servlet-api.jar 加入 CLASSPATH,並複製至 JRE lib/ext/ 或使用 -cp 參數。