java

位置:IT落伍者 >> java >> 浏览文章

教你如何精通Struts:Tiles框架


发布日期:2022年04月06日
 
教你如何精通Struts:Tiles框架

Tiles框架特性和内容

Tiles框架为创建Web页面提供了一种模板机制它能将网页的布局和内容分离它允许先创建模板然后在运行时动态地将内容插入到模板中Tiles 框架建立在JSP的include指令的基础上但它提供了比JSP的 include指令更强大的功能Tiles框架具有如下特性

◆创建可重用的模板

◆动态构建和装载页面

◆定义可重用的Tiles组件

◆支持国际化

Tiles框架包含以下内容

◆Tiles标签库

◆Tiles组件的配置文件

◆TilesPlugIn插件

在开发Web站点时常常要求同一站点的所有Web页面保持一致的外观比如有相同的布局页头页尾和菜单

采用基本的JSP语句创建复合式网页

创建动态Web页面的最基本的办法是为每个页面创建独立的JSP文件如果网页的相同部分发生需求变更必须手工修改所有的JSP文件可见采用基本的JSP语句来编写上述网页会导致JSP代码的大量冗余增加开发与维护成本

采用JSP的include指令创建复合式网页

为了减少代码的冗余可以把indexjsp和productjsp中相同部分放在单独的JSP文件中然后在indexjsp和 productjsp文件中通过JSP include指令把其他JSP文件包含进来这样提高了代码的可重用性但是JSP include指令不能完全避免代码冗余尽管这种方案减少了重复代码但JSP文件的数量增加了由原来的个文件增加到个文件所以软件的复杂度也增加了

采用Tiles:Insert标签创建复合式网页

Tiles标签库的tiles:insert标签和JSP include指令具有相同的功能也能把其他的JSP页面插入到当前页面中用tiles:insert标签取代JSP include指令来创建复合式页面代码仅有稍微的差别两者的利弊也很相似单纯使用tiles:insert标签来创建复合式页面还没有充分发挥 Tiles框架的优势

以下两条语句的作用是相同的

< ?xml:namespace prefix = jsp />< jsp:include page=indexContentjsp>< /jsp:include>

< ?xml:namespace prefix = tiles />< tiles:insert page=indexContentjsp>< /tiles:insert>

采用Tiles模板创建复合式网页

尽管使用了tiles:insert标签indexjsp和productjsp文件还是存在很多的重复代码为了提高Web页面的可重用性和可维护性可以引入Tiles的模板机制通俗的讲Tiles模板是一种描述页面布局的JSP页面Tiles模板仅仅定义Web页面的样式而不指定内容在Web应用运行时才把特定内容插入到模板页面中同一模板可以被多个Web页面共用使用模板可以轻松的实现Web应用的所有页面保持相同的外观和布局无需为每个页面硬编码在一个应用中大多数页面使用同一模板某些页面可能需要不同的外观使用其他的模板因此一个应用可能有一个以上模板

< %@ taglib uri=/WEBINF/strutstilestld prefix=tiles%>

< tiles:insert attribute=sidebar>< /tiles:insert>

< tiles:insert attribute=header>< /tiles:insert>

< tiles:insert attribute=content>< /tiles:insert>

< tiles:insert attribute=footer>< /tiles:insert>

< %@ page contentType=text/html; charset=UTF %>

< %@ taglib uri=/WEBINF/strutstilestld prefix=tiles %>

< tiles:insert page=layoutjsp flush=true>

< tiles:put value=sidebarjsp name=sidebar>< /tiles:put>

< tiles:put value=headerjsp name=header >< /tiles:put>

< tiles:put value=indexContentjsp name=content>< /tiles:put>

< tiles:put value=footerjsp name=footer >< /tiles:put>

< /tiles:insert>

采用Tiles模板机制大大提高了代码的可重用性和可维护性模板中包含了网页共同的布局如果布局发生变化只需要修改模板文件无需修改具体的网页文件不过从例程可以看出尽管 indexjsp和productjsp文件的长度都缩短了但是两者还是存在重复代码

Tiles组件的基本使用方法

为了最大程度的提高代码的可重用性和灵活性Tiles框架引入了Tiles组件的概念Tiles组件可以代表一个完整的网页也可以代表网页的一部分简单的Tiles组件可以组合成复杂的Tiles组件或被扩展为复杂的Tiles组件

Tiles框架允许在专门的XML文件中配置Tiles组件例如以下代码定义了一个名为indexdefinition的Tiles组件它描述整个indexjsp网页

< TILESDEFINITIONS>

< DEFINITION name=indexdefinition path=/layoutjsp>

< put value=sidebarjsp name=sidebar>< /put>

< put value=headerjsp name=header>< /put>

< put value=indexContentjsp name=content>< /put>

< put value=footerjsp name=footer >< /put>

< /DEFINITION>

< /TILESDEFINITIONS>

