Tiles简介
我发现在看到的这些关于Tiles的文档中,Struts文档中关于这方面的介绍对于初学者来说是最好的(个人认为),所以就把它译了过来,对于想了解这方面东西又不想看E文的同胞,可以参考一下。翻译的漏洞在所难免,希望大家对照原文看,出现的错误希望大家帮我指正,谢谢。
1.简介
Tiles框架可以令我们组合可以复用的Tiles来搭建网页。例如,下图中的页面就是通过组合一个header, 一个footer, 一个menu 和一个body搭建起来的。
每一个Tiles(header, menu, body, ...)都是一个JSP页面,它们也可以通过组合其他的Tiles来搭建。
应用Tiles就好比是应用Java的方法:需要你定义Tiles(方法体),然后你才能够在任何你需要的地方“调用”该方法体,并传递一些参数。在Tiles中,为了避免与request参数相混淆,参数(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属性可以是指向任何现存网络资源有效的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:(可选——高级用户使用)
指定所用的TilesUtil的实现的类名。指定的类应该是TilesUtilStrutsImpl类的子类。这一项使moduleAware选项失效。
指定 "TilesUtilStrutsImpl"相当于moduleAware = false。
指定 "TilesUtilStrutsModuleImpl" 相当于moduleAware = true.
当首次遇到这一项时,它被执行,并且只被执行一次。为了避免出现问题,建议在所有的TilesPlugin声明中都用相同的值。
TilesPlugin类为每一个Struts模块创建了一个定义池。
如果moduleAware处于false状态,那么就为所有的模块创建一个共用的定义池。对于后者来说,定义池就会以在第一个plugin中发现的参数来初始化。在每一个模块中应该声明对应的plugin,并且在整个应用程序当中,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。直接访问那些嵌套的Tiles来测试它们是否运行正常。
是Tiles日志生效,详情请查阅commons-logging包的帮助文件。本文地址:http://com.8s8s.com/it/it17152.htm