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成熟以后。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章