选择显示字体大小

用struts实现模板

作者:        vikram goyal 11/20/2002
原文:        http://www.onjava.com/pub/a/onjava/2002/11/20/templatestruts.html
译者:        holexp
                  email: lidaigang1@sina.com
                        qq: 15761693
                  msn: chenmulong@hotmail.com

如果不用框架来开发一个门户站点将会是一件很困难的事。使用模版可以减少些麻烦。他可以让你在眨眼之间方便的更新与部署站点上的内容。用struts模版标签可以帮助你开发以模版为基础的门户站点。
这篇文章解释了与门户有关的一些基本的模版思想,介绍了struts对于模版的支持,围绕着struts模版标签进行了讨论。本文还阐述了其他的一些模版机制。

获得struts
网络应用程序框架使用mvc模式,能简化网络站点的开发。struts正是这样的一个框架。它提供了类集、标签库和一些能作为web开发基础的接口。struts是jakarta-apache论坛下的一个开源项目。

和所有jakarta的项目一样,struts提供原代码和二进制程序的下载。这篇文章里,我们使用struts的1.1b2版本。虽然这不是一个正式的版本,但这个版本比起1.0.2版有许多重大的改进。

首先,解压缩二进制程序到你所指定的目录。会有一个名为jakarta-struts-1.1-b2的目录创建。在它之下有两个子目录,分别为lib和webapps。lib目录包含我们所需要的所有库、dtd文件、tld文件(标签库定义),我们需要把它们添加到应用程序的classpath中。webapps目录包含了许多.war(web程序包)文件。这些可安装运行的war文件可以放到任意servlet容器的webapps目录中。我们使用tomcat作为servlet容器。

模板基础
我们通过模版可以创建很多结构相似的东西。模版帮助我们将会改变的东西归档打包,避免许多重复的工作。这对创建网络应用程序的确是一件很方便的事情。

在大多数的网络应用程序中,经常需要更换的是内容。jsp很容易做到这一点。因为jsp默认提供一个include机制&mdash;&mdash;<jsp:include>标签。因此一个标准页面可以通过改变include文件来改变它的内容。但是我们怎么能如此方便的改变一个页面的布局呢?当我们需要改变的不仅仅是页面的内容,还包括这个页面的布局时情况会怎么样呢?我们等会就会回答这些问题。

java提供的布局管理机制可以帮我们更形象的理解这些问题。java提出了布局管理器、组件、容器的概念来创建图形界面的应用程序。

当容器中的组件改变时,布局管理器会决定怎么样将新的组件部署到容器中。此外,容器本身也可以做为其他容器的组件从而实现了嵌套。在一些简单的情况下,jsp就可以做为一个网络应用程序的模版,其功能就等价于布局管理器。模版隐藏了web页面布局的实现方法。换句话说,它隐藏了布局的法则。假如布局法则需要改变,那么这些改变将回受限于模版。web页面通过实现这个模版来做其内容上的改变。

如果模版等价于布局管理器,那相应的容器和组件又是什么呢?相应的组件就是实际的内容文件:jsp文件、html文件、图象文件等等。容器将这些可见的组件聚集在一个单元里。一个jsp文件就是一个容器。容器需要关于模版的信息来部署这些组件。用java gui举例来说,一个面板(容器,集合单元)可以包含按钮和文本区(组件和内容),使用一个网格布局管理器(gridlayout)来部署这些组件。

现在我们可以来回答先前提出的那个问题了。我们知道模版集成了布局法则,当要改变布局是,我们要做的仅仅改变模版。这些改变会一起相关页面布局的改变,而不需要去改变这些页面本身。在门户应用程序中,这就意味着当大量页面需要采用同样布局时在时间上的节省。

struts用三个模版标签来实现模版。

插入标签inserttag&mdash;&mdash;<template:insert>。
  在容器/集合单元文件(collecting unit file)中使用。它定义了当前容器要使用的模版。类似于java gui中的container.setlayout(layout)方法。在它之后用<template:put>标签定义组件。

放入标签puttag&mdash;&mdash;<template:put>。
  在容器/集合单元文件(collecting unit file)中使用。他定义了组成容器/集合单元的组件/内容。它类似于java gui中的container.add(component)方法。每个puttag标签必须有一个相关组件的名称。

获得标签gettag&mdash;&mdash;<template:get>。
  在模版文件中使用。它告诉模版由puttag标签定义的不同组件的名称。它类似于java gui中的layout.addlayoutcomponent(componentname, component)方法。
一个简单的例子

你可以下载这个例子。我们将要创建两套内容文件、容器(集合单元)文件以及模版文件。当我们有了这些文件后,就可以就可以互换他们的模版,看到他们在布局上的改变。
复制struts-blank.war到tomcatwebapps目录并且将他改名为template-example.war。重起tomcat。template-example会由tomcat自动部署。删除pages目录和index.jsp文件。他们与我们的讨论暂时无关。

