我发现在看到的这些关于Tiles的文档中,Struts文档中关于这方面的介绍对于初学者来说是最好的(个人认为),所以" />

Struts中Tiles标签简介

系统 1529 0
Tiles简介<!-- href="http://dev.21tx.com/web/xml/" _fcksavedurl="http://dev.21tx.com/web/xml/" target="_blan-->XML:namespace prefix = o ns = "urn:schemas-microsoft-com: Office :office" />
我发现在看到的这些关于Tiles的文档中, Struts 文档中关于这方面的介绍对于初学者来说是最好的(个人认为),所以就把它译了过来,对于想了解这方面东西又不想看E文的同胞,可以参考一下。<nobr oncontextmenu="return false;" onmousemove="kwM(5);" id="key5" onmouseover="kwE(event,5, this);" style="COLOR: #6600ff; BORDER-BOTTOM: #6600ff 1px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" onclick="return kwC();" onmouseout="kwL(event, this);" target="_blank">翻译</nobr>的漏洞在所难免,希望大家对照原文看,出现的错误希望大家帮我指正,谢谢。

1.简介
Tiles框架可以令我们组合可以复用的Tiles来搭建网页。例如,下图中的页面就是通过组合一个header, 一个footer, 一个menu 和一个body搭建起来的。
ASPectratio="t" v:ext="edit">
每一个Tiles(header, menu, body, ...)都是一个 JSP 页面,它们也可以通过组合其他的Tiles来搭建。
应用Tiles就好比是应用 Java 的<nobr oncontextmenu="return false;" onmousemove="kwM(0);" id="key0" onmouseover="kwE(event,0, this);" style="COLOR: #6600ff; BORDER-BOTTOM: #6600ff 1px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" onclick="return kwC();" onmouseout="kwL(event, this);" target="_blank">方法</nobr>:需要你定义Tiles(方法体),然后你才能够在任何你需要的地方“调用”该方法体,并传递一些参数。在Tiles中,为了避免与request<nobr oncontextmenu="return false;" onmousemove="kwM(6);" id="key6" onmouseover="kwE(event,6, this);" style="COLOR: #6600ff; BORDER-BOTTOM: #6600ff 1px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" onclick="return kwC();" onmouseout="kwL(event, this);" target="_blank">参数</nobr>相混淆,参数(parameters)被称为属性(attributes)。
Tiles的方法体(也可以说是内容——译者注)可以是一个简单的JSP页面, 或者是一个Struts的动作(action),或者任何一个指向现存的网页资源的URI。
插入或者调用Tiles可以通过在JSP中的任何位置置入如下tag来完成:<tiles:insert ...>。插入也可以通过下面的方法来完成:指定一个作为Struts forward的路径的自定义名;或者指定一个作为Struts action的input,forward或者include属性的自定义名。
Tiles的方法体是用来创建版面布局,可复用部分等的,而Tiles的插入操作是用来插入Tiles的。同一个Tiles可以在同一个站点甚至同一个页面被重用多次。
Tiles的插入可以与一个在Tiles中称作“definition”的逻辑名联系起来。一个Tiles的definition包含一个逻辑名,一个主体页面和一些属性值。definition的声明并不插入与其相关联的Tiles方法体,它只是让Tiles与它的逻辑名关联起来。可以在任何能够插入Tiles地方运用定义的逻辑名,这样与其对应的Tiles及其属性就被插入进来了。
Tiles的definition的定义可以在JSP页面中进行,也可以在一个或者多个中心控制文件中进行。Definition可以继承于另外一个Tiles的definition,重载一些属性,添加一些新的属性等等。这就允许“父类”的definition定义一些通用的layout, header, menu, footer. 所有其他继承于该父类的definition可以简单地通过改变其definition来改变整个页面。
2.简单的例子
(1)插入到JSP页面中:
    
      <tiles:insert 
      
        page
      
      ="/layouts/commonLayout.jsp" flush="true" />
    
  
    
    
  
