Tiles 框架透過「模板+佔位符」機制,將頁面版面與內容分離。模板頁面使用 <tiles:getAsString>(字串佔位)與 <tiles:insert>(資源佔位)標籤,使用頁面再以 <tiles:put> 注入實際值。進階用法可建立 XML 定義檔集中管理重複屬性,並支援定義繼承。
layout.jsp<%@ taglib uri="https://struts.apache.org/tags-tiles" prefix="tiles" %>
<html>
<head><title><tiles:getAsString name="title" /></title></head>
<body>
<table border="<tiles:getAsString name="border" />">
<tr><td><tiles:insert attribute="header" /></td></tr>
<tr><td><tiles:insert attribute="body" /></td></tr>
<tr><td><tiles:insert attribute="footer" /></td></tr>
</table>
</body></html>
五個佔位符:title、border(字串)、header、body、footer(資源)。
// header.jsp
這是一個頁頭
// body.jsp
這是一個頁體
// footer.jsp
這是一個頁尾
mypage.jsp<%@ taglib uri="https://struts.apache.org/tags-tiles" prefix="tiles" %>
<tiles:insert page="layout.jsp">
<tiles:put name="title" value="我的頁面" />
<tiles:put name="border" value="${param.border}" />
<tiles:put name="header" value="header.jsp" />
<tiles:put name="body" value="body.jsp" />
<tiles:put name="footer" value="footer.jsp" />
</tiles:insert>
<tiles:insert page="..."> 引入模板。<tiles:put> 依佔位符類型注入字串或資源路徑。.../mypage.jsp?border=1 與 ?border=0。<tiles:insert> 與 <jsp:include> 相同,被插入資源無法改變當前頁面編碼。即使模板頁已設定正確編碼,使用頁也必須用 page 指令重新宣告,否則中文會亂碼。
tiles-defs.xml<plug-in className="org.apache.struts.tiles.TilesPlugin">
<set-property property="definitions-config" value="/WEB-INF/tiles-defs.xml" />
</plug-in>
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE tiles-definitions PUBLIC
"-//Apache Software Foundation//DTD Tiles Configuration 1.1//EN"
"https://struts.apache.org/dtds/tiles-config_1_1.dtd">
<tiles-definitions>
<definition name="myLayout" path="/layout.jsp">
<put name="title" value="我的頁面" />
<put name="header" value="header.jsp" />
<put name="body" value="body.jsp" />
<put name="footer" value="footer.jsp" />
</definition>
</tiles-definitions>
value="/WEB-INF/A-defs.xml,/WEB-INF/B-defs.xml"。newpage.jsp<tiles:insert definition="myLayout">
<tiles:put name="border" value="${param.border}" />
</tiles:insert>
僅需覆寫會變動的屬性(border),其他沿用定義檔預設值,程式碼大幅簡化。
<definition name="myLayout.newLayout" extends="myLayout">
<put name="title" value="新的頁面" />
</definition>
extends 指定父定義,名稱慣用「父名.子名」格式(點號無特殊含義)。Tiles 模板機制有效解決版面重複問題:模板頁面定義骨架 → 定義檔集中預設屬性 → 使用頁面僅注入差異內容 → 定義繼承支援多層次復用。此模式為後續 JSF Facelets、Thymeleaf 片段佈局等現代模板引擎奠定概念基礎。