OS(OpenSymphony)的SiteMesh是一个用来在JSP中实现页面布局和装饰(layout and decoration)
的框架组件,能够帮助网站开发人员较容易实现页面中动态内容和静态装饰外观的分离。
Sitemesh是由一个基于Web页面布局、装饰以及与现存Web应用整合的框架。它能帮助我们在由大
量页面构成的项目中创建一致的页面布局和外观,如一致的导航条,一致的banner,一致的版权,等等。
它不仅仅能处理动态的内容,如jsp,php,asp等产生的内容,它也能处理静态的内容,如htm的内容,
使得它的内容也符合你的页面结构的要求。甚至于它能将HTML文件象include那样将该文件作为一个面板
的形式嵌入到别的文件中去。所有的这些,都是GOF的Decorator模式的最生动的实现。尽管它是由java语言来实现的,但它能与其他Web应用很好地集成。
官方:http://www.opensymphony.com/sitemesh/
下载地址:http://www.opensymphony.com/sitemesh/download.action 目前的最新版本是Version 2.3;
本文介绍sitemesh的简单应用:
首先下载 sitemesh.jar, 拷贝到你的WEB-INF/lib文件夹下,然后将一下代码添加到你的web.xml下
<!-- sitemesh配置 -->
<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>
(注意过滤器的位置:应该在struts2的org.apache.struts2.dispatcher.FilterDispatcher过滤器之前
org.apache.struts2.dispatcher.ActionContextCleanUp过滤器之后,否则会有问题;)
在WEB-INF下建立decorators.xml文件,添加如下代码:
<?xml version="1.0" encoding="utf-8"?>
<decorators defaultdir="/WEB-INF/decorators">
<!-- 此处用来定义不需要过滤的页面 -->
<excludes>
<pattern>/login/*</pattern>
</excludes>
<!-- 用来定义装饰器要过滤的页面 -->
<decorator name="main" page="main.jsp">
<pattern>/*</pattern>
</decorator>
</decorators>
decorators.xml有两个主要的结点:
decorator结点指定了模板的位置和文件名,通过pattern来指定哪些路径引用哪个模板
excludes结点则指定了哪些路径的请求不使用任何模板
上面代码,凡是以/login/开头的请求路径一律不使用模板;
decorators结点的defaultdir属性指定了模板文件存放的目录;
在WEB-INF下建立decorators文件夹,在下面建立main.jsp,代码如下:
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@ taglib uri="http://www.opensymphony.com/sitemesh/decorator" prefix="decorator"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 01 Transitional//EN" "http://www.worg/TR/html4/loose.dtd">
<html>
<!-- 第一个装饰页面 -->
<head>
<!-- 从被装饰页面获取title标签内容,并设置默认值-->
<title><decorator:title default="默认title"/></title>
<!-- 从被装饰页面获取head标签内容 -->
<decorator:head/>
</head>
<body>
<h2>SiteMesh装饰header</h2>
<hr />
<!-- 从被装饰页面获取body标签内容 -->
<decorator:body />
<hr />
<h2>SiteMesh装饰footer</h2>
</body>
</html>
这就是个简单的模板,页面的头和脚都由模板里的静态HTML决定了,主页面区域用的是<decorator:body />标签;
也就是说凡是能进入过滤器的请求生成的页面都会默认加上模板上的头和脚,然后页面自身的内容将自动放到<decorator:body />标签所在位置;
<decorator:title default="默认title" />:读取被装饰页面的标题,并给出了默认标题。
<decorator:head />:读取被装饰页面的<head>中的内容;
<decorator:body />:读取被装饰页面的<body>中的内容;
好了,下载可以建立页面了,看看你的页面是不是被sitemesh改变了呢?(建立index.jsp)浏览
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 01 Transitional//EN" "http://wwwworg/TR/html4/loosedtd">
<html>
<!-- 第一个被装饰(目标)页面 -->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>被装饰(目标)页面title</title>
</head>
<body>
<h4>被装饰(目标)页面body标签内内容。</h4>
<h3>使用SiteMesh的好处?</h3>
<ul>
<li>
<li>很多很多</li>
</ul>
</body>
</html>