本篇文章简单地介绍一下在struts中使用tiles的问题。
1、tiles框架简介:
大家在编程实践中都会对代码重用有一些切身体会,Web页面的制作当然也不例外。比如:做一个网站,大部分页面都是由页头、主体页及版权页组成。其中,页头及版权页的内容是不变的,而每页的主体内容页则是不相同的。根据代码重用的要求,我们不应该在每页重写页头及版权页的代码。Jsp也的确给我们提供了静态和动态包含的方式让我们来重用这些代码,也就是通过
和
的形式来达到代码重用的目的。但不幸的是:无论采用上述那种形式,都存在一些不尽如人意的地方。如,你如果用这些方式从事过国际化编程,你将会为字符集的问题搞得无所适从。为了解决这些问题,一个名为tiles的框架应运而生。所谓tile,其实就是网页中的一个区域。Tiles框架有如下一些特点:
具有模板能力
能动态构建和装载页面
屏幕定义
对tile和布局的重用支持
支持国际化
从tiles框架的发展历史来看,它开始并不是struts的组成部分。正如我们在本系列的第一篇所说的那样:"它对其他技术和框架显示出很好的融合性"。现在,它已经成为struts的基本组成部分之一。
2、在struts中使用tiles框架的条件
首先,确保如下一些文件在应用程序的WEB-INF/lib目录中:
commons-digester.jar
commons-beanutils.jar
commons-collections.jar
commons-logging.jar |
其次,还要将tiles的tld文件struts-tiles.tld以及struts-template.tld放在应用程序的WEB-INF目录中。这里顺便对本系列前面一些文章中读者提出的问题做一些解释:
本系列文章的每个选题都是根据笔者在论坛中收集的一些热点问题,结合自己开发的一些项目(有很多就是为了便于初学者的理解将实际项目做一些适当的简化)写成的。因为对那些包之类的文件对那个主题是必须的往往没有足够的时间来一一加以验证,有时写多了,有时又写掉了。
所以,有些读者反映照着文章介绍的步骤不能得到正确的结果。首先,在此向这些读者表示歉意,笔者以后会尽量注意一些。说实在的,要完全避免也有困难,毕竟写这些东西只是业余的事情,笔者还有许多本职工作要干,请大家原谅。有一个折中的方案就是:读者在明白基本原理之后采用诸如jbx之类的开发工具,这样在很大程度上可以避免这些问题的干扰,毕竟正常开发大多还是要使用这些工具的,熟悉它们也没有什么坏处。
3、使用tiles构建网页的过程
下面,我们通过构建一个本篇开头提及的那种简单页面来体会一下tiles构建网页的过程。
首先,在struts-config.xml中加入tiles插件,代码如下:
<plug-in className="org.apache.struts.tiles.TilesPlugin">
<set-property property="definitions-config" value="/WEB-INF/tiles-defs.xml" />
</plug-in> |
其次,创建tiles-defs.xml文件,并把它放在应用程序的WEB-INF目录下,其代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE tiles-definitions PUBLIC "-
//Apache Software Foundation
//DTD Tiles Configuration 1.1
//EN" "http://jakarta.apache.org/struts/dtds/tiles-config_1_1.dtd">
<tiles-definitions>
<definition name="testLayout" path="/testLayout.jsp">
<put name="title" value="my tiles test" />
<put name="header" value="/header.jsp" />
<put name="body" value="/body.jsp" />
<put name="footer" value="/right.jsp" />
</definition>
</tiles-definitions> |
再次,创建一个名为testLayout.jsp的布局模板文件,代码如下:
<%@ taglib uri="/WEB-INF/struts-tiles.tld" prefix="tiles"%>
<html>
<head>
<title><tiles:get name="title"/>
</title>
</head>
<body>
<table>
<tr>
<td height="80" width="778" bgcolor="#aa0000">
<tiles:insert attribute="header"/>
</td>
</tr>
<tr>
<td height="360" width="778" bgcolor="#00aa00">
<tiles:insert attribute="body"/>
</td>
</tr>
<tr>
<td height="80" width="778" bgcolor="#0000aa">
<tiles:insert attribute="footer"/>
</td>
</tr>
</table>
</body>
</html> |
从该文件的代码可以看出:
<tiles:insert 标签中的attribute属性值
是由tiles-defs.xml中定义的逻辑名来表示的 |
这为基于该模板的网页动态地装入tile奠定了基础。最后,创建几个用于实验的.jsp文件,它们包括header.jsp、body.jsp、body2.jsp以及right.jsp。
header.jsp的代码如下:
<%@ page contentType="text/html; charset=UTF-8" %>
<html>
<head>
<title>
header
</title>
</head>
<body bgcolor="#ffffff">
<h1> |
这是页头部分
body.jsp的代码如下:
<%@ page contentType="text/html; charset=UTF-8" %>
<html>
<head>
<title>
body
</title>
</head>
<body bgcolor="#ffffff">
<h1> |
这是内容部分
body2.jsp的代码如下:
<%@ page contentType="text/html; charset=UTF-8" %>
<html>
<head>
<title>
body
</title>
</head>
<body bgcolor="#ffffff">
<h1> |
这是内容部分2
right.jsp的代码如下:
<%@ page contentType="text/html; charset=UTF-8" %>
<html>
<head>
<title>
right
</title>
</head>
<body bgcolor="#ffffff">
<h1> |
这是版权页
4、演示tiles的使用效果
为此,我们还要建两个.jsp文件,它们分别名为:page1.jsp和page2.jsp
其中,page1.jsp的代码如下:
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib uri="/WEB-INF/struts-tiles.tld" prefix="tiles" %>
<tiles:insert page="/testLayout.jsp" flush="true">
<tiles:put name="title" content="My first page" direct="true"/>
<tiles:put name="header" value="/header.jsp"/>
<tiles:put name="body" value="/body.jsp"/>
<tiles:put name="footer" value="/right.jsp"/>
</tiles:insert> |
page2.jsp的代码如下:
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib uri="/WEB-INF/struts-tiles.tld" prefix="tiles" %>
<tiles:insert page="/testLayout.jsp" flush="true">
<tiles:put name="title" content="My second page" direct="true"/>
<tiles:put name="header" value="/header.jsp"/>
<tiles:put name="body" value="/body2.jsp"/>
<tiles:put name="footer" value="/right.jsp"/>
</tiles:insert> |
从这两个文件可以看出:
文件的布局是与模板相对应,而这两个文件的body部分则对应着不同的.jsp文件。可以想象,如果要对页头和版权信息做修改,只要对header.jsp和right.jsp做相应的修改,则修改的结果则会反映到page1.jsp和page2.jsp页面上。
以上,只是对tiles的使用做了一个简单的介绍,它还有其他一些特征如:tile的定义可以扩展等等,值得大家深入探讨。至于上面各种文件中出现的一些标签,大多可以从标签本身看出其含义,实在不清楚的也可以参考这方面的有关资料,如果详细在这里讲解这些东西会显得冗长乏味。
现在,如果您在浏览器中输入:http://127.0.0.1:8080/mystruts/page1.jsp就可以看到网页效果了;对比输入:http://127.0.0.1:8080/mystruts/page2.jsp 看看网页的变化。就可以体会到使用tiles框架的作用了。
下一篇文章,笔者准备介绍一下用tiles框架构建frame形式的网页的问题。之所以准备写它们是因为frame形式的网页应用还是比较广泛,而且笔者发现这方面的参考文献比较少见。另外,本系列第八篇发表后,就有读者来信提出过这样的要求,希望整理出来的东西能对这部分读者有所帮助。
参考文献:
《Programming Jakarta Struts》Chuck Cavaness著