`
ldzyz007
  • 浏览: 724677 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

OpenSymphony——SiteMesh——Decorators

    博客分类:
  • web
阅读更多
一、介绍OpenSymphony

    * OpenSymphony是一个开源项目,致力于提供企业级的J2EE组件。OpenSymphony的组件重点强调简洁、一体化、插件化(还是翻译为可插拔?)以及符合规范。
    * 鉴于上面翻译不够准确,特意附上原文如下:OpenSymphony is an Open Source project dedicated to providing enterprise class J2EE components. Our components aim to stress simplicity, integration, pluggability and specification compliance.

二、介绍SiteMesh

    * SiteMeshs是OpenSymphony的组件之一,用来在JSP中实现页面布局和装饰(layout and decoration)的框架组件,能够帮助网站开发人员较容易实现页面中动态内容和静态装饰外观的分离。
    * 它是一个优于Apache Tiles的Web页面布局、装饰框架。
    * SiteMesh的功能基础:Sitemesh是由一个基于Web页面布局、装饰及与现存Web应用整合的框架。它能帮助我们再由大量页面工程的项目中创建一致的页面布局和外观,如一致的导航条、一致的banner、一致的版权等。它不仅能处理动态的内容,如JSP、PHP、ASP、CGI等产生的内容,还能处理静态的内容,比如HTML的内容,使得它的内容也符合你的页面结构的要求。甚至它能像 include那样将HTML文件作为一个面板的形式嵌入到别的文件中去。所有的这些,都是GOF的Decorator模式的最生动的实现。装饰模式是在不必改变原类文件和使用集成的情况下,动态地扩展一个对象的功能。它能通过穿件一个包装对象,也就是装饰来包裹真是的对象。尽管它是由Java语言来实现的,但是它能与其他Web应用很好的集成。
    * 为什么要使用SiteMesh?
      将UI层很多共用的静态或动态部分抽取出来,以达到界面风格统一和美观的目的。Apache Tiles框架可以达到整合通用的静态或动态UI的目的,再加上它与Struts的完美集成,导致大小项目都把他作为UI层的首选框架,但是Tiles也有很多不足,而SiteMesh则刚好可以弥补这些不足。

三、SiteMesh vs Apache Tiles

SiteMesh的优点:

   1. 使用角度,SiteMesh最强的一个特性是SiteMesh将decorator模式用在过滤器上,任何需要被装饰的页面都不知道它要被谁装饰,所以它就可以用来装饰来自php asp cgi等产生的页面。
   2. 可以定义若干个装饰器,根据参数动态地选择装饰器,产生动态的外观以满足要求。
   3. SiteMesh也有一套功能强大的属性体系,它能帮助你构建功能强大而灵活的装饰器。
   4. 简单,系统设计阶段就能把模板文件和SiteMesh框架搭好,哪些页面使用框架,哪些页面不使用框架,通过UI Demo很快就能定义出来。
   5. 在后续开发中所有成员几乎感受不到SiteMesh的存在,各自仅仅关心自己模板功能实现。

Apache Tiles的缺点:

   1. Apache Tiles框架要求所有人不仅仅要了解并且清楚Apache Tiles的存在,并且要特别熟悉每一个Tiles layout模板的作用,否则就可能出现用错模板的情况;
   2. 每个人涉及到的所有WEB页面都需要去配置文件里面逐个配置,不仅麻烦出错的几率还高;

四、SiteMesh的基本原理

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

五、如何使用SiteMesh
以struts2+spring2+hibernate3构架的系统为例
1、下载SiteMesh,下载地址:http://www.opensymphony.com/sitemesh/download.action
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/decorators.xml"/>

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

      具体代码见OpenSymphony——SiteMesh——Decorators(3)
这就是个简单的模板,页面的头和脚都由模板里的静态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"> <!-- 指明了一个名为main的装饰器 -->
        <pattern>/*</pattern>
    </decorator>
</decorators>


decorators.xml有两个主要的结点:(main装饰器默认情况下装饰web应用根路径下的所有页面)

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

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


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

六、使用SiteMesh总结

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

分享到:
评论

相关推荐

    SiteMesh 开发 struts插件

    &lt;constant name="struts.plugins" value="com.opensymphony.sitemesh"/&gt; ``` 2. **配置 SiteMesh**:在 Web 应用的 `web.xml` 配置文件中,添加 SiteMesh 过滤器,指定装饰器路径和默认装饰器。例如: ```xml ...

    SiteMesh入门示例

    这可以通过 `&lt;sitemesh:decorate&gt;` 标签或者在 `decorators.xml` 文件中进行配置。 4. **使用 SiteMesh**:一旦配置完成,SiteMesh 将自动处理所有指定的请求,将页面内容插入到 Decorator 中。你可以在每个 JSP ...

    sitemesh教程

    &lt;filter-class&gt;com.opensymphony.module.sitemesh.filter.PageFilter&lt;/filter-class&gt; &lt;filter-name&gt;sitemesh &lt;url-pattern&gt;/* ``` 这段配置会将所有URL映射到Sitemesh Filter,从而让Sitemesh能够处理所有请求...

    sitemesh3-demo

    2. **过滤器(Filter)配置**: 在`web.xml`中,需要配置`com.opensymphony.sitemesh.webapp.SiteMeshFilter`以启用Sitemesh。配置包括设置过滤器的顺序和其他必要的初始化参数。 3. **装饰规则(Decoration Rules)...

    Struts2整合SiteMesh

    &lt;filter-class&gt;com.opensymphony.sitemesh.webapp.SiteMeshFilter&lt;/filter-class&gt; &lt;filter-name&gt;sitemesh &lt;url-pattern&gt;/* ``` 3. **定义Decorator**:创建decorators.xml文件,用于定义页面装饰器。例如...

    SiteMesh教程及SiteMesh官方文档翻译

    &lt;filter-class&gt;com.opensymphony.module.sitemesh.filter.PageFilter&lt;/filter-class&gt; &lt;filter-name&gt;sitemesh &lt;url-pattern&gt;/* ``` 此配置告诉服务器使用`PageFilter`作为过滤器,并将其应用于所有URL路径...

    sitemesh布局知识点汇总

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

    sitemesh3demo附配置说明

    &lt;filter-class&gt;com.opensymphony.sitemesh.webapp.SiteMeshFilter&lt;/filter-class&gt; &lt;filter-name&gt;Sitemesh &lt;url-pattern&gt;/* ``` 这段代码将Sitemesh过滤器应用到所有URL,这意味着所有请求都会经过Sitemesh...

    sitemesh简单教程页面装配器

    可以通过官方网址下载:[http://www.opensymphony.com/sitemesh/](http://www.opensymphony.com/sitemesh/)。 3. **创建装饰器配置文件** `decorators.xml` 在`WEB-INF`目录下创建`decorators.xml`文件,该文件...

    sitemesh技术的应用.doc

    &lt;filter-class&gt;com.opensymphony.module.sitemesh.filter.PageFilter&lt;/filter-class&gt; &lt;filter-name&gt;sitemesh &lt;url-pattern&gt;/* ``` 2. **taglib定义**:在web.xml中定义Sitemesh的taglib,以便在JSP页面中...

    struts2与sitemesh整合所需架包

    &lt;constant name="struts.plugins" value="com.opensymphony.sitemesh.webapp.decorator.struts2.Struts2DecoratorPlugin"/&gt; |/logout.action|/error.jsp" /&gt; ``` 4. **创建装饰器文件**:在Web应用程序的WEB-INF/...

    SiteMesh入门学习

    &lt;filter-class&gt;com.opensymphony.module.sitemesh.filter.PageFilter&lt;/filter-class&gt; &lt;filter-name&gt;sitemesh &lt;url-pattern&gt;/* ``` 这段配置会告诉Servlet容器(例如Tomcat),当用户请求任何URL时,都要先...

    Struts2整合SiteMesh技巧

    &lt;filter-class&gt;com.opensymphony.module.sitemesh.filter.PageFilter&lt;/filter-class&gt; ``` 3. **struts2**过滤器:Struts2框架自带的过滤器,用于处理所有Struts2相关的请求。 ```xml &lt;filter-name&gt;struts2 ...

    sitemesh简单demo

    &lt;filter-class&gt;com.opensymphony.module.sitemesh.filter.PageFilter&lt;/filter-class&gt; &lt;filter-name&gt;sitemesh &lt;url-pattern&gt;/* ``` ### 2. 创建装饰器(Decorator) 装饰器是 sitemesh 的核心概念,它是一个 ...

    sitemesh的使用和例子

    &lt;filter-class&gt;com.opensymphony.module.sitemesh.filter.PageFilter&lt;/filter-class&gt; &lt;filter-name&gt;Sitemesh &lt;url-pattern&gt;/* ``` 3. **设置默认装饰器**:在Web应用的根目录下创建`WEB-INF/decorators....

    使用sitemesh替换tiles2,spring mvc+spring web flow+sitemsh

    3. **创建装饰模板**:Sitemesh 使用一个名为 `decorators` 的目录来存储装饰模板。这些模板定义了页面的通用结构,如头部、底部和侧边栏。例如,你可以创建一个 `default.jsp` 文件,其中包含你的页面布局。 4. **...

    struts2-sitemesh-plugin-2.2.1.1.jarstruts2

    &lt;filter-class&gt;com.opensymphony.module.sitemesh.filter.PageFilter&lt;/filter-class&gt; &lt;filter-name&gt;decorator &lt;url-pattern&gt;/* ``` 4. 创建装饰模板(Decorator):在Web应用的`WEB-INF/decorators`目录下...

    SiteMesh教程.doc

    com.opensymphony.module.sitemesh.filter.PageFilter &lt;param-name&gt;debug.pagewriter &lt;param-value&gt;true &lt;filter-name&gt;sitemesh &lt;url-pattern&gt;/* ``` 2. **定义修饰器**:在`WEB-INF`目录下创建...

    sitemesh的使用方法demo

    3. **设置装饰器目录**: Sitemesh 会查找特定目录下的装饰器文件,默认为 `WEB-INF/decorators`。如果需要自定义,可以配置 `decorators-file` 参数。 **创建装饰器模板** Sitemesh 使用 JSP 或 FreeMarker 等模板...

Global site tag (gtag.js) - Google Analytics