分享

OpenSymphony——SiteMesh——Decorators

 毁灭号 2011-10-20
一、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等的花哨的图片也搭上)
  • 范例:

    <sitemesh>
         <page-parsers>
           <parser default="true" class="com.opensymphony.module.sitemesh.parser.DefaultPageParser" />
           <parser content-type="text/html" class="com.opensymphony.module.sitemesh.parser.FastPageParser" />
           <parser content-type="text/html;charset=ISO-8859-1" class="com.opensymphony.module.sitemesh.parser.FastPageParser" />
         </page-parsers>

         <decorator-mappers>
           <mapper class="com.opensymphony.module.sitemesh.mapper.ConfigDecoratorMapper">
             <param name="config" value="/WEB-INF/decorators.xml" />
           </mapper>
             <mapper class="com.opensymphony.module.sitemesh.mapper.PrintableDecoratorMapper">
                <param name="decorator" value="printable" />
                <param name="parameter.name" value="printable" />
                        <param name="parameter.value" value="true" />
             </mapper>
      
    </decorator-mappers>
    </sitemesh>
2. decorators.xml文件:定义构成复合视图的所有页面构件的描述(主要结构页面,header,footer...)
  如下例:
<decorators defaultdir="/decorators">
     <decorator name="main" page="main.jsp">   <!--  定义一个名为main的装饰器    -->
       <pattern>*</pattern>
     </decorator>
     <decorator name="printable" page="printable.jsp" role="customer" webapp="aaa" />
</decorators>
  • defaultdir: 包含装饰器页面的目录
  • page : 页面文件名
  • name : 别名
  • role : 角色,用于安全
  • webapp : 可以另外指定此文件存放目录
  • Patterns : 匹配的路径,可以用*,那些被访问的页面需要被装饰。
3. SiteMesh的标签:
  • Decorator标签:被用于建立装饰器页面
    <decorator:head />:插入原始页面(被包装页面)的head标签中的内容(不包括head标签本身)。
    <decorator:body /> :插入原始页面(被包装页面)的body标签中的内容。
    <decorator:title [ default="..." ] />:插入原始页面(被包装页面)的title标签中的内容,还可以添加一个缺省值。
    <decorator:getProperty property="..." [ default="..." ] [ writeEntireProperty="..." ]/>:在标签处插入原始页面(被包装页面)的原有的标签的属性中的内容,还可以添加一个缺省值。注意,writeEntireProperty="true"会在插入内容前加入一个空格。
    <decorator:usePage id="..." />:像jsp页面中的<jsp:useBean>标签一样,可以使用被包装为一个Page对象的页面。例:可用<decorator:usePage id="page" /> :<%=page.getTitle()%>达到<decorator:title/>的访问结果。
  • Page标签:被用于从原始内容页面访问装饰器

    <page:applyDecorator /><page:param > ... </page:param>
  例:
        <page:applyDecorator name="..." [ page="..." title="..." ] >
             <page:param name="..."> ... </page:param>
             <page:param name="..."> ... </page:param>
        </page:applyDecorator>
更多信息请参考:http://www./JavaScript/2009010955000.html

 

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

正确写法:

<decorators defaultdir="/WEB-INF/pages">
    <decorator name="main" page="decorators/main.jsp">
        <pattern>/*</pattern>
    </decorator>

    <!--...-->
</decorators>

错误写法:

<decorators defaultdir="/WEB-INF/pages">
    <decorator name="main" page="/decorators/main.jsp">  <!--这里多了一个“/” -->
        <pattern>/*</pattern>
    </decorator>

    <!--...-->
</decorators>

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

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

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多