Apache Tiles是一个模板布局框架。最初是为了简化Web应用界面开发,现在已不限于JavaEE Web环境。html
Tiles容许开发人员定义页面片断,它们在运行时会组装成一个完整的页面。这些片断,或者叫“瓷砖”(tiles本意即瓷砖),被其余页面引入以减小公共元素的重复定义,或者嵌入另外一个tiles以组成一系列可重用的模板。
web
很多网站都有这样的特色:大部分页面遵循着相同的结构和布局。Composite View Pattern就是这种状况的典型应用场景。请看下图,两个网页有着类似的结构,只是body部分随状况改变,然而这确实须要绘制两个页面,这和使用frameset刷新其中一个子frame是不一样的。spring
Tiles是一个Composite View框架,它容许在整个应用重用页面片断。另外一种能实现相同效果的办法是使用Decorator pattern((页面)装饰模式),例如Sitemesh就是基于装饰模式的。不一样于Composite View建立模板并动态组装页面片断,Decorator pattern利用一个HTML页面添加各个(页眉、页脚、菜单...)部分以呈现界面。你能够经过下表看到他们之间的使用差异:apache
哪些方面 | Composite View | Decorator |
可重用性 | 页面的不一样部分(模板和片断)可以在整个应用重用 | 每一个装饰器都能被重用,可是同一时间装饰器自己只能应用于一个页面 |
配置简便性 | 每一个页面都必须显式定义 | 装饰器甚至可以应用于整个应用 |
运行时配置 | 页面能在运行时配置、组装 | 因为页面装饰一次,没有此特性 |
性能 | 组装开销很低 | 被装饰的页面必须被解析 |
Tiles实现了复合视图模式(Composite View Pattern),为了实现这个模式Tiles添加了几个本身的概念:Template(模板)、Attribute(属性)、Definition(定义)。mvc
即页面布局,页面的各个部分由Attribute填充。(Template能够没有Attribute)app
举个栗子,考虑下图的经典风格布局:框架
一个模板(Template)页面的代码可能相似下面这样:jsp
<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %> <table> <tr> <td colspan="2"> <tiles:insertAttribute name="header" /> </td> </tr> <tr> <td> <tiles:insertAttribute name="menu" /> </td> <td> <tiles:insertAttribute name="body" /> </td> </tr> <tr> <td colspan="2"> <tiles:insertAttribute name="footer" /> </td> </tr> </table>
Attribute就是页面上那些待填充的空白部分,它容许如下三种类型:maven
● string:页面直接呈现的内容。布局
● template:一个可能包含Attribute的模板,若是包含则必须填充Attribute以呈现页面。
● definition:一个可重用的页面部分,其中部分或所有的Attribute已被填充。
Definition是最终要展示给用户的部分,其实就是一个Attribute彻底或部分填充的Template。
● 若是Attribute已彻底填充,它就能够展示给用户。
● 若是还有还没有填充的Attribute,这被称做抽象定义(abstract definition),它能够被其余Definition继承以实现布局复用,或者也能够在运行时填充这些Attribute。
就拿上面的经典布局风格举个栗子(注意页面中insertAttribute的name属性与definition中put-attribute的name属性的对应关系):
<definition name="myapp.homepage" template="/layouts/classic.jsp"> <put-attribute name="header" value="/tiles/banner.jsp" /> <put-attribute name="menu" value="/tiles/common_menu.jsp" /> <put-attribute name="body" value="/tiles/home_body.jsp" /> <put-attribute name="footer" value="/tiles/credits.jsp" /> </definition>
Tiles是一个Web应用包,曾经和Struts捆绑使用,现在已独立出来,目前最经常使用的情形是基于servlet的web应用。
你须要具有如下环境才能保证Tiles正常使用:JDK1.6或更高版本,Servlet2.5
简单起见,仅仅你的pom.xml加入如下内容就可使用Tiles的全部特性了(入门的话不须要再往下看配置了):
<dependency> <groupId>org.apache.tiles</groupId> <artifactId>tiles-extras</artifactId> <version>3.0.5</version> </dependency>
若是你不打算使用全部特性,基本的仅支持servlet的依赖以下:
<dependency> <groupId>org.apache.tiles</groupId> <artifactId>tiles-servlet</artifactId> <version>3.0.5</version> </dependency>
若是你还想加入JSP支持,继续添加:
<dependency> <groupId>org.apache.tiles</groupId> <artifactId>tiles-jsp</artifactId> <version>3.0.5</version> </dependency>
Spring 3.2.x支持2.1.2
及以上版本的Tiles,若是你使用Spring 4请集成Tiles 3.0.x及更高版本。
TilesConfigurer
以加载Tiles定义文件
WebApplicationContext
初始化时,下面的定义文件被加载而且定义工厂(DefinitionsFactory)被实例化。
<bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles3.TilesConfigurer"> <!-- Tiles2:<bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer"> --> <property name="definitions"> <list> <!-- <value>classpath:tiles/tiles-template.xml</value> --> <value>/WEB-INF/defs/general.xml</value> <value>/WEB-INF/defs/widgets.xml</value> <value>/WEB-INF/defs/administrator.xml</value> <value>/WEB-INF/defs/customer.xml</value> <value>/WEB-INF/defs/templates.xml</value> </list> </property> </bean>
至此已经能够在Spring Web工程中做为view使用了,和使用Spring的其它视图技术同样,咱们还须要一个视图解析器(ViewResolver)。咱们可使用支持解析多种视图的ResourceBundleViewResolver(参见:http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/view.html#view-tiles),简单起见,咱们使用UrlBasedViewResolver:
<!-- 配置方式一(UrlBasedViewResolver将会实例化给定的viewClass) --> <bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.tiles3.TilesView"/> <!-- Tiles2:<property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView"/> --> </bean>
<!-- 配置方式二 --> <bean id="tilesViewResolver" class="org.springframework.web.servlet.view.tiles3.TilesViewResolver"> <!-- Tiles2:<bean id="tilesViewResolver" class="org.springframework.web.servlet.view.tiles2.TilesViewResolver"> -->
若是你打算使用Tiles的某些高级特性,像运行时构建视图(Runtime Composition)、更复杂的通配符支持(Wildcard support)之类,启用方式有两种:
方式一:springMVC集成Tiles3情形下很合适:
<bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles3.TilesConfigurer"> <property name="definitions"> <list> <value>/WEB-INF/config/tiles.xml</value> <value>/WEB-INF/config/tiles-adf.xml</value> </list> </property> <!-- Specify whether to apply Tiles 3.0's "complete-autoload" configuration. --> <property name="completeAutoload" value="true" /> </bean>
方式二:在web.xml中配置监听器:
<listener> <listener-class>org.apache.tiles.extras.complete.CompleteAutoloadTilesListener</listener-class> </listener>
SpringMVC整合Tiles3,基于Maven构建,Bootstarp作前台页面呈现尽管作的相对简陋。菜单能够切换两种布局方式(用继承以及覆盖解释如何换汤不换药),固然,还有点彩蛋 ==
下面的项目实战咱们也用到了通配符以简化定义,在普通的springMVC集成Tiles工程里通配符的使用可能相似下面这样:
<definition name="tiles/*" extends="base.definition"> <!-- {1}:通配符方式简化定义 --> <put-attribute name="content" value="/WEB-INF/views/{1}.jsp"/> </definition>
然而,当咱们用springMVC整合Tiles时在springMVC配置文件中启用了complete-autoload致使通配符的使用方式须要作些改进(配置监听器的方式不会出现此问题):
<definition name="WILDCARD:tiles/*" extends="base.definition"> <!-- {1}:通配符方式简化定义 --> <put-attribute name="content" value="/WEB-INF/views/{1}.jsp"/> </definition>
文章并无解释Tiles的高级特性部分,可是部分应用已经体如今下面的项目中了,好比定义的继承、Runtime Composition、通配符、EL支持...
下载地址:tiles3-springmvc.rar