Struts Tiles 框架以 JSP Include 為基礎,提供模板化佈局、動態頁面組裝、可復用組件定義、國際化支持四大核心能力。本文循序漸進演示:基礎 <tiles:insert> 替換 Include → 佈局模板抽取 → XML 定義組件 → TilesPlugin 載入 → Action 直接轉發組件 → 組件嵌套組合 → 定義繼承復用,並給出完整 web.xml、tiles-defs.xml、struts-config.xml 配置範例。
<tiles:insert>、<tiles:put>、<tiles:putAttribute> 等。tiles-defs.xml,定義 <definition> 名稱、模板路徑、屬性注入。<%@ taglib uri="/WEB-INF/struts-tiles.tld" prefix="tiles" %>
<tiles:insert page="sidebar.jsp" flush="true"/>
等價於 <jsp:include page="sidebar.jsp"/>,但支持 flush 屬性控制輸出緩衝。
layout.jsp 定義骨架,僅用 <tiles:insert attribute="sidebar"/> 等佔位符:
<tiles:insert attribute="sidebar"/>
<tiles:insert attribute="header"/>
<tiles:insert attribute="content"/>
<tiles:insert attribute="footer"/>
index.jsp / product.jsp 注入具體內容:
<tiles:insert page="layout.jsp" flush="true">
<tiles:put name="sidebar" value="sidebar.jsp"/>
<tiles:put name="header" value="header.jsp"/>
<tiles:put name="content" value="indexContent.jsp"/>
<tiles:put name="footer" value="footer.jsp"/>
</tiles:insert>
tiles-defs.xml:
<tiles-definitions>
<definition name="index-definition" path="/layout.jsp">
<put name="sidebar" value="sidebar.jsp"/>
<put name="header" value="header.jsp"/>
<put name="content" value="indexContent.jsp"/>
<put name="footer" value="footer.jsp"/>
</definition>
<definition name="product-definition" path="/layout.jsp">
<put name="sidebar" value="sidebar.jsp"/>
<put name="header" value="header.jsp"/>
<put name="content" value="productContent.jsp"/>
<put name="footer" value="footer.jsp"/>
</definition>
</tiles-definitions>
struts-config.xml 註冊插件:
<plug-in className="org.apache.struts.tiles.TilesPlugin">
<set-property property="definitions-config" value="/WEB-INF/tiles-defs.xml"/>
<set-property property="definitions-parser-validate" value="true"/>
</plug-in>
web.xml 配置 ActionServlet(load-on-startup 確保插件初始化):
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param><param-name>config</param-name><param-value>/WEB-INF/struts-config.xml</param-value></init-param>
<load-on-startup>3</load-on-startup>
</servlet>
頁面極簡調用:
<tiles:insert definition="index-definition"/>
無需 JSP,struts-config.xml 映射:
<action path="/index" type="org.apache.struts.actions.ForwardAction" parameter="index-definition"/>
訪問 /index.do → ForwardAction → 組件 index-definition → 渲染頁面。減少 JSP 文件,發揮 Struts 流程控制優勢。
將側邊欄提取為獨立組件 sidebar-definition,模板 sidebar-layout.jsp 內部再插入 top、bottom:
<definition name="sidebar-definition" path="/sidebar-layout.jsp">
<put name="top" value="flags.jsp"/>
<put name="bottom" value="sidebar-links.jsp"/>
</definition>
<definition name="index-definition" path="/layout.jsp">
<put name="sidebar" value="sidebar-definition" type="definition"/> <!-- 關鍵:type="definition" -->
...
</definition>
實現「積木式」復用:側邊欄結構變更只需修改 sidebar-definition,所有引用頁面自動生效。
抽取公共基礎定義 base-definition,子定義僅覆蓋差異屬性:
<definition name="base-definition" path="/layout.jsp">
<put name="sidebar" value="sidebar-definition" type="definition"/>
<put name="header" value="header.jsp"/>
<put name="content" value=""/> <!-- 預留 -->
<put name="footer" value="footer.jsp"/>
</definition>
<definition name="index-definition" extends="base-definition">
<put name="content" value="indexContent.jsp"/>
</definition>
<definition name="product-definition" extends="base-definition">
<put name="content" value="productContent.jsp"/>
</definition>
extends 避免重複聲明佈局與公共區塊,維護成本大幅降低。
struts.jar
commons-digester.jar
commons-beanutils.jar
commons-collections.jar
commons-logging.jar
並將 struts-tiles.tld 複製至 WEB-INF,在 web.xml 配置 <taglib> 引用。