1.使用Tiles框架
通常来说我们在开发Web应用时都会要求所有Web页面保持一致的外观,比如我们有页头,页脚,菜单和布局。下面如图所示为一种典型的页面布局:
Header
Menu Content
Footer
网页被划分为了4个部分:Header,Menu,Footer和Content。对于同一个站点所有Web页面来说,Header,Menu和Footer部分的内容相同,而只有Content部分内容不同。如果采用基本的JSP语句来编写所有的Web页面,显然会导致大量的重复编码,增加开发成本。
Tiles框架为创建Web页面提供了一种模板机制,它能将页面的布局和内容分离。它允许先创建模板,然后在运行时动态的将内容插入到模板中。Tiles框架是建立在JSP的include 指令基础上,但它提供了比JSP的include指令更强大的功能。Tiles框架具有以下特性:z创建可重用的模板
z动态构建和装载页面
z定义可重用的Tiles组件
z支持国际化
Tiles框架包含以下内容:
z Tiles标签库
z Tiles组件的配置文件
z TilesPlugIn插件
1.1. 采用JSP的include指令,把各个页面包含进来(适合
运营型的网站设计)
1.2. 采用frameset或者iframe的方式创建框架集(适合功
能型的网站)
1.3. 采用<tiles:insert>标签创建复合式网页
步骤1、 安装Tiles标签库所需要的文件;
步骤2、 在l文件中配置<taglib>元素(Servlet2.4规范可以不配置);
步骤3、 创建jsp页面并且插入<tiles:insert>标签;
1.4. 采用Tiles模板创建复合式网页
步骤1、 安装Tiles标签库所需要的文件;
步骤2、 在l文件中配置<taglib>元素(Servlet2.4规范可以不配置);
步骤3、 定义模板文件;
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts/tags-tiles"
prefix="tiles"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html:html locale="true">
<head>
/>
<html:base
<title>index.jsp</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<table align="center" width="785" border="0" cellspacing="1"
cellpadding="1">
<tr>
<th
scope="row">
colspan="2"
/>
attribute="header"
<tiles:insert
</th>
</tr>
<tr>
width="104"
scope="row">
<th
/>
attribute="menu"
<tiles:insert
</th>
width="674">
<td
attribute="content"
/>    <tiles:insert
</td>
</tr>
<tr>
scope="row">
colspan="2"
<th
/>
attribute="footer"
<tiles:insert
</th>
</tr>
</table>
</body>
</html:html>
在模板文件中定义了网页的布局,但是没有指定各部分的具体内容。<tiles:insert attribute="footer" />的attribute属性仅仅定义了待插入的逻辑名,而没有指定文件
名。
步骤4、 在index.jsp中运用Tiles模板。
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts/tags-tiles"
prefix="tiles"%>
<tiles:insert page="layout.jsp" flush="true">
<tiles:put name="header" value="header.jsp" />
<tiles:put name="menu" value="menu.jsp" />
<tiles:put name="content" value="content.jsp" />
<tiles:put name="footer" value="footer.jsp" />
</tiles:insert>
1.5. 采用Tiles模板和Tiles组件创建复合式网页
为了最大程度地提高代码地可重用性和灵活性,Tiles框架引入了Tiles组件地概念。Tiles
组件可以代表一个完整地网页,也可以代表网页的一部分。简单的Tiles组件可以组件成复
杂的Tiles组件,或者被扩展成复杂的Tiles组件。
1.1.1.Tiles组件的基本使用方法
Tiles框架允许在专门的XML文件中配置整个Tiles组件。如以下代码,它描述了整个index.jsp网页:
<definition name="index-difinition" path="/layout.jsp">
<put name="header" value="header.jsp" />
<put name="menu" value="menu.jsp" />
<put name="content" value="content.jsp" />
<put name="footer" value="footer.jsp" />
</definition>
<definition>元素的那么属性指定Tiles组件的名字,path属性指定Tiles组件使用的模板,
<definition>元素的<put>子元素用于向模板中插入具体的网页内容。
以下是使用Tiles组件的步骤。
步骤1、 安装Tiles标签库所需要的文件;
步骤2、 在l文件中配置<taglib>元素(Servlet2.4规范可以不配置);
步骤3、 配置ActionServlet,保证控制器能在初始化时加载TilesPlugin插件;
步骤4、 在Struts配置文件中利用plugin机制配置TilesPlugin插件,代码如下:
<!--
这里定义Tiles插件 -->
className="org.apache.struts.tiles.TilesPlugin">
<plug-in
<!--
指定Tiles的配置文件,如果有多个则使用“,”分割 -->
property="definitions-config"
<set-property
/>
value="/l"
<!--
指定是否验证Tiles的配置文件,默认为true -->
property="definitions-parser-validate"  <set-property
/>
value="true"
</plug-in>
步骤5、 在专门的XML文件中配置Tiles组件。代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE component-definitions PUBLIC "-//Apache Software
Foundation//DTD Tiles Configuration 1.1//EN" "tiles-config_1_1.dtd" >
<component-definitions>
<definition name="index-definition" path="/layout.jsp">
<put name="header" value="header.jsp" />
<put name="menu" value="menu.jsp" />
<put name="content" value="content.jsp" />
<put name="footer" value="footer.jsp" />
</definition>
</component-definitions>
步骤6、 在页面中插入Tiles组件:
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts/tags-tiles"
prefix="tiles"%>
<tiles:insert definition="index-difinition" />
1.1.
2.通过Struts Action来调用Tiles组件
如果Tiles组件代表完整的网页,那么可以直接通过Struts Action来调用Tiles组件。如
3tiles果我们希望访问“index-definition”的Tiles组件,那么我们可以在Struts配置文件中配置如
下Action映射:
<action-mappings>
<action parameter="index-definition" path="/index"
type="org.apache.struts.actions.ForwardAction" />
</action-mappings>
通过Struts Action来调用Tiles组件,可以充分发挥Struts框架负责流程的功能。
此外还可以减少JSP文件的数量。例如,如果直接通过Struts Action来调用“index-definition”的Tiles组件,就不必再创建index.jsp。
1.1.3.Tiles组件的组合
Tiles组件是一种可重用的组件,可以象搭积木一样,把简单的Tiles组件组装成复杂的Tiles 组件。例如可以把名为“index-definition”的Tiles组件左边部分拆分为独立的Tiles 组件,名为“sidebar-definition”。
name="sidebar-definition"
<definition
path="/sidebar-layout.jsp">
<put name="bottom" value="menu.jsp" />
</definition>
<definition name="index-definition2" path="/layout.jsp">
<put name="header" value="header.jsp" />
<put name="menu" value="sidebar-definition"
type="definition" />
<put name="content" value="content.jsp" />
<put name="footer" value="footer.jsp" />
</definition>
1.1.4.Tiles组件扩展
到此为止,我们已经节约了很大篇幅的重复代码,但是我们还可以做得更进一步,我们可以利用Tiles组件的可扩展性来进一步消除冗余代码。解决方法为先定义一个包含这两个Tiles组件的共同内容的父类Tiles组件,命名为“base-definition”,然后让“index-definition”继承这个父类组件。继承的语法如下:
<definition name=”index-definition” extends=”base-definition”/>
改进后的l代码如下:
<definition name="base-definition" path="/layout.jsp">
<put name="header" value="header.jsp" />
<put name="menu" value="menu.jsp" />
<put name="content" value="" />
<put name="footer" value="footer.jsp" />
</definition>
name="index-definition3"
<definition
extends="base-definition">
<put name="content" value="content-extends.jsp" />
</definition>