JSP 動作元素 (jsp:xxx) 以 XML 語法在請求處理階段執行,不同於編譯階段生效的指令元素。提供動態包含、JavaBean 操作、轉發、外掛程式產生、XML 操作等功能。
<jsp:action_name attribute="value" />
所有動作元素支援兩個通用屬性:
id:唯一識別碼,可在 pageContext 中取得scope:生命週期範圍 — page (預設)、request、session、application<jsp:include page="relativeURL" flush="true" />
<jsp:param name="key" value="value" />flush="true":包含前先刷新緩衝區 (必要)<%@ include %> 差異:指令為編譯期靜態合併,動作為執行期動態合併<%-- header.jsp --%> <header>網站標題</header> <%-- main.jsp --%> <jsp:include page="header.jsp" flush="true" /> <jsp:include page="footer.jsp" flush="true" />
<jsp:forward page="relativeURL" />
<jsp:param>page="<%= targetPage %>"<%
if (!user.hasPermission("admin")) {
%>
<jsp:forward page="/error/403.jsp" />
<%
}
%>
<jsp:useBean id="user" class="com.example.User" scope="session" />
id 的 Beanclass 實例化 (需無參建構子)type:指定參考型別 (介面/父類別)beanName:搭配 java.beans.Beans.instantiate()<!-- 1. 設定單一屬性 --> <jsp:setProperty name="user" property="username" value="admin" /> <!-- 2. 自動對應請求參數 (名稱相同) --> <jsp:setProperty name="user" property="*" /> <!-- 3. 指定請求參數名稱不同 --> <jsp:setProperty name="user" property="email" param="userEmail" />
useBean 內部:僅在 Bean 新建立時執行useBean 外部:每次請求皆執行<jsp:getProperty name="user" property="username" />
out.print(bean.getProperty()))<%-- User.java --%>
public class User {
private String username, email;
// getter/setter...
%>
<%-- form.jsp --%>
<jsp:useBean id="user" class="com.example.User" scope="request">
<jsp:setProperty name="user" property="*" /> <%-- 僅首次建立時自動綁定 --%>
</jsp:useBean>
<form action="process.jsp" method="post">
姓名:<input name="username" value="<jsp:getProperty name='user' property='username'/>"><br>
Email:<input name="email" value="<jsp:getProperty name='user' property='email'/>"><br>
<button type="submit">送出</button>
</form>
依瀏覽器產生 <object> 或 <embed> 標籤載入 Applet。現代瀏覽器不再支援 NPAPI,不建議使用。
<jsp:element name="elementName"> <jsp:attribute name="attrName">attrValue</jsp:attribute> <jsp:body>element content</jsp:body> </jsp:element>
<jsp:element name="book">
<jsp:attribute name="isbn"><%= isbn %></jsp:attribute>
<jsp:body>
<jsp:element name="title"><jsp:body><%= title %></jsp:body></jsp:element>
<jsp:element name="author"><jsp:body><%= author %></jsp:body></jsp:element>
</jsp:element>
<jsp:text>純文字內容</jsp:text>
> 字元衝突:<jsp:text><![CDATA[ <br> ]]></jsp:text><jsp:text><![CDATA[ <!DOCTYPE html> ]]></jsp:text>| 類別 | 語法 | 執行階段 | 典型用途 |
|---|---|---|---|
| 指令 | <%@ page ... %> | 編譯期 (翻譯成 Servlet) | 頁面屬性、包含檔案、標籤庫宣告 |
| Scriptlet | <% java code %> | 請求處理期 (_jspService) | 任意 Java 邏輯 (不建議濫用) |
| 動作元素 | <jsp:include ... /> | 請求處理期 | 動態包含、Bean 操作、轉發、XML 產生 |
| EL 運算式 | ${expr} | 請求處理期 | 資料輸出、簡單運算、存取範圍屬性 |
<%@ include %> 效能較好。useBean + setProperty(property="*") 替代手動 request.getParameter()。response.sendRedirect() (PRG 模式)。