您的位置:首页 > 其它

SiteMesh框架统一布局用法介绍

2017-07-11 11:58 357 查看
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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息