是什么SiteMesh
SiteMesh是开源组织OpenSymphony的一个用来在JSP中实现页面布局和装饰(layout and decoration)的框架组件,能够帮助网站开发人员较容易实现页面中动态内容和静
态装饰外观。
SiteMesh是由一个基于Web页面布局、装饰及与现存Web应用整合的框架。它能帮助 我们再由大量页面工程的项目中创建一致的页面布局和外观,如一致的导航条、
一致 的banner、一致的版权等。它不仅能处理动态的内容,如JSP、PHP、ASP、CGI等产 生的内容,还能处理静态的内容,比如HTML的内容,使得它的内容也符合
你的页面结 构的要求。甚至它能像include那样将HTML文件作为一个面板的形式嵌入到别的文件中 去。所有的这些,都是GOF的Decorator模式的最生动的实现。
装饰模式是在不必改变 原类文件和使用集成的情况下,动态地扩展一个对象的功能。它能通过创建一个包装 对象,也就是装饰来包裹的对象。尽管它是由Java语言来实现的,
但是它能与其他 Web应用很好的集成
原理
SiteMesh是基于过滤器PageFilter——一个Servlet过滤器完成页面内容的装饰的。容器 接收到页面请求时,会把请求传递给PageFilter,PageFilter收集应用程序的响应细节,
生成自定义的响应对象,然后连同请求一起传递给web应用程序。web应用程序把响应 资源写入到自定义响应对象里,再返回给 PageFilter。
原理
SiteMesh修饰器 一个SiteMesh修饰器其实就是一个使用SiteMesh自定义标签的JSP页面。 SiteMesh标签 <decorator:title/> <decorator:head/> <decorator:body/> <decorator:getProperty/> <decorator:usePage/>
原理
配置文件 sitemesh.xml,用来定义使用哪个页面解析器来解析指定的内容类型或者使用哪种修 饰器映射方案
原理
配置文件sitemesh.xml <property name="decorators-file">指定了用于定义修饰器的文件。<page-parsers> 定义了SiteMesh可以处理的内容类型。每一个<parser>子元素指定哪一个解析器解析 哪一种特定的内容类型。在我们的示例sitemesh.xml文件里,我们告诉SiteMesh使用 FastPageParser解析text/html类型的内容。默认地,SiteMesh只可以处理HTML,但我 们可以创建自己的解析器来处理其他的内容类型。
<decorator-mappers>子元素定义了映射方案,SiteMesh使用这个映射方案来查找修饰 指定页面的修饰器。你可以使用<param>子元素来配置每一个映射器。SiteMesh会把这 些配置信息包装成 java.util.Properties对象传递给映射器的init()方法。
原理
解析阶段 当控制返回给PageFilter的时候,它会检查web应用生成响应的内容类型 (content type),然后基于响应类型,生成不同的解析器来解析响应。比如,如果应用返回 text/html类型的内容,SiteMesh会生成一个 FastPageParser实例,并把web应用生成 的页面传递给它。FastPageParser会解析这个页面,提取出这个页面的header、 footer、title 等内容。 修饰阶段 解析结束后,SiteMesh开始修饰页面。这一阶段分成两部分。
原理
a. 决定如何修饰 SiteMesh 有一个概念,叫做修饰器映射,实现这个概念的接口是DecoratorMapper(有 init()和getDecorator()方法)。映射器在 sitemesh.xml里声明。在sitemesh.xml文 件里,每一个映射器都是它上一个映射器的父映射。当SiteMesh需要一个修饰器来修 饰页面的时候,会在sitemesh.xml里查找映射器,生成找到的第一个映射器的实例并 调用getDecorator()方法,在这个方法里尝试查找针对那个页面的修饰器。如果找到 了就返回;否则,调用父映射器的getDecorator()方法,反复进行这个过程,直到找 到正确的修饰器。 b. 应用修饰 找到修饰器后,SiteMesh会把请求分发给它。修饰器JSP页面会访问在前阶段里解析出 来的页面信息。使用各种SiteMesh自定义标签来提取页面信息不同的部分(比如header、 footer和title)并把它们插入到输出文件合适的位置上去。
优势与不足
优势 SiteMesh并没有限制你只能修饰JSP页面。你可以自由的选择想要修饰的对象,比如 Velocity或者Freemarker。Velocity和 Freemarker是一种可被用于生成web页面的模 板语言。 不足 a. 从Servlet 2.3版本才开始支持过滤器,所以一些早期版本的应用服务器无法支持 SiteMesh。在使用SiteMesh之前请先检查一下您想使用的应用服务器是否支持过滤器。 b.过滤器只有在使用浏览器请求一个页面的时候才能生效。所以,如果你通过浏览器 访问home.jsp,它将被修饰,但如果你使用Servlet的RequestDispatcher.include() 或者forward()来控制home.jsp,修饰器就不起作用了。但是不用担心,从Servlet 2.4版本开始,你可以配置过滤器适用的环境,包括forward和include的情况下都可以 使用了。