您的位置:首页 > 编程语言 > Java开发

Struts中Title标签简介

2009-10-12 09:15 239 查看
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...>。插入也可以通过下面的方法来完成:指定一个作为Strutsforward的路径的自定义名;或者指定一个作为Strutsaction的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:insertpage="/layouts/commonLayout.jsp"flush="true"/>


这个例子将tag中指定的页面插入到整个页面中来。page属性可以是指向任何现存网络资源有效的URL。

(2)插入一个Tiles同时传递属性值:

<tiles:insertpage="/layouts/classicLayout.jsp"flush="true">

<tiles:putname="title"value="PageTitle"/>

<tiles:putname="header"value="/common/header.jsp"/>

<tiles:putname="footer"value="/common/footer.jsp"/>

<tiles:putname="menu"value="/common/menu.jsp"/>

<tiles:putname="body"value="/tiles/mainBody.jsp"/>

</tiles:insert>

(说明:将classicLayout.jsp页面插入到当前页面中,在classicLayout.jsp中分别定义了
<title><tiles:getAsStringname="title"/></title>注释:表示classicLayout.jsp中在此处引用了“PageTitle”字符串作为header
<titles:insertattribute="header"/>注释:表示classicLayout.jsp中在此处引用了common/header.jsp作为header
<titles:insertattribute="footer"/>注释:表示classicLayout.jsp中在此处引用了common/footer.jsp作为footer
<titles:insertattribute="menu"/>注释:表示classicLayout.jsp中在此处引用了common/header.jsp作为header
<titles:insertattribute="body"/>注释:表示classicLayout.jsp中在此处引用了common/body.jsp作为body)

这个例子插入了指定的页面,同时传递了它的属性值。属性值存储在Tiles的context中,这个context也被传递到插入的tag中,然后可以用它们的名字进行访问。

(3)作为String来得到一个属性

<tiles:getAsStringname="title"/>

这个例子得到”tilte”属性的值,并在当前输出流中把它作为字符串打印出来。toString()方法应用于该属性值,允许作为值来传递任何对象。

(4)通过引用属性来插入Tiles

<tiles:insertattribute='menu'/>


该例子插入了被“menu”属性值引用的Tiles。当前的Tiles的context首先获得该属性值,然后它再用来作为页面目标而插入。

(5)典型的页面布局
这个例子是典型的header-footer-menu-body组合而成的页面布局。

<tr>

<tdcolspan="2"><tiles:insertattribute="header"/></td>

</tr>

<tr>

<tdwidth="140"valign="top">

<tiles:insertattribute='menu'/>

</td>

<tdvalign="top"align="left">

<tiles:insertattribute='body'/>

</td>

</tr>

<tr>

<tdcolspan="2">

<tiles:insertattribute="footer"/>

</td>

</tr>

</table>

</body>

</html>

该布局可以在一个JSP页面中声明(比如:/layouts/classicLayout.jsp)。它可以与在例子(2)中描述的tag一起结合运用。

3.Tiles的定义(Definitions)

Tiles的definition包含一个带有TilesURL的逻辑名和一些属性值。定义并不插入Tiles。插入是在后来用definition的名字来完成的。一个definition的逻辑名可以在站点中使用多次,实现对Tiles的轻松复用。
Tiles的definition可以继承自另外一个definition,并且能够重载其属性或者添加属性。这使得通过一些属性来构造不同的definition变得更加容易。比如,你可以定义一个“父类”的definition同时定义主要的header,menu,footer,和一个默认的title。然后令你的每一个页面的definitions继承自这个“父类”的definition并重载title和body属性。
Tiles的definitions的定义可以在JSP页面中进行,也可以在一个或者多个中心控制文件中进行。为了使中心控制文件中定义的definitions有效,你需要初始化“定义池”(definitionsfactory),这个定义池能够解释文件中的definitions并把它们提供给Tiles框架。

4.使定义池生效

为了使在文件中定义的Tilesdefinitions生效,你需要写下这些文件并初始化定义池。
初始化根据你是否应用Struts或者所用的Struts版本的不同而不同(这里只介绍了Struts1.1版本的配置)。

Struts1.1

