`
imshare
  • 浏览: 323947 次
  • 性别: Icon_minigender_1
  • 来自: 宜昌
社区版块
存档分类
最新评论

SiteMesh

    博客分类:
  • Java
阅读更多
一、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.ActionContextCleanUp过滤器之后,org.apache.struts2.dispatcher.FilterDispatcher(struts2.0),org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter(struts2.1)过滤器之前,否则会有问题;

       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系统页面的一种方案。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/allenzue/archive/2009/01/09/3741652.aspx
分享到:
评论
2 楼 imshare 2011-08-23  
zgjs1208 写道
弱弱的问下,装饰器中用c:set设置一个变量,在被装饰页面中能否读取到

可以的
1 楼 zgjs1208 2011-08-22  
弱弱的问下,装饰器中用c:set设置一个变量,在被装饰页面中能否读取到

相关推荐

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

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

    SiteMesh教程及SiteMesh官方文档翻译

    ### SiteMesh教程及SiteMesh官方文档翻译 #### 使用SiteMesh简化网页布局 SiteMesh是一款用于Web应用程序中的页面布局和装饰的框架。它采用Decorator模式,通过过滤器(filter)拦截请求和响应,将不同的页面组件...

    sitemesh

    **Sitemesh** 是一个广泛使用的开源Web应用框架,它主要功能是提供页面布局和装饰功能,用于统一网站的外观和感觉。Sitemesh通过在Web应用中引入“母版”(Master Page)的概念,使得开发者可以轻松地创建一致性的...

    sitemesh框架简单例子

    Sitemesh是一款强大的Web页面布局和装饰框架,它主要用于帮助开发者实现网站的统一外观和感觉。这个框架的主要功能是将页面的主体内容与页眉、页脚、侧边栏等通用部分分离,使得在大量网页中保持一致的设计风格变得...

    siteMesh demo+文档

    SiteMesh 是一个开源的Web应用程序布局和装饰框架,主要用于解决Web应用中的页面布局问题。它通过拦截HTTP请求,将页面内容与预定义的布局模板相结合,实现统一的页面头部、底部和侧边栏等元素,从而提高网站的整体...

    java sitemesh 页面框架

    Java Sitemesh是一个开源的页面布局和装饰框架,它的主要目标是帮助开发者统一网站的外观和感觉,提高代码复用性,并简化页面的复杂性。Sitemesh通过将页面分为内容区域和装饰模板来实现这一目标,使得开发者可以...

    sitemesh-2.2.1.jar sitemesh-2.2.1.jar

    **sitemesh-2.2.1.jar** 是一个用于Web应用程序界面布局的开源框架,由OpenSymphony团队开发。Sitemesh的主要功能是提供页面装饰能力,它可以帮助开发者统一网站的外观和感觉,实现页面模板和内容的分离。通过在...

    sitemesh3-demo

    【sitemesh3-demo】是一个基于Sitemesh3框架的示例项目,旨在展示如何在Web应用程序中有效地实现页面布局和装饰功能。Sitemesh是一个开源的Java Web应用框架,主要用于增强网页的外观和结构,通过定义装饰模板,可以...

    sitemesh3官方下载包

    **Sitemesh3** 是一个开源的网页布局和装饰框架,用于Java Web应用程序。它主要目的是帮助开发者统一网站的外观和感觉,通过提供一种简单的方式来装饰(或模板化)整个Web应用中的页面。Sitemesh3是Sitemesh项目的第...

    sitemesh jar包机tld文件

    在Java Web开发中,SiteMesh是一个非常流行的页面布局框架,它可以帮助开发者轻松地实现网站的统一外观和感觉,以及提供页面装饰功能。标题中的“sitemesh jar包”指的是SiteMesh框架的核心库文件,它是SiteMesh功能...

    springMVC与sitemesh的结合

    而Sitemesh则是一个页面布局和装饰框架,主要用于处理Web应用中的页面布局问题,比如统一头部、底部和侧边栏,提升用户体验并简化开发。 将Spring MVC与Sitemesh结合使用,可以实现更高效的Web应用开发。以下是对这...

    Sitemesh 3 的使用及配置

    ### Sitemesh 3 的使用及配置 #### 一、Sitemesh 3 简介 Sitemesh 是一个非常实用的Web页面布局与修饰框架,它通过Servlet中的Filter来实现网页的装饰功能,类似于ASP.NET中的“母版页”技术。这种技术允许开发者...

    freemarker 与sitemesh 整合例子

    Freemarker和Sitemesh是两个在Web开发中常用的开源技术。Freemarker是一个模板引擎,主要用于生成动态HTML或其他文本格式的输出,而Sitemesh则是一个页面布局和装饰框架,用于统一网站的外观和感觉。这两者的整合...

    sitemesh技术的应用.doc

    标题:Sitemesh技术的应用 描述与标签:Sitemesh技术的应用 Sitemesh技术是Web开发领域中一种用于页面装饰的重要工具,尤其在Java Web应用程序中被广泛应用。其核心功能在于能够统一网站的外观风格,使不同功能...

    spring mvc sitemesh velocity整合

    在本项目中,Spring MVC与两个额外的技术——Sitemesh和Velocity进行了整合,增强了应用的模板渲染和页面布局能力。 Sitemesh 是一个开源的Web应用装饰器框架,主要用于统一网站的页面布局和样式。通过Sitemesh,...

    sitemesh布局知识点汇总

    ### Sitemesh布局知识点汇总 #### 一、Sitemesh简介 Sitemesh是一个非常实用且功能强大的Web页面布局和装饰框架,适用于多种Web应用程序,包括但不限于Java(JSP)、PHP、ASP等技术栈下的应用。它能够有效地帮助...

    SiteMesh教程.pdf

    SiteMesh是一种用于Java Web应用的装饰器设计模式框架,主要通过拦截Web页面请求,动态地将装饰页面如头部(header)、底部(footer)、样式表(stylesheet)和脚本文件(scripts)等页面元素与实际页面组合在一起,...

    sitemesh-3.0.1-javadoc

    SiteMesh是一个网页布局和装饰框架以及Web应用程序集成框架,可帮助创建由页面组成的网站,这些页面需要一致的外观,导航和布局方案。 SiteMesh会拦截对通过Web服务器请求的任何静态或动态生成的HTML页面的请求,...

Global site tag (gtag.js) - Google Analytics