一、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即可简单实现上述要求。
三、环境配置
- jar包:在WEB-INF/lib目录下导入:sitemesh-2.3.jar
- tld包:在WEB-INF目录下装入:sitemesh-decorator.tld 和 sitemesh-page.tld
- 配置文件xml:在WEB-INF目录下有2个配置文件:sitemesh.xml(可选) 和 decorators.xml
- 在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: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: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。为了方便起见,所有标签均不在路径前加“/”。
|