tiles使用介绍

1. 概述
针对view(前台表达)部分所使用的struts tiles技术的介绍。包括tiles简介,配置,以及开发流程的介绍。
2. Struts-tiles技术简介
2.1 概念简介
Tiles Framework建立在jsp include技术的基础之上。通过xml配置文件把显示页面划分为几个“通用模块”(tiles),增强页面的可重用性,易于管理整个应用(网站)的风格,提高web page的可维护性。
2.2 主要功能简介
l 页面划分:
将页面按功能模块划分。
l 页面模版:
在xml文件中设置页面的模版,类似基类的概念,将通过它动态生成我们所需的不同的功能页面。
l 构建页面:
运行时读取tiles配置文件,通过给模版传不同的值,例如menu list等,动态构建功能页面。
3. 实现方案描述
3.1 概述
Tiles Framework实现所要做的工作主要包括:
l 页面公用部分提取:例如每个页面有共同的header部分,menu部分,copyright部分等等。
l 写tiles-def配置文件:定义layout(模版),menu等等。
l 写对应的模版jsp:用tiles的insert等标签构建通用页面。
l 将tiles框架作为struts的插件功能install到struts应用中:这部分的工作包括web.xml的配置,struts-config插件的设置,包的安装等等。
3.2 实现流程
公用部分提取:
从页面设计人员的静态页面中提取公用部分,用于模版的构建。
图例1:
 
如图例所示,每个应用都可以分析提取出一些公用部分,如header、menu、footer。这些通常都是不变的,这样我们就可能实现页面的动态生成,减轻开发任务。
Tiles-def配置文件描述
Definition的定义
根据提取出来的公用部分,可以构建一个或多个可重用的页面模版,通过在tiles-def.xml中的配置,就可以方便的利用tiles动态生成我们所需的功能页面。
示例1:
  <definition name="site.mainLayout" path="/layouts/classicLayout.jsp">   <put name="title"  value="Tiles Blank Site" />   <put name="header" value="/tiles/common/header.jsp" />   <put name="menu"   value="site.menu.bar" />   <put name="footer" value="/tiles/common/footer.jsp" />   <put name="body"   value="/tiles/body.jsp" />  </definition>
这是一个definition的例子,构建了一个向图例1那样的页面模版:
    path属性:定义模版对应的jsp文件,也就是模版的实现。
    put标签:定义了模版中要填入的具体内容。
在menu成员中又嵌套了一个definition,site.menu.bar。也就是说,可以进一步详细的定义模版中一部份内容的拆分,实现模版的嵌套。
Menu Definition的定义
示例2:
<definition name=" site.menu.bar " path="/layout/vboxLayout.jsp" >  <putList name="componentsList" >      <item value="Home"           link="/index.jsp"  />      <item value="Live Examples (new)" link="/examples/index.jsp"  />      <item value="Quick overview" link="/doc/quickOverview.jsp"  />      <item value="Tutorial"       link="/doc/tutorial.jsp"  />      <item value="Tutorial Live Examples" link="/tutorial/index.jsp" />      <item value="Download"       link="/doc/download.jsp" />      <item value="Installation"   link="/doc/installation.jsp" />      <item value="User Guide"    link="/doc/userGuide.jsp" />      <item value="Javadoc"        link="/api/index.html" />  </putList></definition>
这里是一个基本的menu的definition。
path:声明实现的jsp。
putlist:声明列表,用于显示菜单。
item:定义每个菜单项的显示名称和链接。
Definition 的继承
示例3:
<definition name="sys.operator.add.page" extends="site.mainLayout "> <put name="body" value="/sys/sysoperadd.jsp"/></definition>
在这个definition中使用到了extends属性,也就是说一个definition可以从另外一个definition中继承生成。可以overload掉父节点definition中的某些属性,像这个示例就把body显示的内容换成了/sys/sysoperadd.jsp。
Definition naming rule
本次实现的tiles definition name规则:
sino.模块简称.应用
    例如:sino.doc.documentappque领用设置查询页
          sino.doc.documentbacque回销设置查询页
          sino.doc.documentdesque销毁设置查询页
          sino.doc.documentlosque遗失设置查询页
