Tiles的使用,遗漏和总结

 IT修真院菜鸟一只,有对修真院感兴趣的请移步官网    http://www.jnshu.com/login/1/14708688


一.) Tiles配置 

要正常使用tiles,必须在Structs配置文件中加入下列代码:  
 <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>  

1.definitions-factory-class:(可选) 
        definition factory类的名称,可以使用自己编写definition factory。如果不指定,使用国际化factory。 
2.definitions-config:(可选) 
       指定tiles的配置文件, 可以是多个,中间用逗号隔开。每个文件按次序被读取,遇到definition就添加进definition factory中。如果产生重名,后面的definition将替代前面的。 
3.moduleAware:(可选) 
       如果是true(默认值),一个Struts module就会有一个factory;如果是false,多个Struts module分享单独的一个factory。 
4.definitions-parser-validate:(可选) 

        如果是true(默认值),validate.DTD会在文件头中被指定;如果是false,没有validation。 

二.) 把Definition's名称做为Struts Forward 
如果用Tiles' servlet替代Struts' servlet,那么你可以使用Tiles配置文件中的definition名称来替代URL。你Struts Action的配置像下面一样: 

 <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代码和以前一样,但forward mapping现在被指定为一个definition名称,当action forward碰到definition名称时,它就装载definition,创建并初始化Tile's attributes相关的内容,再插回到definition中�


三.) 为View准备数据:添加一个控制器(controller) 
 我们常常需要给Jsp页面传递一些计算好的数据。MVC框架中,控制器用来做这个事情。要解析Tiles和Struts,我们可以用一个Struts Action作为controller,一个JSP页面作为一个view,然后在Tile中将两者组合。所以当你插入Tile时,在Jsp页面显示前Action会先被调用。
 Tils可以通过controller(每个Tile对应一个sub-controller)产生,再合成的一个完整的web页面。这个方法比用一个单独的controller来控制所有Tile的页面要好,因为它允许独立的构建Tile,而不用担心怎样传递数据。 
有几种方法能够把Action和一个View做为一个Tile: 
在<insert>或<definition>中使用Action类名或Action URL。  
让struts-config.xml中的Action指向一个definition名称。在tiles-onfig.xml文件中指定一个含URL的difinition和一个含有view的difinition。第一个difinition作为一个完整的Tile difinition(action+view),第二个difinition作为view difinition。  
可以让多个view和一个controller结合。选择一个恰当的controller,对于有main view和error view来说是很有用的。和以前一样,但可以多个forward到一个view definition。 
 将controller放入中Tile最简单的方法是在<insert>和<definition>中指定,可以是本地URL或一个类。在Jsp页面显示前controller被调用。controller使用共享的Tile内容填充Jsp页面,所以它可以读取、修改和添加Tile属性。controller一般用来做这么几件事情:model的数据被传递到view前进行处理;属性传递到view前对其进行修改或添加。 
 你可以使用当前web应用程序的Structs Action URL来做为controller,你的action可以扩展org.apache.struts.action.TilesAction,来替代Structs Action类。TilesAction继承原来的execute()方法。还提供了一个新的execute()方法,这个方法多了"tileContext"参数,当你需要处理Tile的属性是很有用。 
 <tiles:insert page="layout.jsp" controllerUrl="myAssociatedAction.do” > 
 <tiles:put name="title" value="Test controller set in insert" /> 
 <tiles:put name="header" value="header.jsp" /> 
 <tiles:put name="body" value="body.jsp" /> 
 </tiles:insert>  

Structs Action中的描述: 
 <action path="/myAssociatedAction" type="org.apache.struts.example.tiles.MyAssociatedAction"> 
 </action>  

Action中的描述: 
 public final class MyAssociatedAction extends TilesAction { 
 public ActionForward execute( ComponentContext context,ActionMapping mapping,ActionForm form, 
 HttpServletRequest request, HttpServletResponse response) 
 throws IOException, ServletException{ 
 String title = (String)context.getAttribute( "title" ); 
 System.out.println( "Original title" + title ); 
 context.putAttribute( "title", "New Title" ); 
 return null; 
 } 
}  


