﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-学习--共同努力-随笔分类-struts</title><link>http://www.blogjava.net/rendong/category/13647.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 02 Mar 2007 06:51:51 GMT</lastBuildDate><pubDate>Fri, 02 Mar 2007 06:51:51 GMT</pubDate><ttl>60</ttl><item><title> Struts Tiles讲解</title><link>http://www.blogjava.net/rendong/archive/2006/08/02/61417.html</link><dc:creator>rendong</dc:creator><author>rendong</author><pubDate>Wed, 02 Aug 2006 15:11:00 GMT</pubDate><guid>http://www.blogjava.net/rendong/archive/2006/08/02/61417.html</guid><wfw:comment>http://www.blogjava.net/rendong/comments/61417.html</wfw:comment><comments>http://www.blogjava.net/rendong/archive/2006/08/02/61417.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rendong/comments/commentRss/61417.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rendong/services/trackbacks/61417.html</trackback:ping><description><![CDATA[Struts Tiles<br /><table><tbody><tr><td><table><tbody><tr><td>我很喜欢 struts ，这是我目前最熟悉的 MVC Framework ，但是 struts 的 template Engine 和 Turbine(jakarta 另外一个 mvc framework，还有一个 tapestry )使 用的 Velocity 有异曲同工之妙，另外如果你们在 Mail List 看到 <b>Craig R. McClanahan</b> 这号人物， 他就是“神”的代言人！ </td></tr></tbody></table></td></tr><tr><td><font color="red"><b>MVCII Framework</b></font><br />Cotroller是指由 Servlet 所主导,Model 为 JavaBean所开发, 最后以 JSP 做 View 端的呈现,最后 将资料返回到客户端. 而今天我要讨论的就是客户端的 <b>Template Engine -- <font color="blue">Tiles</font>.</b></td></tr></tbody></table><p><font color="red"><b>View (Template Engine)-Tiles</b></font><br />Tiles是由<i>Cedric Dumoulin</i>老大所开发的 Template Engine , 什么叫做 Template Engine呢, 他是一个版面切割控制的处理中心.通常我们在早古时代大约 ( 1995 ~ 2000 )年间 , 设计网页大多以 Frame 为切割网页的方式 , 因为当时网络带宽不足, 加上开发工具短缺,所以我们那时候对于版面的控制大 概也只是这样, 但随着宽带网络的普及化,造就了网页的复杂功能, HTML 4.0 包含了 Layer的功能,问题 来了, Layer 无法跨过 Frame变成一个浮动的控制小窗口,所以 Frame渐渐被淘汰,变成整个网页由 Table 的切割来组合而成, 但是, Table 的设计大多属于网页美工的工作,你要他们懂得如何写动态程序, 大概只有 1/10 的美工可以做到,所以我们建议是各师其职,让网页视觉大师的工作就单纯只是网页设计, 所以 Template Engine就应运而生,那比较有名的有, Velocity, Tiles, FreeMaker等等. 而 Struts 是使用 Tiles的,这次我就针对 Tiles 做初级的介绍. </p><p>基本上, 你在撰写 JSP的时候, 如果 <b>/WEB-INF/lib/</b>之下有放<b>struts.jar</b>那就代表说, 你的 JSP 可以 import struts 的组件进来, 而 <b>struts-tiles.tld</b>我通常会放在 /WEB-INF/tlds/目录之下,所以你在 JSP 的开始的地方就要写<br /><code>&lt;%@ taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles" %&gt; </code>这意思就是说你这个网页将会通过 Struts-Tiles 这个 TagLib去调用 Tiles Template Engine , 你可以自 己打开 struts-tiles.tld 这个文件看看, 里面的定义就是说,当你调用到其中的 tag时候,他需要去调 用哪一个程序来执行你想得到的结果. </p><p><font color="red"><b>完全战略首部曲--建立模板 (template.jsp)</b></font><br />建立一个 template.jsp, 你先规划书面需要切割成为各个区块,本范例是切成上方标题区(top),左方主选单 (menu),右方主画面再切割上下区域各为 main 及 copyright : <br /></p><pre><code><br />&lt;%@ page contentType="text/html;charset=BIG5" %&gt;<br />&lt;%@ taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles" %&gt;<br /><br />&lt;BODY leftmargin="0" marginheight="0" marginwidth="0" topmargin="0" bgcolor="#FFFFFF" <br /><br />link="#660000"&gt;<br />&lt;table border=\'0\' cellpadding=\'0\' cellspacing=\'0\' width=\'100%\'&gt;<br /> &lt;!-- 上方标题区 --&gt;<br /> &lt;tr&gt;<br /> &lt;td colspan=\'2\'&gt;<br />  &lt;img src="&lt;%=request.getContextPath()%&gt;/images/top.gif" border="0"&gt;<br /> &lt;/td&gt;<br /> &lt;!-- 左方主选单 --&gt;<br /> &lt;tr valign=\'top\'&gt;<br /><br /> &lt;td width=\'120\' bgcolor=\'#FFFFFF\' align=\'center\'&gt;<br />  <font color="blue">&lt;tiles:insert attribute="menu"/&gt;</font><br /> &lt;/td&gt;<br /><br /> &lt;!-- 右方主画面 --&gt;<br /> &lt;td width=\'680\'&gt;<br />  &lt;table border=\'0\' cellpadding=\'0\' cellspacing=\'0\' width=\'100%\'&gt;<br />  &lt;tr&gt;<br />   &lt;td  bgcolor=\'ffffff\'&gt;<br />   <font color="blue">&lt;tiles:insert attribute="main"/&gt;</font><br />   &lt;/td&gt;<br />  &lt;/tr&gt;<br /><br />  &lt;/table&gt;<br /> &lt;/td&gt;<br /> &lt;tr&gt;<br /> &lt;td colspan=\'2\'&gt;<br />  <font color="blue">&lt;tiles:insert attribute="copyright"/&gt;</font><br /> &lt;/td&gt; <br />&lt;/table&gt;<br /><br /></code></pre><br /><br /><br /><p><font color="red"><b>完全战略二部曲--定义 definations.xml</b></font><br />根据 template.jsp 定义的 InsertTag 属性名称 ( attribute )给予一个 jsp/html来显示 </p><pre><code><br /> &lt;definition name="test.screen" path="/admin/template.jsp"&gt;<br />  &lt;put name="menu" value="/menu.jsp"/&gt;<br />  &lt;put name="main" value="/index.jsp"/&gt;<br />  &lt;put name="copyright" value="/copyright.jsp"/&gt;<br /> &lt;/definition&gt;<br /></code></pre><p></p><p><font color="red"><b>完全战略三部曲--制作 ScreenServlet.java (WARN:copyrights are reserved by Softleader Copr.)</b></font><br />编译以下之程序(ScreenServlet.class)放到 /WEB-INF/classes/com/softleader/system/init/之下 </p><pre><code><br />package com.softleader.system.init;<br /><br />import java.util.StringTokenizer;<br />import java.util.HashMap;<br />import java.util.Locale;<br />import java.util.Map;<br /><br />import java.io.IOException;<br />import java.io.PrintWriter;<br /><br />import java.net.URL;<br /><br />import javax.servlet.*;<br />import javax.servlet.ServletException;<br />import javax.servlet.ServletConfig;<br />import javax.servlet.ServletContext;<br />import javax.servlet.http.HttpServlet;<br />import javax.servlet.http.HttpServletRequest;<br />import javax.servlet.http.HttpServletResponse;<br />import javax.servlet.http.HttpSession;<br /><br />import javax.naming.InitialContext;<br />import javax.naming.NamingException;<br /><br />import org.apache.struts.action.Action;<br />import org.apache.struts.action.ActionForm;<br />import org.apache.struts.action.ActionForward;<br />import org.apache.struts.action.ActionMapping;<br />import org.apache.struts.tiles.*;<br />import org.apache.struts.tiles.TilesUtil;<br /><br />public class ScreenServlet extends HttpServlet {<br /><br />    private ServletContext context;<br />    /** Debug flag */<br />    public static final boolean debug = true;<br />    /** Associated definition factory */<br />    protected DefinitionsFactory definitionFactory;<br />    protected ComponentDefinition definition;<br />    private TilesRequestProcessor trp;<br /><br />    public void init()  throws ServletException {<br />    }<br /><br /><br />    public void doPost(HttpServletRequest request, HttpServletResponse response)<br />    throws IOException, ServletException {<br />        process(request, response);<br />    }<br /><br />    public void doGet(HttpServletRequest request, HttpServletResponse  response)<br />    throws IOException, ServletException {<br />        process(request, response);<br /><br />    }<br /><br />    public void process(HttpServletRequest request, HttpServletResponse  response)<br />    throws IOException, ServletException {<br />        // init screen<br />        String screenName = null;<br />        String selectedUrl = request.getRequestURI();<br /><br />        // get the screen name<br />        int lastPathSeparator = selectedUrl.lastIndexOf("/") + 1;<br />        int lastDot = selectedUrl.lastIndexOf(".");<br />        if (lastPathSeparator != -1 &amp;&amp; lastDot != -1 &amp;&amp; lastDot &gt; lastPathSeparator) {<br />            screenName = selectedUrl.substring(lastPathSeparator);<br />        }<br /><br />        try {<br />            // Read definition from factory, but we can create it here.<br />            //ComponentDefinition definition = DefinitionsUtil.getDefinition( screenName, <br /><br />request, this.getServletContext() );<br />            //System.out.println("get Definition " + definition );<br />            //DefinitionsUtil.setActionDefinition( request, definition);<br />            //DefinitionsFactory definitionsFactory = <br /><br />DefinitionsUtil.getDefinitionsFactory(getServletContext());<br />            DefinitionsFactory definitionsFactory = TilesUtil.getDefinitionsFactory(request, <br /><br />getServletContext());<br /><br />            String uri="";<br />            Controller controller;<br />            ComponentContext tileContext = null;<br /><br />            if( definitionsFactory != null ) {<br />                // Get definition of tiles/component corresponding to uri.<br />                ComponentDefinition definition<br />                    = definitionsFactory.getDefinition(screenName, request, getServletContext());<br /><br /><br />                if( definition != null ){<br />                    // We have a definition.<br />                    // We use it to complete missing attribute in context.<br />                    // We also get uri, controller.<br />                    uri = definition.getPath();<br />                    controller = definition.getOrCreateController();<br /><br />                    if( tileContext == null ) {<br /><br />                        tileContext = new ComponentContext( definition.getAttributes() );<br />                        ComponentContext.setContext( tileContext, request);<br /><br />                    }<br />                    else<br />                        tileContext.addMissing( definition.getAttributes() );<br />                } // end if<br />            } // end if<br /><br /><br />            RequestDispatcher rd = getServletContext().getRequestDispatcher(uri);<br /><br />            rd.forward(request, response);<br /><br /><br />        }  catch( Exception ex ) {<br />        }<br />    }<br /><br />}<br /><br /></code></pre>并且设定 web.xml增加一个 ScreenServlet <pre><code><br />  &lt;servlet&gt;<br />    &lt;servlet-name&gt;ScreenServlet&lt;/servlet-name&gt;<br />    &lt;display-name&gt;ScreenServlet&lt;/display-name&gt;<br />    &lt;servlet-class&gt;com.softleader.system.init.ScreenServlet&lt;/servlet-class&gt;<br />    &lt;load-on-startup&gt;3&lt;/load-on-startup&gt;<br />  &lt;/servlet&gt;<br /></code></pre><p></p><p><font color="red"><b>测试网页呈现</b></font><br />当然,你需要自己建立相关定义在 definations.xml 的 jsp文件, 接着重新启动 tomcat, 你就可以看到 <a href="http://localhost:8080/test.screen是一个整合起来的画面了" target="_blank"><font color="#000000">http://localhost:8080/test.screen是一个整合起来的画面了 </font></a><br /></p><ol><li>设定相关的 compile 环境, 基本上,可以直接使用 struts source 的 libs 和 sources <br /></li><li>设定相关的 properties 及 xml,如果不太了解, 请直接查阅 oreilly 所出的 Struts <br /></li><li>请尊重知识产权,本文章之原始文件不得用于商业用途,需要时请于本公司联络. <br /></li><li>Struts 网站: <a href="http://jakarta.apache.org/struts/" target="_blank"><font color="#000000">http://jakarta.apache.org/struts/</font></a><br /></li><li>Tiles网站: <a href="http://www.lifl.fr/~dumoulin/tiles/" target="_blank"><font color="#000000">http://www.lifl.fr/~dumoulin/tiles/</font></a><br /></li><li>Tomcat 网站: <a href="http://jakarta.apache.org/tomcat" target="_blank"><font color="#000000">http://jakarta.apache.org/tomcat/</font></a><br /></li><li>以上程序都在 Tomcat 4.1.x以上以及 Sun JDK 1.4.x以上测试完成 </li></ol><p></p><table><tbody><tr><td><table><tbody><tr><td>上周告诉大家使用 tile 的基本方法,当然也有更基本的, 相关的文件有 Manning 出的 <a href="http://www.manning.com/husted/chap11.pdf" target="_blank"><font color="#000000">Struts in Action</font></a> 和 Oreilly 出的 <a href="http://www.onjava.com/pub/a/onjava/excerpt/progjakstruts_14/index1.html" target="_blank"><font color="#000000">Programming Jakarta Struts </font></a>里面都有详尽的解释. 不过今天要介绍的时更高阶的技术-- <b>Tile Layout</b> ,书上 都没有提到,呵呵!! </td></tr></tbody></table></td></tr><tr><td></td></tr></tbody></table><p><font color="red"><b>单独使用 Tiles</b></font><br />把 tiles.jar 放到 WEB-INF/lib/<br />把 tiles.tld 放到 WEB-INF/<br />把 commons-digester.jar,commons-collections.jar,commons-beanutils.jar 放到 WEB-INF/lib/ 下<br />把 jakarta commons *.tld 放到 WEB-INF/ 下<br /><br />接着在 WEB-INF/web.xml 中增加<br /></p><pre><code><br />&lt;servlet&gt;<br /> &lt;servlet-name&gt;action&lt;/servlet-name&gt;<br /> &lt;servlet-class&gt;org.apache.struts.titles.TilesServlet&lt;/servlet-class&gt;<br /><br /><br /> &lt;init-param&gt;<br />  &lt;param-name&gt;definitions-config&lt;/param-name&gt;<br />  &lt;param-value&gt;/WEB-INF/tiles/tiles-definitions.xml&lt;/param-value&gt;<br /> &lt;/init-param&gt;<br /> &lt;init-param&gt;<br />  &lt;param-name&gt;definitions-parser-validate&lt;/param-name&gt;<br />  &lt;param-value&gt;true&lt;/param-value&gt;<br /> &lt;/init-param&gt;<br />&lt;/servlet&gt;<br /></code></pre><p></p><p><font color="red"><b>使用 &lt;putList&gt; 及 &lt;add&gt;</b></font><br />简单来说, 上一篇介绍的 tiles definitions 的方法是一对一, tiles:insert 会去找 definitions 中的 put 值, 把指向的 jsp 抓进来, 一起包装成一个网页送到客户端的浏览器, 但是, 如果我希望在 template 中一次 加入多笔的页面该怎么做呢, 哪就得用 &lt;putList&gt; 接着使用 iterate 把他一个一个取出来显示. </p><pre><code><br />&lt;titles:insert page="/template.jsp"&gt;<br /> &lt;tiles:putList name="items"&gt;<br />  &lt;tiles:add value="home"/&gt;<br />  &lt;tiles:add&gt;&lt;img <br /><br />src="&lt;%=request.getContextPath()%&gt;/images/logo.gif"&gt;&lt;/titles:add&gt;<br />  &lt;tiles:add value="documentation"/&gt;<br /> &lt;/titles:putList&gt;<br />&lt;/titles:insert&gt;<br /></code></pre><p> 在 view 端 jsp 中要写 </p><pre><code><br />&lt;tiles:importAttribute/&gt;<br />&lt;table&gt;<br /> &lt;logic:iterate id="item" name="items"&gt;<br /> &lt;tr&gt;&lt;td&gt;&lt;%=item%&gt;&lt;/td&gt;&lt;/tr&gt;<br /> &lt;/logic:iterate&gt;<br />&lt;/table&gt;<br /></code></pre><p></p><p><font color="red"><b>RssChannel</b></font><br />所谓的 RssData, 是一个 webservice 的格式, 相关的介绍有<br /><a href="http://www.xml.com/pub/a/2002/12/18/dive-into-xml.html" target="_blank"><font color="#000000">XML.com RSS 的介绍<br /></font><a href="http://www.oreillynet.com/rss/" target="_blank"><font color="#000000">Oreilly RSS 研究中心<br /></font><a href="http://www.mnot.net/rss/tutorial/" target="_blank"><font color="#000000">RSS 教学手册<br /></font><a href="http://blogspace.com/rss/" target="_blank"><font color="#000000">RSS 最新消息</font></a><br />基本上有几个好处 <br /><ul><li>可能放到各个不同的 tiles channel 中 . <br /></li><li>在同一个 page 可能放到好几个不同 channel . <br /></li><li>可以简单的重新绘出 channel 画面. <br /></li><li>可能符合好几个 channel , 每一个都可以各自重绘. </li></ul><p>首先 我们先定义 tiles-definition.xml , 最重要的, 是 controllerUrl 需要设定 , 此外, 还需要得到 rss 的格式. </p><pre><code><br /><br />&lt;definition name="examples.rssChannel.body" path="/examples/tiles/rssChannels.jsp" <br /> controllerUrl="/examples/controller/rssChannel.do"&gt;<br /> &lt;putList name="urls"&gt;<br />  &lt;add value="http://newsforge.com/newsforge.rss"/&gt;<br />  &lt;add value="http://xmlhack.com/rss.php"/&gt;<br />  &lt;add value="http://lwn.net/headlines/rss"/&gt;<br /> &lt;/putList&gt;<br />&lt;/definition&gt;<br /><br /></code></pre><p>在 strut-config.xml 中定义 </p><pre><code><br /> &lt;action path="/examples/controller/rssChannel" <br />   type="org.apache.struts.example.tiles.rssChannel.RssChannelsAction"&gt;<br /> &lt;/action&gt;<br /></code></pre><p>接着建立一个 RssChannelsAction 的 Class </p><pre><code><br /> public final class RssChannelsAction extends TilesAction {<br />  public static final String CHANNELS_KEY = "CHANNELS";<br /><br />  public static final String CHANNEL_URLS_KEY= "urls";<br /><br />  public ActionForward doExecute(ActionMapping mapping, <br />    ActionForm form, HttpServletRequest request,<br />    HttpServletResponse response) <br />  throws IOException, ServletException, Exception {<br /><font color="red">   org.apache.commons.digester.rss.Channel channel = null ; <br /><br /></font><br />   List channels = (List)context.getAttribute(CHANNEL_URLS_KEY);<br />   List channelBeans = new ArrayList(channels.size());<br /><br />   for ( int i=0 ; i &lt; channels.size(); i++ ) {<br />    RSSDigester digester = new RSSDigester();<br />    String url = (String)channels.get(i);<br /><br />    Channel obj = (Channel) digester.parse(url);<br />    channelBeans.add(obj);<br />   }<br />   context.putAttribute(CHANNELS_KEY,channelBeans);<br />   return null;<br />  }  <br /><br /> }<br /></code></pre><p>最后, 在 view 端 jsp 这样就可以看到 rssChannel 的资料啦 </p><pre><code><br />&lt;%@ page language="java" %&gt;<br />&lt;%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %&gt;<br />&lt;%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %&gt;<br />&lt;%@ taglib uri="/WEB-INF/struts-tiles.tld" prefix="tiles" %&gt;<br /><br />&lt;div align="center"&gt;&lt;font size="+1"&gt;&lt;b&gt;<br /><br />&lt;tiles:importAttribute name="CHANNELS" scope="page"/&gt;<br /><br />&lt;logic:iterate name="CHANNELS" id="CHANNEL" &gt;<br />&lt;TABLE border="0" cellspacing="0" cellpadding="4" width="100%" align="center" &gt;<br />&lt;TR&gt;<br />&lt;TD class="spanhd" &gt;&lt;logic:present name="CHANNEL" property="image"&gt;<br />  &lt;a href="&lt;bean:write name="CHANNEL" property="link"/&gt;"&gt;<br />    &lt;img src="&lt;bean:write name="CHANNEL" <br /><br />property="image.URL"/&gt;"&gt;&lt;/logic:present&gt;&lt;/a&gt;<br />&lt;/TD&gt;<br />&lt;TD class="spanhd" width="100%"&gt;&lt;bean:write name="CHANNEL" property="title"/&gt; <br />&lt;a href="&lt;bean:write name="CHANNEL" property="link"/&gt;"&gt;[home]&lt;/a&gt;&lt;/TD&gt;<br />&lt;/TR&gt;<br />&lt;TD class="yellow" colspan="2"&gt;&lt;bean:write name="CHANNEL" <br /><br />property="description"/&gt;&lt;/TD&gt;<br />&lt;/TR&gt;<br /><br />&lt;TR&gt;<br />&lt;TD class="datagrey" colspan="2"&gt;<br />&lt;logic:iterate name="CHANNEL" property="items" id="ITEM"&gt;<br />&lt;br&gt;&lt;b&gt;&lt;bean:write name="ITEM" property="title"/&gt;&lt;/b&gt;<br />&lt;br&gt;&lt;bean:write name="ITEM" property="description"/&gt;<br />&lt;br&gt;  [ &lt;a href="&lt;bean:write name="ITEM" <br /><br />property="link"/&gt;"&gt;more&lt;/a&gt; ]<br />&lt;br&gt;<br />&lt;/logic:iterate&gt;<br />&lt;/TD&gt;<br />&lt;/TR&gt;<br />&lt;/TABLE&gt;<br />&lt;br&gt;<br />&lt;/logic:iterate&gt;<br /><br />&lt;/b&gt;&lt;/font&gt;&lt;/div&gt;<br /><br /></code></pre><p></p><p><font color="red"><b>Layouts</b></font><br />目前 tiles-example 有提供几种不同的 layout 可以参考 <br /></p><table style="WIDTH: 730px; HEIGHT: 840px" border="1"><tbody><tr><th>Layout Name</th><th>Parameters</th><th>Use</th></tr><tr><td>Class Layout</td><td><ol><li>title <br /></li><li>header <br /></li><li>menu <br /></li><li>body <br /></li><li>fotter </li></ol></td><td>使用 &lt;tiles:getAsString attribute="title"&gt; 取得标题外,<br />其余使用 &lt;tiles:insert attribute="menu"&gt; </td></tr><tr><td>Menu Layout</td><td><ol><li>title <br /></li><li>items </li></ol></td><td>使用 &lt;tiles:getAsString attribute="title"&gt; 取得标题外,<br />其余使用 org.apache.struts.tiles.beans.MenuItem  iterate </td></tr><tr><td>VBox or VStack Layout</td><td><ol><li>list </li></ol></td><td>使用 &lt;tiles:useAttribute classname="java.util.List" name="list" id="list"&gt; </td></tr><tr><td>Multi-columns Layout</td><td><ol><li>numCols <br /></li><li>list1 <br /></li><li>list2 [optional] <br /></li><li>list3 [optional] <br /></li><li>listn [optional] </li></ol></td><td>使用 &lt;tiles:useAttribute classname="java.util.String" name="numCols" id="numColsStr"&gt; 接着使用 &lt;tiles:insert&gt; 和 &lt;tiles:put&gt; 将资料放进来</td></tr><tr><td>Center Layout</td><td><ol><li>header <br /></li><li>right <br /></li><li>body <br /></li><li>left <br /></li><li>footer </li></ol></td><td>使用 &lt;tiles:insert&gt; 和 &lt;tiles:put&gt; 将资料放进来</td></tr><tr><td>Tabs Layout</td><td><ol><li>tabList <br /></li><li>selectedIndex <br /></li><li>parameterName </li></ol></td><td>这个几乎以上用到的观念都会用到</td></tr></tbody></table>当然, 你也可以建立自己的 Layout , 我们希望你能建立符合 MVC 观念的 Layout!! </a></a></a></p><img src ="http://www.blogjava.net/rendong/aggbug/61417.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rendong/" target="_blank">rendong</a> 2006-08-02 23:11 <a href="http://www.blogjava.net/rendong/archive/2006/08/02/61417.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts s Tiles 使用入门完全攻略(转载)</title><link>http://www.blogjava.net/rendong/archive/2006/08/02/61416.html</link><dc:creator>rendong</dc:creator><author>rendong</author><pubDate>Wed, 02 Aug 2006 15:09:00 GMT</pubDate><guid>http://www.blogjava.net/rendong/archive/2006/08/02/61416.html</guid><wfw:comment>http://www.blogjava.net/rendong/comments/61416.html</wfw:comment><comments>http://www.blogjava.net/rendong/archive/2006/08/02/61416.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rendong/comments/commentRss/61416.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rendong/services/trackbacks/61416.html</trackback:ping><description><![CDATA[
		<p>一：说明<br />Struts1.1以后增加了Tiles包使得struts在页面的处理方面多了一种选择.并且更容易实现代码的重用。Tiles中对页面的划分有点象jakarta的另外一个项目Turbine中的TDK。增加了layout的概念.其实就是把一个页面划分为几块。通常的来说一个页面大概可以划分为如下几块：head页面头部:存放一个运用的公共信息：logo等，如果是网站可能是最上面的一块.menu页面菜单:放置一个运用中需要使用的菜单，或者在每一个页面都使用的连接.footer页面尾部:如版权信息等.body页面主题内容:每个页面相对独立的内容.如果按上面的划分那对每一个页面我们只要写body里面的内容，其他的就可以共享重用.如果大多数页面的布局基本相同我们甚至可以使用一个jsp文件根据不同的参数调用不同的body.</p>
		<p>二：Tiles配置和基本配置文件介绍<br />Tiles有一个配置文件:tiles-defs.xml<br />tiles-defs.xml定义了每一个页面的组成元素和形式。<br />下面我将说明如下所示的一个tiles-defs.xml文件<br />tiles-defs.xml<br />-----------------------------------------------<br />&lt;tiles-definitions&gt;<br />&lt;!--定义/layouts/classicLayout.jsp的组成名称为site.mainLayout--&gt;<br />&lt;!--后面将附/layouts/classicLayout.jsp的内容--&gt;<br />&lt;definition name="site.mainLayout" path="/layouts/classicLayout.jsp"&gt;<br />&lt;put name="title" value="Tiles Blank Site" /&gt;<br />&lt;put name="header" value="/tiles/common/header.jsp" /&gt;<br />&lt;put name="menu" value="site.menu.bar" /&gt;<br />&lt;!--menu的组成为site.menu.bar对应的页面--&gt;<br />&lt;put name="footer" value="/tiles/common/footer.jsp" /&gt;<br />&lt;put name="body" value="/tiles/body.jsp" /&gt;<br />&lt;/definition&gt;<br />&lt;!--定义site.index.page，继承site.mainLayout--&gt;<br />&lt;definition name="site.index.page" extends="site.mainLayout" &gt;<br />&lt;put name="title" value="Tiles Blank Site Index" /&gt;<br />&lt;put name="body" value="/tiles/body.jsp" /&gt;<br />&lt;!--以上两个元素将替换site.mainLayout中的元素--&gt;<br />&lt;/definition&gt;</p>
		<p>&lt;definition name="site.menu.bar" path="/layouts/vboxLayout.jsp" &gt;<br />&lt;putList name="list" &gt;<br />&lt;add value="site.menu.links" /&gt;<br />&lt;add value="site.menu.documentation" /&gt;<br />&lt;/putList&gt;<br />&lt;/definition&gt;<br />&lt;/tiles-definitions&gt;</p>
		<p>附：/layouts/classicLayout.jsp<br />--------------------------------<br />&lt;html&gt;<br />&lt;head&gt;<br />&lt;title&gt;&lt;tiles:getAsString name="title"/&gt;<br />&lt;/title&gt;<br />&lt;/head&gt;</p>
		<p>&lt;body bgcolor="#ffffff" text="#000000" link="#023264" alink="#023264" vlink="#023264"&gt;<br />&lt;table border="0" width="100%" cellspacing="5"&gt;<br />&lt;tr&gt;<br />&lt;td colspan="2"&gt;&lt;tiles:insert attribute="header" /&gt;&lt;/td&gt;<br />&lt;/tr&gt;<br />&lt;tr&gt;<br />&lt;td width="140" valign="top"&gt;<br />&lt;tiles:insert attribute='menu'/&gt;<br />&lt;/td&gt;<br />&lt;td valign="top" align="left"&gt;<br />&lt;tiles:insert attribute='body' /&gt;<br />&lt;/td&gt;<br />&lt;/tr&gt;<br />&lt;tr&gt;<br />&lt;td colspan="2"&gt;<br />&lt;tiles:insert attribute="footer" /&gt;<br />&lt;/td&gt;<br />&lt;/tr&gt;<br />&lt;/table&gt;<br />&lt;/body&gt;<br />&lt;/html&gt;</p>
		<p>在web.xml里面配置tiles,配置完后对应struts action servlet的配置如下:<br />web.xml<br />-----------------<br />&lt;!-- Action Servlet Configuration --&gt;<br />&lt;servlet&gt;<br />&lt;servlet-name&gt;action&lt;/servlet-name&gt;<br />&lt;!-- Specify servlet class to use:<br />- Struts1.0.x: ActionComponentServlet<br />- Struts1.1: ActionServlet<br />- no Struts: TilesServlet<br />--&gt; <br />&lt;servlet-class&gt;org.apache.struts.action.ActionServlet&lt;/servlet-class&gt; </p>
		<p>&lt;!-- Tiles Servlet parameter <br />Specify configuration file names. There can be several comma <br />separated file names<br />--&gt; <br />&lt;init-param&gt;<br />&lt;param-name&gt;definitions-config&lt;/param-name&gt;<br />&lt;param-value&gt;/WEB-INF/tiles-defs.xml&lt;/param-value&gt;<br />&lt;/init-param&gt;</p>
		<p>&lt;!-- Tiles Servlet parameter <br />Specify Tiles debug level.<br />O : no debug information<br />1 : debug information<br />2 : more debug information<br />--&gt; <br />&lt;init-param&gt;<br />&lt;param-name&gt;definitions-debug&lt;/param-name&gt;<br />&lt;param-value&gt;1&lt;/param-value&gt;<br />&lt;/init-param&gt;</p>
		<p>&lt;!-- Tiles Servlet parameter <br />Specify Digester debug level. This value is passed to Digester<br />O : no debug information<br />1 : debug information<br />2 : more debug information<br />--&gt; <br />&lt;init-param&gt;<br />&lt;param-name&gt;definitions-parser-details&lt;/param-name&gt;<br />&lt;param-value&gt;0&lt;/param-value&gt;<br />&lt;/init-param&gt;</p>
		<p>&lt;!-- Tiles Servlet parameter <br />Specify if xml parser should validate the Tiles configuration file.<br />true : validate. DTD should be specified in file header.<br />false : no validation<br />--&gt; <br />&lt;init-param&gt;<br />&lt;param-name&gt;definitions-parser-validate&lt;/param-name&gt;<br />&lt;param-value&gt;true&lt;/param-value&gt;<br />&lt;/init-param&gt;</p>
		<p>&lt;!-- Struts configuration, if Struts is used --&gt;<br />&lt;init-param&gt;<br />&lt;param-name&gt;config&lt;/param-name&gt;<br />&lt;param-value&gt;/WEB-INF/struts-config.xml&lt;/param-value&gt;<br />&lt;/init-param&gt;<br />&lt;init-param&gt;<br />&lt;param-name&gt;validate&lt;/param-name&gt;<br />&lt;param-value&gt;true&lt;/param-value&gt;<br />&lt;/init-param&gt;<br />&lt;init-param&gt;<br />&lt;param-name&gt;debug&lt;/param-name&gt;<br />&lt;param-value&gt;2&lt;/param-value&gt;<br />&lt;/init-param&gt;<br />&lt;init-param&gt;<br />&lt;param-name&gt;detail&lt;/param-name&gt;<br />&lt;param-value&gt;2&lt;/param-value&gt;<br />&lt;/init-param&gt;</p>
		<p>&lt;load-on-startup&gt;2&lt;/load-on-startup&gt;<br />&lt;/servlet&gt;</p>
		<p>三：使用Tiles<br />如果已经配置好tiels-defs.xml，接下来就可以在jsp文件中使用这些定义了。<br />有如下的方式使用tiles<br />3.1:<br />&lt;tiles:insert definition="site.mainLayout" flush="true" /&gt;<br />插入site.mainLayout标记的一页</p>
		<p>3.2：<br />&lt;tiles:insert template="/tutorial/basic/myFramesetLayout.jsp" &gt;<br />&lt;tiles:put name="title" content="My first frameset page" direct="true" /&gt;<br />&lt;tiles:put name="header" content="/tutorial/common/header.jsp" direct="true"/&gt;<br />&lt;tiles:put name="footer" content="/tutorial/common/footer.jsp" direct="true"/&gt;<br />&lt;tiles:put name="menu" content="/tutorial/basic/menu.jsp" direct="true"/&gt;<br />&lt;tiles:put name="body" content="/tutorial/basic/helloBody.jsp" direct="true"/&gt;<br />&lt;/tiles:insert&gt;</p>
		<p>/tutorial/basic/myFramesetLayout.jsp<br />---------------------------------<br />&lt;html&gt;<br />&lt;head&gt;<br />&lt;title&gt;&lt;tiles:get name="title"/&gt;&lt;/title&gt;<br />&lt;/head&gt;</p>
		<p>&lt;frameset rows="73, *, 73"&gt;<br />&lt;frame src="&lt;%=request.getContextPath()%&gt;&lt;tiles:get name="header" /&gt;" name="header" &gt;<br />&lt;frame src="&lt;%=request.getContextPath()%&gt;&lt;tiles:get name="body" /&gt;" name="body" &gt;<br />&lt;frame src="&lt;%=request.getContextPath()%&gt;&lt;tiles:get name="footer" /&gt;" name="footer" &gt;<br />&lt;/frameset&gt;</p>
		<p>&lt;/html&gt;<br />插入/tutorial/basic/myFramesetLayout.jsp<br />并把title的值设定为:My first frameset page<br />header设定为/tutorial/common/header.jsp</p>
		<p>四：后记<br />Tiles的使用在他的文档里面写的比较详细。以上是一些简单和基本的使用。具体的文档可以看Struts里面的一个tiles-documentation.war的包。但即使是这个包也不是很全。可以通过上的的连接到作者的主页上去找。个人觉得使用Tiles在做企业运用的时候可能不如在做网站那样更能体现优越性。但在系统开始设计的时候考虑并规划好整个UI，那在修改和维护的时候将节省不少的工作量，因为通常UI的确定在代码编写结束和完成，所有尽可能的使用多个子页面构成一个页面，后面的美化和维护就比直接维护一个很大的页面容易</p>
<img src ="http://www.blogjava.net/rendong/aggbug/61416.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rendong/" target="_blank">rendong</a> 2006-08-02 23:09 <a href="http://www.blogjava.net/rendong/archive/2006/08/02/61416.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>