Struts1.x系列教程(23):使用Tiles模板进行布局

简介:
Tiles 提供的模板机制可以最大限度地避免重复编写代码。实际上, Tiles 模板就是的 JSP 页面,只是在这种 JSP 页面中使用 Tiles 标签代替确定不了的内容(相当于占位符),也就是需要在开发人员使用模板时来确定的内容。除了这一点, Tiles 模板页面和普通的 JSP 页面完全相同。
一般的模板页面可以有如下两种占位符:
1.         字符串:使用<tiles:getAsString> 标签进行占位。如<tiles:getAsString name = "title" />
2.        Web 资源(包括JSP Servlet HTML 等):使用<tiles:insert> 标签来占位,如 <tiles:insert attribute="header" />
下面我们来看一下如何编写一个Tiles 模板。在Web 根目录中建立一个layout.jsp 文件,代码如下:
   <% @ page pageEncoding = " GBK " %>
  
<% @ taglib uri = " http://struts.apache.org/tags-tiles "  prefix = " tiles " %>
  
< html >
      
< head >
          
< title >< tiles:getAsString  name ="title"   /></ title >
      
</ head >
      
< body >
          
< table  border =<tiles:getAsString  name ="border"   /> >
              
< tr >
                  
< td >
                      
< tiles:insert  attribute ="header"   />
                  
</ td >
              
</ tr >
              
< tr >
                  
< td >
                      
< tiles:insert  attribute ="body"   />
                  
</ td >
              
</ tr >
              
< tr >
                  
< td >
                      
< tiles:insert  attribute ="footer"   />
                  
</ td >
              
</ tr >
          
</ table >
      
</ body >
  
</ html >
从上例可以看出有五处占位符,这些内容将由开发人员在使用layout.jsp 模板时指定。在编写完上述模板后,在Web 根目录中建立三个在模板中使用的JSP 文件,代码如下:
header.jsp
<% @ page pageEncoding = " GBK " %>
这是一个页头
body.jsp
<% @ page pageEncoding = " GBK " %>
这是一个页体

footer.jsp
<% @ page pageEncoding = " GBK " %>
这是一个页尾

     下面我们来使用这个模板。在Web 根目录中建立一个mypage.jsp 文件,代码如下:
   <% @ page contentType = " text/html; charset=GBK " %>
  
<% @ taglib uri = " http://struts.apache.org/tags-tiles "  prefix = " tiles " %>
  
< tiles:insert  page ="layout.jsp" >
      
< tiles:put  name ="title"  value ="我的页面"   />
      
< tiles:put  name ="border"  value ="${param.border}" />
      
< tiles:put  name ="header"  value ="header.jsp" />
      
< tiles:put  name ="body"  value ="body.jsp" />
      
< tiles:put  name ="footer"  value ="footer.jsp" />
  
</ tiles:insert >
     从mypage.jsp页面中可以看出,在<tiles:insert>标签中通过page属性插入了layout.jsp页面(也就是Tiles模板),并且在<tiles:insert>标签中使用了< tiles:put>子标签为layout.jsp页面中的占位标签指定参数值。如果是<tiles:getAsString>标签,就会将<tiles:put>标签中的value属性值解释为字符串;如果是<tiles:insert>标签,就会将< tiles:put>标签中的value属性值解释为Web资源。大家可以看到,如果有多个使用layout.jsp模板的JSP页面,都可以按着 mypage.jsp页面的方式使用这个layout.jsp模板,而无须再重复编写象table这样的HTML元素。
     在启动Tomcat后,我们可以使用如下两个URL来测试程序:

http://localhost:8080/samples/mypage.jsp?border=1

http://localhost:8080/samples/mypage.jsp?border=0

注意: 由于<tiles:insert> <jsp:include> 标签类似,被插入或包含的Web 资源都无法改面当前页面的字符集编码,因此,在使用Tiles 模板时,即使在当前页没有使用中文,也应该使用page 指令设置相应的字符集编码。如果没有设置,当模板页面中有中文字符时,即使模板页面使用了正确的字符集编码,在当前页面仍然无法正常显示中文字符。
    
上面曾讲过,Tiles 框架的目的就是最大限度地避免重复编写代码。而上面的例子虽然已经基本上避免了重复编码的工作,但仍然可能会存在一些重复的代码。如在mypage.jsp 页面中的<tiles:put> 标签。如果有很多页面都需要插件页头、页尾,那么就会有很多插入相同页面的<tiles:put> 标签被分布在不同的JSP 页面中。因此,Tiles 框架又提供了一个定义文件,来定义些重复使用的Tiles 标签。在使用定义文件之前, 需要首先安装Tiles 插件(如果不使用定义文件,是不需要安装Tiles 插件的)。
    下面我们来将上面的部分代码放到定义文件中。在WEB-INF目录中建立一个tiles-defs.xml文件,代码如下:
   <? xml version="1.0" encoding="GBK"  ?>   
  