如果你使用类名做为controller,就必须继承下面基类或接口中的一个: 
 org.apache.struts.tiles.Controller:这是个controller接口定义了cintorller方法。这些方法接收包含当前Tile内容的参数和普通的servlet参数(request、response和servletContext)。 
 org.apache.struts.tiles.ControllerSupport:这是个底层类,没有方法。 
 <tiles:insert page="layout.jsp" controllerClass="org.apache.struts.example.tiles.test.TestTileController" > 
 <tiles:put name="title" value="Test controller set in insert" /> 
 <tiles:put name="header" value="header.jsp" /> 
 <tiles:put name="body" value="body.jsp" /> 
 </tiles:insert>  

在definition中使用的例子: 
 <definition name="tileWithActionAsController" path="/actionAsController.do" > 
 <put name="title" value="Title" /> 
 <put name="anAttribute" value="aValue" /> 
 </definition>  

Action被用作controller: <action path="/ actionAsController " type="org.apache.struts.example.tiles.ActionAsController"> 
 <forward name="failure" path="/failurePage.jsp"/> 
 <forward name="success" path="success.definition"/> 
 </action>


一.) 常用到的layout 
Tiles有个令人感兴趣的地方,它可以复用现有的layout,定义一个新的layout,简单改变一下属性设置就可以扩展一个layout。对于一个layout,只不过是以现有页面为基础,抽取并提供一些属性的描述。 
注:在jakarta-struts-1.2.2中的tiles-documentation.war有相关的代码。 

Classic layout 
这个layout经常会被web站点采用。它提供典型的"header, menu, body ,footer",用<header>和<body>做为HTML页面的骨架,在恰当的地方放置header、menu、body、footer。  
所需属性: 
tiltle - String类型; 
header、menu、body、footer - URL或definition名称。  
调用layout的代码: 
 <tiles:insert page="/layouts/classicLayout.jsp" flush="true"> 
 <tiles:put name="title" value="Browser Title" /> 
 <tiles:put name="header" value="/header.jsp" /> 
 <tiles:put name="footer" value="/footer.jsp" /> 
 <tiles:put name="menu" value="/menu.jsp" /> 
 <tiles:put name="body" value="definition.name" /> 
 </tiles:insert>  

也能够在definition中调用: 
 <definition name="mainLayout" path="/layouts/classicLayout.jsp"> 
 <put name="title" value="Browser Title" /> 
 <put name="header" value="/header.jsp" /> 
 <put name="footer" value="/footer.jsp" /> 
 <put name="menu" value="menu.main" /> 
 <put name="body" value="main.portal.body" /> 
 </definition>  


layout的代码: <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>  


Menu Layout 
这个layout用于带有链接的菜单。一个菜单需要一个"item" bean列表,每个"item"包含一个子菜单的数据。可以用一个属性相同的menu layout来代替另一种menu layout(例如可以用vbox layout构建一个垂直的menu,下面会讲到)。  
所需属性 
title - String类型,做为菜单标题(可选)。 
items - List类型,Items 是带有vlaue、link、tooltip、icon参数的bean。  
调用layout的代码: <definition name="examples.menu.settings" path="/layouts/menu.jsp" >
 <put name="title" value="Preferences" /> 
 <putList name="items" > 
 <item value="my Portal Settings" link="/examples/myPortalSettings.jsp" classtype="org.apache.struts.tiles.beans.SimpleMenuItem" /> 
 <item value="my Menu Settings" link="/examples/myMenuSettings.jsp" classtype="org.apache.struts.tiles.beans.SimpleMenuItem" /> 
 </putList> 
 </definition>  

definition中描述了两个属性:tilte和list。list是一个item bean 列表,每个item相当于菜单中的一个选项,包含一些参数,value表示选项的标题,link表示链接。  
layout的代码: <%@ 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" %> 

 <%-- 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>  


VBox 或 VStack Layout 
这个layout用于垂直的显示Tile列表,常被菜单条或multi - columns layout采用。  
所需属性 
list - 要插入的列表名称或URL  
调用的layout代码: <definition name="examples.menu.bar" path="/layouts/vboxLayout.jsp" > 
 <putList name="list" > 
 <add value="examples.userMenu" /> 
 <add value="examples.menu.links" /> 
 <add value="doc.menu.links" /> 
 <add value="examples.menu.settings" /> 
 <add value="doc.menu.taglib.references" /> 
 <add value="doc.menu.printer.friendly" /> 
 <add value="examples.menu.admin" /> 
 </putList>  


