分享

SiteMesh使用

 凌氏 2014-05-09

什么是SiteMesh?
    SiteMesh是OpenSymphony下的一个项目,是基于PageFilter,Servlet过滤器的通用组件.



SiteMesh为我们带来什么?
    我們可以想像一下,当我们的应用程序有大量的页面时候,为每个页面include我们各种各样的标签库,引入的js和css等样式,这将会成为重复性的工作,而且只要其中一个标签库进行了更新升级,所有页面的标签声明都需要重新更改,这项工作无疑是恐怖而且毫无技术含量的,SiteMesh就是为了帮助我们解决这个问题,把共有的标签例如js,css,struts-tags等重复性的声明抽象到一个页面当中,从而实现集中处理,增加维护性和解除页面间的耦合.



SiteMesh原理:
    SiteMesh应用了Decorator模式,用filter截取request和response,把页面组件head,content,banner结合为一个完整的视图。通常我们都是用include标签在每个jsp页面中来不断的包含各种header, stylesheet, scripts and footer,现在,在SiteMesh的帮助下,我們可以不再编写那些重复性的代码,从而集中在一个地方进行管理.容器接收到页面请求时,会把请求传递给PageFilter,PageFilter收集应用程序的响应细节,生成自定义的响应对象,然后连同请求一起传递给web应用程序.web应用程序把响应资源写入到自定义响应对象里,再返回给PageFilter.



SiteMesh使用:
    本事例使用基于Struts2来进行编写
    1.首先在我们的项目当中添加Maven的依赖

Xml代码  收藏代码
  1. <dependency>  
  2.     <groupId>opensymphony</groupId>  
  3.     <artifactId>sitemesh</artifactId>  
  4.     <version>2.4.2</version>  
  5.     <type>jar</type>  
  6.     <scope>compile</scope>  
  7. </dependency>  
  8.   
  9. <dependency>  
  10.     <groupId>org.apache.struts</groupId>  
  11.     <artifactId>struts2-sitemesh-plugin</artifactId>  
  12.     <version>2.2.3</version>  
  13.     <type>jar</type>  
  14.     <scope>compile</scope>  
  15. </dependency>  


    2.在web.xml文件中增加如下配置
Xml代码  收藏代码
  1. <filter>  
  2.     <filter-name>sitemesh</filter-name>  
  3.     <filter-class>com.opensymphony.sitemesh.webapp.SiteMeshFilter</filter-class>  
  4. </filter>  
  5.       
  6. <filter-mapping>  
  7.     <filter-name>sitemesh</filter-name>  
  8.     <url-pattern>*.action</url-pattern>  
  9.     <dispatcher>REQUEST</dispatcher>  
  10.     <dispatcher>FORWARD</dispatcher>  
  11.     <dispatcher>INCLUDE</dispatcher>  
  12. </filter-mapping>  


    3.在WEB-INF建立decorators.xml,该文件描述各个装饰器页面和如何过滤页面
Xml代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.   
  3.   
  4. <!-- defaultdir 属性为通用页面存放的路径 -->  
  5. <decorators defaultdir="/WEB-INF/content/base">  
  6.       
  7.     <!-- excludes 为哪些页面不需要进行装饰,这通常结合popup来使用 -->  
  8.     <excludes>  
  9.         <pattern>*no-decorate*</pattern>  
  10.         <pattern>/login*</pattern>  
  11.     </excludes>  
  12.       
  13.     <!-- decorator为指定装饰页面的名称和路径 -->  
  14.     <decorator name="main" page="main.jsp">  
  15.         <!-- pattern 为要过滤哪些页面? * 代表所有页面都进行过滤-->  
  16.         <pattern>*</pattern>  
  17.     </decorator>  
  18.       
  19.     <decorator name="printable" page="printable.jsp"/>  
  20. </decorators>  

     以下为main.jsp代码
Html代码  收藏代码
  1. <!--   
  2.     当使用了SiteMesh后,本页面main.jsp就会变成所有页面的模板  
  3.     我们可以在这个页面中引入各种的css,js和其他的页面,  
  4.     亦可以在这里使用jsp的include标签引入其他的页面,  
  5.     更甚者可以在这里设定全局的js,例如jQuery的$.(document).ajaxStart(function(){})  
  6.  -->  
  7. <html>  
  8. <head>  
  9.     <!-- decorator:title可以将被过滤的页面的title填充到这里 -->  
  10.     <title><decorator:title/></title>  
  11.     <!-- decorator:head 可以将被过滤的页面中的head填充到这里 -->  
  12.     <decorator:head />  
  13. </head>  
  14. <body>  
  15. <div class="content">  
  16.     <!-- decorator:head 可以将被过滤的页面中的body填充到这里 -->  
  17.     <decorator:body />   
  18. </div>  


总结:
    使用了SiteMesh后,更集中的管理了各個頁面的标签,css,js的引入,虽然在实际开发当中一般会首先固定各个技术使用的版本,但由于需求的变更和技术的更新发展,有时候不得不更新所使用的版本,大量分散在不同页面的引入标签修改起来简直就是噩梦般的事情,而且SiteMesh的简单易用,我们何乐而不为的去使用SiteMesh呢?

       

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多