首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Struts Tiles 框架深度指南:從佈局模板到組件組合與繼承的完整實踐

     編輯:Java 相關知識

Struts Tiles 框架以 JSP Include 為基礎,提供模板化佈局、動態頁面組裝、可復用組件定義、國際化支持四大核心能力。本文循序漸進演示:基礎 <tiles:insert> 替換 Include → 佈局模板抽取 → XML 定義組件 → TilesPlugin 載入 → Action 直接轉發組件 → 組件嵌套組合 → 定義繼承復用,並給出完整 web.xml、tiles-defs.xml、struts-config.xml 配置範例。

核心組件

  • Tiles 標簽庫:<tiles:insert>、<tiles:put>、<tiles:putAttribute> 等。
  • 組件配置文件:tiles-defs.xml,定義 <definition> 名稱、模板路徑、屬性注入。
  • TilesPlugin:Struts 插件,啟動時解析配置文件,註冊組件定義。

階段一:直接插入頁面片段

<%@ 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>

階段三:XML 組件定義 + TilesPlugin

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"/>

階段四:Action 直接轉發組件

無需 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 避免重複聲明佈局與公共區塊,維護成本大幅降低。

依賴 JAR 清單(放入 WEB-INF/lib)

struts.jar
commons-digester.jar
commons-beanutils.jar
commons-collections.jar
commons-logging.jar

並將 struts-tiles.tld 複製至 WEB-INF,在 web.xml 配置 <taglib> 引用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved