SiteMesh框架统一布局用法介绍

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

介绍:

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

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 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>


  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值