关闭

sitemesh/decorators装饰器与jsp页面中include的区别

标签: 框架装饰器
3634人阅读 评论(0) 收藏 举报
分类:

今天研究了一下项目中使用的装饰器框架:sitemesh


首先来看一下百科的定义:SiteMesh 是一个网页布局和修饰的框架,利用它可以将网页的内容和页面结构分离,以达到页面结构共享的目的。OS(OpenSymphony)的SiteMesh是一个用来在JSP中实现页面布局和装饰(layout and decoration)的框架组件,能够帮助网站开发人员较容易实现页面中动态内容和静态装饰外观的分离。

    sitemesh是通过servlet的fileter过滤器拦截response响应来实现的。SpringMVC中也是同样的道理,通过SpringMVC封装的过滤器,来实现对也页面的过滤。


相同点:都能提高公共模块的复用性,提高开发效率。

不同点:include需要把需要用到的jsp文件写死到每一个jsp文件中,而sitemesh则是动态的,使用filter过滤response请求,然后把装饰完成的页面,返回给前端。


区别还是很大的,我们可以简单的理解:sitemesh是动态的,提供了更高的灵活性;而传统的include方法是静态的,一旦需要改变公共部分,使用include是一件很麻烦的事情。


我们来看一个简单的装饰器:


首先要在web.xml中配置

<web-app>

  ...

  <filter>
    <filter-name>sitemesh</filter-name>
    <filter-class>org.sitemesh.config.ConfigurableSiteMeshFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>sitemesh</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  
</web-app>


<span style="font-size:14px;"><body<decorator:getProperty property="body.id" writeEntireProperty="true"/><decorator:getProperty property="body.class" writeEntireProperty="true"/>>


       <!--  <div id="page">  -->
        <c:if test="${param.thirdFlag!='1'}">
            <jsp:include page="/common/login-header.jsp"/>
        </c:if>
       <!-- </div>  -->


       <!-- <div id="content" class="clearfix"> -->
          <!--  <div id="main">  -->
                <decorator:body/>
          <!--  </div> -->
     <!--   </div>  -->
        
      <!--  <div id="footer" class="clearfix"> -->
      <c:if test="${param.thirdFlag!='1'}">
            <jsp:include page="/common/footer.jsp"/>
      </c:if>
      <!--  </div>  -->
   <!--  </div>  -->
</body></span>


配置文件sitemesh.xml

<span style="font-size:14px;"><sitemesh>
    <property name="decorators-file" value="/WEB-INF/decorators.xml"/>
    <excludes file="${decorators-file}"/> 
    <page-parsers>
        <parser default="true" class="com.opensymphony.module.sitemesh.parser.FastPageParser"/>
        <parser content-type="text/html" class="com.opensymphony.module.sitemesh.parser.FastPageParser"/>
        <parser content-type="text/html;charset=utf-8" class="com.opensymphony.module.sitemesh.parser.FastPageParser"/>
    </page-parsers>

    <decorator-mappers>
        <mapper class="com.opensymphony.module.sitemesh.mapper.ConfigDecoratorMapper">
            <param name="config" value="${decorators-file}"/> 
        </mapper>
    </decorator-mappers>
</sitemesh></span>

默认情况下,sitemesh只对HTTP响应头中的Content-type为text/html的类型进行拦截和装饰,我们通常需要进行扩展,支持更多类型的Content-type

  <mime-type>text/html</mime-type>
  <mime-type>application/vnd.wap.xhtml+xml</mime-type>
  <mime-type>application/xhtml+xml</mime-type>


配置文件 decorators.xml


