Tiles和SiteMesh,谁更适合你

前段时间因工作需要,再次对Tiles和SiteMesh进行了应用对比,接下来我简单阐述一下我目前的结论,有错的地方,希望有朋友能够给予指导

 

版本选择:Tiles 2.1.2 SiteMesh 2.4

 

因兄弟们极力推荐,说SiteMesh好,我问为什么?他们告诉我说,网上文章都说SiteMesh好。于是我首先到opensymphone下了SiteMesh来试用,地址:http://www.opensymphony.com/sitemesh/刚开始项目使用时,就感觉SiteMesh的配置很简单,基本参照sitemesh-blank.war的示例https://sitemesh.dev.java.net/files/documents/887/124380/sitemesh-blank.war去做,就很快能够使用了。不需要sitemesh.xml,只有一个decorators.xml配置文件就可以正常的工作了。

 

示例应用配置:

1、SiteMesh 2.4

web.xml

    <filter>
        <filter-name>sitemesh</filter-name>
        <filter-class>com.opensymphony.sitemesh.webapp.SiteMeshFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>sitemesh</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

 

 

decorators.xml

<?xml version="1.0" encoding="ISO-8859-1"?>

<decorators defaultdir="/decorators">
    <decorator name="main" page="main.jsp">
        <pattern>/*</pattern>
    </decorator>

    <decorator name="panel" page="panel.jsp"/>
    <decorator name="footer" page="footer.jsp"/>
</decorators>

 

 

main.jsp

<%@ taglib uri="http://www.opensymphony.com/sitemesh/decorator" prefix="decorator" %>
<%@ taglib uri="http://www.opensymphony.com/sitemesh/page" prefix="page" %>

<html>
    <head>
        <title>My Site - <decorator:title default="Welcome!" /></title>
        <decorator:head />
    </head>

    <body>
        <page:applyDecorator name="panel"/>
        <decorator:body />
        <p><small>(<a href="?printable=true">printable version</a>)</small></p>
        <page:applyDecorator name="footer"/>
    </body>
</html>

 

 

2、Tiles 2.1.2

web.xml

	<context-param>
		<param-name>
			org.apache.tiles.impl.BasicTilesContainer.DEFINITIONS_CONFIG
		</param-name>
		<param-value>/WEB-INF/tiles-defs-example.xml</param-value>
	</context-param>
	<listener>
		<listener-class>
			org.apache.tiles.web.startup.TilesListener
		</listener-class>
	</listener>

 

 

tiles-defs-example.xml

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

<!-- Definitions for Tiles documentation   -->

<tiles-definitions>
	
	<definition name="basic" template="/decorators/main.jsp">
		<put-attribute name="title" value="example" />
		<put-attribute name="menu" value="/decorators/menu.jsp" />
		<put-attribute name="body" value="/decorators/blank.jsp" />
		<put-attribute name="footer" value="/decorators/footer.jsp" />
	</definition>

	<definition name="example.*.*" extends="basic">
		<put-attribute name="body" value="/example/{1}/{2}.jsp"/>
	</definition>

</tiles-definitions>

 

 

main.jsp

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<%@ page language="java" contentType="text/vnd.wap.wml; charset=utf-8"
	pageEncoding="UTF-8"%>
<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
<wml>
<head>
	<meta http-equiv="Cache-Control" content="max-age=0" forua="true" />
</head>
<card title='<tiles:getAsString name="title"/>'>
<tiles:insertAttribute name="menu" />
<tiles:insertAttribute name="body" />
<tiles:insertAttribute name="footer" />
</card>
</wml>

 

眼尖的朋友有没有发现?以前我写过一篇文章说《tiles不支持通配,spring支持》,这个文章可以废除了,Tiles 2.1.2支持通配了!!!是个非常有用的功能,项目当中遵循一个约定,我的一个项目中的配置就是几行!

 

3、直接用jsp路径访问

 

这项对比,虽然Tiles能够使用<tiles>标签做到,但是终究必须在第个页面加上<tiles>,多打那么几行!

而sitemesh基本不需要你做什么了,他会自动把你访问的jsp文件渲染到帧框中去。

 

4、servlet等MVC、集成模式访问

 

大多数项目团队,都会有一定的MVC约束机制。经过进一步集成进我的引擎框架的过程中时,比如我需要一个这样的函数,是能够直接渲染页面的功能:

public void render(String def) throws Exception {
	// 2.0.4版本使用TilesAccess,2.1.2版本时,使用ServletUtil工具.
        TilesContainer container;
        if ( tilesVersion.startsWith("2.0"))
	container = TilesAccess.getContainer(servletContext());
        else
                container = ServletUtil.getContainer(servletContext);
        container.render(def,request,response);
}

 

然后在其他Servlet或者bean中调用

render("example.entityA.edit");

 

我原以为sitemesh在代码内可以直接forward("/example/entityA/edit.jsp")就可以。但是不对,sitemesh不能通过servlet的api函数达到渲染效果,必须使用让用户浏览器发生行为的动作才能有效激活渲染,比如redirect。

 

SiteMesh暂时没有对这种应用需求考虑好。我参考了struts2和sitemesh的PageTag的代码,发现sitemesh的代码内部耦合性太强,需要对sitemesh内部好多类熟悉才能真正应用好。写一段类似以上面render方法时,要用到好多Servlet API不说,你只看看以下要用到sitemesh的类:

要用到的sitemesh内部类 写道
PageParser
Page
PageRequestWrapper
PageResponseWrapper
PageContext
Decorator
DecoratorManager
Config
Factory

你就明白,那是多么复杂的一件事情。

 

我的总体认识是:

 

sitemesh的优点是是配置简单,方便快捷,适合的项目应该是主要以jsp作为主控制器的项目,比如项目是以jsp为主去开发,相信sitemesh对这样的项目会如虎添翼!或者你直接采用struts-sitemesh这样的第三方组件,也是可行的。缺点是对底层支持、api支持暂时不够,相信将来sitemesh会提供一个很好用的接口的,但目前不行!

 

最后,我基于这两个版本的对比,还是全面采用tiles 2.1.2!

推荐对MVC有一定约束期望的团队采用Tiles,我个人认为tiles在国际化、性能、灵活性方面更胜一筹。

 

 

以上仅个人之解,如有不正确的地方,欢迎朋友们给予指导!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值