这个例子将tag中指定的页面插入到整个页面中来。page属性可以是指向任何现存<nobr oncontextmenu="return false;" onmousemove="kwM(4);" id="key4" onmouseover="kwE(event,4, this);" style="COLOR: #6600ff; BORDER-BOTTOM: #6600ff 1px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" onclick="return kwC();" onmouseout="kwL(event, this);" target="_blank">网络</nobr>资源有效的URL。
(2)插入一个Tiles同时传递属性值:
    
      <tiles:insert page="/layouts/classicLayout.jsp" flush="true">
    
  
    
      <tiles:put name="title"value="Page Title" />
    
  
    
      <tiles:put name="header" value="/common/header.jsp" />
    
  
    
      <tiles:put name="footer" value="/common/footer.jsp" />
    
  
    
       <tiles:put name="menu" value="/common/menu.jsp" />
    
  
    
      <tiles:put name="body" value="/tiles/mainBody.jsp" />
    
  
    
      </tiles:insert>
    
  
这个例子插入了指定的页面,同时传递了它的属性值。属性值存储在Tiles的context中,这个context也被传递到插入的tag中,然后可以用它们的名字进行访问。
(3)作为String来得到一个属性
<tiles:getAsString name="title" />
这个例子得到 ”tilte” 属性的值,并在当前输出流中把它作为字符串打印出来。toString() 方法应用于该属性值,允许作为值来传递任何对象。
(4)通过引用属性来插入Tiles
    
      <tiles:insert attribute='menu' />
    
  
该例子插入了被 “menu” 属性值引用的Tiles。当前的Tiles的context首先获得该属性值,然后它再用来作为页面目标而插入。
(5)典型的页面布局
这个例子是典型的header-footer-menu-body 组合而成的页面布局。
    
      <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>
    
  
该布局可以在一个JSP页面中声明(比如:/layouts/classicLayout.jsp)。它可以与在例子(2)中描述的tag一起结合运用。
3.Tiles的定义(Definitions)
Tiles的definition包含一个带有Tiles URL的逻辑名和一些属性值。定义并不插入Tiles。插入是在后来用definition的名字来完成的。一个definition的逻辑名可以在站点中使用多次,实现对Tiles的轻松复用。
Tiles的definition可以继承自另外一个definition,并且能够重载其属性或者添加属性。这使得通过一些属性来构造不同的definition变得更加容易。比如,你可以定义一个“父类”的definition同时定义主要的 header, menu, footer, 和一个默认的 title。然后令你的每一个页面的definitions继承自这个“父类”的definition并重载title和body属性。
Tiles的definitions的定义可以在JSP页面中进行,也可以在一个或者多个中心控制文件中进行。为了使中心控制文件中定义的definitions有效,你需要初始化“定义池”(definitions factory),这个定义池能够解释文件中的definitions并把它们提供给Tiles框架。
4.使定义池生效
为了使在文件中定义的Tiles definitions生效,你需要写下这些文件并初始化定义池。
初始化根据你是否应用Struts或者所用的Struts版本的不同而不同(这里只介绍了Struts1.1版本的配置)。
Struts1.1
应用Tiles的插件(plug-in)使Tiles definition生效。该插件创建定义池并把它传递给带有参数的配置对象。参数可以在 Web .xml文件中配置,也可以作为插件的参数来配置。插件首先从web.xml中读取参数,然后,重载那些在插件中也配置了的参数。所有的参数都是可选的,也可以忽略它们。插件应该在每一个struts-config.xml文件中声明:
    
      <plug-in className="org.apache.struts.tiles.TilesPlugin" >
    
  
    
       <set-property property="definitions-config" 
    
  
    
       value="/WEB-INF/tiles-defs.xml,
    
  
    
       /WEB-INF/tiles-tests-defs.xml,/WEB-INF/tiles-tutorial-defs.xml,
    
  
    
       /WEB-INF/tiles-examples-defs.xml" />
    
  
    
       <set-property property="moduleAware" value="true" />
    
  
    
       <set-property property="definitions-parser-validate" value="true" />
    
  
    
      </plug-in>
    
  