definition元素的name属性指定Tiles组件的名字path属性指定Tiles组件使用的模板definition元素的put子元素用于向模板中插入具体的网页内容

例程 tilesdefsxml

< ?xml version= encoding=ISO ?>

config__dtd>

< TILESDEFINITIONS>

< DEFINITION name=indexdefinition path=/layoutjsp>

<:put value=sidebarjsp name=sidebar>< /put>

<:put value=headerjsp name=header>< /put>

<:put value=indexContentjsp name=content>< /put>

<:put value=footerjsp name=footer>< /put>

< /DEFINITION>

< DEFINITION name=productdefinition path=/layoutjsp>

< put value=sidebarjsp name=sidebar>< /put>

< put value=headerjsp name=header >< /put>

< put value=productContentjsp name=content>< /put>

< put value=footerjsp name=footer >< /put>

< /DEFINITION>

< /TILESDEFINITIONS>

以上代码定义了两个Tiles组件它们分别代表完整的indexjsp和productjsp页面

)在Strut配置文件中配置TilesPlugin插件代码如下

< PLUGIN className=orgapachestrutstilesTilesPlugin>

< SETPROPERTY value=/WEBINF/tilesdefsxml property=definitionsconfig />

< SETPROPERTY value=true property=definitionsparservalidate />

< /PLUGIN>

TilesPlugin插件用于加载Tiles组件的配置文件在plugin元素中包含几个setproperty子元素用于向TilesPlugin插件传入附加的参数

◆definitionsconfig参数指定Tiles组件的配置文件如果有多个配置文件则它们之间用逗号分隔

◆definitionsparservalidate参数指定XML解析器是否验证Tiles配置文件可选值包括true和false默认值为true

)在webxml文件中配置ActionServlet

为了保证在Web应用启动时加载TilesPlugin插件应该加入ActionServlet控制器ActionServlet控制器在初始化时能加载所有的插件以下是在webxml文件中配置ActionServlet的代码

< SERVLET>

< SERVLETNAME>action< /SERVLETNAME>

< SERVLETCLASS>orgapachestrutsactionActionServlet< /SERVLETCLASS>

< INITPARAM>

< PARAMNAME>config< /PARAMNAME>

< PARAMVALUE>/WEBINF/strutsconfigxml< /PARAMVALUE>

< /INITPARAM>

< LOADONSTARTUP>< /LOADONSTARTUP>

< /SERVLET>

< SERVLETMAPPING>

< SERVLETNAME>action< /SERVLETNAME>

< URLPATTERN>*do< /URLPATTERN>

< /SERVLETMAPPING>

)在indexjsp和productjsp中插入Tiles组件参见例程和例程

例程 indexjsp

< %@ page contentType=text/html; charset=UTF %>

< %@ taglib uri=/WEBINF/strutstilestld prefix=tiles %>

< tiles:insert definition=indexdefinition>< /tiles:insert>

例程 productjsp

< CCID_NOBR>

bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center">

< CCID_CODE> < %@ page contentType="text/html; charset=UTF-8" %>

< %@ taglib uri="/WEB-INF/struts-tiles.tld" prefix="tiles" %>

< tiles:insert definition="product-definition">< /tiles:insert>

通过Struts Action来调用Tiles组件

如果Tiles组件代表完整的网页,可以直接通过Struts Action来调用Tiles组件。tW.wiNgWIt.cOm例如,如果希望通过Struts Action来调用16.5.1节定义的名为"index-definition"的Tiles组件,可以在Struts配置文件中配置如下Action 映射:

< ACTION-MAPPINGS>

< ACTION path="/index" P <>

type="org.apache.struts.actions.ForwardAction"

parameter="index-definition">

< /ACTION>

< /ACTION-MAPPINGS>

接下来通过浏览器访问 ,该请求先被转发到ForwardAction, ForwardAction再把请求转发给名为"index-definition"的Tiles组件,最后在浏览器端,用户将看到和index.jsp 相同的页面。

通过Struts Action来调用Tiles组件,可以充分发挥Struts框架负责流程控制的功能。此外,可以减少JSP文件的数目。例如,如果直接通过Struts Action来调用名为"index-definition"的Tiles组件,就不必再创建index.jsp文件。

解析Tiles组件的组合与扩展

Tiles 组件是一种可重用的组件。可以象搭积木一样,把简单的Tiles组件组装成复杂的Tiles组件,例如,可以把名为"index-definition" 的Tiles组件的左边部分拆分为独立的Tiles组件,名为"sidebar-definition"。

< DEFINITION name="index-definition" path="/layout.jsp">

< put value="sidebar-definition" name="sidebar" type="definition">< /put>

……

< /DEFINITION>

以上put子元素的value属性指定被包含的Tiles组件的名字,type属性设为"definition",表示value属性指定的是Tiles组件,而不是JSP文件。

< DEFINITION name="index-definition" extends="base-definition">

上一篇:奇怪的Eclipse Debug异常

下一篇:Java开源项目Hibernate快速入门