前段时间因工作需要,再次对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在国际化、性能、灵活性方面更胜一筹。
以上仅个人之解,如有不正确的地方,欢迎朋友们给予指导!
分享到:
相关推荐
在本文中,我们将深入探讨如何将 Tiles2 替换为 Sitemesh 在一个基于 Spring MVC 和 Spring Web Flow 的项目中。Sitemesh 是一个流行的页面布局和装饰框架,它可以为我们的应用程序提供统一的外观和感觉。Tiles2 ...
通过对Sitemesh的学习和实践,开发者可以更好地管理Web应用程序中的布局和装饰问题。 #### 六、参考资料 - [Sitemesh官方网站](https://www.opensymphony.com/sitemesh/) - [Sitemesh官方文档]...
一种解决方案是全面重写系统,并使用像Struts-Tiles这样的框架来确保统一的外观和感觉。然而,这种方法通常成本高昂且不切实际。另一种方法是尝试让所有应用系统的部分都具有相同的外观和感觉,但这将导致维护上的...
Struts2、Spring2、Hibernate3、Velocity和Sitemesh是经典的Java Web开发框架组合,它们各自在Web应用的不同层面提供了强大的支持。这个集成框架代码集合了这些技术,旨在提供一个高效、灵活和可扩展的开发环境。 1...
JWebBox2.0.0是Java服务器页面(JSP)项目中使用的小型布局工具,起着Tiles和SiteMesh的作用,但是它是纯面向对象设计的,没有XML文件,没有标签,功能强大但简单(仅1个Java类),并且易于使用,可用于构建整个网站...
Spring MVC 是一个基于 Java 的轻量级 Web 开发框架,它是 Spring 框架的一部分,主要用于构建 MVC(Model-View-Controller)模式的 Web ...通过逐步学习和实践,你可以提升自己的技能,更好地掌握企业级 Web 开发。
tiles-request-servlet-wildcard-1.0.1.jar, tiles-request-velocity-1.0.1.jar, tiles-servlet-2.2.2.jar, tiles-template-2.2.2.jar, tiles-velocity-3.0.1.jar, velocity-1.6.4.jar, velocity-tools-1.3.jar, ...
与Struts1.x中常用的Tiles框架相比,SiteMesh配置更为简洁,能够方便地为所有请求添加装饰。 **整合步骤:** 在整合Struts2、Spring和Hibernate时,通常会遵循以下步骤: 1. **创建项目环境** 使用像MyEclipse...
tiles-autotag-core-runtime-1.1.0.jar, tiles-core-3.0.5.jar, tiles-el-3.0.5.jar, tiles-freemarker-3.0.5.jar, tiles-jsp-3.0.5.jar, tiles-ognl-3.0.5.jar, tiles-request-api-1.0.6.jar, tiles-request-...
struts2-tiles-plugin-2.5.10.jar,tiles-api-3.0.7.jar,tiles-autotag-core-runtime-1.2.jar,tiles-core-3.0.7.jar,tiles-el-3.0.7.jar,tiles-freemarker-3.0.7.jar,tiles-jsp-3.0.7.jar,tiles-ognl-3.0.7.jar,tiles...
Struts2提供了丰富的标签库(Tiles、Sitemesh等),使得JSP页面的编写更加简洁和规范。 7. **使用Struts2标签** Struts2提供了一系列的标签,如`s:textfield`用于输入字段,`s:submit`用于提交按钮,`s:action...
10. **MVC 插件**:Spring MVC 还支持多种插件,如 Tiles、SiteMesh 等,用于页面布局和装饰。 在实际开发中,开发者通常会结合其他 Spring 组件,如 Spring Data(用于数据库操作)、Spring Security(用于安全...
4. **集成性**:Struts2可以与Spring框架无缝集成,同时支持SiteMesh(布局管理)和Tiles(页面组装),并提供了与OGNL(Object-Graph Navigation Language)表达式的集成,用于数据绑定和表达式计算。 5. **视图技术...
Struts2拥有活跃的开发者和用户社区,支持注解和XML配置,Action基于POJO,易于测试,并能与Spring、SiteMesh和Tiles等框架集成。OGNL(Object Graph Notation Language)是Struts2中的表达式语言,用于数据绑定和...
tiles-request-servlet-wildcard-1.0.1.jar tiles-request-velocity-1.0.1.jar tiles-servlet-3.0.1.jar tiles-template-3.0.1.jar tiles-velocity-3.0.1.jar tomcat-juli.jar velocity-1.6.4.jar velocity-tools-...