tiles应用指南

tiles应用指南

Q:什么时候你需要tiles
A:当你的系统中有太多的页面中含有相同的内容时,你就该考虑了

tiles使用从零开始

①为了使用tiles,请确保以下文件,位于你的/WEB-INF/lib目录下

struts.jar
commons-digester.jar
commons-beanutils.jar
commons-collections.jar
commons-logging.jar

②使用tiles标签
加入tiles-defs.xml,struts-tiles.tld到特定目录,假设在/WEB-INF目录下
其中tiles-defs.xml不是必须的
内容如下
<?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>

</tiles-defnitions>

③在web.xml中添加
<taglib>
    <taglib-uri>/WEB-INF/struts-tiles.tld</taglib-uri>
    <taglib-location>/WEB-INF/struts-tiles.tld</taglib-location>
</taglib>

④在struts-config.xml添加
<plug-in className="org.apache.struts.tiles.TilesPlugin">
    <set-property property="definitions-config" value="/WEB-INF/tiles-defs.xml" />
</plug-in>

如果用ide,譬如jbuilder的话,以上的4步都是ide工具自动完成的

在开始介绍tiles的使用方法之前让我们来看看tiles究竟能帮你解决什么

|--------------------|
|                           |
|     header         |
|--------------------|
|     content        |
|--------------------|
|     footer           |
|--------------------|

假设框架中的页面是上述结构,仅是content部分内容不同,而header和booter
部分是相同的.
我想有如果不借助tiles,你一定会这样做
假如其中的两个页面page1.jsp,page2.jsp
page1.jsp内容如下

<table>
<tr>
<td>
<jsp:include page ="header.jsp"/>
</td>
</tr>
<tr>
<td>
<jsp:include page="content1.jsp"/>
</td>
</tr>
<tr>
<td>
<jsp:include page ="footer.jsp"/>
</td>
</tr>
</table>


page2.jsp内容如下

<table>
<tr>
<td>
<jsp:include page ="header.jsp"/>
</td>
</tr>
<tr>
<td>
<jsp:include page="content2.jsp"/>
</td>
</tr>
<tr>
<td>
<jsp:include page ="footer.jsp"/>
</td>
</tr>
</table>

恩,好像上面的方法基本解决了,你面临的问题.但是可以看出page1.jsp和page2.jsp仍然
有大量重复的代码.而且可能还有比这还糟糕的.譬如有一天用户心血来潮说,想把页面
的布局改成下面的形式

|--- -|--- -|---- -|
|      |       |       |
|      |       |       |
|      |       |       |
|left|mid|right|
|      |       |       |
|      |       |       |
|--- -|--- -|----- |

估计那是你会表面应付然后心理骂一句oh,shit..
估计到那是你要做的就是将没个页面的布局都改一下.假设有
100个页面??

呵呵,闲话少说进入正题.tiles就是为了解决上面的问题.

重构page1.jsp和page2.jsp页面

在这里我们可以写一个layout.jsp
内容如下


<table>
<tr>
<td>
<tiles:insert attribute="footer">
</td>
</tr>
<tr>
<td>
<tiles:insert attribute="content">
</td>
</tr>
<tr>
<td>
<tiles:insert attribute="footer">
</td>
</tr>
</table>

可以看到这里layout.jsp的作用,它并不指定具体引入的是哪个页面,
而只是做为页面的整体结构来使用,如果要改页面的结构那么只需要
对layout.jsp进行修改即可.

那page1.jsp可以写成
<%@ page contentType="text/html; charset=GBK" %>
<%@taglib uri="/WEB-INF/struts-tiles.tld" prefix="tiles" %>
<tiles:insert page="layout.jsp" flush="true">
<tiles:put name="foot" value="foot.jsp"/>
<tiles:put name="content" values="content1.jsp"/>
<tiles:put name="header" value="header.jsp"/>
</tiles>

page2.jsp那么写成
<%@ page contentType="text/html; charset=GBK" %>
<%@taglib uri="/WEB-INF/struts-tiles.tld" prefix="tiles" %>
<tiles:insert page="layout.jsp" flush="true">
<tiles:put name="foot" value="foot.jsp"/>
<tiles:put name="content" values="content2.jsp"/>
<tiles:put name="header" value="header.jsp"/>
</tiles>

恩,这样是不是好多了?但是仍然不够完美.可以看到page1.jsp和page2.jsp
中仍然有重复代码况且如果对再对layout.jsp页面增加一个foot1,那么还是要每个页面
都要进行修改.

更完美的解决方法
使用tiles-defs.xml
在<tiles-definitions>之中增加
<definition name="layout" path="/layout.jsp">
<put name="header" value="header.jsp"/>
<put name="content" value=""/>
<put name="footer" value="footer.jsp">
</definition >

<definition name="page1" extends="layout">
<put name="content" value="content1.jsp"/>
</definition >

<definition name="page2" extends="layout">
<put name="content" value="content2.jsp"/>

<!--这里的value也可以是另外一个definition的名字,如果是另一个definition那么要加type属性-->
<!--
 譬如
 <put name="content" value="page1" type="definition"/>

-->
</definition >

那么在page1.jsp中内容如下
<%@ page contentType="text/html; charset=GBK" %>
<%@taglib uri="/WEB-INF/struts-tiles.tld" prefix="tiles" %>
<tiles:insert definition="page1">
</tiles:insert>

page1.jsp中内容如下
<%@ page contentType="text/html; charset=GBK" %>
<%@taglib uri="/WEB-INF/struts-tiles.tld" prefix="tiles" %>
<tiles:insert definition="page2">
</tiles:insert>

结论,通过以上可以看到使用tiles的好处,但是它也有其缺点也很明显,为了
使用tiles,我所需的jsp页面的数目几乎翻倍.其实可以看到page1.jsp中的内容
只是仅仅的几句话.幸好,tiles自身解决了这个不足,例如在我们完全可以使用
definition的name来代表一个jsp页面,当然前提是definition必须是个完整的页面
在struts-config.xml中配置
<action-mapping>
<action path="/page1" type="org.apache.struts.actions.ForwardAction"
 parameter="page1"><!--这里的page1对应tiles-defs.xml中个的definition page1 -->
 </action>
</action-mapping>

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值