layout代码: <%@ page import="java.util.Iterator"%> 
 <%@ taglib uri="/WEB-INF/tiles.tld" prefix="tiles" %> 
 <tiles:useAttribute id="list" name="list" classname="java.util.List" /> 
 <% // 用Tile 属性初始化一个脚本变量。 
 // 这里不使用<logic:iterate>标签,因为在JSP1.1不允许这么做。 
 <% 
 Iterator i=list.iterator(); 
 while( i.hasNext() ) 
 { 
 String name= (String)i.next(); 
 %> 
 <tiles:insert name="<%=name%>" flush="true" /> 
 <br> 
 <% 
 } // end loop 
 %>  


Multi-columns Layout 
这个layout垂直显示Tile多行列表。每一行代表一个列表,常用来构建多个Tile主体的入口。  
所需属性 
numCols - 行数 
list1 - 第一个Tile列表 
list2、list3、listn - 第n个Tile类别(可选)  
调用的代码: <definition name="examples.portal.body" path="/layouts/columnsLayout.jsp" controllerUrl="/portal/myPortal.do" > 
 <put name="numCols" value="2" /> 
 <putList name="list0" > 
 <add value="/examples/tiles/portal/login.jsp" /> 
 <add value="/examples/tiles/portal/messages.jsp" /> 
 <add value="/examples/tiles/portal/newsFeed.jsp" /> 
 </putList> 
 <putList name="list1" > 
 <add value="/examples/tiles/portal/advert3.jsp" /> 
 <add value="/examples/tiles/portal/stocks.jsp" /> 
 <add value="/examples/tiles/portal/whatsNew.jsp" /> 
 <add value="/examples/tiles/portal/advert2.jsp" /> 
 </putList> 
 </definition>  


layout的代码: <tiles:useAttribute id="numColsStr" name="numCols" classname="java.lang.String" /> 
 <table> 
 <tr> 

<% 
 int numCols = Integer.parseInt(numColsStr); 
 ComponentContext context = ComponentContext.getContext( request ); 
 for( int i=0; i<numCols; i++ ) 
 { 
 java.util.List list=(java.util.List)context.getAttribute( "list" + i ); 
 pageContext.setAttribute("list", list ); 
 if(list==null) 
 System.out.println( "list is null for " + i ); 
 %> 
 <td valign="top"> 
 <tiles:insert page="/layouts/vboxLayout.jsp" flush="true" > 
 <tiles:put name="list" beanName="list" beanScope="page" /> 
 </tiles:insert> 
 </td> 
 <% 
 } // end loop 
 %> 
 </tr> 
 </table>  

这边同样也不能使用<logic:iterate>标签,在JSP1.1不允许在一个标记体内插入另一个页面。
Center Layout 
这个layout常由"top, left, center, right, bottom"组成,left和right部分是可选的。  
所需属性 
header、body、footer - 用difinition名称或URL显示相应的部分。 
right、left - 用difinition名称或URL显示相应的部分(可选)。  
调用layout的代码:和classic layout类似 <tiles:insert page="/layouts/centerLayout.jsp" flush="true"> 
 <tiles:put name="header" value="/header.jsp" /> 
 <tiles:put name="footer" value="/footer.jsp" /> 
 <tiles:put name="right" value="/menu.jsp" /> 
 <tiles:put name="left" value="/menuLeft.jsp" /> 
 <tiles:put name="body" value="definition.name" /> 
 </tiles:insert>  

也可以忽略left和right部分: <tiles:insert page="/layouts/centerLayout.jsp" flush="true"> 
 <tiles:put name="header" value="/header.jsp" /> 
 <tiles:put name="footer" value="/footer.jsp" /> 
 <tiles:put name="body" value="definition.name" /> 
 </tiles:insert>  


