一、
SiteMesh
项目简介
<wbr><wbr><wbr><wbr><wbr>OS(OpenSymphony)</wbr></wbr></wbr></wbr></wbr> 的 SiteMesh 是一个用来在 JSP 中实现页面布局和装饰( layout and decoration )
的框架组件,能够帮助网站开发人员较容易实现页面中动态内容和静态装饰外观的分离。
<wbr><wbr><wbr><wbr><wbr><wbr>Sitemesh</wbr></wbr></wbr></wbr></wbr></wbr> 是由一个基于 Web 页面布局、装饰以及与现存 Web 应用整合的框架。它能帮助我们在由大
量页面构成的项目中创建一致的页面布局和外观,如一致的导航条,一致的 banner ,一致的版权,等等。
它不仅仅能处理动态的内容,如 jsp , php , asp 等产生的内容,它也能处理静态的内容,如 htm 的内容,
使得它的内容也符合你的页面结构的要求。甚至于它能将 HTML 文件象 include 那样将该文件作为一个面板
的形式嵌入到别的文件中去。所有的这些,都是 GOF 的 Decorator 模式的最生动的实现。尽管它是由 java 语言来实现的,但它能与其他 Web 应用很好地集成。
<wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr> 官方: http://www.opensymphony.com/sitemesh/
<wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr> 下载地址: http://www.opensymphony.com/sitemesh/download.action 目前的最新版本是 Version 2.3 ;
二、为什么要使用 SiteMesh?
<wbr><wbr><wbr></wbr></wbr></wbr> 我们的团队开发 J2EE 应用的时候,经常会碰到一个比较头疼的问题:
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr> 由于 Web 页面是由不同的人所开发,所以开发出来的界面通常是千奇百怪,通常让项目管理人员苦笑不得。
<wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr> 而实际上,任何一个项目都会要求界面的统一风格和美观,既然风格统一,那就说明 UI 层肯定有很多可以抽出来
共用的静态或动态部分;如何整合这些通用的静态或动态 UI 呢? Apache Tiles 框架站了出来很好的解决了这一问题,
再加上他与 struts 的完美集成,导致大小项目都把他作为 UI 层的首选框架,
但是:
<wbr><wbr>Tiles</wbr></wbr> 确实有着它很多的不足之处 , 下文我会介绍 , 本文想说的是,除了 Apache Tiles 框架 , 其实我们还有更好的解
决方案,那就是 :SiteMesh ;
本文
<wbr><wbr><br><wbr><wbr></wbr></wbr></wbr></wbr> 介绍了一个基于 Web 页面的布局、装饰以及应用整合的框架 Sitemesh ,它能帮助你为你的应用创建一致的外观,
很好的取代 Apache Tiles;
三、 SiteMesh VS Apache Tiles
<wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr> 用过 struts 的朋友应该对 Apache Tiles 的不会陌生,我曾经有一篇文章介绍过 struts 中 tiles 框架的组合与继承,
现在怎么看怎么觉得复杂 ;
<wbr><wbr><wbr><wbr><wbr><br><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr> 从使用角度来看, Tiles 似乎是 Sitemesh 标签 <page:applyDecorator> 的一个翻版。其实 sitemesh 最强的
一个特性是 sitemesh 将 decorator 模式用在过滤器上。任何需要被装饰的页面都不知道它要被谁装饰,所以它就
可以用来装璜来自 php 、 asp 、 CGI 等产生的页面了。你可以定义若干个装饰器,根据参数动态地选择装饰器,
产生动态的外观以满足你的需求。它也有一套功能强大的属性体系,它能帮助你构建功能强大而灵活的装饰器。
相比较而言,在这方面 Tiles 就逊色许多。
<wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr> 个人觉得在团队开发里面, Apache Tiles 框架会导致所有人不仅仅要了解并且清楚 Apache Tiles 的存在,
并且要特别熟悉每一个 Tiles layout 模板的作用,否则就可能出现用错模板的情况;除此之外,每个人涉及到
的所有 WEB 页面都需要去配置文件里面逐个配置,不仅麻烦出错的几率还高;
<wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr> 而以上所有的不足都是 SiteMesh 所不存在的;
四、 SiteMesh 的基本原理
<wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr> 一个请求到服务器后,如果该请求需要 sitemesh 装饰,服务器先解释被请求的资源,然后根据配置文件
获得用于该请求的装饰器,最后用装饰器装饰被请求资源,将结果一同返回给客户端浏览器。
五、如何使用 SiteMesh
<wbr><wbr></wbr></wbr> 这里以 struts2+spring2+hibernate3 构架的系统为例
<wbr><wbr><wbr><wbr>1</wbr></wbr></wbr></wbr> 、下载 SiteMesh
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr> 下载地址: http://www.opensymphony.com/sitemesh/download.action 目前的最新版本是 Version 2.3 ;
<wbr><wbr><wbr><wbr><wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr>2</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr> 、在工程中引入 SiteMesh 的必要 jar 包,和 struts2-sitemesh-plugin-2.0.8.jar ;
<wbr><wbr><wbr><wbr><wbr><br><wbr><wbr><wbr><wbr><wbr><wbr>3</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr> 、修改你的 web.xml, 在里面加入 sitemesh 的过滤器,示例代码如下:
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><br> <!-- sitemesh</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr> 配置 -->
<wbr><wbr><wbr><filter><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><filter-name>sitemesh</filter-name><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><filter-class><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>com.opensymphony.module.sitemesh.filter.PageFilter<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr></filter-class><br><wbr><wbr><wbr></filter><br><wbr><wbr><wbr><filter-mapping><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><filter-name>sitemesh</filter-name><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><url-pattern>/*</url-pattern><br><wbr><wbr><wbr></filter-mapping><br><br><wbr><wbr><wbr><wbr><wbr><br><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr> 注意过滤器的位置:应该在 struts2 的 org.apache.struts2.dispatcher.ActionContextCleanUp 过滤器之后 ,org.apache.struts2.dispatcher.FilterDispatcher 过滤器之前,否则会有问题;
<wbr><wbr><wbr><wbr><wbr><wbr>4</wbr></wbr></wbr></wbr></wbr></wbr> 、在下载的 SiteMesh 包中找到 sitemesh.xml , (\sitemesh-2.3\src\example-webapp\WEB-INF 目录下就有 )
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr> 将其拷贝到 /WEB-INF 目录下;
<wbr><wbr><wbr><wbr><wbr><wbr>5</wbr></wbr></wbr></wbr></wbr></wbr> 、在 sitemesh.xml 文件中有一个 property 结点 ( 如下 ) ,该结点指定了 decorators.xml 在工程中的位置,让 sitemesh.xml 能找到他 ;
按照此路径新建 decorators.xml 文件,当然这个路径你可以任意改变,只要 property 结点的 value 值与其匹配就行;
<property name="decorators-file" value="/WEB-INF/sitemesh/decorators.xml"/>
<wbr><wbr><wbr><br><wbr><wbr><wbr><wbr><wbr>6</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr> 、在 WebRoot 目录下新建 decorators 目录,并在该目录下新建一个模板 jsp ,根据具体项目风格编辑该模板,
如下示例:我的模板: main.jsp
<%@ page language="java" pageEncoding="UTF-8"%>
<%@taglib prefix="decorator"
<wbr><wbr><wbr><wbr>uri="http://www.opensymphony.com/sitemesh/decorator"%><br> <%@taglib prefix="page" uri="http://www.opensymphony.com/sitemesh/page"%><br> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 Transitional//EN"<br> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><br> <%<br><wbr><wbr><wbr><wbr>response.setHeader("Pragma", "no-cache");<br><wbr><wbr><wbr><wbr>response.setHeader("Cache-Control", "no-cache");<br><wbr><wbr><wbr><wbr>response.setDateHeader("Expires", 0);<br> %><br> <html><br><wbr><wbr><wbr><head><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><title><decorator:title default="kangxm test" /><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr></title><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><!--</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr> 页面 Head 由引用模板的子页面来替换 -->
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><decorator:head /><br><wbr><wbr><wbr></head><br><wbr><wbr><wbr><body id="page-home"><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><div id="page-total"><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><div id="page-header"><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><table width="100%" border="0" cellspacing="0" cellpadding="0"><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><tr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><td><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><div class="topFunc"><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr> 我的账户
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>|<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr> 退出
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></div><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></td><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></tr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></table><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></div><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr></div><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><!-- end header --><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><!--<wbr><wbr>Menu Tag begin --><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><div id="page-menu" style="margin-top: 8px; margin-bottom: 8px;"><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><div><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr> 这里放菜单
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></div><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr></div><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><!--<wbr><wbr>Menu Tag end --><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><div id="page-content" class="clearfix"><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><center><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><table width="100%" border="0" cellpadding="0" cellspacing="0"><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><tr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><td><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><decorator:body /><!--</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr> 这里的内容由引用模板的子页面来替换 -->
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></td><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></tr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></table><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></center><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr></div><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><!-- end content --><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><div id="page-footer" class="clearfix"><br><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr> 这里放页面底部
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><!-- end footer --><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr></div><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><!-- end page --><br><wbr><wbr><wbr></body><br> </html><br><br><br></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr> 这就是个简单的模板,页面的头和脚都由模板里的静态 HTML 决定了,主页面区域用的是 <decorator:body /> 标签;
也就是说凡是能进入过滤器的请求生成的页面都会默认加上模板上的头和脚,然后页面自身的内容将自动放到 <decorator:body /> 标签所在位置;
<decorator:title default="Welcome to test sitemesh!" /> :读取被装饰页面的标题,并给出了默认标题。
<decorator:head /> :读取被装饰页面的 <head> 中的内容;
<decorator:body /> :读取被装饰页面的 <body> 中的内容;
<wbr><wbr><wbr><wbr><wbr>7</wbr></wbr></wbr></wbr></wbr> 、说到这里大家就要想了,那如果某个特殊的需求请求路径在过滤器的范围内,但又不想使用模板怎么办?
你总不能这么不讲道理吧!
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr> 大家放心吧, SiteMesh 早就考虑到这一点了,上面第 5 步说道的 decorators.xml 这个时候就起到作用了!
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><br></wbr></wbr></wbr></wbr></wbr></wbr></wbr> 下面是我的 decorators.xml :
<?xml version="1.0" encoding="ISO-8859-1"?>
<decorators defaultdir="/decorators">
<wbr><wbr><wbr><!-- Any urls that are excluded will never be decorated by Sitemesh --><br><wbr><wbr><wbr><excludes><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><pattern>/index.jsp*</pattern><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><pattern>/login/*</pattern><br><wbr><wbr><wbr></excludes><br><wbr><wbr><wbr><decorator name="main" page="main.jsp"><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><pattern>/*</pattern><br><wbr><wbr><wbr></decorator><br> </decorators><br><br><br> decorators.xml</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr> 有两个主要的结点:
<wbr><wbr><wbr><wbr><wbr><wbr>decorator</wbr></wbr></wbr></wbr></wbr></wbr> 结点指定了模板的位置和文件名,通过 pattern 来指定哪些路径引用哪个模板
<wbr><wbr><wbr><wbr><wbr><wbr>excludes</wbr></wbr></wbr></wbr></wbr></wbr> 结点则指定了哪些路径的请求不使用任何模板
如上面代码, /index.jsp 和凡是以 /login/ 开头的请求路径一律不使用模板;
另外还有一点要注意的是: decorators 结点的 defaultdir 属性指定了模板文件存放的目录 ;
六、实战感受
<wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr> 刚刚做完一个用到 sitemesh 的项目,跟以前用 tiles 框架相比,最大的感受就是简单,系统设计阶段
就把模板文件和 sitemesh 框架搭好了!哪些页面使用框架哪些不使用,全部都通过 UI Demo 很快就定义出来了;
在接下来的开发中所有成员几乎感受不到 sitemesh 的存在,各自仅仅关心自己的模块功能实现;
七、总结
<wbr><wbr><wbr></wbr></wbr></wbr> 使用 sitemesh 给我们带来的是不仅仅是页面结构问题,它的出现让我们有更多的时间去关注底层业务
逻辑,而不是整个页面的风格和结构。它让我们摆脱了大量用 include 方式复用页面尴尬局面,也避免了 tiles
框架在团队开发中的复杂度,它还提供了很大的灵活性以及给我们提供了整合异构 Web 系统页面的一种方案。
<wbr><wbr><wbr><wbr><wbr>OS(OpenSymphony)</wbr></wbr></wbr></wbr></wbr> 的 SiteMesh 是一个用来在 JSP 中实现页面布局和装饰( layout and decoration )
的框架组件,能够帮助网站开发人员较容易实现页面中动态内容和静态装饰外观的分离。
<wbr><wbr><wbr><wbr><wbr><wbr>Sitemesh</wbr></wbr></wbr></wbr></wbr></wbr> 是由一个基于 Web 页面布局、装饰以及与现存 Web 应用整合的框架。它能帮助我们在由大
量页面构成的项目中创建一致的页面布局和外观,如一致的导航条,一致的 banner ,一致的版权,等等。
它不仅仅能处理动态的内容,如 jsp , php , asp 等产生的内容,它也能处理静态的内容,如 htm 的内容,
使得它的内容也符合你的页面结构的要求。甚至于它能将 HTML 文件象 include 那样将该文件作为一个面板
的形式嵌入到别的文件中去。所有的这些,都是 GOF 的 Decorator 模式的最生动的实现。尽管它是由 java 语言来实现的,但它能与其他 Web 应用很好地集成。
<wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr> 官方: http://www.opensymphony.com/sitemesh/
<wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr> 下载地址: http://www.opensymphony.com/sitemesh/download.action 目前的最新版本是 Version 2.3 ;
二、为什么要使用 SiteMesh?
<wbr><wbr><wbr></wbr></wbr></wbr> 我们的团队开发 J2EE 应用的时候,经常会碰到一个比较头疼的问题:
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr> 由于 Web 页面是由不同的人所开发,所以开发出来的界面通常是千奇百怪,通常让项目管理人员苦笑不得。
<wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr> 而实际上,任何一个项目都会要求界面的统一风格和美观,既然风格统一,那就说明 UI 层肯定有很多可以抽出来
共用的静态或动态部分;如何整合这些通用的静态或动态 UI 呢? Apache Tiles 框架站了出来很好的解决了这一问题,
再加上他与 struts 的完美集成,导致大小项目都把他作为 UI 层的首选框架,
但是:
<wbr><wbr>Tiles</wbr></wbr> 确实有着它很多的不足之处 , 下文我会介绍 , 本文想说的是,除了 Apache Tiles 框架 , 其实我们还有更好的解
决方案,那就是 :SiteMesh ;
本文
<wbr><wbr><br><wbr><wbr></wbr></wbr></wbr></wbr> 介绍了一个基于 Web 页面的布局、装饰以及应用整合的框架 Sitemesh ,它能帮助你为你的应用创建一致的外观,
很好的取代 Apache Tiles;
三、 SiteMesh VS Apache Tiles
<wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr> 用过 struts 的朋友应该对 Apache Tiles 的不会陌生,我曾经有一篇文章介绍过 struts 中 tiles 框架的组合与继承,
现在怎么看怎么觉得复杂 ;
<wbr><wbr><wbr><wbr><wbr><br><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr> 从使用角度来看, Tiles 似乎是 Sitemesh 标签 <page:applyDecorator> 的一个翻版。其实 sitemesh 最强的
一个特性是 sitemesh 将 decorator 模式用在过滤器上。任何需要被装饰的页面都不知道它要被谁装饰,所以它就
可以用来装璜来自 php 、 asp 、 CGI 等产生的页面了。你可以定义若干个装饰器,根据参数动态地选择装饰器,
产生动态的外观以满足你的需求。它也有一套功能强大的属性体系,它能帮助你构建功能强大而灵活的装饰器。
相比较而言,在这方面 Tiles 就逊色许多。
<wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr> 个人觉得在团队开发里面, Apache Tiles 框架会导致所有人不仅仅要了解并且清楚 Apache Tiles 的存在,
并且要特别熟悉每一个 Tiles layout 模板的作用,否则就可能出现用错模板的情况;除此之外,每个人涉及到
的所有 WEB 页面都需要去配置文件里面逐个配置,不仅麻烦出错的几率还高;
<wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr> 而以上所有的不足都是 SiteMesh 所不存在的;
四、 SiteMesh 的基本原理
<wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr> 一个请求到服务器后,如果该请求需要 sitemesh 装饰,服务器先解释被请求的资源,然后根据配置文件
获得用于该请求的装饰器,最后用装饰器装饰被请求资源,将结果一同返回给客户端浏览器。
五、如何使用 SiteMesh
<wbr><wbr></wbr></wbr> 这里以 struts2+spring2+hibernate3 构架的系统为例
<wbr><wbr><wbr><wbr>1</wbr></wbr></wbr></wbr> 、下载 SiteMesh
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr> 下载地址: http://www.opensymphony.com/sitemesh/download.action 目前的最新版本是 Version 2.3 ;
<wbr><wbr><wbr><wbr><wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr>2</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr> 、在工程中引入 SiteMesh 的必要 jar 包,和 struts2-sitemesh-plugin-2.0.8.jar ;
<wbr><wbr><wbr><wbr><wbr><br><wbr><wbr><wbr><wbr><wbr><wbr>3</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr> 、修改你的 web.xml, 在里面加入 sitemesh 的过滤器,示例代码如下:
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><br> <!-- sitemesh</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr> 配置 -->
<wbr><wbr><wbr><filter><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><filter-name>sitemesh</filter-name><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><filter-class><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>com.opensymphony.module.sitemesh.filter.PageFilter<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr></filter-class><br><wbr><wbr><wbr></filter><br><wbr><wbr><wbr><filter-mapping><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><filter-name>sitemesh</filter-name><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><url-pattern>/*</url-pattern><br><wbr><wbr><wbr></filter-mapping><br><br><wbr><wbr><wbr><wbr><wbr><br><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr> 注意过滤器的位置:应该在 struts2 的 org.apache.struts2.dispatcher.ActionContextCleanUp 过滤器之后 ,org.apache.struts2.dispatcher.FilterDispatcher 过滤器之前,否则会有问题;
<wbr><wbr><wbr><wbr><wbr><wbr>4</wbr></wbr></wbr></wbr></wbr></wbr> 、在下载的 SiteMesh 包中找到 sitemesh.xml , (\sitemesh-2.3\src\example-webapp\WEB-INF 目录下就有 )
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr> 将其拷贝到 /WEB-INF 目录下;
<wbr><wbr><wbr><wbr><wbr><wbr>5</wbr></wbr></wbr></wbr></wbr></wbr> 、在 sitemesh.xml 文件中有一个 property 结点 ( 如下 ) ,该结点指定了 decorators.xml 在工程中的位置,让 sitemesh.xml 能找到他 ;
按照此路径新建 decorators.xml 文件,当然这个路径你可以任意改变,只要 property 结点的 value 值与其匹配就行;
<property name="decorators-file" value="/WEB-INF/sitemesh/decorators.xml"/>
<wbr><wbr><wbr><br><wbr><wbr><wbr><wbr><wbr>6</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr> 、在 WebRoot 目录下新建 decorators 目录,并在该目录下新建一个模板 jsp ,根据具体项目风格编辑该模板,
如下示例:我的模板: main.jsp
<%@ page language="java" pageEncoding="UTF-8"%>
<%@taglib prefix="decorator"
<wbr><wbr><wbr><wbr>uri="http://www.opensymphony.com/sitemesh/decorator"%><br> <%@taglib prefix="page" uri="http://www.opensymphony.com/sitemesh/page"%><br> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 Transitional//EN"<br> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><br> <%<br><wbr><wbr><wbr><wbr>response.setHeader("Pragma", "no-cache");<br><wbr><wbr><wbr><wbr>response.setHeader("Cache-Control", "no-cache");<br><wbr><wbr><wbr><wbr>response.setDateHeader("Expires", 0);<br> %><br> <html><br><wbr><wbr><wbr><head><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><title><decorator:title default="kangxm test" /><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr></title><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><!--</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr> 页面 Head 由引用模板的子页面来替换 -->
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><decorator:head /><br><wbr><wbr><wbr></head><br><wbr><wbr><wbr><body id="page-home"><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><div id="page-total"><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><div id="page-header"><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><table width="100%" border="0" cellspacing="0" cellpadding="0"><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><tr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><td><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><div class="topFunc"><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr> 我的账户
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>|<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr> 退出
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></div><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></td><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></tr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></table><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></div><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr></div><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><!-- end header --><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><!--<wbr><wbr>Menu Tag begin --><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><div id="page-menu" style="margin-top: 8px; margin-bottom: 8px;"><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><div><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr> 这里放菜单
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></div><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr></div><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><!--<wbr><wbr>Menu Tag end --><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><div id="page-content" class="clearfix"><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><center><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><table width="100%" border="0" cellpadding="0" cellspacing="0"><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><tr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><td><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><decorator:body /><!--</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr> 这里的内容由引用模板的子页面来替换 -->
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></td><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></tr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></table><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></center><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr></div><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><!-- end content --><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><div id="page-footer" class="clearfix"><br><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr> 这里放页面底部
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><!-- end footer --><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr></div><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><!-- end page --><br><wbr><wbr><wbr></body><br> </html><br><br><br></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr> 这就是个简单的模板,页面的头和脚都由模板里的静态 HTML 决定了,主页面区域用的是 <decorator:body /> 标签;
也就是说凡是能进入过滤器的请求生成的页面都会默认加上模板上的头和脚,然后页面自身的内容将自动放到 <decorator:body /> 标签所在位置;
<decorator:title default="Welcome to test sitemesh!" /> :读取被装饰页面的标题,并给出了默认标题。
<decorator:head /> :读取被装饰页面的 <head> 中的内容;
<decorator:body /> :读取被装饰页面的 <body> 中的内容;
<wbr><wbr><wbr><wbr><wbr>7</wbr></wbr></wbr></wbr></wbr> 、说到这里大家就要想了,那如果某个特殊的需求请求路径在过滤器的范围内,但又不想使用模板怎么办?
你总不能这么不讲道理吧!
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr> 大家放心吧, SiteMesh 早就考虑到这一点了,上面第 5 步说道的 decorators.xml 这个时候就起到作用了!
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><br></wbr></wbr></wbr></wbr></wbr></wbr></wbr> 下面是我的 decorators.xml :
<?xml version="1.0" encoding="ISO-8859-1"?>
<decorators defaultdir="/decorators">
<wbr><wbr><wbr><!-- Any urls that are excluded will never be decorated by Sitemesh --><br><wbr><wbr><wbr><excludes><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><pattern>/index.jsp*</pattern><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><pattern>/login/*</pattern><br><wbr><wbr><wbr></excludes><br><wbr><wbr><wbr><decorator name="main" page="main.jsp"><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><pattern>/*</pattern><br><wbr><wbr><wbr></decorator><br> </decorators><br><br><br> decorators.xml</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr> 有两个主要的结点:
<wbr><wbr><wbr><wbr><wbr><wbr>decorator</wbr></wbr></wbr></wbr></wbr></wbr> 结点指定了模板的位置和文件名,通过 pattern 来指定哪些路径引用哪个模板
<wbr><wbr><wbr><wbr><wbr><wbr>excludes</wbr></wbr></wbr></wbr></wbr></wbr> 结点则指定了哪些路径的请求不使用任何模板
如上面代码, /index.jsp 和凡是以 /login/ 开头的请求路径一律不使用模板;
另外还有一点要注意的是: decorators 结点的 defaultdir 属性指定了模板文件存放的目录 ;
六、实战感受
<wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr> 刚刚做完一个用到 sitemesh 的项目,跟以前用 tiles 框架相比,最大的感受就是简单,系统设计阶段
就把模板文件和 sitemesh 框架搭好了!哪些页面使用框架哪些不使用,全部都通过 UI Demo 很快就定义出来了;
在接下来的开发中所有成员几乎感受不到 sitemesh 的存在,各自仅仅关心自己的模块功能实现;
七、总结
<wbr><wbr><wbr></wbr></wbr></wbr> 使用 sitemesh 给我们带来的是不仅仅是页面结构问题,它的出现让我们有更多的时间去关注底层业务
逻辑,而不是整个页面的风格和结构。它让我们摆脱了大量用 include 方式复用页面尴尬局面,也避免了 tiles
框架在团队开发中的复杂度,它还提供了很大的灵活性以及给我们提供了整合异构 Web 系统页面的一种方案。