SiteMesh 入门 总结

SiteMesh 入门 结合网上和官网的,如果英文ok 的话,建议看官网比较全。
下载:http://wenku.baidu.com/view/99a362eb172ded630b1cb660.html

SiteMesh 入门

一个优于Apache TilesWeb页面布局、装饰框架
一、SiteMesh项目简介
OS(OpenSymphony)SiteMesh是一个用来在JSP中实现页面布局和装饰(layout and decoration
的框架组件,能够帮助网站开发人员较容易实现页面中动态内容和静态装饰外观的分离。
Sitemesh是由一个基于Web页面布局、装饰以及与现存Web应用整合的框架。它能帮助我们在由大
量页面构成的项目中创建一致的页面布局和外观,如一致的导航条,一致的banner,一致的版权,等等。
它不仅仅能处理动态的内容,如jspphpasp等产生的内容,它也能处理静态的内容,如htm的内容,
使得它的内容也符合你的页面结构的要求。甚至于它能将HTML文件象include那样将该文件作为一个面板
的形式嵌入到别的文件中去。所有的这些,都是GOFDecorator模式的最生动的实现。尽管它是由java语言来实现的,但它能与其他Web应用很好地集成。
官方:http://www.opensymphony.com/sitemesh/
下载地址:http://www.opensymphony.com/sitemesh/download.action 目前的最新版本是Version 2.4.1
二、为什么要使用SiteMesh?
我们的团队开发J2EE应用的时候,经常会碰到一个比较头疼的问题:
由于Web页面是由不同的人所开发,所以开发出来的界面通常是千奇百怪,通常让项目管理人员苦笑不得。
而实际上,任何一个项目都会要求界面的统一风格和美观,既然风格统一,那就说明UI层肯定有很多可以抽出来
共用的静态或动态部分;如何整合这些通用的静态或动态UI呢?Apache Tiles框架站了出来很好的解决了这一问题,
再加上他与struts的完美集成,导致大小项目都把他作为UI层的首选框架,
但是:
Tiles确实有着它很多的不足之处,下文我会介绍,本文想说的是,除了Apache Tiles框架,其实我们还有更好的解决方案,那就是:SiteMesh
本文
介绍了一个基于Web页面的布局、装饰以及应用整合的框架Sitemesh,它能帮助你为你的应用创建一致的外观,
很好的取代Apache Tiles;
三、SiteMesh VS Apache Tiles
用过struts的朋友应该对Apache Tiles的不会陌生,我曾经有一篇文章介绍过strutstiles框架的组合与继承,
现在怎么看怎么觉得复杂;
从使用角度来看,Tiles似乎是Sitemesh标签<page:applyDecorator>的一个翻版。其实sitemesh最强的一个特性是sitemeshdecorator模式用在过滤器上。任何需要被装饰的页面都不知道它要被谁装饰,所以它就可以用来装璜来自phpaspCGI等产生的页面了。你可以定义若干个装饰器,根据参数动态地选择装饰器,产生动态的外观以满足你的需求。它也有一套功能强大的属性体系,它能帮助你构建功能强大而灵活的装饰器。
相比较而言,在这方面Tiles就逊色许多。
个人觉得在团队开发里面,Apache Tiles框架会导致所有人不仅仅要了解并且清楚Apache Tiles的存在,
并且要特别熟悉每一个Tiles layout模板的作用,否则就可能出现用错模板的情况;除此之外,每个人涉及到
的所有WEB页面都需要去配置文件里面逐个配置,不仅麻烦出错的几率还高;
以上所有的不足都是SiteMesh所不存在的;
四、SiteMesh的基本原理
一个请求到服务器后,如果该请求需要sitemesh装饰,服务器先解释被请求的资源,然后根据配置文件获得用于该请求的装饰器,最后用装饰器装饰被请求资源,将结果一同返回给客户端浏览器。
SiteMesh设计思想是,用户发送request至服务器,服务器根据此request生成动态数据,生成网页,准备返回给客户端。就在返回前,SiteMesh进行拦截,对此网页进行解析,将titlebody等部分拆解出来,套上模板后,再返回给客户端。由于SiteMesh在返回客户端的最后一步工作,此时的网页已经具备了标准的html网页格式,因此SiteMesh只需解析标准的html网页,无需考虑各个Web应用是应用了JSPASP,还是Velocity技术,相当灵活。
SiteMesh使用了Decorator的设计模式
五、如何使用SiteMesh
1 添加基础包和文件:
a sitemesh-2.4.1.jar
b sitemesh-decorator.tld
c sitemesh-page.tld
后面两个是xml 定义文件,tomcat 版本高的可以不引用,否则需要在web.xml下配置(详看readme)
<jsp-config>
<taglib>
<taglib-uri>http://www.opensymphony.com/sitemesh/decorator</taglib-uri>
<taglib-location>/WEB-INF/lib/sitemesh-decorator.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>http://www.opensymphony.com/sitemesh/page</taglib-uri>
<taglib-location>/WEB-INF/lib/sitemesh-page.tld</taglib-location>
</taglib>
</jsp-config>
最基本的可以参考:sitemesh-blank.war
2 web.xml 配置:
<filter>
<filter-name>sitemesh</filter-name>
<filter-class>com.opensymphony.sitemesh.webapp.SiteMeshFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>sitemesh</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
这里定义了一个过滤器.所有的请求都交由sitemesh来处理
WEB-INF下创建一个decorators.xml文件,内容如下:
<decorators defaultdir="/decorators">
<decorator name="main" page="/decorator/decorator.jsp">
<pattern>/*</pattern>
</decorator>
<!-- excludes标签中定义不会被装饰的JSP视图界面 -->
<excludes>
<pattern>/jsp/layout/*</pattern>
<pattern>/jsp/template/*</pattern>
<pattern>/jsp/image.jsp</pattern>
</excludes>
<!-- 定义装饰器,该装饰器为一个页面格式分为上中下三块的JSP视图界面-->
<decorator name="template" page="3PartLayoutTemplate.jsp">
<pattern>/jsp/*</pattern>
<pattern>/jsp/body/*</pattern>
</decorator>
</decorators>
这是定义了模板页,也就是所有页面在返回给客户端之前,先在这里加上装饰,套上模板。
defaultdir="/decorators"说明了模板页的路径.(默认是可以不配置,'/' 即根目录)<decorator name="main" page="main.jsp">模板页的名称。
<pattern>/*</pattern>表示对所有的response进行处理
defaultdir: 包含装饰器页面的目录
page : 页面文件名
name : 别名
role : 角色,用于安全
webapp : 可以另外指定此文件存放目录
Patterns : 匹配的路径,可以用*,那些被访问的页面需要被装饰。
下面开始一个最简单的配置:
1 加入包 sitemesh-2.4.1.jar
2 web.xml 新增过滤器:
<filter>
<filter-name>sitemesh</filter-name>
<filter-class>com.opensymphony.sitemesh.webapp.SiteMeshFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>sitemesh</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3 新建decorators.xml 配置装饰器
<decorators defaultdir="/decorators">
<!-- 定义装饰器,该装饰器为一个页面格式分为上中下三块的JSP视图界面-->
<decorator name="main" page="/decorator/decorator.jsp">
<pattern>/*</pattern>
</decorator>
<!-- excludes标签中定义不会被装饰的JSP视图界面 -->
<excludes>
</excludes>
</decorators>
4 装饰器页面 /decorator/decorator.jsp 注意路径以根路径webroot开始,编码utf-8
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>
<%@ taglib uri="http://www.opensymphony.com/sitemesh/decorator" prefix="decorator" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My Site -<decorator:title default="Welcome! 装饰器页面。。。" /></title>
<decorator:head></decorator:head>
</head>
<body>
<p><font color="red">before body</font> </p>
<decorator:body ></decorator:body>
<p><font color="red">After body</font></p>
</body>
</html>
5 新建被装饰的页面index2.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Agent Test </title>
</head>
<body>
我是访问index2.jsp 单独的一条语句:
</body>
</html>
6 部署访问http://192.168.1.74:8085/struts2.2lxDemo/index2.jsp

简单Demo 结束;~ ~
其他:
可以结合原有的velocity 或者freemarker 页面框架,在原来的定义装饰器的文件decorators.xml 添加:

<decorator name="velocity" page="velocity.vm">

<pattern>/velocity.html</pattern>
</decorator>
<decorator name="freemarker" page="freemarker.ftl">
<pattern>/freemarker.html</pattern>
</decorator>
在与strut结合时需要引入:
1 struts2-sitemesh-plugin-2.0.8.jar
2 注意过滤器的位置:应该在struts2org.apache.struts2.dispatcher.FilterDispatcher过滤器之前org.apache.struts2.dispatcher.ActionContextCleanUp过滤器之后,否则会有问题;
3 sturts访问的时候记得重定向:其他不变

<!----------------------文件名:struts.xml---------------->

…………
<action name="index" >
<result type="redirect">/jsp/body/firstPage.jsp</result>
</action>
…………
4 如果decorator.xml 需要定义到其他位置,可以通过。xml配置:
在下载的SiteMesh包中找到sitemesh.xml(\sitemesh-2.3\src\example-webapp\WEB-INF目录下就有)将其拷贝到/WEB-INF目录下;
sitemesh.xml文件中有一个property结点(如下),该结点指定了decorators.xml在工程中的位置,让sitemesh.xml能找到他;
按照此路径新建decorators.xml文件,当然这个路径你可以任意改变,只要property结点的value值与其匹配就行;

<property name="decorators-file" value="/WEB-INF/sitemesh/decorators.xml"/>

六、实战感受
刚刚做完一个用到sitemesh的项目,跟以前用tiles框架相比,最大的感受就是简单,系统设计阶段
就把模板文件和sitemesh框架搭好了!哪些页面使用框架哪些不使用,全部都通过UI Demo很快就定义出来了;
在接下来的开发中所有成员几乎感受不到sitemesh的存在,各自仅仅关心自己的模块功能实现;
更多可以访问:

http://www.javaeye.com/topic/509015 主题:Struts2讲义44 Struts2 页面布局实现

http://www.javaeye.com/topic/509710 主题:Struts2讲义45 10.2 sitemesh 高级应用
http://www.javaeye.com/topic/510309
主题:Struts2讲义46 <decorator:usePage> <decorator:useHtmlPage> <decorator:head> 标签的使用介绍
http://www.blogjava.net/yjhmily/archive/2007/09/28/149143.htm
一个优于Apache TilesWeb页面布局、装饰框架
http://www.javaeye.com/topic/190031 主题:SiteMesh入门
http://hkme.javaeye.com/blog/518656 SiteMesh教程
http://www.docin.com/p-46157733.html#
http://blog.csdn.net/kongxx/archive/2007/05/13/1606901.aspx
之前也已经说过原来的 sitemesh 装饰标签值能显示 <head> <body> 之间的内容,不能显示它们的属性。但是使用 <decorator:usePage> <decorator:useHtmlPage> 就能显示这些属性的内容。
七、总结
使用sitemesh给我们带来的是不仅仅是页面结构问题,它的出现让我们有更多的时间去关注底层业务
逻辑,而不是整个页面的风格和结构。它让我们摆脱了大量用include方式复用页面尴尬局面,也避免了tiles
框架在团队开发中的复杂度,它还提供了很大的灵活性以及给我们提供了整合异构Web系统页面的一种方案。

代码解释
1 ) 首先说明开发中如果要使用 sitemesh 来进行页面布局功能开发,在 WEB-INF/lib 文件夹下一定要放入 sitemesh 支持的 jar 包。目前 sitemesh 最新版本是 sitemesh-2.3.jar
2 )然后在 web.xml 中必须定义 sitemesh 为过滤器。这样 Web 项目中的 JSP 或其他视图界面都可以被 sitemesh 调用进行页面布局。然后新建 decorators.xml 文件。该文件是用来定义所有装饰器视图界面。因为 sitemesh 是使用设计模式中的装饰模式来进行页面布局功能开发(具体装饰模式定义读者可查看相关设计模式资料)。在这里笔者只能简单说明 sitemesh 将视图页面分为装饰页面和被装饰页面两种。装饰页面又称之为装饰器。都是在 decorators.xml 文件定义,一般定义装饰器时候都指定了被装饰页面或者某文件路径,在该文件路径下的所有视图界面文件都是被装饰页面。
读者可以查看 decorators.xml 文件代码看到 <excludes> 标签,在该标签中一般都是指定不需要被装饰的视图文件。以 <pattern> 标签来一个个定义。有代码也可知道“ /jsp/layout/* ”标明在 /jsp/layout/ 目录下所有的视图界面都是不需要被装饰的。如果想指定某个视图文件不被装饰,则可以写成代码中/jsp/image.jsp形式,这样在 jsp 目录下只有 image.jsp 文件不被装饰,其他视图界面都是要被装饰的。
<decorator> 标签则是相关装饰器页面定义需要使用的标签。其中 name 属性是让开发者定义装饰器名字,而 page 属性则指定装饰器文件的路径和具体名字。在本示例代码中可知 3PartLayoutTemplate.jsp 是一个装饰器文件。
注意:在<decorators> 标签中有个defaultdir 属性,它是表明装饰器文件的路径。本示例代码中定义的是“/jsp/template ”, 也就是说之前所定义的3PartLayoutTemplate.jsp 是在该目录下。如果defaultdir 定义的是“/ ”,则装饰器定义的page 属性中定义的装饰器文件是在Web 项目根目录下。在开发环境中就是在WebRoot 文件夹下(笔者使用的是MyEclipse ,所以读者使用的开发工具不是MyEclipse 的话,则web 根目录的文件夹名字不一定是WebRoot )。如果读者想让3PartLayoutTemplate.jsp 还是在/jsp/template 目录下,而defaultdir 想定义为“/ ”,则page 属性中定义需要写成“/jsp/template/3PartLayoutTemplate.jsp ”
在装饰器定义中,可以还是使用<pattern> 标签来指定需要被装饰的视图界面。具体做法和<excludes> 中的<pattern> 用法相同,只不过一个是指定被装饰的,另外一个指定不被装饰的。当然也可以不使用<pattern> 标签,这样可以使用 <page:applyDecorator> 标签在页面中指定需要被装饰的视图界面文件(下一小节将具体介绍如何使用),而不是在 decorators.xml 文件中指定被装饰的视图界面文件。
3 )在 3PartLayoutTemplate.jsp 该装饰器页面中,读者查看代码可以看见在该视图文件中,笔者先定义了 “<%@ taglib uri="http://www.opensymphony.com/sitemesh/decorator" prefix="decorator"%> ”用以在页面中使用<decorator> 标签 。这里只是使用了 <decorator:title> < decorator:body> 两个 decorator 的基础标签。
这里 <decorator:title> 中有个 default 属性。使用该属性的目的是当被装饰视图界面文件中没有定义自己的 <title> 标签内容时候,则装饰和被装饰视图界面一起显示的页面布局界面的 title 就显示该属性中内容。在图 10.1 中,笔者也用红框特别注明了显示的 title 的内容。
< decorator:body> 就是表明被装饰视图界面的 <body> 中内容显示。因此可以这么理解在装饰器视图界面文件中,如果看到以 decorator 打头的标签,则是显示被装饰视图界面文件的内容。如果后写的是 title 则显示的是被装饰文件中 <title> 标签中的内容。如果是 body 则显示的是被装饰文件中 <body> 标签中的内容。
在本示例中笔者将 /jsp/body/ 中的 firstPage.jsp 作为被装饰文件,在 web.xml 中定义缺省显示的就是该被装饰文件。因此运行该示例就可以看到 firstPage.jsp 不仅仅显示了自己的内容,而且将装饰器文件 3PartLayoutTemplate.jsp 中的内容也显示出来了,特别是两个<jsp:include> JSP 文件。给人感觉就是在3PartLayoutTemplate.jsp 显示的内容上面又加了 firstPage.jsp 内容。而被装饰的文件还可以是其他视图文件。因此在别的界面中则显示的不一定是 firstPage.jsp 内容,但是 3PartLayoutTemplate.jsp 中的内容还是会先出来的。这样就达到了页面布局的效果。
注意:开发人员还可以定义Action 来显示页面布局。在笔者使用的该示例的struts.xml 中定义了index.action ,而其中result 指向的就是 firstPage.jsp 。不过这时候 result type 类型一定要是redirect(代码中黑体注明,另外说一句 result 缺省的类型是 dispatcher ,可以不显示声明)。因为如果不定义该类型,则 index.action 指向的只是单纯 firstPage.jsp 文件的内容,不会显示装饰器文件 3PartLayoutTemplate.jsp 中的内容。这和redirect 是一个重定向有关系,有关重定向的概念笔者在第二章也做过简单介绍,读者可以翻阅之前章节。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

«    2025年11月    »
12
3456789
10111213141516
17181920212223
24252627282930
搜索
标签列表
网站分类
最新留言
    文章归档
    友情链接

    Powered By Z-BlogPHP 1.7.4

    Copyright Your WebSite.Some Rights Reserved.闽ICP备11018667号-2