l definitions-config:(可选)
指定配置文件的名称。可以有多个文件名,之间用逗号隔开。
l definitions-parser-validate:(可选)
指定XML解释器是否验证Tiles的配置文件。
true::验证。DTD应该在文件开头指定(默认情况)
false:不验证。
l moduleAware:(可选)
指定Tiles的定义池是否已模块对应化。如果是true(默认),对应每一个Struts模块都有一个定义池。如果是false,就会有一个为所有模块共用的定义池。对应后者,仍然需要每一个模块都对应定义一个plug-in插件。定义池将要以在第一个plug-in插件(一般是与默认的模块相关联的那个插件)中发现的参数值来初始化定义池。
true:Tiles框架是模块对应。
false:Tiles框架在所有的模块中只有一个共用的定义池(默认)。
l tilesUtilImplClassname:(可选——<nobr oncontextmenu="return false;" onmousemove="kwM(1);" id="key1" onmouseover="kwE(event,1, this);" style="COLOR: #6600ff; BORDER-BOTTOM: #6600ff 1px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" onclick="return kwC();" onmouseout="kwL(event, this);" target="_blank">高级</nobr>用户使用)
指定所用的TilesUtil的实现的类名。指定的类应该是TilesUtilStrutsImpl类的子类。这一项使moduleAware选项失效。
指定 "TilesUtilStrutsImpl"相当于moduleAware = false。
指定 "TilesUtilStrutsModuleImpl" 相当于moduleAware = true.
当首次遇到这一项时,它被执行,并且只被执行一次。为了避免出现问题,建议在所有的TilesPlugin声明中都用相同的值。
TilesPlugin类为每一个Struts模块创建了一个定义池。
如果moduleAware处于false状态,那么就为所有的模块创建一个共用的定义池。对于后者来说,定义池就会以在第一个plugin中发现的参数来初始化。在每一个模块中应该声明对应的plugin,并且在整个应用<nobr oncontextmenu="return false;" onmousemove="kwM(2);" id="key2" onmouseover="kwE(event,2, this);" style="COLOR: #6600ff; BORDER-BOTTOM: #6600ff 1px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" onclick="return kwC();" onmouseout="kwL(event, this);" target="_blank">程序</nobr>当中,moduleAware都应该处于同一状态。
Tiles中的路径都是相对于main context来说的。
你不必指定具体的TilesRequestProcessor,plug-in会自动处理,然而,你想指定你自己的RequestProcessor,那么它应该继承自TilesRequestProcessor。plug-in会检查这项约束。
5.定义文件的语法
定义文件的语法可以在 tiles-config_1_1.dtd 文件中找到。
下面是一个简单的例子:
  
    
      <!DOCTYPE tiles-definitions PUBLIC
    
  
    
       "-//Apache Software Foundation//DTD Tiles Configuration//EN"
    
  
    
       "http://jakarta.apache.org/struts/dtds/tiles-config_1_1.dtd">
    
  
    
    
  
    
      <!-- Definitions for Tiles documentation -->
    
  
    
      <tiles-definitions>
    
  
    
    
  
    
      <!-- ========================================================== -->
    
  
    
      <!-- Master definition -->
    
  
    
       <!-- ========================================================== -->
    
  
    
      <!-- Main page layout used as a root for other page definitions -->
    
  
    
    
  
    
      <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" />
    
  
    
       <put name="footer" value="/tiles/common/footer.jsp" />
    
  
    
       <put name="body" value="/tiles/body.jsp" />
    
  
    
      </definition>
    
  
    
    
  
    
      <!-- ========================================================== -->
    
  
    
      <!-- Index page definition -->
    
  
    
      <!-- ========================================================== -->
    
  
    
       <!-- This definition inherits from the main definition.
    
  
    
       It overloads the page title and the body used.
    
  
    
       Use the same mechanism to define new pages sharing common 
    
  
    
       properties (here header, menu, footer, layout)
    
  
    
       -->
    
  
    
    
  
    
      <definition name="site.index.page" extends="site.mainLayout" >
    
  
    
       <put name="title"value="Tiles Blank Site Index" />
    
  
    
       <put name="body" value="/tiles/body.jsp" />
    
  
    
      </definition>
    
  
    
    
  
    
      </tiles-definition>
    
  
6.调试 (Debugging)
若想调试由Tiles组建的页面,可以遵循下面的建议:
l 独立的检查每一个Tiles。直接<nobr oncontextmenu="return false;" onmousemove="kwM(7);" id="key7" onmouseover="kwE(event,7, this);" style="COLOR: #6600ff; BORDER-BOTTOM: #6600ff 1px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" onclick="return kwC();" onmouseout="kwL(event, this);" target="_blank">访问</nobr>那些嵌套的Tiles来<nobr oncontextmenu="return false;" onmousemove="kwM(3);" id="key3" onmouseover="kwE(event,3, this);" style="COLOR: #6600ff; BORDER-BOTTOM: 0px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" onclick="return kwC();" onmouseout="kwL(event, this);" target="_blank">测试</nobr>它们是否运行正常。
Tiles 日志生效,详情请查阅 commons-logging 包的帮助文件。

Struts中Tiles标签简介


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论