安装
tiles可以作为struts的一个plug-in来整合到struts中。Plug-in的属性可以在web.xml中定义,也可以在struts-config.xml中定义。属性读取时会先从web.xml中读取,再从struts-config.xml中读取覆盖它。推荐直接在sturts-config.xml中定义。
<plug-in className="org.apache.struts.tiles.TilesPlugin" ><set-property property="definitions-config"value="/WEB-INF/tiles-defs.xml,/WEB-INF/tiles-tests-defs.xml,/WEB-INF/tiles-tutorial-defs.xml,/WEB-INF/tiles-examples-defs.xml" /><set-property property="moduleAware" value="true" /><set-property property="definitions-parser-validate" value="true" /></plug-in>
属性描述:
l definitions-factory-class:可以定义自己的definition-factory,classname用这个属性设置,默认是i18n factory。
l definitions-config:definition的配置文件路径和文件名,默认值是/WEB-INF/tileDefinitions.xml。
l moduleAware:在有多个definition配置文件时,设置为true表示每个文件使用不同的factory实例,false则公用一个。默认为true。
l definitions-parser-validate:是否进行DTD校验,默认为true。
l definitions-debug:设置debug级别,0最低,2最高,默认为0。
以上所有的属性都是可选的,不是必须设置的。
Layout生成
menuLayout实现(vboxLayout.jsp):
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %><%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %><%@ taglib uri="/WEB-INF/tiles.tld" prefix="tiles" %><%@ page import="java.util.Iterator" %><%-- Menu LayoutThis layout renders a menu with links.It takes as parameter the title and a list of items. Each item is a beanwith following properties: value, href, icon, tooltip.@param title Menu title@param items list of items. Items are beans--%><%-- Push tiles attributes in page context --%><tiles:importAttribute /><table><logic:present name="title"><tr><th colspan=2><div align="left"><strong><tiles:getAsString name="title"/></strong></div></th></tr></logic:present><%-- iterate on items list --%><logic:iterate id="item" name="items" type="org.apache.struts.tiles.beans.MenuItem" ><% // Add site URL if link starts with "/"String link = item.getLink();if(link.startsWith("/") ) link = request.getContextPath() + link;%><tr><td width="10" valign="top" ></td><td valign="top" ><font size="-1"><a href="<%=link%>"><logic:notPresent name="item" property="icon"><%=item.getValue()%></logic:notPresent><logic:present name="item" property="icon"><% // Add site URL if link starts with "/"String icon = item.getIcon();if(icon.startsWith("/") ) icon = request.getContextPath() + icon;%><img src='<%=request.getContextPath()%><bean:write name="item" property="icon" scope="page"/>'alt='<bean:write name="item" property="tooltip" scope="page" ignore="true"/>' /></logic:present></a></font></td></tr></logic:iterate></table>
说明:
importAttribute:用来引入配置文件中定义好的菜单枚举。
mainLayout实现:
mainLayout.jsp:
<%-- Layout TilesThis layout creates a HTML page with <header> and <body> tags. It rendersa header, left menu, body and footer tile.@param title String used as page title@param header Header Tile (URL of a JSP page or definition name)@param menu Menu Tile@param body Body Tile@param footer Footer Tile--%><%@ page contentType="text/html; charset=GBK" %><%@ taglib uri="/WEB-INF/struts-tiles.tld" prefix="tiles" %><HTML><HEAD><link rel=stylesheet href="<%=request.getContextPath()%>/layouts/stylesheet.css"type="text/css"><title><tiles:getAsString name="title"/></title></HEAD><body bgcolor="#ffffff" text="#000000" link="#023264" alink="#023264" vlink="#023264"><table border="0" width="100%" cellspacing="5"><tr><td colspan="2"><tiles:insert attribute="header" /></td></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>
header.jsp
<%@ page contentType="text/html; charset=GBK" %><table width="100%" border="0" cellspacing="0" cellpadding="0">  <tr>    <td width="48%" background="<%=request.getContextPath()%>/sys/images/p012.gif"><img src="<%=request.getContextPath()%>/sys/images/logo.gif" width="374" height="70"></td>    <td width="30%" background="<%=request.getContextPath()%>/sys/images/p012.gif"><img src="<%=request.getContextPath()%>/sys/images/p001.gif" width="202" height="70"></td>    <td width="22%" align="right" background="<%=request.getContextPath()%>/sys/images/p012.gif"><img src="<%=request.getContextPath()%>/sys/images/p002.gif" width="203" height="70"></td>  </tr></table>
footer.jsp
<%@ page contentType="text/html; charset=GBK" %><table width="100%" border="0" cellspacing="0" cellpadding="0">  <tr>    <td bgcolor="FF966B" height="1"></td>  </tr>  <tr align="center">    <td height="18" class="font9">生命保险人寿股份有限公司 版权所有</td>  </tr></table>
说明:
title:通过getAsString标签从配置文件读取,显示在页面中。
header,footer,body,menu:通过insert标签被include到mainLayout.jsp中。
menuLayout:利用struts:iterate的枚举功能生成Menu的链接列表。
这样就构成了一个图例1所示的页面模版。
应用tiles(动态页面)
在definition、layout已经定义好了之后,就可以应用到struts中用它们代替原来forward mapping使用的url。
<action path="/tutorial/testAction2"type="org.apache.struts.example.tiles.tutorial.ForwardExampleAction"><forward name="failure" path="forward.example.failure.page"/><forward name="success" path="forward.example.success.page"/></action>
关于action的配置和没有加入tiles的唯一区别就在于forward mapping使用的url变成了definition配置文件中的definition定义。
Controller
对于每个definition,还可以定义一个controller。在使用这个definition之前会先调用一个controller做一些必须的业务逻辑。
l Definition设置:
<definition name="examples.rssChannel.body" path="/examples/tiles/rssChannels.jsp" controllerUrl="/examples/controller/rssChannel.do"><putList name="urls"><add value=" http://www.newsforge.com/newsforge.rss"/><add value=" http://xmlhack.com/rss.php"/><add value=" http://lwn.net/headlines/rss"/></putList></definition>
给definition定义一个controllerUrl。
l Struts设置:
<actiontype="org.apache.struts.webapp.tiles.rssChannel.RssChannelsAction" path="/controller/rssChannel"/>
在struts-config中配置这个controllerUrl的映射class。注意controller action是没有forword mapping的,因为它对应了一个tiles definition。
l RssChannelsAction.java:
package org.apache.struts.webapp.tiles.rssChannel;……import org.apache.struts.tiles.actions.*;……public final class RssChannelsAction    extends TilesAction {……    public ActionForward perform (ComponentContext context,                                  ActionMapping mapping,                                  ActionForm form,                                  HttpServletRequest request,                                  HttpServletResponse response)        throws IOException, ServletException {……        List channels = (List) context.getAttribute ("urls");……    }}
Controller继承org.apache.struts.tiles.actions.TilesAction类,通过重写perform()方法来处理必要的逻辑。该方法与struts action的区别就是多了一个ComponetContext型参数,可以通过这个对象的getAttribute()方法读取definition中定义的输入属性。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值