將 tiles-jsp-2.0.6.jar 內的 tiles-jsp.tld 複製至 WEB-INF/tiles-jsp.tld。
WEB-INF/tiles.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE tiles-definitions PUBLIC
"-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"
"https://tiles.apache.org/dtds/tiles-config_2_0.dtd">
<tiles-definitions>
<definition name="xixi.haha" template="/layout.jsp">
<put-attribute name="header" value="/head.jsp" />
<put-attribute name="sidebar" value="/sidebar.jsp" />
<put-attribute name="content" value="/content.jsp" />
<put-attribute name="footer" value="/foot.jsp" />
</definition>
</tiles-definitions>
<context-param>
<param-name>org.apache.tiles.CONTAINER_FACTORY</param-name>
<param-value>org.apache.struts2.tiles.StrutsTilesContainerFactory</param-value>
</context-param>
<context-param>
<param-name>org.apache.tiles.impl.BasicTilesContainer.DEFINITIONS_CONFIG</param-name>
<param-value>/WEB-INF/tiles.xml</param-value>
</context-param>
<listener>
<listener-class>org.apache.struts2.tiles.StrutsTilesListener</listener-class>
</listener>
<struts>
<package name="default" extends="tiles-default">
<action name="XXAction" class="com.XXAction">
<result name="success" type="tiles">xixi.haha</result>
</action>
</package>
</struts>
extends="tiles-default" 繼承內建 Tiles 結果類型攔截器。type="tiles" 告訴 Struts 將結果名稱視為 Tiles 定義名。layout.jsp
<%@ taglib uri="/WEB-INF/tiles-jsp.tld" prefix="tiles" %>
<table>
<tr><td><tiles:insertAttribute name="header" /></td></tr>
<tr><td><tiles:insertAttribute name="sidebar" /></td></tr>
<tr><td><tiles:insertAttribute name="content" /></td></tr>
<tr><td><tiles:insertAttribute name="footer" /></td></tr>
</table>
建立 head.jsp、sidebar.jsp、content.jsp、foot.jsp,內容自定。
index.jsp
<form action="XXAction.action" method="post">
<input type="submit" value="送出" />
</form>
| 現象 | 原因與解決 |
|---|---|
| 找不到 Tiles 定義 | 檢查 tiles.xml 路徑、definition name 拼寫、web.xml listener 是否載入 |
| JSP 標籤報錯 | 確認 tiles-jsp.tld 已放入 WEB-INF,且 layout.jsp 引用正確 URI |
| Struts 2.5+ 版本 | Tiles 整合包改為 struts2-tiles-plugin,DTD 升級至 3.0,屬性名 put-attribute 不變 |
Struts 2 + Tiles 透過「定義組合」實現頁面佈局復用:tiles.xml 定義模板與片段對應,Action 返回定義名,layout.jsp 用 <tiles:insertAttribute> 組裝。關鍵在於 JAR 版本對應、TLD 位置、web.xml 容器啟動、struts.xml 繼承 tiles-default。掌握此流程,可輕鬆構建結構清晰、易維護的企業級 Web 應用。