Tiles框架简介

转载自 李宁的极客世界 (http://www.blogjava.net/nokiaguy/archive/2009/02/archive/2009/02/27/257067.html):

   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元素。

注意:由于<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属性值。


    为了更好的复用,在定义文件中的<definition>元素也可以继承其他的<definition>,如我们可以在tiles-defs.xml文件中加一个<definition>元素,来继承myLayout,代码如下:

< definition  name ="myLayout.newLayout"  extends ="myLayout" >
     < put  name ="title"  value ="新的页面"   />
</ definition >

    上面的代码覆盖了myLayout中的title属性,其他的属性值都继承了myLayout中相应的属性值。其中name属性的值中的“.”是为了表明这个新的<definition>元素是从myLayout继承的,没有特殊的含义。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值