JSP(Jakarta Server Pages)是 Servlet 技術的延伸,允許在 HTML 中嵌入 Java 程式碼。掌握核心語法元素與生命週期,是開發動態網頁的基石。
JSP 頁面由以下六大元素組成:
page、include、taglib)<%= ... %> 輸出值<% ... %> 執行 Java 陳述式<%! ... %> 宣告成員變數/方法通常置於頁面頂端,同一頁可有多個。常用屬性:
| 屬性 | 說明 | 範例 |
|---|---|---|
| language | 腳本語言(預設 java) | language="java" |
| contentType | 回應 MIME 型別與編碼 | contentType="text/html;charset=UTF-8" |
| pageEncoding | JSP 檔案本身編碼 | pageEncoding="UTF-8" |
| import | 匯入 Java 套件/類別 | import="java.util.*,java.sql.*" |
| session | 是否啟用 session 物件 | session="true" |
| errorPage | 例外導向錯誤頁 | errorPage="/error.jsp" |
| isErrorPage | 宣告此頁為錯誤處理頁 | isErrorPage="true" |
| autoFlush | 緩衝區滿時自動刷新 | autoFlush="true" |
| buffer | 緩衝區大小 | buffer="8kb" |
<%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" import="java.util.*" %>
靜態包含:編譯階段將目標檔案內容合併進當前 JSP,會解析目標檔中的 JSP 語法。
<%@ include file="/common/header.jsp" %>
與 <jsp:include> 動態包含(請求階段合併輸出)不同。
引入標籤庫(如 JSTL),定義標籤前綴。
<%@ taglib prefix="c" uri="https://java.sun.com/jsp/jstl/core" %>
| 類型 | 語法 | 客戶端可見性 | 用途 |
|---|---|---|---|
| HTML 註解 | <-- 內容 --> | ✅ 可見(檢視原始碼) | 前端說明、暫時隱藏區塊 |
| JSP 註解 | <%-- 內容 --%> | ❌ 不可見(編譯移除) | 伺服器端邏輯說明、隱藏敏感資訊 |
| 腳本註解 | // 單行 / /* 多行 */ | ❌ 不可見 | Java 程式碼內部註解 |
在頁面中執行 Java 陳述式,可包含多行,每行以分號結尾。
<%
String name = request.getParameter("name");
out.println("Hello, " + name);
%>
注意:腳本內變數為區域變數,轉譯為 Servlet 的 _jspService() 方法內部變數,執行緒不安全。
宣告類別層級成員(欄位、方法、內部類別),不輸出內容。轉譯為 Servlet 類別的成員。
<%!
private int counter = 0;
public int getCounter() { return ++counter; }
%>
警告:聲明的成員為 Servlet 實例變數,多執行緒共享,非執行緒安全,避免用於可變狀態。
輸出值到回應流,不以分號結尾,內容會被轉為 out.print(...)。
目前時間:<%= new java.util.Date() %>
用戶名:<%= request.getParameter("username") %>
JSP 實際上會被容器翻譯為 Servlet,生命週期與 Servlet 一致,分四階段:
.class。jspInit()。jspInit() 執行一次性初始化(如資料庫連線池、載入配置)。_jspService(request, response)。jspDestroy()。jspDestroy() 釋放資源(關閉連線、檔案、執行緒池)。errorPage 與 isErrorPage,集中處理例外。buffer、關閉 autoFlush 提升效能。