<span style="font-size:14px;"><?xml version="1.0" encoding="utf-8"?>
<decorators defaultdir="/decorators">
    <excludes>
    	<pattern>/index.html*</pattern> 
        <pattern>/40*.jsp</pattern>
    </excludes>
    
    <decorator name="login-decorator" page="login-decorator.jsp">
        <pattern>/signup.html</pattern>
        <pattern>/findpassword/*.html</pattern>
    </decorator>
    
     <decorator name="debitcard-decorator" page="debitcard-decorator.jsp">
        <pattern>/debitcard/*.html</pattern>
    </decorator>
    
    <decorator name="helpcenter-decorator" page="helpcenter-decorator.jsp">
    	<pattern>/helpcenterinfo/*.html</pattern>
    </decorator>
	
	<decorator name="item-decorator" page="mc-item-decorator.jsp">
        <pattern>/productinfo/productItemDetail0.html*</pattern>
        <pattern>/productinfo/productItemDetail*.html*</pattern>
    </decorator>
	    
    <decorator name="default" page="mc-decorator.jsp">
        <pattern>/*</pattern>
    </decorator>
</decorators></span>


  
  <!-- 默认装饰器,当下面的路径都不匹配时,启用该装饰器进行装饰 -->
  <mapping decorator="/default-decorator.html"/>
  
  <!-- 对不同的路径,启用不同的装饰器 -->
  <mapping path="/admin/*" decorator="/another-decorator.html"/>
  <mapping path="/*.special.jsp" decorator="/special-decorator.html"/>


  <!-- 对同一路径,启用多个装饰器 -->
  <mapping>
    <path>/articles/*</path>
    <decorator>/decorators/article.html</decorator>
    <decorator>/decorators/two-page-layout.html</decorator>
    <decorator>/decorators/common.html</decorator>
  </mapping>


  <!-- 排除,不进行装饰的路径 -->
  <mapping path="/javadoc/*" exclue="true"/>
  <mapping path="/brochures/*" exclue="true"/>
  
  <!-- 自定义 tag 规则 -->
  <content-processor>
    <tag-rule-bundle class="com.something.CssCompressingBundle" />
    <tag-rule-bundle class="com.something.LinkRewritingBundle"/>
  </content-processor>




0
0
查看评论

decorators.xml的用法

简介: sitemesh应用Decorator模式,用filter截取request和response,把页面组件head,content,banner结合为一个完整的视图。通常我们都是用include标签在每个jsp页面中来不断的包含各种header, stylesheet, scripts a...
  • laozhuxiao
  • laozhuxiao
  • 2017-01-11 11:43
  • 3738

decorators.xml的用法

今天改前人做的项目,用struts2,spring,hibernate框架做的,对了,还有jquery。我用jquery做异步请求到后台,生成json数据返回前台生成下拉输入框,请求到后台以后,成功生成了json数据并根据struts的映射文件返回到一个jsp页面,这个页面的作用只是生成文本数据,但...
  • gavinloo
  • gavinloo
  • 2012-04-13 15:22
  • 38085

sitemesh中的decorators.xml的用法

据说即将新出台的Portlet规范会帮助我们标准的实现比这些更多更cool的想法,但可怜的我还不懂它到底是一个什末东东,有兴趣的人可以研究   sitemesh应用Decorator模式,用filter截取request和response,把页面组件head,content,b...
  • WEILIN19921214
  • WEILIN19921214
  • 2016-08-19 14:06
  • 292

decorators.xml

最近维护一个项目,因为这个项目我没作开发,所以需要先熟悉项目的框架和业务,昨天被一个问题给整懵了,我不管怎么看都弄不明白那个链接怎么跳过去的.因为那个链接地址跟实际看到的页面不一样.链接地址的页面只是实际看到页面的一小部分,反反复复盯着那个请求名,然后到struts.xml文件中去找实际的跳转页面,...
  • Java_WuYY
  • Java_WuYY
  • 2016-02-20 10:05
  • 392

使用sitemesh的decorators功能

复合页面,始终是一个开发web应用时必须面对的问题,对struts的titles有厌倦,听说sitemesh不错,尝试,原以为复杂,谁知用起来是那么地简单,太令人惊叹! 写下试用教程: 1.准备一个web项目,到sitemesh官方网站下载sitemesh包与tld文件 http://www....
  • lizhibin3944
  • lizhibin3944
  • 2014-05-21 10:37
  • 680

Decorators详解

Python中的Decorators表面看起来很像C#的Attribute,其实不然,Python的Decorators和C#的Attribute完全是两个东西。Python的Decorators让我想到了设计模式中的装饰者模式(Decorator Pattern)。 Decorator Patt...
  • QQ276592716
  • QQ276592716
  • 2014-01-30 12:43
  • 944

Visual Studio Code 装饰器提示“experimentalDecorators”的解决办法

突然想体验下元编程,于是Nodejs的装饰器就成为了我的首选,但在Visual Studio Code中,始终提示如下错误:file: 'file:///e%3A/Nodejs/yo-hot-mis/src/index.es6' severity: '错误' mess...
  • yiifaa
  • yiifaa
  • 2017-12-21 12:50
  • 1094

使用Spring Mvc 转发 带着模板 父页面 之解决方法 decorators.xml

周末了,周一布置的任务还没完成,卡在了页面跳转上,做了一个半截的项目开发,之前没有人给培训,全靠自己爬代码,所以进度比较慢,而且加上之前没有用过 Spring Mvc 开发项目,所以有点吃力,不过接触了Spring Mvc近一个月的时间感觉 开发速度确实比 SSH快不少,不用一个一个的Bean去配置...
  • morning99
  • morning99
  • 2014-06-29 21:42
  • 11053

装饰器 Decorators

python之装饰器(Decorators)
  • neverstandstill
  • neverstandstill
  • 2017-05-04 23:48
  • 158

sitemesh中的decorators.xml的用法

据说即将新出台的Portlet规范会帮助我们标准的实现比这些更多更cool的想法,但可怜的我还不懂它到底是一个什末东东,有兴趣的人可以研究   sitemesh应用Decorator模式,用filter截取request和response,把页面组件head,content...
  • weixin_37864013
  • weixin_37864013
  • 2017-09-27 23:42
  • 92
    个人资料
    • 访问:372568次
    • 积分:4090
    • 等级:
    • 排名:第9020名
    • 原创:76篇
    • 转载:42篇
    • 译文:0篇
    • 评论:54条
    最新评论