SiteMesh是一个Java WEB项目的网页布局和修饰框架。使用SiteMesh后就不再需要在每个页面中都用<jsp:include>标签引入页头、页尾、导航等其他公用页面了。
- 可以将网页的内容和页面结构分离,达到页面结构共享的目的。
- 页面装饰效果耦合在目标页面中,无需使用include指令显示包含装饰效果,目标页面和装饰页面完全分离。
- 整个web应用可以使用相同的装饰页面,风格统一,整体效果更好。
- SiteMesh通过Filter拦截请求和响应,给原始页面加入装饰,再把装饰后的结果返回给客户端。
- 根据页面URL查找合适的装饰模板页
- 提取被访问页的内容,放置到装饰模板中的适当位置。
用法
1.加入siteMesh Jar包
2.在web.xml中配置siteMesh Filter
WEB-INF/web.xml文件
<web-app ......>
......
<filter>
<filter-name>sitemeshFilter</filter-name>
<filter-class>com.opensymphony.sitemesh.webapp.SiteMeshFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>sitemeshFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
3.创建装饰器配置文件
指定装饰模板与URL的对应关系,也可以配置那些URL不需要模板控制。
WEB-INF/decorators.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!-- Any urls that are excluded will never be decorated by Sitemesh -->
<excludes>
<pattern>/Login*</pattern>
<patterm>/index.jsp*<pattern>
</excludes>
<decorators defaultdir="/WEB-INF/views"> <!--defaultdir属性为模板文件的存放路径-->
<!-- 默认装饰模板配置, 在需要装饰的页面增加<meta name="decorator" content="default"/> -->
<decorator name="main" page="layouts/main.jsp" >
<pattern>/api/certs/*</pattern>
<pattern>/api/provs/*</pattern>
<pattern>/api/macs/*</pattern>
</decorator>
<decorator name="panel" page="layouts/panle.jsp">
</decorator>
<!-- 下面可以写多个 -->
</decorators>
decorator标签属性
- page 装饰模板文件
- name 装饰模板别名
- role 角色
- webapp 单独指定装饰文件存放目录
使用SiteMesh最主要的工作就是创建装饰模板,然后在decorators.xml配置装饰模板应用于哪些页面URL。一般项目可以抽象出主模板,二级页面模板,三级页面模板,弹出窗口模板等,但数量往往不会超过8个。
4.创建装饰模板
WEB-INF/views/layouts/main.jsp
<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@taglib prefix="decorator" uri="http://www.opensymphony.com/sitemesh/decorator" %>
<html>
<head>
<title> <decorator:title default="default title"/> </title>
<decorator:head/>
</head>
<body <decorator:getProperty property=“body.onload" writeEntireProperty=“1"/> >
<jsp:include page="/header.jsp"></jsp:include>
......
<decorator:body/>
......
从meta中获取变量company的名称:
<decorator:getProperty property=“meta.company”/>
......
<decorator:usePage id=“myPage" />
<%=myPage.getRequest().getAttribute(“username”)%>
......
<jsp:include page="/footer.jsp"></jsp:include>
</body>
</html>
Sitemesh标签
<decorator:head />
填充被装饰页面的head标签内容
<decorator:body />
填充被装饰页面的body标签内容
<decorator:title default="default title" />
填充被装饰页面的title标签内容,
<decorator:getProperty property="" default="" writeEntireProperty="{true|false|1|0}"/>
读取被装饰页面中的相关标签的属性值,writeEntrieProperty表示只显示"value",还是显示"prop=value"
<decorator:usePage id="" />
<%=myPage.getRequest().getAttribute(“username”)%>
将被装饰页面构造为一个对象,可以在装饰页面的JSP中直接引用。
5.被装饰页面
<html lang=“en”>
<head>
<title>我的sitemesh</title>
<meta name="decorator" content="default"/>
<meta name=“company” content=“smartdot”/>
<meta name=“Author” content=“zhangsan”/>
<script>
function count(){return 10;}
</script>
</head>
<body onload=“count()”>
<p>这是一个被修饰页面</p>
</body>
</html>
主动应用装饰器
在装饰模板中和被包装页面中都可以主动应用装饰器。使用的标签为applyDecorator或apply-decorator,可以内嵌param标签提供参数,装饰模板中用getProperty标签可以读取param提供的参数值。
<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib uri="http://www.opensymphony.com/sitemesh/page" prefix="page"%>
......
<body>
<page:applyDecorator page="/common/top.jsp" name="panel">
<page:param name="paramName">
......
</page:param>
</page:applyDecorator>
......
</body>
panel装饰模板中配置:
<div class="....">
<decorator:body/> top.jsp的body
<decorator:getProperty property="paramName"/>
</div>
applyDecorator属性
- name 要使用的装饰模板名,decorators.xml中配置的
- page 要装饰的页面
原理
http://my.oschina.net/georgele/blog/49137?p=1
http://my.oschina.net/s2jh/blog/361044
SiteMesh使用拦截器拦截所有请求。
参考文档
http://m.blog.csdn.net/blog/kpchen_0508/41281749
http://blog.csdn.net/jzh440/article/details/7770013