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