struts系列学习(tiles标签库一)
2007-02-03 09:50
316 查看
Tiles的使用(一)
综述可用性是当今应用程序设的主要关注点,一致性(consistency)是可用性的主要因素。用户想要专注于手上的任务,却会被应用程序界面或屏幕的布局的小问题而担搁。保持动态web应用程序一致性是个很大挑战,因为一般都是手动对每个页面进行编码的。如今已经有许多针对静态页面的布局设计工具可以提供给设计人员,但基于JSP的很少。更糟的是,应用程序的外观往往是到最后才会被确定下来,然后会在不同的版本间改变,甚至是对一个大型的web站点随意的重新布局(relaunch)。在最后的期限编码或测试,即使是改变背景色或添加一个新的链接到工具栏上,也像是一场恶梦!
一致性并不像一个妖怪,它也有一些好的设计特性。web页面包含了许多的共通的元素,headers,footers,menus等等。它们常常从一个页面剪切复制到另一个页面,来对代码"复用"。
在书的一开始,我们着重讲了应用程序分层的重要性,这样能减少改动带来的影响。通过对应用程序的分层,我们可以修改某个部分而不会影响其它部分。表现层使用相同的设计,实现了内容和外观的分离。将内容从布局(layout)中分离出来,可以使用动态的JSP include。JSP规范提供了静态的和动态的include。标准的动态JSP include的动作是:<jsp:include>。
我们可以使用动态include把页面分成几个片断,每个都有自己特有的用途。把一个后台模板设成缺省的布局页面,运行时用这些片断来提供内容。
Tiles框架是一种更加高级的JSP include行为的表现形式。在Tiels应用程序中,模板常被用来定义header,menu body,content和footer的位置。其它的页面用来向这些页面填充内容。如果header需要改变,只要修改模板文件就可以了。这种改变会自动的应用到每个使用模板的页面中。改动带来的影响会降到最低。
标准的HTML组件,象CSS也能很好的工作在动态模板下,这样能进一步降低改动的影响。
使用模板
Tiles是一个成熟的框架,和Structs结合的非常好,甚至可以在Structs ActionForward中部署。这章会展示怎样最好的集成Tiles和Structs及象CSS一样的其它资源。还会提供Tiles的重构向导,帮助你将现有的应用程序迁移到Tiles中。
下面解释了一些在Tiles中经常出现的术语:
Dynamic element (动态元素) | JSP 的一部分,会被JSP翻译器识别,包括action,directive,expression, JSP标签, 或scriptlet |
Template data (模版数据) | JSP的一部分,通常不被JSP 翻译器转换,而被逐字传递到响应之中。 通常是标记或者可视文本 |
Template page (模版页面) | 一个包含其他页面或者被其他页面包含的JSP |
Template file (模版文件) | 一个包含模版页面的静态文件或者JSP文件 |
Tile | 模版页面的同义词 |
Layout (布局) | 描述模版文件或tiles应该如何在页面中定位 |
Tiles | 一个强大易用的模版和布局框架 |
Definition (定义) | 一个Tiles 特征,允许一个布局被标识为一个模版页面,或者一个JavaBean。也可以用一个XML 文档来描述 |
当HTML 表格第一次引入时,页面设计者马上将它作为是一种布局方式。无边框的表格可以用来包含其他表格和内容,这是一种与众不同的布局方式。同样的想法经常用在动态模板中,一个主模板用来提供页面的布局和组件位置,页面片段被包含进来填充这些组件。页面片段可以被包含进各种类型的布局:无边框表格,<div>标记,甚至最简单的将一个组件堆在另一个组件之上。
Tiles 是一个用简单但有效的标记库来实现模板和布局的框架。它可以用来替换Struts1.0 中的模板标记库但功能更强大。Tiles包也用在任何的JSP应用程序中。
通常,JSP 模板系统都是使用一个模板作为布局,而其他作为填充组件。Tiles 称之为布局文件Definitions。大多数模版系统都要求有一个额外的文件作为布局文件。为避免这种麻烦,Tiles允许布局Definitions像一个JavaBean一样被存储。而且,在Struts 中还有个扩展,允许Definitions是一个ActionForward 的目标。这是一个激动人心的特征,现在让我们从头开始,创建一个新的布局。 你可以在下面代码中见到,我们创建用来包含布局组件的地方,都放置了一个JSP 标记,像
<tiles:insert attribute="aName"/>。意思是说在这里插入属性值指代的tile(或者模板文件) 。当要在应用程序中使用这个模板的时候,只要传递给它这个文件的路径。这允许我们在多处使用同一个模板,只需要简单的传递一个或多个不同tile的路径。
在大多数情况下,每个页面的body tile可能不同,但是同一模块中所有页面可以共享相同的header和menu tile。同时,可能同一站点的所有页面都要共享同一个footer tile。当新的一年过去,需要在每个页面中更新版权声明,这时只要修改footer tile就行。接着只需要加入剩下的HTML 标记,一个完整的独立的模板页面就完成了。
构建一个布局模板
为了能快速完成一个例子,我们将构建一个典型的有一个header,menu,body和footer的web页面。布局如下:
herder | |
menu | body |
footer |
打开一个新的JSP页面
导入Tiles标记库
创建一个匹配上图的HTML表格
使用Tiles JSP tag -<tiles:insert>去命名布局中的每个部分
<%@ taglib uri="/tags/tiles" prefix="tiles" %> <HTML> <HEAD> <TITLE><tiles:getAsString name="title"/></TITLE> //此标签表示:通过toString()方法返回一个title属性的值 </HEAD> <BODY> <TABLE border="0" width="100%" cellspacing="5"> <TR> <TD colspan="2"><tiles:insert attribute="header" /></TD> //此标签表示:根据属性名插入相应的JSP片断 </TR> <TR> <TD width="140" valign="top"> <tiles:insert attribute='menu'/> </TD> <TD valign="top" align="left"> <tiles:insert attribute='body' /> </TD> </TR> <TR> <TD colspan="2"> <tiles:insert attribute="footer" /> </TD> </TR> </TABLE> </BODY> </HTML> |
Tiles 框架提供的模板特性要远远超过标准Servlet 和JSP include 所提供的。框架称其模板为tiles。这有助于说明tiles比简单的JSP 模板功能更加强大。对于你的表现层,Tiles就象是积木。
学术上,tile是JSP中的一个矩形区域,有时也称为区域(region)。一个tile 也可以由其他tile 组合而成。Tiles能被递归构建,像是一颗树,树上的每个节点是一个区域,根节点是页面,最终节点或叶节点包含内容,中间的节点通常被用来布局。布局节点很有用,可以确定位置一个tile或为内容tile提供后台标签。
tile对象支持几个重要的特性,包括参数(parameters)和定义(Definitions)。
Parameters--参数
在运行期间一个tile能够以参数或属性的形式接受不同的信息,据这些信息表现出不同的效果。tiles 参数通常称为属性(attribute)以避免和请求参数相冲突。Tile的属性插入tile时被定义,此属性只有在这个tile中可见。对于子tiles或包含该tile的页面也是不可见的。当相同的tile多次用在相同的页面中时,可以避免名称冲突。开发人员就可以着力于构建Tiles而不用担心名字冲突的问题了。tile属性可以是String或其它类型。
Definitions--定义
各种属性通过一个tile组合在一起用来描述屏幕的显示。在实际中,这些描述是有关联的,往往是构建在其它tile之上的。Definitions存储一组属性,有自己标识的独立对象。声名一个base Screen Definitions,然后在这个基础上建立其它的Definitions。如果这个base Screen改变了,在这个base Screen上扩展的所有Definitions也会改变。这就将面向对象的继承和封装原理带到了你的动态页面中。Definitions是可选的,也可以随时用一个简单的JSP标记来部署Tile。
部署Tiles模板
上面说了在什么地方使用Tiles,接着要介绍怎么使用Tiles ,下面是hello.jsp的源代码,使用的是myLayout.jsp的布局方式:
<%@ taglib uri="/tags/tiles" prefix="tiles" %> <tiles:insert page="/layouts/myLayout.jsp" flush="true"> <tiles:put name="title" value="Hello World" /> <tiles:put name="header" value="/tiles/header.jsp" /> <tiles:put name="footer" value="/tiles/footer.jsp" /> <tiles:put name="menu" value="/tiles/menu.jsp" /> <tiles:put name="body" value="/tiles/helloBody.jsp" /> </tiles:insert> |
<tiles:put name="title" value="Hello World" /> <tiles:put name="body" value="/tiles/helloBody.jsp" /> |
<tiles:put name="title" value="Hello Again" /> <tiles:put name="body" value="/tiles/pageTwo.jsp" /> |
但是,要注意的是,执行上面的步骤,要创建两个新的页面:一个是hello.jsp,第二个是要插入hello.jsp的包含内容的页面,像helloBody.jsp。下面的方法就不需要产生两个页面。
<%@ taglib uri="/tags/tiles" prefix="tiles" %> <tiles:insert page="/layouts/myLayout.jsp" flush="true"> <tiles:put name="title" value="Hello World" /> <tiles:put name="header" value="/tiles/header.jsp" /> <tiles:put name="body" type="string"> //直接打印下面的内容 <%-- Place the content from /tiles/pageTwo.jsp here --%> </tiles:put> <tiles:put name="footer" value="/tiles/footer.jsp" /> <tiles:put name="menu" value="/tiles/menu.jsp" /> </tiles:insert> |
添加一个CSS
<%@ taglib uri="/tags/struts-html" prefix="html" %> <HTML> <HEAD> <TITLE><tiles:getAsString name="title"/></TITLE> <html:base/> <LINK rel="stylesheet" type="text/css" ref="<html:rewrite page='/assets/styles/global.css'/>"> </HEAD> <BODY> |
还可以使用<html:base> 标记来引入CSS或其它资源。
相关文章推荐
- struts系列学习(tiles标签库一)
- struts系列学习(tiles标签库二)
- struts系列学习(tiles标签库三)
- struts系列学习(tiles标签库二)
- struts系列学习(tiles标签库四)
- struts系列学习(tiles标签库三)
- struts系列学习(tiles标签库四)
- Struts2 学习笔记16 struts标签 part2
- html5学习系列之hi类标签
- Struts Tiles标签
- SpringMVC学习系列(11) 之 表单标签
- Html5 学习系列(三)增强型表单标签
- Struts2标签大全,个人整理struts标签全、struts2标签全集学习
- 学习CVS( 2.0.2.4)系列----(三)查看文件历史版本、提取历史版本内容和创建标签和分支
- SpringMVC学习系列(11) 之 表单标签
- 框架学习系列 mybatis 第十五篇 mybatis动态sql及常用标签二
- 传智播客学习之Struts标签库-HTML标签
- 框架学习之Struts2 第九节 Struts2重要的标签解说
- struts学习笔记 [JSTL]<c:forEach>标签的使用
- SpringMVC 学习系列 (11) 之 表单标签