在我们已知的创建符合式网页的方法中,包括:
采用基本的JSP语句创建符合式网页。这种方法会导致JSP代码的大量冗余,后果是重复编码、多处修改,大大增加开发和维护成本。
采用JSP的include指令创建符合式网页。和第一种方案相比,尽管采用JSP的include指令创建的复合式网页减少了重复代码,但不能完全避免代码冗余。同时JSP文件的数量增加了,使软件的复杂度也增加了。
采用<tiles:insert>标签创建符合式网页。这种方法和JSP的include指令拥有相同的功能,同时也有着相同的利弊。
采用Tiles模板创建符合式网页。Tiles模板是一种描述页面布局的JSP页面,Tiles模板只定义了Web页面的样式,而不指定内容。在Web页面运行时,才把特定的内容插入到模板中。使用Tiles模板的步骤是:
(1) 安装Tiles标签库所需要的文件;
(2) 定义模板文件,模板文件是指定义了网页布局,但不包含具体网页内容的JSP页面;
(3) 在页面中运用定义好的Tiles模板,运用Tiles模板是通过<tiles:insert>标签和<tiles:put>子标签来定义的。
Struts还在Tiles框架中引入了Tiles组件的概念。Tiles组件可以代表一个完整的网页,也可以代表网页的一部分。简单的Tiles组件可以组成复杂的Tiles组件,或被扩展为复杂的Tiles组件。Tiles组件的使用步骤:
(1) 安装Tiles标签库所需要的文件;
(2) 定义模板文件,模板文件是指定义了网页布局,但不包含具体网页内容的JSP页面。在模板JSP页面中通过<tiles:insert attribute="pageName"> 标签来预留页面将要加载的位置。
(3) 在专门的XML文件中配置Tiles组件。如下配置一个default-definition组件(其中pageName与<tiles:insert>标签中的pageName对应):
<tiles:definitions>
<definition name="default-definiton" path="...../layout.jsp">
<put name="pageName" value="...../jspName.jsp">
......
</definiton>
</tiles-definitions>
(4) 在Struts配置文件中配置TilesPlugin插件,代码如下:
<plug-in className="org.apache.struts.tiles.TilesPlugin">
<set-property property="definitions-config" value="/WEB-INF/tiles-defs.xml"/>
<set-property property="definitions-parser-validate" value="true"/>
</plug-in>
TilesPlugin插件用于加载Tiles组件的配置文件,在<plug-in>元素中包含几个<set-property>子元素,用于向
TilesPlugin插件传入附加的参数:
definitions-config参数:指定Tiles组件的配置文件。如果有多个配置文件,则它们之间用逗号分隔。
definitions-parser-validate参数:指定XML解析器是否验证Tiles配置文件,可选值包括true和false,默认值为
true。
(5) 为保证TilesPlugin插件在Web应用启动时加载,在web.xml文件中配置ActionSerlvet(在MyEclipse中添加Struts支持,会默认配置好ActionServlet)。ActionServlet控制器在初始化时会加载所有插件。
(6) 最后在需要应用Tiles组件的JSP页面中通过<tiles:insert definiton="default-definiton">标签,插入Tiles组件。(其中default-definiton对应于(3)中的default-definiton)
如果Tiles组件是一个完整的网页,还可以直接通过Struts Action来访问Tiles组件。只要如下配置好一个action就可以在页面中访问:
<action path="/default"
type="org.apache.struts.actions.ForwardAction"
parameter="definitions-config">
</action>
此外,Tiles组件还有两个非常有用的特性:
Tiles组件的可组合性。Tiles组件作为一种可重用的组件,可以像搭积木一样,把简单的Tiles组件组装成复杂的Tiles组件:
<tiles-definitions>
<definiton name="side-definiton" path="......./sidelayout.jsp">
<put name="top" value="top.jsp">
<put name="bottom" value="bottom.jsp">
</definiton>
<definiton name="content-definiton" path="....../contentlayout.jsp>
<put name="side" value="side-definiton" type="definiton">
<put name="content" value="content.jsp">
</definiton>
</tiles-definitons>
Tiles组件的可扩展性。Tiles组件可以像Java类一样,被子Tiles组件继承,子Tiles拥有父Tiles组件的所有特性,从而进一步消除代码冗余。
<tiles-definitions>
<definiton name="base-definiton" path="......./baselayout.jsp">
<put name="header" value="header.jsp">
<put name"content" value="">
<put name="footer" value="footer.jsp">
</definiton>
<definiton name="content-definiton" extends="base-definiton">
<put name="content" value="content.jsp">
</definiton>
</tiles-definitons>