JSP(JavaServer Pages)頁面本質上是HTML標籤與JSP元素的混合體。JSP容器在翻譯階段會將這些元素轉換為Servlet的Java代碼。掌握三大核心元素——註釋、指令、動作,是編寫高效、可維護JSP頁面的關鍵。
語法:<%-- 註釋內容 --%>
<!-- --> 會輸出至瀏覽器原始碼,不可用於隱藏伺服器邏輯。指令元素為JSP容器提供頁面處理的全域資訊,語法:<%@ 指令名 屬性="值" %>。
定義頁面屬性,如編碼、錯誤處理、Session啟用等。
<%@ page
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
errorPage="error.jsp"
isErrorPage="false"
session="true"
import="java.util.*, java.sql.*"
buffer="8kb"
autoFlush="true"
%>
| 屬性 | 說明 | 預設值 |
|---|---|---|
| contentType | 響應MIME類型及字符集 | text/html; charset=ISO-8859-1 |
| pageEncoding | JSP源文件編碼 | ISO-8859-1 |
| import | 導入Java包/類,可多次使用或逗號分隔 | 無 |
| session | 是否啟用HttpSession | true |
| buffer | 輸出緩衝區大小,none表示無緩衝 | 8kb |
| autoFlush | 緩衝區滿時是否自動刷新 | true |
| errorPage | 發生異常時轉向的錯誤頁面 | 無 |
| isErrorPage | 當前頁是否為錯誤處理頁(可用exception隱含對象) | false |
語法:<%@ include file="相對路徑" %>
引入自定義標籤庫(如JSTL),賦予語義化標籤能力。
<%@ taglib prefix="c" uri="https://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="https://java.sun.com/jsp/jstl/fmt" %>
uri:唯一標識標籤庫描述符(TLD)位置。prefix:自定義前綴,使用時格式為 <prefix:tagName>。JSTL 核心標籤示例:
<c:if test="${user.loggedIn}">
歡迎,<c:out value="${user.name}" />!
</c:if>
<c:forEach var="item" items="${productList}">
<li><c:out value="${item.name}" /> - $<c:out value="${item.price}" /></li>
</c:forEach>
動作元素在請求處理階段執行,語法符合XML規範:<jsp:actionName ... />。
| 動作 | 功能 | 關鍵屬性 |
|---|---|---|
<jsp:useBean> | 尋找或實例化Bean,放入指定作用域 | id, scope(page/request/session/application), class, type |
<jsp:setProperty> | 設定Bean屬性值 | name, property("*"表單自動映射), param, value |
<jsp:getProperty> | 讀取Bean屬性並輸出至響應 | name, property |
<!-- 實例化 UserBean 放入 Session -->
<jsp:useBean id="user" class="com.model.UserBean" scope="session" />
<!-- 自動映射表單參數到 Bean 屬性 -->
<jsp:setProperty name="user" property="*" />
<!-- 輸出屬性 -->
用戶名:<jsp:getProperty name="user" property="username" />
<jsp:include page="..." flush="true" />:動態包含。請求階段執行目標頁面,將響應合併。目標頁面可獨立編譯,支援參數傳遞 (<jsp:param>),適合動態內容區塊。<jsp:forward page="..." />:請求轉發。將請求轉交給其他資源(Servlet/JSP),瀏覽器URL不變,請求對象共享。<jsp:param name="..." value="..." />:輔助標籤,用於 include 或 forward 時附加請求參數。<jsp:include page="sidebar.jsp" flush="true">
<jsp:param name="category" value="tech" />
<jsp:param name="userId" value="${param.id}" />
</jsp:include>
| 特性 | <%@ include %> (靜態) | <jsp:include /> (動態) |
|---|---|---|
| 處理階段 | 翻譯/編譯階段 | 請求處理階段 |
| 產出 | 單一 Servlet 類 | 多個 Servlet 類,運行時合併響應 |
| 性能 | 略優(無運行時開銷) | 略低(運行時分派) |
| 靈活度 | 低(靜態文件) | 高(動態頁面、可傳參、條件判斷) |
| 變更生效 | 需重新編譯主頁 | 子頁修改即時生效 |
<% ... %>),實現邏輯與視圖分離。page (默認) < request < session < application,按需最小化作用域。jsp:include,佈局模板用 include 指令 或 Tiles/SiteMesh 等框架。