让我们定义又定义我们自己的内容文件做为一个开始。在template-example下建立一个名为content的目录,并且在其中创建六个文件:top1.htm, top2.htm, bottom1.htm, bottom2.htm, middle1.jsp, and middle2.jsp
放入什么文件是取决于你的,但是对于初学者,静态的.htm文件更容易理解。举个例子来说,top.htm包括以下的内容:

this is the <b>top</b> content for the <b>first</b> 
example. this is a static html file.


类似的,middle1.jsp包括如下内容:

this is the <b>middle</b> content for the <b>first</b> 
example. this is a dynamic jsp file and the
current date and time is <%= new date() %>


定义了内容之后,让我们来定义两个模版。
在template-example下建立名为templates的目录,并在其下创建两个文件template1.jsp和template2.jsp
这些模版定义了两种布局方式,如下图所示。



我们如下来定义这两个模版:


<%@ taglib uri='/web-inf/struts-
template.tld' prefix='template' %>
<html>
<head>
<title><template:get name='title'/>
</title>
</head>
<body>
<table border=1>
<tr>
<td><template:get name='top'/></td>
</tr>
<tr>
<td bgcolor=&quot;#ff55ff&quot;>
<template:get name='middle'/></td>
</tr>
<tr>
<td><template:get name='bottom'/></td>
</tr>
</table>
</body>
</html>
定义 template 1




<%@ taglib uri='/web-inf/struts-
template.tld' prefix='template' %>
<html>
<head>
<title><template:get name='title'/>
</title>
</head>
<body>
<table border=1>
<tr>
<td><template:get name='top'/></td>
<td bgcolor=&quot;#ff55ff&quot;>
<template:get name='middle'/></td>
<td><template:get name='bottom'/></td>
</tr>
</table>
</body>
</html>
定义 template 2

注意到这两个模版定义了两种布局方式,换句话说,它们定义了两种不同的布局法则。
我们已经有了我们自己的内容和模版。现在我们需要的是容器文件。在tomcat-example目录下创建两个容器文件分别名为container1.jsp和container2.jsp。容器文件需要包含组件(内容)。同样,容器文件利用template insert和put tags标签来逐个定义使用和加入的组件(内容)。

让我们带着这些概念看一下其中的一个容器文件(container1.jsp)。

<%@ taglib uri='/web-inf/struts-template.tld' prefix='template' %>
<template:insert template='/templates/template1.jsp'>
<template:put name='title' content='templates' direct='true'/>
<template:put name='top' content='/content/top1.htm' />
<template:put name='middle' content='/content/middle1.jsp' />
<template:put name='bottom' content='/content/bottom1.htm'/>
</template:insert>


我们可以打开浏览器,输入http://localhost:8080/template-example/container1.jsp看看这个文件的实际输出。你会看到如下的页面:

     在这个页面的后面,container1.jsp使用模版template1.jsp来定义输出页面的布局并且从不同的组件中包含内容。注意这里属性direct的用法<template:put name='title' content='templates' direct='true'/>。当direct设置为true时,content标签定义的内容将会被直接调用。它不寻找一个外部的文件。(when direct is set to true, the content specified by the content attribute is used directly. it is not looked up in an external file.有点疑问,翻的不好)

container2类似,所不同的只是他使用template2,页面输出如下:


我们到目前位置所做的工作的优点是显而易见的。举例来说,我们可以用template2替换template1(通过简单的复制和粘贴用template2.jsp替换template2.js1)。之后container1.jsp会马上变成如下的模样。我们改变了容器的布局却没有碰container1!这就是模版的作用。

struts template vs. tiles

struts 1.1开始,引入了另一种模版机制&mdash;&mdash;tiles。现在它已经成为了模版机制的一个主要分支。tiles机制定义与tiles网络站点中,并且与struts定义的模版标签兼容。事实上,tiles是模版标签的一个扩展集。那为什么我们要要tiles来替代模版呢?

tiles允许我们传递参数,从而对容器有更多的控制权。当我想使模版和容器具有动态特性时变的非常有用。此外,tiles与struts动作组件(struts action components)结合的更为紧密。

但是,tiles会使代码变的更为复杂。而且更为重要的是我们还要花更多的时间来掌握它。

结语
使用模版可以方便你管理网络应用程序。这篇文章是理解struts模版的开始。这里只介绍了关于模版的很少的一部分知识,还有很多比如基于角色(role-based)和可选内容(optional content)的知识要靠大家自己去学习。希望我的这篇文章能激励大家去探索更多的关于模版的特点。

作者vikram goya是个拥有六年经验的java爱好者。


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons