Struts之tiles的使用
tile英文意思是瓦片,tiles就是一堆瓦片。比如有个系统,顶端是快捷键,左边是导航条,下边是copyright。按基本的html写法,会导致大量的重复编码,增加开发和维护成本。tiles框架就是为创建web页面提供了一种模板机制,它将网页的布局和内容分开。它允许先创建模板,然后在运行时动态地将内容插入到模板中。我们可以将这个blog系统分成4个独立的jsp,导航条,快捷建,copyright和主要内容。然后把他们组合起来,这样减少了很多重复代码,降低了耦合度。
tiles框架是建立在jsp的include指令基础上,但提供了比include更强大的功能。
我们将该blog分成4块。
Sidebar.jsp | Header.jsp |
Content.jsp | |
Footer.jsp |
准备工作:
1./WEB-INF/lib下应该有如下jar包:
- struts.jar
- commons-digester.jar
- commons-beanutils.jar
- commons-collections.jar
- commons-logging.jar
2./WEB-INF下应该有struts-tiles.tld(tiles标签库定义文件)
3.在web.xml中配置:
<taglib>
<taglib-uri>/WEB-INF/struts-tiles.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-tiles.tld</taglib-location>
</taglib>
开动:
header.jsp
<font size="6">This is a header</font>
<hr>
footer.jsp
<hr>
<font size="6">This is a footer</font>
sidebar.jsp
<%@ page contentType="text/html;charset="UTF-8""%>
<table>
<tr>
<td>
<a href="/spaces/content1.jsp">Content1</a><br>
<a href="/spaces/content2.jsp">Content2</a><br>
</td>
</tr>
</table>
content1.jsp, content2.jsp 随便写点什么了,我们主要是看如何用。
再写一个将这些jsp拼合的layout.jsp
<%@ page contentType="text/html;charset="UTF-8""%>
<%@ taglib uri="/WEB-INF/struts-tiles.tld" prefix="tiles"%>
<table>
<%-- Sidebar section --%>
<tr>
<td width="150" valign="top" align="left" bgcolor="#CCFFCC">
<tiles:insert attribute="sidebar"/>
</td>
<%-- Main Content section --%>
<td valign="top" height="100%" width="*">
<table width="100%" height="100%">
<tr>
<%-- Header Section --%>
<td height="15%">
<tiles:insert attribute="header"/>
</td>
</tr>
<tr>
<%-- Content Section --%>
<td valign="top" height="*">
<tiles:insert attribute="content"/>
</td>
</tr>
<tr>
<%-- Footer Section --%>
<td valign="bottom" height="15%">
<tiles:insert attribute="footer"/>
</td>
</tr>
</table>
</td>
</tr>
</table>
在layout.jsp中就定义好了web的格局,只是没插入具体内容。在<tiles:insert>标签中的attribute属性指定了待插入内容的逻辑名。
写一个content3.jsp
<%@ page contentType="text/html;charset="UTF-8""%>
<%@ taglib uri="/WEB-INF/struts-tiles.tld" prefix="tiles"%>
<tiles:insert page="layout.jsp" flush="true">
<tiles:put name="sidebar" value="/spaces/sidebar.jsp"/>
<tiles:put name="header" value="header.jsp"/>
<tiles:put name="content" value="/spaces/content1.jsp"/>
<tiles:put name="footer" value="footer.jsp"/>
</tiles:insert>
运行content3.jsp就可以看到前面的示例图。
但这不是标准的用法,下面展示标准用法,在配置文件中制定jsp的组合,jsp只需要调用这些组合就行了。
写一个tiles-defs.xml,放到/WEB-INF目录下。
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
"http://struts.apache.org/dtds/struts-config_1_2.dtd">
<tiles-definitions>
<definition name="content1-definition" path="/layout.jsp">
<put name="sidebar" value="/sidebar.jsp" />
<put name="header" value="/header.jsp" />
<put name="content" value="/content1.jsp" />
<put name="footer" value="/footer.jsp" />
</definition>
<definition name="content2-definition" path="/layout.jsp">
<put name="sidebar" value="/sidebar.jsp" />
<put name="header" value="/header.jsp" />
<put name="content" value="/content2.jsp" />
<put name="footer" value="/footer.jsp" />
</definition>
</tiles-definitions>
在tiles-defs.xml中我们定义了2种组合,content是content1.jsp或content2.jsp。
在struts配置文件struts-config.xml中配置TilesPlugin插件
<plug-in className="org.apache.struts.tiles.TilesPlugin">
<set-property property="definitions-config" value="/WEB-INF/tiles-defs.xml"/>
<set-property property="moduleAware" value="true" />
<set-property property="definitions-parser-validate" value="true" />
</plug-in>
写个content3.jsp
<%@ page contentType="text/html;charset="UTF-8""%>
<%@ taglib uri="/WEB-INF/struts-tiles.tld" prefix="tiles"%>
<tiles:insert definition="content1-definition"/>
这和前面那个content3.jsp效果是一样的。或则还有更好的方法,通过struts action来调用tiles组件,在struts-config.xml中加上action映射。
<action-mappings>
<action path="/content1"
type="org.apache.struts.actions.ForwardActon"
parameter="content1-definition">
</action>
</action-mappings>
这样只要通过浏览器访问 http://localhost:8080/content1.do,请求转发到ForwardAction,再转到content1-definition的tiles组件,最后在浏览器端显示和前面content1.jsp一样的页面。调用content2-definition可以得到content是content2.jsp的页面。
Tiles组件的再组合
我们只是把页面分成4块,你有兴趣可以把sidebar,header,content或footer再分下去。比如将sidebar分为top和bottom两部分,content1-definition和content2-definition就可以调用sidebar-definition
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
"http://struts.apache.org/dtds/struts-config_1_2.dtd">
<tiles-definitions>
<definition name="sidebar-definition" path="/sidebarlayout.jsp">
<put name="top" value="/sidebartop.jsp" />
<put name="bottom" value="/sidebarbottom.jsp" />
</definition>
<definition name="content1-definition" path="/layout.jsp">
<put name="sidebar" value="sidebar-definition" type="definition"/>
<put name="header" value="/header.jsp" />
<put name="content" value="/content1.jsp" />
<put name="footer" value="/footer.jsp" />
</definition>
<definition name="content2-definition" path="/layout.jsp">
<put name="sidebar" value="sidebar-definition" type="definition"/>
<put name="header" value="/header.jsp" />
<put name="content" value="/content2.jsp" />
<put name="footer" value="/footer.jsp" />
</definition>
</tiles-definitions>
为了提高definition的利用率,还可实现继承。如我们定义了base-definition,它定义了sidebar,header,content和footer的模板。content1-definition只需要继承它并重写(override)自己的content块。
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
"http://struts.apache.org/dtds/struts-config_1_2.dtd">
<tiles-definitions>
<definition name="sidebar-definition" path="/sidebarlayout.jsp">
<put name="top" value="/sidebartop.jsp" />
<put name="bottom" value="/sidebarbottom.jsp" />
</definition>
<definition name="base-definition" path="/layout.jsp">
<put name="sidebar" value="sidebar-definition" type="definition"/>
<put name="header" value="/header.jsp" />
<put name="content" value="" />
<put name="footer" value="/footer.jsp" />
</definition>
<definition name="content1-definition" extends="base-definition">
<put name="content" value="/content1.jsp" />
</definition>
<definition name="content2-definition" extends="base-definition">
<put name="content" value="/content2.jsp" />
</definition>
</tiles-definitions>
这些就是tiles的大概用法,保证测试通过
文章引用自:http://www.classky.com/spaces/user1/martincsy/archives/2006/200692421139.html