欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SiteMesh框架统一布局用法介绍

程序员文章站 2024-03-11 20:05:07
...

SiteMesh 是一个网页布局和修饰的框架,基于 Servlet 中的 Filter,类似于 ASP.NET 中的‘母版页’技术。

介绍:

1,SiteMesh是OpenSymphony团队开发的JEE框架之一,它是一个非常优秀的页面装饰器框架。它通过对所有的用户请求进行过滤,并对服务器向客户端响应也进行过滤,从而给原始的服务器响应加入一定的装饰,可以是header,footer等。
2,然后将经过装饰后的页面送回浏览者.对于被装饰的页面而言,它无需知道自身被谁装饰,也无从知道自身被谁装饰,SiteMesh通过配置文件来配置指定的装饰器,用于过滤某些页面,则该装饰器会装饰这些页面,从而提供更好的页面效果。
3,通过SiteMesh的页面装饰,可以提供更好的代码复用,所有的页面装饰效果耦合在目标页面中,无需使用include指令来显式包含装饰效果,目标页面与装饰页面完全分高.提供更好的解耦,而且可以应用中所有的页面都使用相同的装饰页面,整个Web应用会有更统一的风格,会提供更好的整体效果.
简单来说,Sitemesh的流程就是:通过Filter来截取request和response,然后给原始的页面加入一定的装饰,再把结果返回给客户端.
结构图
SiteMesh框架统一布局用法介绍
SiteMesh的官方网站:http://wiki.sitemesh.org/wiki/display/sitemesh/Home

使用流程:

   可以网上下载SiteMesh3.0的jar包,这里介绍使用Maven。

1,新建一个maven工程,在pom.xml中配置如下:

 <!-- 网页布局的前端框架 -->
   <dependency>
	   <groupId>org.sitemesh</groupId>
	   <artifactId>sitemesh</artifactId>
	   <version>3.0.0</version>
   </dependency>

2,在web.xml中配置SiteMesh的过滤器:
<!-- 网页布局前端框架的过滤器 -->
	<filter>
		<filter-name>sitemesh</filter-name>
		<filter-class>org.sitemesh.config.ConfigurableSiteMeshFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>sitemesh</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

3,在WEB-INF下,也就是和web.xml同级目录下新建一个sitemesh3.xml,这里来配置哪些展示页面用此框架来修饰,哪些不用此框架来修饰,也是类似前台页面的过滤器:
<?xml version="1.0" encoding="UTF-8"?>
<sitemesh>
	<!-- 指明满足“/*”的页面,将被“/pub.jsp”所装饰 -->
	<mapping path="/*" decorator="/pub.jsp" />

	<!-- 指明满足“/no_mytest*”的页面,将被排除,不被装饰 -->
	<mapping path="/no_mytest*" exclue="true" />
</sitemesh>
这是比较简单的配置,指明除根目录下的所有页面,除去/no_mytest*下的页面,都要被pub.jsp页面去修饰。

更多的配置:
a,默认情况下, sitemesh 只对 HTTP 响应头中 Content-Type 为 text/html 的类型进行拦截和装饰,那么如果我们想对其他的页面也进行修饰,我们应该添加更多的响应头:
<mime-type>text/html</mime-type>
<mime-type>application/vnd.wap.xhtml+xml</mime-type>
<mime-type>application/xhtml+xml</mime-type>
b,如果我们不想网站仅仅只使用一套的装饰器,不同的模块想要用不同的装饰器,那么我们可以将不同的路径使用不同的装饰器:
<mapping path="/admin/*" decorator="/another-decorator.html" />
<mapping path="/*.special.jsp" decorator="/special-decorator.html" />
c,对同一路径下的不同页面也可以使用不同的装饰器:
<mapping>
	<path>/articles/*</path>
	<decorator>/decorators/article.html</decorator>
	<decorator>/decorators/two-page-layout.html</decorator>
	<decorator>/decorators/common.html</decorator>
</mapping>

4,定义一个母版页,也就是用该页面做统一布局页面:
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title><sitemesh:write property='title' /></title>
<sitemesh:write property='head' />
</head>
<body>
<center>
	<sitemesh:write property='title' />
	<br />
	<sitemesh:write property='body' />
</center>
	<div style="float:left">
		<ul>
			<li><a href="index.jsp">菜单管理</a></li>
			<li><a href="list.jsp">用户管理</a></li>
			<li><a href="no_mytest/list.jsp">角色管理</a></li>
		</ul>
	</div>
</body>
</html>


<sitemesh:title/>: 会自动替换为被过滤页面的title。
<sitemesh:head/>: 会把被过滤页面head里面的东西(除了title)放在这个地方。
<sitemesh:body/> :被过滤的页面body里面的内容放在这里。

头部引入js和css以及div中的内容,都可以在其他重用,在被过滤页面都是可见的,而且还有一个好处,只需要定义好pub页面的样式即可。

适用场景:

使用SiteMesh框架可以较快捷的开发页面要求统一简洁的网站,例如管理系统,网站后台等非灵活网站,前端页面管理可以类似浏览器的tag,如图:
SiteMesh框架统一布局用法介绍


扩展:

如何使用的自定义标签?

Sitemesh 3 默认只提供了 body,title,head 等HTML常用的标签 类型,我们在实际开发中,HTML页面往往需要用到很多自定义的标签,那么 我们可以通过实现 TagRuleBundle 类来扩展自定义的标签。

自定义标签使用流程:
1,实现 TagRuleBundle类:
public class MyTagRuleBundle implements TagRuleBundle {
    @Override
    public void install(State defaultState, ContentProperty contentProperty,
            SiteMeshContext siteMeshContext) {
        defaultState.addRule("myHeader", new ExportTagToContentRule(contentProperty.getChild("myHeader"), false));
        
    }
    
    @Override
    public void cleanUp(State defaultState, ContentProperty contentProperty,
            SiteMeshContext siteMeshContext) {
    }
}


2,在sitemesh3.xml 配置文件中进行配置:
<content-processor>
	<tag-rule-bundle class="com.test.MyTagRuleBundle" />
</content-processor>