??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我通常?x)放?/WEB-INF/tlds/目录之?所以你?JSP 的开始的地方p?br /> 完全战略首部?-建立模板 (template.jsp) 完全战略二部?-定义 definations.xml 完全战略三部?-制作 ScreenServlet.java (WARN:copyrights are reserved by Softleader Copr.) 试|页呈现 单独使用 Tiles 使用 <putList> ?<add> ??view ?jsp 中要? RssChannel 首先 我们先定?tiles-definition.xml , 最重要? ?controllerUrl 需要设?, 此外, q需要得?rss 的格? ?strut-config.xml 中定? 接着建立一?RssChannelsAction ?Class 最? ?view ?jsp q样可以看?rssChannel 的资料啦 Layouts我很喜欢 struts Q这是我目前最熟?zhn)?MVC Framework Q但?struts ?template Engine ?Turbine(jakarta 另外一?mvc frameworkQ还有一?tapestry )?用的 Velocity 有异曲同工之妙,另外如果你们?Mail List 看到 Craig R. McClanahan q号人物Q?他就是“神”的代言人! MVCII Framework
Cotroller是指由 Servlet 所d,Model ?JavaBean所开? 最后以 JSP ?View 端的呈现,最?资料返回到客户? 而今天我要讨论的是客户端的 Template Engine -- Tiles.
Tiles是MCedric Dumoulin老大所开发的 Template Engine , 什么叫?Template Engine呢, 他是一个版面切割控制的处理中心(j).通常我们在早古时代大U?( 1995 ~ 2000 )年?, 设计|页大多?Frame 为切割网늚方式 , 因ؓ(f)当时|络带宽不, 加上开发工L(fng)~?所以我们那时候对于版面的控制?概也只是q样, 但随着宽带|络的普?qing)?造就?jin)网늚复杂功? HTML 4.0 包含?Layer的功能,问?来了(jin), Layer 无法跨过 Frame变成一个Q动的控制窗?所?Frame渐渐被淘汰,变成整个网는 Table 的切割来l合而成, 但是, Table 的设计大多属于网늾工的工作,你要他们懂得如何写动态程??大概只有 1/10 的美工可以做?所以我们徏议是各师其职,让|页视觉大师的工作就单纯只是|页设计,?所?Template Engine就应运而生,那比较有名的有, Velocity, Tiles, FreeMaker等{? ?Struts?是?Tiles的,q次我就针对 Tiles 做初U的介绍. <%@ taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles" %>
q意思就是说你这个网将?x)通过 Struts-Tiles q个 TagLib去调用 Tiles Template Engine , 你可以自 己打开 struts-tiles.tld q个文g看看, 里面的定义就是说,当你调用到其中?tag时?他需要去?用哪一个程序来执行你想得到的结?
建立一?template.jsp? 你先规划书面需要切割成为各个区?本范例是切成上方标题?top),左方主选单 (menu),x(chng)ȝ面再切割上下区域各ؓ(f) 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%\'>
(tng)<!-- 上方标题?-->
(tng)<tr>
(tng)<td colspan=\'2\'>
(tng) (tng)<img src="<%=request.getContextPath()%>/images/top.gif" border="0">
(tng)</td>
(tng)<!-- 左方主选单 -->
(tng)<tr valign=\'top\'>
(tng)<td width=\'120\' bgcolor=\'#FFFFFF\' align=\'center\'>
(tng) (tng)<tiles:insert attribute="menu"/>
(tng)</td>
(tng)<!-- x(chng)ȝ?-->
(tng)<td width=\'680\'>
(tng) (tng)<table border=\'0\' cellpadding=\'0\' cellspacing=\'0\' width=\'100%\'>
(tng) (tng)<tr>
(tng) (tng) (tng)<td (tng) (tng)bgcolor=\'ffffff\'>
(tng) (tng) (tng)<tiles:insert attribute="main"/>
(tng) (tng) (tng)</td>
(tng) (tng)</tr>
(tng) (tng)</table>
(tng)</td>
(tng)<tr>
(tng)<td colspan=\'2\'>
(tng) (tng)<tiles:insert attribute="copyright"/>
(tng)</td>
</table>
Ҏ(gu) template.jsp 定义?InsertTag 属性名U?( attribute )给予一?jsp/html来昄
(tng)<definition name="test.screen" path="/admin/template.jsp">
(tng) (tng)<put name="menu" value="/menu.jsp"/>
(tng) (tng)<put name="main" value="/index.jsp"/>
(tng) (tng)<put name="copyright" value="/copyright.jsp"/>
(tng)</definition>
~译以下之程?ScreenServlet.class)攑ֈ /WEB-INF/classes/com/softleader/system/init/之?
q且讑֮ 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 {
(tng) (tng) (tng) (tng)private ServletContext context;
(tng) (tng) (tng) (tng)/** Debug flag */
(tng) (tng) (tng) (tng)public static final boolean debug = true;
(tng) (tng) (tng) (tng)/** Associated definition factory */
(tng) (tng) (tng) (tng)protected DefinitionsFactory definitionFactory;
(tng) (tng) (tng) (tng)protected ComponentDefinition definition;
(tng) (tng) (tng) (tng)private TilesRequestProcessor trp;
(tng) (tng) (tng) (tng)public void init() (tng) (tng)throws ServletException {
(tng) (tng) (tng) (tng)}
(tng) (tng) (tng) (tng)public void doPost(HttpServletRequest request, HttpServletResponse response)
(tng) (tng) (tng) (tng)throws IOException, ServletException {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)process(request, response);
(tng) (tng) (tng) (tng)}
(tng) (tng) (tng) (tng)public void doGet(HttpServletRequest request, HttpServletResponse (tng) (tng)response)
(tng) (tng) (tng) (tng)throws IOException, ServletException {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)process(request, response);
(tng) (tng) (tng) (tng)}
(tng) (tng) (tng) (tng)public void process(HttpServletRequest request, HttpServletResponse (tng) (tng)response)
(tng) (tng) (tng) (tng)throws IOException, ServletException {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)// init screen
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)String screenName = null;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)String selectedUrl = request.getRequestURI();
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)// get the screen name
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)int lastPathSeparator = selectedUrl.lastIndexOf("/") + 1;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)int lastDot = selectedUrl.lastIndexOf(".");
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)if (lastPathSeparator != -1 && lastDot != -1 && lastDot > lastPathSeparator) {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)screenName = selectedUrl.substring(lastPathSeparator);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)}
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)try {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)// Read definition from factory, but we can create it here.
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)//ComponentDefinition definition = DefinitionsUtil.getDefinition( screenName,
request, this.getServletContext() );
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)//System.out.println("get Definition " + definition );
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)//DefinitionsUtil.setActionDefinition( request, definition);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)//DefinitionsFactory definitionsFactory =
DefinitionsUtil.getDefinitionsFactory(getServletContext());
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)DefinitionsFactory definitionsFactory = TilesUtil.getDefinitionsFactory(request,
getServletContext());
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)String uri="";
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)Controller controller;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)ComponentContext tileContext = null;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)if( definitionsFactory != null ) {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)// Get definition of tiles/component corresponding to uri.
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)ComponentDefinition definition
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)= definitionsFactory.getDefinition(screenName, request, getServletContext());
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)if( definition != null ){
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)// We have a definition.
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)// We use it to complete missing attribute in context.
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)// We also get uri, controller.
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)uri = definition.getPath();
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)controller = definition.getOrCreateController();
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)if( tileContext == null ) {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)tileContext = new ComponentContext( definition.getAttributes() );
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)ComponentContext.setContext( tileContext, request);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)}
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)else
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)tileContext.addMissing( definition.getAttributes() );
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)} // end if
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)} // end if
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)RequestDispatcher rd = getServletContext().getRequestDispatcher(uri);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)rd.forward(request, response);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)} (tng) (tng)catch( Exception ex ) {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)}
(tng) (tng) (tng) (tng)}
}
(tng) (tng)<servlet>
(tng) (tng) (tng) (tng)<servlet-name>ScreenServlet</servlet-name>
(tng) (tng) (tng) (tng)<display-name>ScreenServlet</display-name>
(tng) (tng) (tng) (tng)<servlet-class>com.softleader.system.init.ScreenServlet</servlet-class>
(tng) (tng) (tng) (tng)<load-on-startup>3</load-on-startup>
(tng) (tng)</servlet>
当然,你需要自己徏立相兛_义在 definations.xml ?jsp文? 接着重新启动 tomcat, 你就可以看到 http://localhost:8080/test.screen是一个整合v来的画面?jin)?上周告诉大家使用 tile 的基本方?当然也有更基本的, 相关的文件有 Manning 出的 Struts in Action ?Oreilly 出的 Programming Jakarta Struts 里面都有详尽的解? 不过今天要介l的时更高阶的技?- 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>
(tng)<servlet-name>action</servlet-name>
(tng)<servlet-class>org.apache.struts.titles.TilesServlet</servlet-class>
(tng)<init-param>
(tng) (tng)<param-name>definitions-config</param-name>
(tng) (tng)<param-value>/WEB-INF/tiles/tiles-definitions.xml</param-value>
(tng)</init-param>
(tng)<init-param>
(tng) (tng)<param-name>definitions-parser-validate</param-name>
(tng) (tng)<param-value>true</param-value>
(tng)</init-param>
</servlet>
单来? 上一介l的 tiles definitions 的方法是一对一, tiles:insert ?x)去?definitions 中的 put ? 把指向的 jsp 抓进? 一起包装成一个网送到客户端的览? 但是, 如果我希望在 template 中一?加入多笔的页面该怎么做呢, 哪就得用 <putList> 接着使用 iterate 把他一个一个取出来昄.
<titles:insert page="/template.jsp">
(tng)<tiles:putList name="items">
(tng) (tng)<tiles:add value="home"/>
(tng) (tng)<tiles:add><img
src="<%=request.getContextPath()%>/images/logo.gif"></titles:add>
(tng) (tng)<tiles:add value="documentation"/>
(tng)</titles:putList>
</titles:insert>
<tiles:importAttribute/>
<table>
(tng)<logic:iterate id="item" name="items">
(tng)<tr><td><%=item%></td></tr>
(tng)</logic:iterate>
</table>
所谓的 RssData, 是一?webservice 的格? 相关的介l有
XML.com RSS 的介l?br />Oreilly RSS I中?br />RSS 教学手册
RSS 最新消?/font>
基本上有几个好处
<definition name="examples.rssChannel.body" path="/examples/tiles/rssChannels.jsp"
(tng)controllerUrl="/examples/controller/rssChannel.do">
(tng)<putList name="urls">
(tng) (tng)<add value="http://newsforge.com/newsforge.rss"/>
(tng) (tng)<add value="http://xmlhack.com/rss.php"/>
(tng) (tng)<add value="http://lwn.net/headlines/rss"/>
(tng)</putList>
</definition>
(tng)<action path="/examples/controller/rssChannel"
(tng) (tng) (tng)type="org.apache.struts.example.tiles.rssChannel.RssChannelsAction">
(tng)</action>
(tng)public final class RssChannelsAction extends TilesAction {
(tng) (tng)public static final String CHANNELS_KEY = "CHANNELS";
(tng) (tng)public static final String CHANNEL_URLS_KEY= "urls";
(tng) (tng)public ActionForward doExecute(ActionMapping mapping,
(tng) (tng) (tng) (tng)ActionForm form, HttpServletRequest request,
(tng) (tng) (tng) (tng)HttpServletResponse response)
(tng) (tng)throws IOException, ServletException, Exception {
(tng) (tng) (tng)org.apache.commons.digester.rss.Channel channel = null ;
(tng) (tng) (tng)List channels = (List)context.getAttribute(CHANNEL_URLS_KEY);
(tng) (tng) (tng)List channelBeans = new ArrayList(channels.size());
(tng) (tng) (tng)for ( int i=0 ; i < channels.size(); i++ ) {
(tng) (tng) (tng) (tng)RSSDigester digester = new RSSDigester();
(tng) (tng) (tng) (tng)String url = (String)channels.get(i);
(tng) (tng) (tng) (tng)Channel obj = (Channel) digester.parse(url);
(tng) (tng) (tng) (tng)channelBeans.add(obj);
(tng) (tng) (tng)}
(tng) (tng) (tng)context.putAttribute(CHANNELS_KEY,channelBeans);
(tng) (tng) (tng)return null;
(tng) (tng)} (tng) (tng)
(tng)}
<%@ 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">
(tng) (tng)<a href="<bean:write name="CHANNEL" property="link"/>">
(tng) (tng) (tng) (tng)<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> (tng) (tng)[ <a href="<bean:write name="ITEM"
property="link"/>">more</a> ]
<br>
</logic:iterate>
</TD>
</TR>
</TABLE>
<br>
</logic:iterate>
</b></font></div>
目前 tiles-example 有提供几U不同的 layout 可以参?
当然, 你也可以建立自己?Layout , 我们希望你能建立W合 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> 资料放q来 Center Layout 使用 <tiles:insert> ?<tiles:put> 资料放q来 Tabs Layout q个几乎以上用到的观念都?x)用?/td>
二:(x)Tiles配置和基本配|文件介l?br />Tiles有一个配|文?tiles-defs.xml
tiles-defs.xml定义?jin)每一个页面的l成元素和Ş式?br />下面我将说明如下所C的一个tiles-defs.xml文g
tiles-defs.xml
-----------------------------------------------
<tiles-definitions>
<!--定义/layouts/classicLayout.jsp的组成名UCؓ(f)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的组成ؓ(f)site.menu.bar对应的页?->
<put name="footer" value="/tiles/common/footer.jsp" />
<put name="body" value="/tiles/body.jsp" />
</definition>
<!--定义site.index.pageQ(h)承site.mainLayout-->
<definition name="site.index.page" extends="site.mainLayout" >
<put name="title" value="Tiles Blank Site Index" />
<put name="body" value="/tiles/body.jsp" />
<!--以上两个元素替换site.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>
附:(x)/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>
在web.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>
三:(x)使用Tiles
如果已经配置好tiels-defs.xmlQ接下来可以在jsp文g中用这些定义了(jin)?br />有如下的方式使用tiles
3.1:
<tiles:insert definition="site.mainLayout" flush="true" />
插入site.mainLayout标记的一?/p>
3.2Q?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
q把title的D定ؓ(f):My first frameset page
header讑֮?tutorial/common/header.jsp
四:(x)后记
Tiles的用在他的文档里面写的比较详细。以上是一些简单和基本的用。具体的文档可以看Struts里面的一个tiles-documentation.war的包。但即是这个包也不是很全。可以通过上的的连接到作者的主页上去找。个得用Tiles在做企业q用的时候可能不如在做网站那h能体C性。但在系l开始设计的时候考虑q规划好整个UIQ那在修改和l护的时候将节省不少的工作量Q因为通常UI的确定在代码~写l束和完成,所有尽可能的用多个子面构成一个页面,后面的美化和l护比直接l护一个很大的面Ҏ(gu)