鸿荣源集团行政岗:OpenSymphony——SiteMesh——Decorators

来源:百度文库 编辑:偶看新闻 时间:2024/04/28 10:25:53
一、Web可复用框架概述
    为了建立可复用的web应用程序,一个通用的方法是建立一个分层结构,如下面一个普通web应用:
  • 前端:JSP和Servlets,或jakarta的velocity
  • 控制层框架 Controller : (Struts/Webwork)
  • 业务逻辑 Business :主要业务逻辑
  • 持久化框架:hibernate/jdo
    可糟糕的是前端的页面逻辑很难被复用,当你在每一个页面中用数之不尽的include来复用公共的header, stylesheet, scripts,footer时,一个问题出现了——重复的代码,每个页面必须用copy来复用页面结构,而当你需要创意性的改变页面结构时,那么修改起来将会变得很混乱。
    SiteMesh通过filter截取request和response,并给原始的页面加入一定的装饰(可能header,footer...),然后把结果返回给客户端,并且被装饰的原始页面并不知道sitemesh的装饰,这也就达到了脱耦的目的。

二、Decorators介绍
    Decorator,装饰器模式,SiteMesh使用Decorator模式,用filter截取request和response,把页面组件head ,content ,banner结合为一个完整的视图。通常我们都是用include标签在每个jsp页面中来不断的包含各种header, style sheet, scripts and footer,现在,使用SiteMesh即可简单实现上述要求。

三、环境配置
  1. jar包:在WEB-INF/lib目录下导入:sitemesh-2.3.jar
  2. tld包:在WEB-INF目录下装入:sitemesh-decorator.tld 和 sitemesh-page.tld
  3. 配置文件xml:在WEB-INF目录下有2个配置文件:sitemesh.xml(可选) 和 decorators.xml 
  4. 在WebRoot下建立自己的装饰器即可,如_decoratos/main.jsp
四、详细说明
1. sitemesh.xml文件:一般不用建立它,默认设置足够了(com/opensymphony/module/sitemesh/factory/sitemesh-default.xml)。它可以设置2种信息:
  • Page Parsers:负责读取stream的数据到一个Page对象中以被SiteMesh解析和操作。(不太常用,默认即可)
  • Decorator Mappers : 不同的装饰器种类,下面列出2种比较有用的。一种通用的mapper,可以指定装饰器的配置文件名;另一种可打印的装饰器:可以允许你当用http://localhost/aaa/a.html?printable=true方式访问时给出原始页面以供打印(免得把header,footer等的花哨的图片也搭上)
  • 范例:


        
          
          
          
        


        
          
            
          

            
               
               
                       
            

      

2. decorators.xml文件:定义构成复合视图的所有页面构件的描述(主要结构页面,header,footer...)
  如下例:

       
       *
    

    
  • defaultdir: 包含装饰器页面的目录
  • page : 页面文件名
  • name : 别名
  • role : 角色,用于安全
  • webapp : 可以另外指定此文件存放目录
  • Patterns : 匹配的路径,可以用*,那些被访问的页面需要被装饰。
3. SiteMesh的标签:
  • Decorator标签:被用于建立装饰器页面
    :插入原始页面(被包装页面)的head标签中的内容(不包括head标签本身)。
    :插入原始页面(被包装页面)的body标签中的内容。
    :插入原始页面(被包装页面)的title标签中的内容,还可以添加一个缺省值。
    :在标签处插入原始页面(被包装页面)的原有的标签的属性中的内容,还可以添加一个缺省值。注意,writeEntireProperty="true"会在插入内容前加入一个空格。
    :像jsp页面中的标签一样,可以使用被包装为一个Page对象的页面。例:可用 :<%=page.getTitle()%>达到的访问结果。
  • Page标签:被用于从原始内容页面访问装饰器

    ...
  例:
       
             ...
             ...
       

更多信息请参考:http://www.mscto.com/JavaScript/2009010955000.html

 

另外:一个注意问题:在配置decorators.xml中,装饰器的page属性前不要加上"/",否则会报错。例:

正确写法:


   
        /*
   

   

错误写法:


    /decorators/main.jsp"> 
        /*
   

   

    但对于其下的非装饰器页标签中的page属性却没有此限制(有没有“/”均可)。不知道是不是SiteMesh的Bug。为了方便起见,所有标签均不在路径前加“/”。