`

SiteMesh装饰器

 
阅读更多

一、SiteMesh项目简介

OS(OpenSymphony)的SiteMesh是一个用来在JSP中实现页面布局和装饰(layout and decoration)
的框架组件,能够帮助网站开发人员较容易实现页面中动态内容和静态装饰外观的分离。

Sitemesh是由一个基于Web页面布局、装饰以及与现存Web应用整合的框架。它能帮助我们在由大
量页面构成的项目中创建一致的页面布局和外观,如一致的导航条,一致的banner,一致的版权,等等。
它不仅仅能处理动态的内容,如jsp,php,asp等产生的内容,它也能处理静态的内容,如htm的内容,
使得它的内容也符合你的页面结构的要求。甚至于它能将HTML文件象include那样将该文件作为一个面板
的形式嵌入到别的文件中去。所有的这些,都是GOF的Decorator模式的最生动的实现。尽管它是由java语言来实现的,但它能与其他Web应用很好地集成。

官方:http://www.opensymphony.com/sitemesh/

下载地址:http://www.opensymphony.com/sitemesh/download.action 目前的最新版本是Version 2.3

二、为什么要使用SiteMesh?

我们的团队开发J2EE应用的时候,经常会碰到一个比较头疼的问题:

由于Web页面是由不同的人所开发,所以开发出来的界面通常是千奇百怪,通常让项目管理人员苦笑不得。

而实际上,任何一个项目都会要求界面的统一风格和美观,既然风格统一,那就说明UI层肯定有很多可以抽出来
共用的静态或动态部分;如何整合这些通用的静态或动态UI呢?Apache Tiles框架站了出来很好的解决了这一问题,
再加上他与struts的完美集成,导致大小项目都把他作为UI层的首选框架,

但是

Tiles确实有着它很多的不足之处,下文我会介绍,本文想说的是,除了Apache Tiles框架,其实我们还有更好的解
决方案,那就是:
SiteMesh;

本文


介绍了一个基于Web页面的布局、装饰以及应用整合的框架Sitemesh,它能帮助你为你的应用创建一致的外观,
很好的取代Apache Tiles;

三、SiteMesh VS Apache Tiles

用过struts的朋友应该对Apache Tiles的不会陌生,我曾经有一篇文章介绍过 struts中tiles框架的组合与继承
现在怎么看怎么觉得复杂;

从使用角度来看,Tiles似乎是Sitemesh标签<page:applyDecorator>的一个翻版。其实sitemesh最强的
一个特性是sitemesh将decorator模式用在过滤器上。任何需要被装饰的页面都不知道它要被谁装饰,所以它就
可以用来装璜来自php、asp
、CGI等产生的页面了。你可以定义若干个装饰器,根据参数动态地选择装饰器,
产生动态的外观以满足你的需求。它也有一套功能强大的属性体系,它能帮助你构建功能强大而灵活的装饰器。
相比较而言,在这方面Tiles就逊色许多。

个人觉得在团队开发里面,Apache Tiles框架会导致所有人不仅仅要了解并且清楚Apache Tiles的存在,
并且要特别熟悉每一个Tiles layout模板的作用,否则就可能出现用错模板的情况;除此之外,每个人涉及到
的所有WEB页面都需要去配置文件里面逐个配置,不仅麻烦出错的几率还高;
而以上所有的不足都是SiteMesh所不存在的;


四、SiteMesh的基本原理

一个请求到服务器后,如果该请求需要sitemesh装饰,服务器先解释被请求的资源,然后根据配置文件
获得用于该请求的装饰器,最后用装饰器装饰被请求资源,将结果一同返回给客户端浏览器。


五、如何使用SiteMesh

这里以struts2+spring2+hibernate3构架的系统为例
1、下载SiteMesh
下载地址:http://www.opensymphony.com/sitemesh/download.action 目前的最新版本是Version 2.3

2、在工程中引入SiteMesh的必要jar包,和struts2-sitemesh-plugin-2.0.8.jar;

3、修改你的web.xml,在里面加入sitemesh的过滤器,示例代码如下:

<!-- sitemesh配置 -->
< filter >
< filter-name > sitemesh </ filter-name >
< filter-class >
com.opensymphony.module.sitemesh.filter.PageFilter
</ filter-class >
</ filter >
< filter-mapping >
< filter-name > sitemesh </ filter-name >
< url-pattern > /* </ url-pattern >
</ filter-mapping >

注意过滤器的位置:应该在struts2的org.apache.struts2.dispatcher.FilterDispatcher过滤器之前 org.apache.struts2.dispatcher.ActionContextCleanUp过滤器之后,否则会有问题;

4、在下载的SiteMesh包中找到sitemesh.xml,(/sitemesh-2.3/src/example-webapp/WEB-INF目录下就有)

将其拷贝到/WEB-INF目录下;

5、在sitemesh.xml文件中有一个property结点(如下),该结点指定了decorators.xml在工程中的位置,让sitemesh.xml能找到他;
按照此路径新建decorators.xml文件,当然这个路径你可以任意改变,只要property结点的value值与其匹配就行;


< property name ="decorators-file" value ="/WEB-INF/sitemesh/decorators.xml" />


6、在WebRoot目录下新建decorators目录,并在该目录下新建一个模板jsp,根据具体项目风格编辑该模板,
如下示例:我的模板:main.jsp

<% @ page language = " java " pageEncoding = " UTF-8 " %>
<% @taglib prefix = " decorator "
uri
= " http://www.opensymphony.com/sitemesh/decorator " %>
<% @taglib prefix = " page " uri = " http://www.opensymphony.com/sitemesh/page " %>
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
>
<%
response.setHeader(
" Pragma " , " no-cache " );
response.setHeader(
" Cache-Control " , " no-cache " );
response.setDateHeader(
" Expires " , 0 );
%>
< html >
< head >
< title >< decorator:title default ="kangxm test" />
</ title >
<!-- 页面Head由引用模板的子页面来替换 -->
< decorator:head />
</ head >
< body id ="page-home" >
< div id ="page-total" >
< div id ="page-header" >
< table width ="100%" border ="0" cellspacing ="0" cellpadding ="0" >
< tr >
< td >
< div class ="topFunc" >
我的账户
|
退出
</ div >
</ td >
</ tr >
</ table >
</ div >
</ div >
<!-- end header -->
<!-- Menu Tag begin -->
< div id ="page-menu" style ="margin-top: 8px; margin-bottom: 8px;" >
< div >
这里放菜单
</ div >
</ div >
<!-- Menu Tag end -->
< div id ="page-content" class ="clearfix" >
< center >
< table width ="100%" border ="0" cellpadding ="0" cellspacing ="0" >
< tr >
< td >
< decorator:body /> <!-- 这里的内容由引用模板的子页面来替换 -->
</ td >
</ tr >
</ table >
</ center >
</ div >
<!-- end content -->
< div id ="page-footer" class ="clearfix" >

这里放页面底部
<!-- end footer -->
</ div >
<!-- end page -->
</ body >
</ html >


这就是个简单的模板,页面的头和脚都由模板里的静态HTML决定了,主页面区域用的是<decorator:body />标签;
也就是说凡是能进入过滤器的请求生成的页面都会默认加上模板上的头和脚,然后页面自身的内容将自动放到<decorator:body />标签所在位置;

<decorator:title default="Welcome to test sitemesh!" />:读取被装饰页面的标题,并给出了默认标题。
<decorator:head />:读取被装饰页面的<head>中的内容;
<decorator:body />:读取被装饰页面的<body>中的内容;

7、说到这里大家就要想了,那如果某个特殊的需求请求路径在过滤器的范围内,但又不想使用模板怎么办?
你总不能这么不讲道理吧!
大家放心吧,SiteMesh早就考虑到这一点了,上面第5步说道的decorators.xml这个时候就起到作用了!

下面是我的decorators.xml:

<? xml version="1.0" encoding="ISO-8859-1" ?>
< decorators defaultdir ="/decorators" >
<!-- Any urls that are excluded will never be decorated by Sitemesh -->
< excludes >
< pattern > /index.jsp* </ pattern >
< pattern > /login/* </ pattern >
</ excludes >
< decorator name ="main" page ="main.jsp" >
< pattern > /* </ pattern >
</ decorator >
</ decorators >


decorators.xml有两个主要的结点:
decorator结点指定了模板的位置和文件名,通过pattern来指定哪些路径引用哪个模板
excludes结点则指定了哪些路径的请求不使用任何模板

如上面代码,/index.jsp和凡是以/login/开头的请求路径一律不使用模板;

另外还有一点要注意的是:decorators结点的defaultdir属性指定了模板文件存放的目录;

六、实战感受

刚刚做完一个用到sitemesh的项目,跟以前用tiles框架相比,最大的感受就是简单,系统设计阶段
就把模板文件和sitemesh框架搭好了!哪些页面使用框架哪些不使用,全部都通过UI Demo很快就定义出来了;
在接下来的开发中所有成员几乎感受不到sitemesh的存在,各自仅仅关心自己的模块功能实现;

七、总结

使用sitemesh给我们带来的是不仅仅是页面结构问题,它的出现让我们有更多的时间去关注底层业务
逻辑,而不是整个页面的风格和结构。它让我们摆脱了大量用include方式复用页面尴尬局面,也避免了tiles
框架在团队开发中的复杂度,它还提供了很大的灵活性以及给我们提供了整合异构Web系统页面的一种方案。

分享到:
评论

相关推荐

    sitemesh装饰器入门

    **Sitemesh装饰器入门** Sitemesh 是一个开源的 Web 应用程序框架,它主要用来帮助开发者实现页面布局和装饰功能。Sitemesh 的核心概念是“装饰器”,这个概念源自于软件设计模式中的装饰者模式。通过使用 Sitemesh...

    SiteMesh

    3. **页面内容(Page Content)**: 页面内容是实际的业务逻辑页面,它们被SiteMesh装饰器包围,只需关注自身的业务逻辑,无需关心页面布局。 4. **配置(Configuration)**: SiteMesh的配置文件(通常为`sitemesh....

    页面装饰器(sitemesh)实例源代码

    页面装饰器(Sitemesh)是一种广泛用于Web应用的开源框架,它的主要功能是提供页面布局和装饰功能,使得开发者可以方便地实现统一的页面头部、尾部、侧边栏等元素,从而提高网站的整体风格一致性。在本实例中,我们...

    Struts2.0 与 sitemesh的例子

    6. **Sitemesh装饰器的创建**:创建装饰器模板,定义页面的布局结构,如页头、页脚、侧边栏等。 7. **错误与异常处理**:学习如何在Struts2中处理异常,提供友好的错误页面。 8. **测试与调试**:使用单元测试工具...

    SiteMesh教程.pdf

    这意味着开发人员可以利用这些技术在SiteMesh装饰的页面中实现更加丰富的功能和设计。 6. 页面解析器和装饰器映射器: SiteMesh支持多种页面解析器(Page Parsers),能够解析不同类型的Web页面,如HTML、XHTML等。...

    sitemesh简单教程页面装配器

    Sitemesh是一款用于Web应用中的页面布局管理工具,它通过采用装饰器(Decorator)设计模式,实现了对Web页面布局的灵活管理和重用。传统的Web开发中,开发者往往需要在每个JSP页面中不断地使用`include`标签来嵌入...

    sitemesh框架简单例子

    此外,Sitemesh还支持自定义装饰器的加载顺序,以及与Spring、Struts等其他框架的集成。 在实际开发中,Sitemesh可以帮助你提高效率,减少重复工作,并确保网站的整体设计一致性。通过深入学习和实践这个“sitemesh...

    java sitemesh 页面框架

    2. **选择装饰器**:根据请求的URL或者在代码中明确指定,Sitemesh会选择一个合适的装饰器(Decorator)模板。 3. **内容分离**:装饰器模板通常包含固定的部分,如页头、页脚、侧边栏等,而用户请求的实际内容被...

    sitemesh入门demo

    - 如果页面需要装饰,Sitemesh会读取配置的装饰器模板,然后将请求页面的内容插入到装饰器的相应位置。 3. **装饰器(Decorator)** - 装饰器是Sitemesh的核心概念,它是一个HTML文件,定义了页面的基本结构,如...

    SiteMesh教程及SiteMesh官方文档翻译

    当用户访问`/index.jsp`时,SiteMesh会自动使用之前定义的装饰器页面对其进行装饰,从而呈现出完整的页面布局。 #### Sitemesh对于性能的影响 为了评估SiteMesh对Web应用程序性能的影响,进行了一系列的测试。 **...

    sitemesh

    当一个请求到达服务器,Sitemesh会根据配置找到合适的装饰器,然后使用它来包装请求的页面内容。 在Sitemesh中,`index.html` 可能是一个示例母版页面,包含了网站的标准布局。其他文件如 `badsource.html`、`...

    sitemesh布局知识点汇总

    - **定义装饰器目录**:创建一个名为`decorators`的目录,用于存放装饰器文件(即使用Sitemesh标签的JSP文件)。 - **编写装饰器模板**:创建一个装饰器文件,例如命名为`mymain.jsp`,并放置在`decorators`目录下。...

    sitemesh 例子

    在压缩包文件"testgit"中,可能包含了实际的项目源码,如Sitemesh的配置文件、装饰器模板、以及使用Sitemesh的示例页面。通过查看这些文件,你可以更深入地理解Sitemesh如何工作,并在自己的项目中进行实践。 此外...

    sitemesh3-demo

    6. **动态装饰**: Sitemesh3支持动态装饰,允许在运行时根据请求信息决定是否应用装饰器或者使用哪个装饰器。 7. **响应式设计**: Sitemesh3可以与其他响应式前端框架(如Bootstrap)结合,实现响应式布局,使网站...

    sitemesh教程

    - **自定义装饰器标签**:可以创建自定义的装饰器标签来扩展SiteMesh的功能。 #### 六、总结 通过本文的介绍,我们了解了如何在Web项目中集成并使用SiteMesh,以及如何结合Freemarker模板引擎实现更复杂的布局设计...

    springMVC与sitemesh的结合

    7. **Spring MVC的ModelAndView与Sitemesh**:Spring MVC的Controller返回的ModelAndView对象中的属性可以在装饰器中使用,通过`&lt;decorator:property name="yourModelAttribute"/&gt;`标签访问,实现数据在装饰器和视图...

    sitemesh-2.2.1.jar sitemesh-2.2.1.jar

    - **Decorator(装饰器)**:装饰器是Sitemesh的核心,它定义了页面的通用布局,可以包含多个区域,如header、footer、content等。每个区域可以独立定义,以便插入不同的页面内容。 - **Decorator选择器**:允许...

    sitemesh例子

    1. **标记页面**:在需要使用 Sitemesh 布局的 JSP 或 HTML 页面中,添加以下注解来指定装饰器(即布局模板): ```jsp ;charset=UTF-8" language="java" decorates="true" %&gt; ``` 如果需要自定义装饰器,可以...

    sitemesh jar包机tld文件

    1. `sitemesh-page.tld`: 这个文件定义了一个名为`&lt;decorator:page&gt;`的标签,该标签用于标记当前JSP页面的内容,SiteMesh会将这部分内容插入到装饰器模板的指定位置。例如,你可以在JSP页面的开头和结尾分别添加`...

    sitemesh简单demo

    除了基础功能,sitemesh 还提供了很多高级特性,如:自定义装饰器选择策略、页面属性传递、支持 Velocity 和 FreeMarker 等模板引擎等。这些特性使得 sitemesh 能够适应更复杂的项目需求。 通过这个“sitemesh简单...

Global site tag (gtag.js) - Google Analytics