锘??xml version="1.0" encoding="utf-8" standalone="yes"?> View (Template Engine)-Tiles 鍩烘湰涓? 浣犲湪鎾板啓 JSP顡嗙殑鏃跺? 濡傛灉 /WEB-INF/lib/顡嗕箣涓嬫湁鏀絹搯struts.jar顡嗛偅灝變唬琛ㄨ, 顡嗕綘鐨?JSP 鍙互顧?import struts 鐨勭粍浠惰繘鏉? 鑰?struts-tiles.tld顡嗘垜閫氬父浼氭斁鍦?/WEB-INF/tlds/顡嗙洰褰曚箣涓?顡嗘墍浠ヤ綘鍦?JSP 鐨勫紑濮嬬殑鍦版柟灝辮鍐?br /> 瀹屽叏鎴樼暐棣栭儴鏇?-寤虹珛妯℃澘 (template.jsp) 瀹屽叏鎴樼暐浜岄儴鏇?-瀹氫箟 definations.xml 瀹屽叏鎴樼暐涓夐儴鏇?-鍒朵綔 ScreenServlet.java (WARN:copyrights are reserved by Softleader Copr.) 嫻嬭瘯緗戦〉鍛堢幇 鍗曠嫭浣跨敤 Tiles 浣跨敤 <putList> 鍙?<add> 顩?鍦?view 绔?jsp 涓鍐? RssChannel 棣栧厛 鎴戜滑鍏堝畾涔?tiles-definition.xml , 鏈閲嶈鐨? 鏄?controllerUrl 闇瑕佽瀹?, 姝ゅ, 榪橀渶瑕佸緱鍒?rss 鐨勬牸寮? 鍦?strut-config.xml 涓畾涔? 鎺ョ潃寤虹珛涓涓?RssChannelsAction 鐨?Class 鏈鍚? 鍦?view 绔?jsp 榪欐牱灝卞彲浠ョ湅鍒?rssChannel 鐨勮祫鏂欏暒 Layouts鎴戝緢鍠滄 struts 錛岃繖鏄垜鐩墠鏈鐔熸倝鐨?MVC Framework 錛屼絾鏄?struts 鐨?template Engine 鍜?Turbine(jakarta 鍙﹀涓涓?mvc framework錛岃繕鏈変竴涓?tapestry )浣?鐢ㄧ殑 Velocity 鏈夊紓鏇插悓宸ヤ箣濡欙紝鍙﹀濡傛灉浣犱滑鍦?Mail List 鐪嬪埌 Craig R. McClanahan 榪欏彿浜虹墿錛?浠栧氨鏄滅鈥濈殑浠h█浜猴紒 MVCII Framework
Cotroller顡嗘槸鎸囩敱 Servlet 鎵涓誨,顡哅odel 涓?JavaBean顡嗘墍寮鍙? 鏈鍚庝互 JSP 鍋?View 绔殑鍛堢幇,顡嗘渶鍚?灝嗚祫鏂欒繑鍥炲埌瀹㈡埛绔? 鑰屼粖澶╂垜瑕佽璁虹殑灝辨槸瀹㈡埛绔殑 Template Engine -- Tiles.
Tiles顡嗘槸鐢鱉搯Cedric Dumoulin顡嗚佸ぇ鎵寮鍙戠殑 Template Engine , 浠涔堝彨鍋?Template Engine顡嗗憿, 顡嗕粬鏄竴涓増闈㈠垏鍓叉帶鍒剁殑澶勭悊涓績.閫氬父鎴戜滑鍦ㄦ棭鍙ゆ椂浠eぇ綰?( 1995 ~ 2000 )顡嗗勾闂?, 璁捐緗戦〉澶у浠?Frame 涓哄垏鍓茬綉欏電殑鏂瑰紡 , 鍥犱負褰撴椂緗戠粶甯﹀涓嶈凍, 鍔犱笂寮鍙戝伐鍏風煭緙?顡嗘墍浠ユ垜浠偅鏃跺欏浜庣増闈㈢殑鎺у埗澶?姒備篃鍙槸榪欐牱, 浣嗛殢鐫瀹藉甫緗戠粶鐨勬櫘鍙婂寲,顡嗛犲氨浜嗙綉欏電殑澶嶆潅鍔熻兘, HTML 4.0 鍖呭惈浜?Layer顡嗙殑鍔熻兘,顡嗛棶棰?鏉ヤ簡, Layer 鏃犳硶璺ㄨ繃 Frame顡嗗彉鎴愪竴涓誕鍔ㄧ殑鎺у埗灝忕獥鍙?顡嗘墍浠?Frame顡嗘笎娓愯娣樻卑,顡嗗彉鎴愭暣涓綉欏電敱 Table 鐨勫垏鍓叉潵緇勫悎鑰屾垚, 浣嗘槸, Table 鐨勮璁″ぇ澶氬睘浜庣綉欏電編宸ョ殑宸ヤ綔,顡嗕綘瑕佷粬浠噦寰楀浣曞啓鍔ㄦ佺▼搴?顡?澶ф鍙湁 1/10 鐨勭編宸ュ彲浠ュ仛鍒?顡嗘墍浠ユ垜浠緩璁槸鍚勫笀鍏惰亴,顡嗚緗戦〉瑙嗚澶у笀鐨勫伐浣滃氨鍗曠函鍙槸緗戦〉璁捐,顡?鎵浠?Template Engine顡嗗氨搴旇繍鑰岀敓,顡嗛偅姣旇緝鏈夊悕鐨勬湁, Velocity, Tiles, FreeMaker顡嗙瓑絳? 鑰?Struts顡?鏄嬌鐢?Tiles顡嗙殑,榪欐鎴戝氨閽堝 Tiles 鍋氬垵綰х殑浠嬬粛. <%@ taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles" %>
榪欐剰鎬濆氨鏄浣犺繖涓綉欏靛皢浼氶氳繃 Struts-Tiles 榪欎釜 TagLib顡嗗幓璋冪敤 Tiles Template Engine , 浣犲彲浠ヨ嚜 宸辨墦寮 struts-tiles.tld 榪欎釜鏂囦歡鐪嬬湅, 閲岄潰鐨勫畾涔夊氨鏄,顡嗗綋浣犺皟鐢ㄥ埌鍏朵腑鐨?tag顡嗘椂鍊?顡嗕粬闇瑕佸幓璋?鐢ㄥ摢涓涓▼搴忔潵鎵ц浣犳兂寰楀埌鐨勭粨鏋?
寤虹珛涓涓?template.jsp顡? 浣犲厛瑙勫垝涔﹂潰闇瑕佸垏鍓叉垚涓哄悇涓尯鍧?鏈寖渚嬫槸鍒囨垚涓婃柟鏍囬鍖?top),宸︽柟涓婚夊崟 (menu),鍙蟲柟涓葷敾闈㈠啀鍒囧壊涓婁笅鍖哄煙鍚勪負 main 鍙?copyright :
<%@ page contentType="text/html;charset=BIG5" %>
<%@ taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles" %>
<BODY leftmargin="0" marginheight="0" marginwidth="0" topmargin="0" bgcolor="#FFFFFF"
link="#660000">
<table border=\'0\' cellpadding=\'0\' cellspacing=\'0\' width=\'100%\'>
聽<!-- 涓婃柟鏍囬鍖?-->
聽<tr>
聽<td colspan=\'2\'>
聽聽<img src="<%=request.getContextPath()%>/images/top.gif" border="0">
聽</td>
聽<!-- 宸︽柟涓婚夊崟 -->
聽<tr valign=\'top\'>
聽<td width=\'120\' bgcolor=\'#FFFFFF\' align=\'center\'>
聽聽<tiles:insert attribute="menu"/>
聽</td>
聽<!-- 鍙蟲柟涓葷敾闈?-->
聽<td width=\'680\'>
聽聽<table border=\'0\' cellpadding=\'0\' cellspacing=\'0\' width=\'100%\'>
聽聽<tr>
聽聽聽<td聽聽bgcolor=\'ffffff\'>
聽聽聽<tiles:insert attribute="main"/>
聽聽聽</td>
聽聽</tr>
聽聽</table>
聽</td>
聽<tr>
聽<td colspan=\'2\'>
聽聽<tiles:insert attribute="copyright"/>
聽</td>
</table>
鏍規嵁 template.jsp 瀹氫箟鐨?InsertTag 灞炴у悕縐?( attribute )顡嗙粰浜堜竴涓?jsp/html顡嗘潵鏄劇ず
聽<definition name="test.screen" path="/admin/template.jsp">
聽聽<put name="menu" value="/menu.jsp"/>
聽聽<put name="main" value="/index.jsp"/>
聽聽<put name="copyright" value="/copyright.jsp"/>
聽</definition>
緙栬瘧浠ヤ笅涔嬬▼搴?ScreenServlet.class)鏀懼埌 /WEB-INF/classes/com/softleader/system/init/顡嗕箣涓?
顭嬵檲騫朵笖璁懼畾 web.xml顡嗗鍔犱竴涓?ScreenServlet
package com.softleader.system.init;
import java.util.StringTokenizer;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URL;
import javax.servlet.*;
import javax.servlet.ServletException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.tiles.*;
import org.apache.struts.tiles.TilesUtil;
public class ScreenServlet extends HttpServlet {
聽聽聽聽private ServletContext context;
聽聽聽聽/** Debug flag */
聽聽聽聽public static final boolean debug = true;
聽聽聽聽/** Associated definition factory */
聽聽聽聽protected DefinitionsFactory definitionFactory;
聽聽聽聽protected ComponentDefinition definition;
聽聽聽聽private TilesRequestProcessor trp;
聽聽聽聽public void init()聽聽throws ServletException {
聽聽聽聽}
聽聽聽聽public void doPost(HttpServletRequest request, HttpServletResponse response)
聽聽聽聽throws IOException, ServletException {
聽聽聽聽聽聽聽聽process(request, response);
聽聽聽聽}
聽聽聽聽public void doGet(HttpServletRequest request, HttpServletResponse聽聽response)
聽聽聽聽throws IOException, ServletException {
聽聽聽聽聽聽聽聽process(request, response);
聽聽聽聽}
聽聽聽聽public void process(HttpServletRequest request, HttpServletResponse聽聽response)
聽聽聽聽throws IOException, ServletException {
聽聽聽聽聽聽聽聽// init screen
聽聽聽聽聽聽聽聽String screenName = null;
聽聽聽聽聽聽聽聽String selectedUrl = request.getRequestURI();
聽聽聽聽聽聽聽聽// get the screen name
聽聽聽聽聽聽聽聽int lastPathSeparator = selectedUrl.lastIndexOf("/") + 1;
聽聽聽聽聽聽聽聽int lastDot = selectedUrl.lastIndexOf(".");
聽聽聽聽聽聽聽聽if (lastPathSeparator != -1 && lastDot != -1 && lastDot > lastPathSeparator) {
聽聽聽聽聽聽聽聽聽聽聽聽screenName = selectedUrl.substring(lastPathSeparator);
聽聽聽聽聽聽聽聽}
聽聽聽聽聽聽聽聽try {
聽聽聽聽聽聽聽聽聽聽聽聽// Read definition from factory, but we can create it here.
聽聽聽聽聽聽聽聽聽聽聽聽//ComponentDefinition definition = DefinitionsUtil.getDefinition( screenName,
request, this.getServletContext() );
聽聽聽聽聽聽聽聽聽聽聽聽//System.out.println("get Definition " + definition );
聽聽聽聽聽聽聽聽聽聽聽聽//DefinitionsUtil.setActionDefinition( request, definition);
聽聽聽聽聽聽聽聽聽聽聽聽//DefinitionsFactory definitionsFactory =
DefinitionsUtil.getDefinitionsFactory(getServletContext());
聽聽聽聽聽聽聽聽聽聽聽聽DefinitionsFactory definitionsFactory = TilesUtil.getDefinitionsFactory(request,
getServletContext());
聽聽聽聽聽聽聽聽聽聽聽聽String uri="";
聽聽聽聽聽聽聽聽聽聽聽聽Controller controller;
聽聽聽聽聽聽聽聽聽聽聽聽ComponentContext tileContext = null;
聽聽聽聽聽聽聽聽聽聽聽聽if( definitionsFactory != null ) {
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽// Get definition of tiles/component corresponding to uri.
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽ComponentDefinition definition
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽= definitionsFactory.getDefinition(screenName, request, getServletContext());
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽if( definition != null ){
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽// We have a definition.
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽// We use it to complete missing attribute in context.
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽// We also get uri, controller.
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽uri = definition.getPath();
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽controller = definition.getOrCreateController();
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽if( tileContext == null ) {
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽tileContext = new ComponentContext( definition.getAttributes() );
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽ComponentContext.setContext( tileContext, request);
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽}
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽else
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽tileContext.addMissing( definition.getAttributes() );
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽} // end if
聽聽聽聽聽聽聽聽聽聽聽聽} // end if
聽聽聽聽聽聽聽聽聽聽聽聽RequestDispatcher rd = getServletContext().getRequestDispatcher(uri);
聽聽聽聽聽聽聽聽聽聽聽聽rd.forward(request, response);
聽聽聽聽聽聽聽聽}聽聽catch( Exception ex ) {
聽聽聽聽聽聽聽聽}
聽聽聽聽}
}
聽聽<servlet>
聽聽聽聽<servlet-name>ScreenServlet</servlet-name>
聽聽聽聽<display-name>ScreenServlet</display-name>
聽聽聽聽<servlet-class>com.softleader.system.init.ScreenServlet</servlet-class>
聽聽聽聽<load-on-startup>3</load-on-startup>
聽聽</servlet>
褰撶劧,顡嗕綘闇瑕佽嚜宸卞緩绔嬬浉鍏沖畾涔夊湪 definations.xml 鐨?jsp顡嗘枃浠? 鎺ョ潃閲嶆柊鍚姩 tomcat, 浣犲氨鍙互鐪嬪埌 http://localhost:8080/test.screen顡嗘槸涓涓暣鍚堣搗鏉ョ殑鐢婚潰浜嗩劒顥?涓婂懆鍛婅瘔澶у浣跨敤 tile 鐨勫熀鏈柟娉?褰撶劧涔熸湁鏇村熀鏈殑, 鐩稿叧鐨勬枃浠舵湁 Manning 鍑虹殑 Struts in Action 鍜?Oreilly 鍑虹殑 Programming Jakarta Struts 閲岄潰閮芥湁璇﹀敖鐨勮В閲? 涓嶈繃浠婂ぉ瑕佷粙緇嶇殑鏃舵洿楂橀樁鐨勬妧鏈?- Tile Layout ,涔︿笂 閮芥病鏈夋彁鍒?鍛靛懙!!
鎶?tiles.jar 鏀懼埌 WEB-INF/lib/
鎶?tiles.tld 鏀懼埌 WEB-INF/
鎶?commons-digester.jar,commons-collections.jar,commons-beanutils.jar 鏀懼埌 WEB-INF/lib/ 涓?br />鎶?jakarta commons *.tld 鏀懼埌 WEB-INF/ 涓?br />
鎺ョ潃鍦?WEB-INF/web.xml 涓鍔?br />
<servlet>
聽<servlet-name>action</servlet-name>
聽<servlet-class>org.apache.struts.titles.TilesServlet</servlet-class>
聽<init-param>
聽聽<param-name>definitions-config</param-name>
聽聽<param-value>/WEB-INF/tiles/tiles-definitions.xml</param-value>
聽</init-param>
聽<init-param>
聽聽<param-name>definitions-parser-validate</param-name>
聽聽<param-value>true</param-value>
聽</init-param>
</servlet>
綆鍗曟潵璇? 涓婁竴綃囦粙緇嶇殑 tiles definitions 鐨勬柟娉曟槸涓瀵逛竴, tiles:insert 浼氬幓鎵?definitions 涓殑 put 鍊? 鎶婃寚鍚戠殑 jsp 鎶撹繘鏉? 涓璧峰寘瑁呮垚涓涓綉欏甸佸埌瀹㈡埛绔殑嫻忚鍣? 浣嗘槸, 濡傛灉鎴戝笇鏈涘湪 template 涓竴嬈?鍔犲叆澶氱瑪鐨勯〉闈㈣鎬庝箞鍋氬憿, 鍝氨寰楃敤 <putList> 鎺ョ潃浣跨敤 iterate 鎶婁粬涓涓竴涓彇鍑烘潵鏄劇ず.
<titles:insert page="/template.jsp">
聽<tiles:putList name="items">
聽聽<tiles:add value="home"/>
聽聽<tiles:add><img
src="<%=request.getContextPath()%>/images/logo.gif"></titles:add>
聽聽<tiles:add value="documentation"/>
聽</titles:putList>
</titles:insert>
<tiles:importAttribute/>
<table>
聽<logic:iterate id="item" name="items">
聽<tr><td><%=item%></td></tr>
聽</logic:iterate>
</table>
鎵璋撶殑 RssData, 鏄竴涓?webservice 鐨勬牸寮? 鐩稿叧鐨勪粙緇嶆湁
XML.com RSS 鐨勪粙緇?br />Oreilly RSS 顑劇爺絀朵腑蹇?br />RSS 鏁欏鎵嬪唽
RSS 鏈鏂版秷鎭?/font>
鍩烘湰涓婃湁鍑犱釜濂藉
<definition name="examples.rssChannel.body" path="/examples/tiles/rssChannels.jsp"
聽controllerUrl="/examples/controller/rssChannel.do">
聽<putList name="urls">
聽聽<add value="http://newsforge.com/newsforge.rss"/>
聽聽<add value="http://xmlhack.com/rss.php"/>
聽聽<add value="http://lwn.net/headlines/rss"/>
聽</putList>
</definition>
聽<action path="/examples/controller/rssChannel"
聽聽聽type="org.apache.struts.example.tiles.rssChannel.RssChannelsAction">
聽</action>
聽public final class RssChannelsAction extends TilesAction {
聽聽public static final String CHANNELS_KEY = "CHANNELS";
聽聽public static final String CHANNEL_URLS_KEY= "urls";
聽聽public ActionForward doExecute(ActionMapping mapping,
聽聽聽聽ActionForm form, HttpServletRequest request,
聽聽聽聽HttpServletResponse response)
聽聽throws IOException, ServletException, Exception {
聽聽聽org.apache.commons.digester.rss.Channel channel = null ;
聽聽聽List channels = (List)context.getAttribute(CHANNEL_URLS_KEY);
聽聽聽List channelBeans = new ArrayList(channels.size());
聽聽聽for ( int i=0 ; i < channels.size(); i++ ) {
聽聽聽聽RSSDigester digester = new RSSDigester();
聽聽聽聽String url = (String)channels.get(i);
聽聽聽聽Channel obj = (Channel) digester.parse(url);
聽聽聽聽channelBeans.add(obj);
聽聽聽}
聽聽聽context.putAttribute(CHANNELS_KEY,channelBeans);
聽聽聽return null;
聽聽}聽聽
聽}
<%@ page language="java" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
<%@ taglib uri="/WEB-INF/struts-tiles.tld" prefix="tiles" %>
<div align="center"><font size="+1"><b>
<tiles:importAttribute name="CHANNELS" scope="page"/>
<logic:iterate name="CHANNELS" id="CHANNEL" >
<TABLE border="0" cellspacing="0" cellpadding="4" width="100%" align="center" >
<TR>
<TD class="spanhd" ><logic:present name="CHANNEL" property="image">
聽聽<a href="<bean:write name="CHANNEL" property="link"/>">
聽聽聽聽<img src="<bean:write name="CHANNEL"
property="image.URL"/>"></logic:present></a>
</TD>
<TD class="spanhd" width="100%"><bean:write name="CHANNEL" property="title"/>
<a href="<bean:write name="CHANNEL" property="link"/>">[home]</a></TD>
</TR>
<TD class="yellow" colspan="2"><bean:write name="CHANNEL"
property="description"/></TD>
</TR>
<TR>
<TD class="datagrey" colspan="2">
<logic:iterate name="CHANNEL" property="items" id="ITEM">
<br><b><bean:write name="ITEM" property="title"/></b>
<br><bean:write name="ITEM" property="description"/>
<br>聽聽[ <a href="<bean:write name="ITEM"
property="link"/>">more</a> ]
<br>
</logic:iterate>
</TD>
</TR>
</TABLE>
<br>
</logic:iterate>
</b></font></div>
鐩墠 tiles-example 鏈夋彁渚涘嚑縐嶄笉鍚岀殑 layout 鍙互鍙傝?
褰撶劧, 浣犱篃鍙互寤虹珛鑷繁鐨?Layout , 鎴戜滑甯屾湜浣犺兘寤虹珛絎﹀悎 MVC 瑙傚康鐨?Layout!! Layout Name Parameters Use Class Layout 浣跨敤 <tiles:getAsString attribute="title"> 鍙栧緱鏍囬澶?
鍏朵綑浣跨敤 <tiles:insert attribute="menu"> Menu Layout 浣跨敤 <tiles:getAsString attribute="title"> 鍙栧緱鏍囬澶?
鍏朵綑浣跨敤 org.apache.struts.tiles.beans.MenuItem 顧?iterate VBox or VStack Layout 浣跨敤 <tiles:useAttribute classname="java.util.List" name="list" id="list"> Multi-columns Layout 浣跨敤 <tiles:useAttribute classname="java.util.String" name="numCols" id="numColsStr"> 鎺ョ潃浣跨敤 <tiles:insert> 鍜?<tiles:put> 灝嗚祫鏂欐斁榪涙潵 Center Layout 浣跨敤 <tiles:insert> 鍜?<tiles:put> 灝嗚祫鏂欐斁榪涙潵 Tabs Layout 榪欎釜鍑犱箮浠ヤ笂鐢ㄥ埌鐨勮蹇甸兘浼氱敤鍒?/td>
浜岋細Tiles閰嶇疆鍜屽熀鏈厤緗枃浠朵粙緇?br />Tiles鏈変竴涓厤緗枃浠?tiles-defs.xml
tiles-defs.xml瀹氫箟浜嗘瘡涓涓〉闈㈢殑緇勬垚鍏冪礌鍜屽艦寮忋?br />涓嬮潰鎴戝皢璇存槑濡備笅鎵紺虹殑涓涓猼iles-defs.xml鏂囦歡
tiles-defs.xml
-----------------------------------------------
<tiles-definitions>
<!--瀹氫箟/layouts/classicLayout.jsp鐨勭粍鎴愬悕縐頒負site.mainLayout-->
<!--鍚庨潰灝嗛檮/layouts/classicLayout.jsp鐨勫唴瀹?->
<definition name="site.mainLayout" path="/layouts/classicLayout.jsp">
<put name="title" value="Tiles Blank Site" />
<put name="header" value="/tiles/common/header.jsp" />
<put name="menu" value="site.menu.bar" />
<!--menu鐨勭粍鎴愪負site.menu.bar瀵瑰簲鐨勯〉闈?->
<put name="footer" value="/tiles/common/footer.jsp" />
<put name="body" value="/tiles/body.jsp" />
</definition>
<!--瀹氫箟site.index.page錛岀戶鎵縮ite.mainLayout-->
<definition name="site.index.page" extends="site.mainLayout" >
<put name="title" value="Tiles Blank Site Index" />
<put name="body" value="/tiles/body.jsp" />
<!--浠ヤ笂涓や釜鍏冪礌灝嗘浛鎹ite.mainLayout涓殑鍏冪礌-->
</definition>
<definition name="site.menu.bar" path="/layouts/vboxLayout.jsp" >
<putList name="list" >
<add value="site.menu.links" />
<add value="site.menu.documentation" />
</putList>
</definition>
</tiles-definitions>
闄勶細/layouts/classicLayout.jsp
--------------------------------
<html>
<head>
<title><tiles:getAsString name="title"/>
</title>
</head>
<body bgcolor="#ffffff" text="#000000" link="#023264" alink="#023264" vlink="#023264">
<table border="0" width="100%" cellspacing="5">
<tr>
<td colspan="2"><tiles:insert attribute="header" /></td>
</tr>
<tr>
<td width="140" valign="top">
<tiles:insert attribute='menu'/>
</td>
<td valign="top" align="left">
<tiles:insert attribute='body' />
</td>
</tr>
<tr>
<td colspan="2">
<tiles:insert attribute="footer" />
</td>
</tr>
</table>
</body>
</html>
鍦╳eb.xml閲岄潰閰嶇疆tiles,閰嶇疆瀹屽悗瀵瑰簲struts action servlet鐨勯厤緗涓?
web.xml
-----------------
<!-- Action Servlet Configuration -->
<servlet>
<servlet-name>action</servlet-name>
<!-- Specify servlet class to use:
- Struts1.0.x: ActionComponentServlet
- Struts1.1: ActionServlet
- no Struts: TilesServlet
-->
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<!-- Tiles Servlet parameter
Specify configuration file names. There can be several comma
separated file names
-->
<init-param>
<param-name>definitions-config</param-name>
<param-value>/WEB-INF/tiles-defs.xml</param-value>
</init-param>
<!-- Tiles Servlet parameter
Specify Tiles debug level.
O : no debug information
1 : debug information
2 : more debug information
-->
<init-param>
<param-name>definitions-debug</param-name>
<param-value>1</param-value>
</init-param>
<!-- Tiles Servlet parameter
Specify Digester debug level. This value is passed to Digester
O : no debug information
1 : debug information
2 : more debug information
-->
<init-param>
<param-name>definitions-parser-details</param-name>
<param-value>0</param-value>
</init-param>
<!-- Tiles Servlet parameter
Specify if xml parser should validate the Tiles configuration file.
true : validate. DTD should be specified in file header.
false : no validation
-->
<init-param>
<param-name>definitions-parser-validate</param-name>
<param-value>true</param-value>
</init-param>
<!-- Struts configuration, if Struts is used -->
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>validate</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>2</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>2</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
涓夛細浣跨敤Tiles
濡傛灉宸茬粡閰嶇疆濂絫iels-defs.xml錛屾帴涓嬫潵灝卞彲浠ュ湪jsp鏂囦歡涓嬌鐢ㄨ繖浜涘畾涔変簡銆?br />鏈夊涓嬬殑鏂瑰紡浣跨敤tiles
3.1:
<tiles:insert definition="site.mainLayout" flush="true" />
鎻掑叆site.mainLayout鏍囪鐨勪竴欏?/p>
3.2錛?br /><tiles:insert template="/tutorial/basic/myFramesetLayout.jsp" >
<tiles:put name="title" content="My first frameset page" direct="true" />
<tiles:put name="header" content="/tutorial/common/header.jsp" direct="true"/>
<tiles:put name="footer" content="/tutorial/common/footer.jsp" direct="true"/>
<tiles:put name="menu" content="/tutorial/basic/menu.jsp" direct="true"/>
<tiles:put name="body" content="/tutorial/basic/helloBody.jsp" direct="true"/>
</tiles:insert>
/tutorial/basic/myFramesetLayout.jsp
---------------------------------
<html>
<head>
<title><tiles:get name="title"/></title>
</head>
<frameset rows="73, *, 73">
<frame src="<%=request.getContextPath()%><tiles:get name="header" />" name="header" >
<frame src="<%=request.getContextPath()%><tiles:get name="body" />" name="body" >
<frame src="<%=request.getContextPath()%><tiles:get name="footer" />" name="footer" >
</frameset>
</html>
鎻掑叆/tutorial/basic/myFramesetLayout.jsp
騫舵妸title鐨勫艱瀹氫負:My first frameset page
header璁懼畾涓?tutorial/common/header.jsp
鍥涳細鍚庤
Tiles鐨勪嬌鐢ㄥ湪浠栫殑鏂囨。閲岄潰鍐欑殑姣旇緝璇︾粏銆備互涓婃槸涓浜涚畝鍗曞拰鍩烘湰鐨勪嬌鐢ㄣ傚叿浣撶殑鏂囨。鍙互鐪婼truts閲岄潰鐨勪竴涓猼iles-documentation.war鐨勫寘銆備絾鍗充嬌鏄繖涓寘涔熶笉鏄緢鍏ㄣ傚彲浠ラ氳繃涓婄殑鐨勮繛鎺ュ埌浣滆呯殑涓婚〉涓婂幓鎵俱備釜浜鴻寰椾嬌鐢═iles鍦ㄥ仛浼佷笟榪愮敤鐨勬椂鍊欏彲鑳戒笉濡傚湪鍋氱綉绔欓偅鏍鋒洿鑳戒綋鐜頒紭瓚婃с備絾鍦ㄧ郴緇熷紑濮嬭璁$殑鏃跺欒冭檻騫惰鍒掑ソ鏁翠釜UI錛岄偅鍦ㄤ慨鏀瑰拰緇存姢鐨勬椂鍊欏皢鑺傜渷涓嶅皯鐨勫伐浣滈噺錛屽洜涓洪氬父UI鐨勭‘瀹氬湪浠g爜緙栧啓緇撴潫鍜屽畬鎴愶紝鎵鏈夊敖鍙兘鐨勪嬌鐢ㄥ涓瓙欏甸潰鏋勬垚涓涓〉闈紝鍚庨潰鐨勭編鍖栧拰緇存姢灝辨瘮鐩存帴緇存姢涓涓緢澶х殑欏甸潰瀹規槗