tiles使用總結

最近學習了下Tiles,準備應用到實際項目中,由於還使用了Spring MVC,所以需要把Tiles集成到Spring MVC中。
Tiles是的版本是2.2.2,Spring版本是3.1.0M2.
步驟挺簡單
[list]
[*]創建佈局文件

<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles"%>

<HTML>
<HEAD>
<title><tiles:getAsString name="title" /></title>
</HEAD>

<body>
<table border="0" width="100%" cellspacing="5">
<tr>
<td colspan="2"><tiles:insertAttribute name="header" /></td>
</tr>
<tr>
<td width="140" valign="top"><tiles:insertAttribute name='menu' /></td>
<td valign="top" align="left"><tiles:insertAttribute name='body' /></td>
</tr>
<tr>
<td colspan="2"><hr></td>
</tr>
<tr>
<td colspan="2"><tiles:insertAttribute name="footer" /></td>
</tr>
</table>
</body>
</html>

佈局文件用來規範了整個頁面的佈局,包括頁面上的哪一塊應該放入哪個內容,但是具體的內容沒有在這個頁面上體現出來,所以還需要一個用來指定每塊內容的定義文件。
[*]創建定義文件

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE tiles-definitions PUBLIC
"-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"
"http://tiles.apache.org/dtds/tiles-config_2_0.dtd">

<tiles-definitions>

<definition name=".mainLayout" template="/WEB-INF/views/test/common/layout.jsp">
<put-attribute name="title" value="Tiles Library Documentation" />
<put-attribute name="header" value="/WEB-INF/views/test/common/header.jsp" />
<put-attribute name="menu" value="/WEB-INF/views/test/common/menu.jsp" />
<put-attribute name="footer" value="/WEB-INF/views/test/common/footer.jsp" />
</definition>

<definition name=".test.*.*" extends=".mainLayout" preparer="com.fsti.test.controller.TestViewPrepare">
<put-attribute name="body" value="/WEB-INF/views/test/{1}/{2}.jsp" />
</definition>

</tiles-definitions>

定義文件指定了佈局文件中每塊應該由什麼具體內容來填充。注意我們這裏使用了通配。
[*]在Spring中配置TilesConfigurer和Tiles的視圖解析器

<beans:bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
<beans:property name="definitions">
<beans:list>
<beans:value>/WEB-INF/tiles-defs.xml</beans:value>
</beans:list>
</beans:property>
</beans:bean>

<beans:bean class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<beans:property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView" />
</beans:bean>

<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>

注意這裏還有個JSP用的視圖解析器,用來處理不需要被Tiles渲染的視圖。
[*]Controller中返回邏輯視圖名

@RequestMapping("/view")
public String view(){
return ".test.product.product_view";
}

注意到現在控制器返回的邏輯視圖名對應的是一個tiles定義文件中的定義名,這樣tiles的視圖解析器就會爲你正確的渲染視圖。
[/list]
可以看到使用Tiles還是很簡單的,自從Tiles2.1後就開始支持通配,通過約定命名規範,就可以節省許多定義文件的配置。
以前也使用過Sitemesh,現在再大概比較下它們:
1. sitemesh最令人詬病的一點可能就是它的性能問題,由於使用了裝飾器模式,要去解析html代碼,會產生好多垃圾對象,所以會頻繁的引起GC,CPU的負擔會加大。而Tiles基本上沒有這樣的問題。Sitemesh的測試見:[url]http://www.iteye.com/topic/715100[/url]。
2. 有人說tiles的配置比較繁瑣,通過上面的例子我們可以看見自從Tiles引入通配後,配置簡單了很多。使用Sitemesh也至少需要兩個文件,一個佈局文件,一個裝飾器映射文件,在映射中也需要配置匹配的URL路徑,實際上比Tiles簡單不了多少。
3. 在JSP頁面的編寫上,使用Sitemesh非常舒服,完全是無傾入的,開發人員根本不知道是否用了sitemesh。而使用Tiles的開發人員要注意由於<HTML>這樣的標籤都定義在了佈局jsp中,所以每個tile頁面是不能包含它們的。
4. 動態內容的編輯,比如每個頁面的title,sitemesh提供了<decorator:title />用來很方便的爲你插入title內容。而sitemesh則必須單獨定義在定義文件中,或者使用通配從controller返回的視圖名中解析出來,感覺相當不好。
5. Tiles的功能更強大一些,比如可以直接在servlet中渲染視圖,在運行時改變定義之類的,而且有更好的個性化擴展性,相對來說siteme就沒那麼多功能了(雖說我覺得那些功能實際上都沒什麼用)。不過也可以認爲Tiles的學習難度會比sitemesh高一些。
總的來說,Tiles和Sitemesh都是非常好的佈局框架,具體選擇哪一個應該根據項目來定。如果對性能要求比較高的話,還是選擇Tiles穩妥些,或者可以等到Sitemesh3成熟以後。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章