1.简介
Sitemesh是由一个基于Web页面布局、装饰及与现存Web应用整合的框架。它能帮助我们在由大量页面工程的项目中创建一致的页面布局和外观,如一致的导航条、一致的banner、一致的版权等。它不仅能处理动态的内容,如JSP、PHP、ASP、CGI等产生的内容,还能处理静态的内容,比如HTML的内容,使得它的内容也符合你的页面结构的要求。甚至它能像include那样将HTML文件作为一个面板的形式嵌入到别的文件中去。所有的这些,都是GOF的Decorator模式的最生动的实现。装饰模式是在不必改变原类文件和使用集成的情况下,动态地扩展一个对象的功能。它能通过创建一个包装对象,也就是装饰来包裹的对象。尽管它是由Java语言来实现的,但是它能与其他Web应用很好的集成.
2.下载
sitemesh框架只需要导入一个jar即可使用,官网地址为:http://www.opensymphony.com/sitemesh/index.html
3.例子
3.1.首先新建web项目,导入jar包,配置web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>MyBatis</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<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>
3.2.在WEB-INF下新建sitemesh的核心配置文件decorators.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- decorators元素用来配置装饰器,defaultdir配置装饰器所在的路径-->
<decorators defaultdir="/decorator">
<!-- 配置主装饰器,装饰器的名字name的值可以自定义,page指向装饰器文件 ,pattern指明对请求的哪些路径进行装饰,这里是对所有请求进行装饰,可自定义-->
<decorator name="main" page="main.jsp">
<pattern>/*</pattern>
</decorator>
<!-- 配置面板装饰器,这里请注意该元素不能配置pattern属性,面板装饰器会在main.jsp中介绍如何使用 ,这些名字都可以自定义的-->
<decorator name="panel" page="panel.jsp">
</decorator>
<!-- excludes元素用来配置那些不需要装饰的页面 -->
<excludes>
<pattern>/dont</pattern>
</excludes>
</decorators>
3.3.创建装饰器文件,在webroot文件夹下新建decorator文件夹,在该文件夹内新建main.jsp文件,注意不要忘了导入标签库
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="decorator" uri="http://www.opensymphony.com/sitemesh/decorator" %>
<%@ taglib prefix="page" uri="http://www.opensymphony.com/sitemesh/page" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>main.jsp</title>
<style>
td{
border:1px solid blue;
}
</style>
</head>
<body>
<table>
<tr>
<!-- 获取请求资源的title,其实学过模板引擎的很好理解,就是相当于用一个变量指代请求资源中对应的值
这里就是相当于用变量<decorator:title/>,比如我现在请求的资源是index.jsp,那么他会获取index.jsp中的title的值,
然后赋值给该标签,然后回显到视图,<decorator:body/>同理
-->
<td><p><decorator:title/></p></td>
</tr>
<!-- 这里用的是面板装饰器,在主装饰器里嵌入其他装饰器都是面板装饰器,
这里的name="panel"指代的是主配置文件中 <decorator name="panel" page="panel.jsp"> 定义的name,
page="left.jsp"指代的是你需要面板装饰器装饰的文件,而不是用主装饰器来装饰。
-->
<tr>
<td><page:apply-decorator name="panel" page="left.jsp"/></td>
<td><decorator:body/></td>
</tr>
</table>
</body>
</html>
4.工作流程原理
该例子中,首先我们发布到tomcat服务器,然后访问http://localhost:8080/Sitemesh/,由于web.xml下配置了<welcome-file>index.jsp</welcome-file>,这里会访问index.jsp页面,由于配置了sitemesh过滤器,该请求会被拦截,拦截后会调用主装饰器 <decorator name="main" page="main.jsp">中的main.jsp页面来装饰index.jsp页面,也可以看成是你现在一些照片,但有些好看有些不好看,你想好看的照片好好的保存起来,于是你对满足自己需求的照片用一个很漂亮的相框来装饰。main.jsp中配置了一些占位符(变量,元素,随你怎么叫)来处理装饰器中需要填充的东西,就好比一个空的相框,需要往里面嵌入照片,装饰完后就是一个完整的漂亮的页面了。由于在主装饰器中嵌入了面板装饰器,其实原理差不多,现在我点击链接1111,该链接会跳转到one.jsp.由于One.jsp也会被拦截器拦截,所以,会和原来的页面差不多,区别就是右边的内容变成了one.jsp里面的内容。这就是类似于frameset中的点击左边框架内容,变化右边框架内容了。