<! DOCTYPE tiles-definitions PUBLIC
         "-//Apache Software Foundation//DTD Tiles Configuration 1.1//EN"
         "http://struts.apache.org/dtds/tiles-config_1_1.dtd"
>
  
< tiles-definitions >
      
< definition  name ="myLayout"  path ="/layout.jsp" >
          
< put  name ="title"  value ="我的页面"   />
          
< put  name ="header"  value ="header.jsp"   />
          
< put  name ="body"  value ="body.jsp"   />
          
< put  name ="footer"  value ="footer.jsp"   />
      
</ definition >
  
</ tiles-definitions >  
  在上面的代码中定义了一个<definition>元素。并且使用< put>元素对四个属性:title、header、body和footer赋值。因此,如果使用这个定义文件,就可以无需使用< tiles:put>标签再赋一遍值了。在Web根目录中建立一个newpage.jsp文件,代码如下:
   <% @ page contentType = " text/html; charset=GBK " %>
  
<% @ taglib uri = " http://struts.apache.org/tags-tiles "  prefix = " tiles " %>
  
< tiles:insert  definition ="myLayout" >
      
< tiles:put  name ="border"  value ="${param.border}" />
  
</ tiles:insert >
     newpage.jsp页面的功能和mypage.jsp页面完全一样,只是代码要简单得多。由于只有border属性需要设置,因此,在newpage.jsp页面中只要设置这一个属性即可。而在<tiles:insert> 标签中使用了definition属性指定了“myLayout”。这个值就是在tiles-defs.xml中<definition>元素的name属性值。
     在启动Tomcat后,我们可以使用如下的URL来测试newpage.jsp:

http://localhost:8080/samples/newpage.jsp?border=1


     为了更好的复用,在定义文件中的<definition> 元素也可以继承其他的<definition> ,如我们可以在tiles-defs.xml 文件中加一个<definition> 元素,来继承myLayout ,代码如下:
< definition  name ="myLayout.newLayout"  extends ="myLayout" >
     < put  name ="title"  value ="新的页面"   />
</ definition >
     上面的代码覆盖了myLayout 中的title 属性,其他的属性值都继承了myLayout 中相应的属性值。其中name 属性的值中的“. ”是为了表明这个新的<definition> 元素是从myLayout 继承的,没有特殊的含义。



 本文转自 androidguy 51CTO博客,原文链接:http://blog.51cto.com/androidguy/214843,如需转载请自行联系原作者

相关文章
SpringMVC 中的视图如何使用 Velocity
SpringMVC 中的视图如何使用 Velocity
|
Java Apache Maven
Tiles与SpringMVC整合应用实践
Tiles与SpringMVC整合应用实践
104 0
|
开发框架 Java .NET
SiteMesh JSP布局框架介绍
SiteMesh JSP布局框架介绍
|
C#
WPF QuickStart系列之样式和模板(Style and Template)
原文:WPF QuickStart系列之样式和模板(Style and Template) 在WPF桌面程序中,当我们想构建一个统一的UI表现时(在不同操作系统下,显示效果一致),此时我们就需要使用到WPF中的样式和模板技术。
1040 0
|
前端开发 Java Apache
第6章—渲染web视图—使用Apache Tiles视图定义布局
使用Apache Tiles视图定义布局 Tiles是一个免费的开源模板Java应用程序的框架。基于复合模式简化的用户界面的构建。对于复杂的网站仍是最简单、最优雅的方式与任何MVC技术一起工作。
1302 0
|
Java
[Struts]使用tiles管理界面遇到困难
上个周末都在研究怎么用tiles管理示范中心项目的界面,没想到遇到了不少麻烦,到现在也没解决。首先,示范中心项目有很多个模块,我们是用struts的模块功能分开的。本来想的是在缺省模块里定义几个公用的界面定义(definition),然后再各模块里都继承这个定义,并修改必要的tile就可以了。
1258 0
|
Java
[Struts]让Dreamweaver显示Struts标签的插件
Dreamweaver(简称DW)的设计视图里不能显示struts标签,只能手动改代码。为此我找了好久,终于还是在DW网站上找到了,只有8K大,虽然没有漂亮的图标,但显示的信息还是很够用的。现在总算可以用DW编辑含有struts标签的jsp文件了! 图1 在DW里显示struts标签 这个文件我已经放在FTP上了,请点这里下载。
1180 0