layout的代码: <%@ taglib uri="/WEB-INF/tiles.tld" prefix="tiles" %> 
 <table border="0" width="100%" cellspacing="5"> 
 <tr> 
 <td colspan="3"><tiles:insert attribute="header" /></td> 
 </tr> 
 <tr> 
 <td width="140" valign="top"> 
 <tiles:insert attribute=right ignore='true'/> 
 </td> 
 <td valign="top" align="left"> 
 <tiles:insert attribute='body' /> 
 </td> 
 <td valign="top" align="left"> 
 <tiles:insert attribute='left' ignore='true'/> 
 </td> 
 </tr> 
 <tr> 
 <td colspan="3"> 
 <tiles:insert attribute="footer" /> 
 </td> 
 </tr> 
 </table>  


Tabs Layout 
这个layout用表格的形式来呈现Tile类表。Tabs Layout有一个body区域,用来显示当前被选中的Tile;还有一个索引区域,显示可用的表格或Tile。  
所需属性 
tabList - 列表的URL或definition名称,我们用MenuItem来存储数据。 
selectedIndex - 默认被选中的表格 
parameterName - HTTP参数名,在HTTP request中存储选中的Tile信息。  
调用layout的代码:创建了带有三个索引的tab layout <definition name="examples.tabs.body" path="/layouts/tabsLayout.jsp" > 
 <put name="selectedIndex" value="0" /> 
 <put name="parameterName" value="selected" /> 
 <putList name="tabList" > 
 <item value="Doc Home" link="/index.jsp" classtype="org.apache.struts.tiles.beans.SimpleMenuItem" /> 
 <item value="Quick overview" link="/doc/quickOverview.jsp" classtype="org.apache.struts.tiles.beans.SimpleMenuItem" /> 
 <item value="Tutorial" link="/doc/tutorial.jsp" classtype="org.apache.struts.tiles.beans.SimpleMenuItem" /> 
 </putList> 
 </definition>  


layout的代码: <%@ taglib uri="/WEB-INF/tiles.tld" prefix="tiles" %> 
 <tiles:useAttribute name="parameterName" classname="java.lang.String" /> 
 <tiles:useAttribute id="selectedIndexStr" name="selectedIndex" ignore="true" classname="java.lang.String" /> 
 <tiles:useAttribute name="tabList" classname="java.util.List" /> 
 <% 
 String selectedColor="#98ABC7"; 
 String notSelectedColor="#C0C0C0"; 
 int index = 0; // Loop index 
 int selectedIndex = 0; 
 // Check if selected come from request parameter 
 try { 
 selectedIndex = Integer.parseInt(selectedIndexStr); 
 selectedIndex = Integer.parseInt(request.getParameter( parameterName )); 
 } 
 catch( java.lang.NumberFormatException ex ) 
 { // do nothing 
 } 
 // Check selectedIndex bounds 
 if( selectedIndex < 0 || selectedIndex >= tabList.size() ) selectedIndex = 0; 
 String selectedBody = 
 ((org.apache.struts.tiles.beans.MenuItem)tabList.get(selectedIndex)).getLink(); // Selected body 
 %><table border="0" cellspacing="0" cellpadding="0"> 
 <%-- Draw tabs --%> 
 <tr><td width="10""> </td> 
 <td> 
 <table border="0" cellspacing="0" cellpadding="5"> 
 <tr><logic:iterate id="tab" name="tabList" type="org.apache.struts.tiles.beans.MenuItem" >
 <% // compute href 
 String href = request.getRequestURI() + "?"+parameterName + "=" + index; 
 String color = notSelectedColor; 
 if( index == selectedIndex ) 
 { 
 selectedBody = tab.getLink(); 
 color = selectedColor; 
 } // enf if 
 index++; 
 %> 
 <td bgcolor="<%=color%>"><a href="<%=href%>" /><%=tab.getValue()%></a></td> 
 <td width="1" ></td> 
 </logic:iterate> 
 </tr></table></td> 
 <td width="10" > </td></tr> 
 <tr><td height="5" bgcolor="<%=selectedColor%>" colspan="3" > </td></tr> 
 <%-- Draw body --%> 
 <tr><td width="10" bgcolor="<%=selectedColor%>"> </td> 
 <td><tiles:insert name="<%=selectedBody%>" flush="true" /></td> 
 <td width="10" bgcolor="<%=selectedColor%>"> </td></tr> 
 <tr><td height="5" bgcolor="<%=selectedColor%>" colspan="3" > </td> 
 </tr></table>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值