Jakarta Struts编程:使用Tiles,第二部分
作者:Chuck Cavaness 陈正勇(zhengyongchen@21cn.com)译
本文是从《Programming Jakarta Struts》摘录的系列文章的第二部分,我们将学习如何安装和配置Tiles,并全面了解tiles。
安装和配置Tiles
在您能够使用Tiles 框架之前,您必须确保它已安装并正确的配置在web容器中。Tiles框架并不依赖于某种特定的容器,您要做的就是获得所需的文件,并将它们放到web应用程序的正确位置上。
下载Tiles
Tiles框架包含在struts发行版中。先前版本中,它位于contrib文件夹中,但现在是核心的一部分。您还可以在http://www.lifl.fr/~dumoulin/tiles/index.html找到最新的源程序、二进制发行版本,以及其它一些有用的信息。
安装所需的JAR文件和相关文件
第一步是安装所需文件。对于Tiles来说,以下文件必须位于WEB-INF/lib目录中:
u tiles.jar
u commons-digester.jar
u commons-beanutils.jar
u commons-collections.jar
u commons-logging.jar
如果您在使用struts,这些文件就已经存在了,此外您还需要安装Tiles TLD文件到应用程序的WEB-INF目录。
警告:不要为了避免将tiles.jar文件放到每个web应用程序的WEB-INF/lib目录,而将它放到servlet容器的classpath路径中,如果这样做的话会导致抛出ClassNotFoundException异常。
您还应该将tiles-config.dtd文件放到WEB-INF 目录。该DTD文件用来验证Tiles 定义文件(它将在本章的后面部分讲到)。
添加Tiles标签库
就象 其它的JSP标签库一样,在您能使用它们之前,您必须将Tiles标签库加入web应用程序发布描述文件中。给web.xml文件增加如下taglib元素:
<taglib>
<taglib-uri>/WEB-INF/tiles.tld</taglib-uri>
<taglib-location>/WEB-INF/tiles.tld</taglib-location>
</taglib>
如果您在使用标准的struts标签库,那么taglib元素应该已经有了。每个需要使用Tiles标签库的页面必须在顶部包含如下行:
<%@ taglib uri="/WEB-INF/tiles.tld" prefix="tiles" %>
配置Tiles和Struts协同工作
Tiles框架可以和struts一起使用,也可单独使用。取决于您如何使用它,为web应用程序配置tiles可以有几种选择。因为本书是讲struts的,所以我们的重点是如何将其捆绑到struts应用程序。
提示:若使用tiles框架的先前版本,您必须在web.xml文件中配置一个叫做ActionComponentServlet的特殊ActionServlet,而且在Struts的controller元素中还需配置一个RequestProcessor。现在这些不需了-现在有一个tiles插件,它来完成所有的初始化。
如果您正计划使用tiles,该插件是非常需要的。您也可不配置该插件而使用tiles库和struts。但是,配置它也没有什么害处,如果您以后决定使用tiles定义,它还可能节约您的时间。
在struts应用程序中加入tiles插件,请在struts配置文件中加入下列plug-in元素:
<plug-in className="org.apache.struts.tiles.TilesPlugin" >
<set-property property="definitions-config" value="/WEB-INF/tiles-defs.xml" />
<set-property property="definitions-debug" value="2" />
<set-property property="definitions-parser-details" value="2" />
<set-property property="definitions-parser-validate" value="true" />
</plug-in>
在plug-in元素中,您可以加入几个set-property元素给Plugin类传入附加的参数。definitions-config参数指定包含tiles定义的xml文件。如果使用了多个文件名,则它们之间用逗号分隔。
definitions-debug参数指定调试的层次,允许值为:
0 :不输出调试信息。
1 :提供部分调试信息。
2 :提供完整的调试信息。
缺省值为0。
definitions-parser-details参数指定当定义文件被解析时所需要的调试信息的层次,该值传给Commons Digester。所允许的值同definitions-debug参数,缺省值为0。
definitions-parser-validate参数指明解析器是否验证Tiles配置文件,允许值为true和false,缺省值为true。
还有一个叫做definitions-factory-class的参数没有显示出来。您可以创建一个自定义工厂,然后在这里给出类名,缺省值为org.apache.struts.tiles.xmlDefinition.I18NfactorySet。
Tiles纵览
Tiles框架提供一种模板机制,它能将布局和内容的职责分离。本章前面描述的模板,允许您先创建模板,然后在运行时动态地将内容插入到布局中。如果您要根据国际化、用户喜好定制您的站点,或仅仅改变视感(这在每个网站迟早会发生的),您就会发觉模板是一个强有力的机制。Tiles框架具有如下特性:
u 模板能力
u 动态构建和装载页面
u 视屏定义
u 支持tile和布局重用
u 支持国际化
u 支持多通道
模板标签库已经存在于struts框架中相当长的时间了,这些标签可让您使用非常基本的模板方式在web应用程序中组织JSP页面。虽然这些标签对分离web应用程序的布局和内容很有帮助,但tiles框架走的更远,它实际上是模板标签库的超集,具备许多其它特性。
提示:tiles框架先前被称做Components,后来因为Component这个术语被滥用而改名。在tiles文档和源程序中某些地方仍然在沿用老的名称。
Cedric Dumoulin创立了tiles框架,它扩展了模板的概念,提供给开发人员在用JSP技术创建web应用程序时更大的灵活性和自由度。Web应用程序的内容仍然用JSP页面和JavaBeans驱动,但是布局由一个独立的JSP页面或XML文件(后面将提到)指定。
什么是tile?
Tile是web页面的一个区域,一个页面可以只有一个区域组成,或分解为几个区域。图14-1列举了Storefront应用程序的一个例子。
图14-1 Storefront应用程序的区域
一个JSP页面通常由几个区域或tile组成,关于页面没有什么特别的,仅仅是用在tiles框架中,并使用tiles标签库。
Tile最重要的方面在于它是可复用的,对于布局和内容来说都是正确的。不同于大多数JSP页面,tiles组件在应用程序中重复利用,甚至可能跨应用程序复用。而且,tile不复杂。实际上,我们已经看到的大多数例子,包括例14-2到例14-4,都能归类为tiles。
使用布局tile
在tiles的世界里,布局就是我们已经提及的模板。布局起着模板同样的作用,即组合一组tile来指定页面的格式。实际上,例14-2就是一个tile布局。Tiles和struts中包含的模板库在语法上几乎完全一样。
提示:tiles框架是David Geary所定义的标准struts模板标签的功能上的超集,但它提供更多的功能,进一步扩展了模板的概念。
布局也是受到高度评价的tiles。JSP页面,甚至整个应用程序都能复用布局。通常建立一个布局库,用于许多不同的项目中。Tiles框架自带有几个预建立的布局tiles,您可复用它或是根据需要修改它。Tiles框架包含的布局有:
u Classic布局:具有页头、左列菜单、主体、和页脚
u Columns布局:具有多列,每列垂直堆叠
u Center布局:具有页头、左帧、右帧、主体和页脚
u Menu布局:具有链接菜单
u Tabs布局:
u Vertical box布局:
由于tiles的主要目标之一是重用性,因此您可在应用程序中只需少许修改或不修改即可重用这些布局。当然您也可自由地根据需要定制布局。
规划布局
提早规划布局是非常重要的,在网站建立之后再决定外观绝对不知一个好方法。通常由人性化团队、产品管理或是web开发人员自身做这种决定。不管怎样,您应该在开发之前规划布局。
Storefront应用程序的缺省布局在例14-2中介绍了,该布局将作为例子贯穿本章。
传参数给布局
例14-2所示的布局tile是一般的,它并不知道itemdetail.jsp或其它页面的内容。这样做是有目的的,它能让我们在很多页面中复用该布局。与在布局页面中硬编码不同,内容是在运行时作为参数传递给布局页面的。让我们来看看storefront应用程序的signin.jsp tile,如例14-5所示:
例14-5: storefront应用程序的signin.jsp tile
<%@ taglib uri="/WEB-INF/tiles.tld" prefix="tiles" %>
<tiles:insert page="../layouts/storefrontDefaultLayout.jsp" flush="true">
<tiles:put name="header" value="../common/header.jsp"/>
<tiles:put name="menubar" value="../common/menubar.jsp"/>
<tiles:put name="body-content" value="../security/signin-body.jsp"/>
<tiles:put name="copyright" value="../common/copyright.jsp"/>
</tiles:insert>
例14-5中的put标签的作用是提供布局tile,布局由包含的insert标签指定。例14-5中的name属性的值必须和所期望的布局tile相吻合。
提示:insert标签有一可选ignore属性,它可以允许当找不到属性所引用的文件时什么东西都不输出。缺省时,如果属性所指定的文件没有提供的话,运行时异常将抛出。