1 简介php
SiteMesh是由一个基于Web页面布局、装饰以及与现存Web应用整合的框架。它能帮助咱们在由大量页面构成的项目中建立一致的页面布局和外观,如一致的导航条,一致的banner,一致的版权,等等。 它不单单能处理动态的内容,如jsp,php,asp等产生的内容,它也能处理静态的内容,如htm的内容,使得它的内容也符合你的页面结构的要求。甚至于它能将HTML文件象include那样将该文件做为一个面板的形式嵌入到别的文件中去。全部的这些,都是GOF的Decorator模式的最生动的实现。尽管它是由java语言来实现的,但它能与其余Web应用很好地集成。html
2 原理java
SiteMesh框架是OpenSymphony团队开发的一个很是优秀的页面装饰器框架,它经过对用户请求进行过滤,并对服务器向客户端响应也进行过滤,而后给原始页面加入必定的装饰(header,footer等),而后把结果返回给客户端。经过SiteMesh的页面装饰,能够提供更好的代码复用,全部的页面装饰效果耦合在目标页面中,无需再使用include指令来包含装饰效果,目标页与装饰页彻底分离,若是全部页面使用相同的装饰器,能够是整个Web应用具备统一的风格。web
3 demo服务器
<?xml version="1.0" encoding="utf-8"?> <decorators defaultdir="/decorators"> <!-- 此处用来定义不须要过滤的页面 --> <excludes> </excludes> <!-- 用来定义装饰器要过滤的页面 --> <decorator name="main" page="main.jsp"> <pattern>/*</pattern> </decorator> </decorators>
在[web-app]/WEB-INF/web.xml添加如下内容:app
<filter> <filter-name>sitemesh</filter-name> <filter-class> com.opensymphony.module.sitemesh.filter.PageFilter </filter-class> </filter> <filter-mapping> <filter-name>sitemesh</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
在[web-app]下建立一个decorators文件夹,在该文件下再建立一个装饰页面main.jsp,包含如下内容:框架
<%@ page language="java" contentType="text/html" pageEncoding="utf-8" %> <%@ taglib uri="http://www.opensymphony.com/sitemesh/decorator" prefix="decorator"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>AAAAAAAAA<decorator:title default="天佑魔神"/> </title> <decorator:head ></decorator:head> <body> <p>head decorator...</p> <!-- 头部 --> <decorator:body /> <p>foot decorator...</p><!-- 脚部,能够写一些copyright之类的东西 --> </body> </html>
在[web-app]下建立被装饰页面hours.jsp,包含如下内容:jsp
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html > <head> <title>Hours</title> </head> <body> <h1>Weekdays</h1> <p>5:00pm - 10:00pm</p> <p>Weekends</p> <p>5:00pm - 10:00pm</p> </body> </html>
4 总结
从以上的例子,能够看出经过SiteMesh装饰,不须要在每一个目标页面中将header和footer等共同文件include进去,被装饰(目标)页面和装饰页面彻底分离。本文只对SiteMesh作一个简单的介绍,SiteMesh能够Velocity,FreeMarker等开源模板工具结合使用,下降页面开发复杂度。工具