应用Tiles的插件(plug-in)使Tilesdefinition生效。该插件创建定义池并把它传递给带有参数的配置对象。参数可以在web.xml文件中配置,也可以作为插件的参数来配置。插件首先从web.xml中读取参数,然后,重载那些在插件中也配置了的参数。所有的参数都是可选的,也可以忽略它们。插件应该在每一个struts-config.xml文件中声明:

<plug-inclassName="org.apache.struts.tiles.TilesPlugin">

<set-propertyproperty="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-propertyproperty="moduleAware"value="true"/>

<set-propertyproperty="definitions-parser-validate"value="true"/>

</plug-in>

ldefinitions-config:(可选)
指定配置文件的名称。可以有多个文件名,之间用逗号隔开。
ldefinitions-parser-validate:(可选)
指定XML解释器是否验证Tiles的配置文件。
true::验证。DTD应该在文件开头指定(默认情况)
false:不验证。
lmoduleAware:(可选)
指定Tiles的定义池是否已模块对应化。如果是true(默认),对应每一个Struts模块都有一个定义池。如果是false,就会有一个为所有模块共用的定义池。对应后者,仍然需要每一个模块都对应定义一个plug-in插件。定义池将要以在第一个plug-in插件(一般是与默认的模块相关联的那个插件)中发现的参数值来初始化定义池。
true:Tiles框架是模块对应。
false:Tiles框架在所有的模块中只有一个共用的定义池(默认)。
ltilesUtilImplClassname:(可选——高级用户使用)
指定所用的TilesUtil的实现的类名。指定的类应该是TilesUtilStrutsImpl类的子类。这一项使moduleAware选项失效。
指定"TilesUtilStrutsImpl"相当于moduleAware=false。
指定"TilesUtilStrutsModuleImpl"相当于moduleAware=true.
当首次遇到这一项时,它被执行,并且只被执行一次。为了避免出现问题,建议在所有的TilesPlugin声明中都用相同的值。

TilesPlugin类为每一个Struts模块创建了一个定义池。

如果moduleAware处于false状态,那么就为所有的模块创建一个共用的定义池。对于后者来说,定义池就会以在第一个plugin中发现的参数来初始化。在每一个模块中应该声明对应的plugin,并且在整个应用程序当中,moduleAware都应该处于同一状态。

Tiles中的路径都是相对于maincontext来说的。
你不必指定具体的TilesRequestProcessor,plug-in会自动处理,然而,你想指定你自己的RequestProcessor,那么它应该继承自TilesRequestProcessor。plug-in会检查这项约束。

5.定义文件的语法

定义文件的语法可以在tiles-config_1_1.dtd文件中找到。
下面是一个简单的例子:

<!DOCTYPEtiles-definitionsPUBLIC

"-//ApacheSoftwareFoundation//DTDTilesConfiguration//EN"

"http://jakarta.apache.org/struts/dtds/tiles-config_1_1.dtd">


<!--DefinitionsforTilesdocumentation-->

<tiles-definitions>


<!--==========================================================-->

<!--Masterdefinition-->

<!--==========================================================-->

<!--Mainpagelayoutusedasarootforotherpagedefinitions-->


<definitionname="site.mainLayout"path="/layouts/classicLayout.jsp">

<putname="title"value="TilesBlankSite"/>

<putname="header"value="/tiles/common/header.jsp"/>

<putname="menu"value="site.menu.bar"/>

<putname="footer"value="/tiles/common/footer.jsp"/>

<putname="body"value="/tiles/body.jsp"/>

</definition>


<!--==========================================================-->

<!--Indexpagedefinition-->

<!--==========================================================-->

<!--Thisdefinitioninheritsfromthemaindefinition.

Itoverloadsthepagetitleandthebodyused.

Usethesamemechanismtodefinenewpagessharingcommon

properties(hereheader,menu,footer,layout)

-->


<definitionname="site.index.page"extends="site.mainLayout">

<putname="title"value="TilesBlankSiteIndex"/>

<putname="body"value="/tiles/body.jsp"/>

</definition>


</tiles-definition>


6.调试(Debugging)

若想调试由Tiles组建的页面,可以遵循下面的建议:

l独立的检查每一个Tiles。直接访问那些嵌套的Tiles来测试它们是否运行正常。
是Tiles日志生效,详情请查阅commons-logging包的帮助文件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: