Struts Bean 標籤庫(struts-bean.tld)是 JSP 標準標籤庫的強力補充,專注於「從多樣數據源創建 JavaBean 並暴露給頁面」。它不僅封裝了 jsp:useBean、jsp:setProperty 的基礎功能,更提供了針對 Cookie、請求頭、JSP 內置對象、動態響應等場景的專用標籤,極大簡化了視圖層的數據準備邏輯。
<bean:define>| 場景 | 示例 | 說明 |
|---|---|---|
| 字符串常量創建 Bean | <bean:define id="foo" value="This is a new String"/> |
直接將字面量封裝為 String 類型 Bean |
| 運行時表達式賦值 | <bean:define id="bar" value="<%= 'Hello, ' + user.getName() %>"/> |
支持 JSP 表達式動態構建值 |
| 指定作用域 | <bean:define id="last" scope="session" value="<%= request.getRequestURI() %>"/> |
可選 page/request/session/application |
| 複製現有 Bean 引用 | <bean:define id="foo" name="bar"/> |
可選 type 屬性聲明目標類型 |
| 從 Bean 屬性派生新 Bean | <bean:define id="foo" name="bar" property="baz" scope="request" toScope="session"/> |
支持 simple/nested/indexed 屬性路徑,如 role[3].name |
<bean:cookie><!-- 單個 Cookie -->
<bean:cookie id="foo" name="cookiename"/>
<!-- 同名多 Cookie 組裝為數組 -->
<bean:cookie id="all" name="JSESSIONID" multiple="true"/>
最佳實踐:配合 <logic:present cookie="xxx"> 預檢 Cookie 存在性,避免運行時異常。
<bean:header><bean:header id="agent" name="User-Agent"/>
<bean:header id="languages" name="Accept-Language" multiple="true"/>
<bean:include><bean:include id="text" name="/generateXml?param1=a¶m2=b"/>
發起內部子請求,將響應體(如動態生成的 XML)作為 String 類型 Bean 暴露,後續可配合 XSLT 轉換。注意:若當前請求屬於 Session,子請求會自動攜帶 Session ID。
<bean:page><bean:page id="app" property="application"/>
<bean:page id="sess" property="session"/>
可訪問 page/request/session/application/config/out 等隱式對象及其屬性。
toScope 屬性可將 Bean 從一個作用域複製到另一個(如 request → session),實現跨請求數據共享。type 屬性支持強制類型轉換,配合 Struts 類型轉換器可自動處理基礎類型與自定義對象。bean:include 會產生額外的內部請求開銷,高併發場景下建議改用 Action 轉發或緩存策略。<c:out>、<c:forEach> 等 JSTL 標籤使用,實現「Struts 準備數據,JSTL 負責渲染」的職責分離。Struts Bean 標籤庫是視圖層數據適配器的「瑞士軍刀」。掌握其六大核心標籤(define/cookie/header/include/page/parameter)及作用域控制,能讓 JSP 頁面擺脫大量 Scriptlet,保持模板整潔。在現代化改造中,可漸進式替換為 Spring MVC 的 @ModelAttribute 或 Thymeleaf 表達式,但理解其設計思想對維護歷史系統仍有重要價值。