SiteMesh是一个Java WEB项目的网页布局和修饰框架。使用SiteMesh后就不再需要在每个页面中都用<jsp:include>标签引入页头、页尾、导航等其他公用页面了。

  • 可以将网页的内容和页面结构分离,达到页面结构共享的目的。
  • 页面装饰效果耦合在目标页面中,无需使用include指令显示包含装饰效果,目标页面和装饰页面完全分离
  • 整个web应用可以使用相同的装饰页面,风格统一,整体效果更好。
  • SiteMesh通过Filter拦截请求和响应,给原始页面加入装饰,再把装饰后的结果返回给客户端。
  • 根据页面URL查找合适的装饰模板页
  • 提取被访问页的内容,放置到装饰模板中的适当位置。

用法

1.加入siteMesh Jar包

2.在web.xml中配置siteMesh Filter

WEB-INF/web.xml文件

  1. <web-app ......>
  2. ......
  3. <filter>
  4. <filter-name>sitemeshFilter</filter-name>
  5. <filter-class>com.opensymphony.sitemesh.webapp.SiteMeshFilter</filter-class>
  6. </filter>
  7. <filter-mapping>
  8. <filter-name>sitemeshFilter</filter-name>
  9. <url-pattern>/*</url-pattern>
  10. </filter-mapping>
  11. </web-app>

3.创建装饰器配置文件

指定装饰模板与URL的对应关系,也可以配置那些URL不需要模板控制。

WEB-INF/decorators.xml文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- Any urls that are excluded will never be decorated by Sitemesh -->
  3. <excludes>
  4.   <pattern>/Login*</pattern>
  5.   <patterm>/index.jsp*<pattern>
  6. </excludes>
  7. <decorators defaultdir="/WEB-INF/views"> <!--defaultdir属性为模板文件的存放路径-->
  8. <!-- 默认装饰模板配置, 在需要装饰的页面增加<meta name="decorator" content="default"/> -->
  9. <decorator name="main" page="layouts/main.jsp" >
  10. <pattern>/api/certs/*</pattern>
  11. <pattern>/api/provs/*</pattern>
  12. <pattern>/api/macs/*</pattern>
  13. </decorator>
  14.   <decorator name="panel" page="layouts/panle.jsp">
  15.   </decorator>
  16. <!-- 下面可以写多个 -->
  17. </decorators>

decorator标签属性

  • page  装饰模板文件
  • name  装饰模板别名
  • role  角色
  • webapp  单独指定装饰文件存放目录

使用SiteMesh最主要的工作就是创建装饰模板,然后在decorators.xml配置装饰模板应用于哪些页面URL。一般项目可以抽象出主模板,二级页面模板,三级页面模板,弹出窗口模板等,但数量往往不会超过8个。

4.创建装饰模板

WEB-INF/views/layouts/main.jsp

  1. <%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
  2. <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
  3. <%@taglib prefix="decorator" uri="http://www.opensymphony.com/sitemesh/decorator" %>
  4. <html>
  5.   <head>
  6.     <title> <decorator:title default="default title"/> </title> 
  7.     <decorator:head/>
  8.   </head>
  9.   <body <decorator:getProperty property=“body.onload" writeEntireProperty=“1"/> >
  10.     <jsp:include page="/header.jsp"></jsp:include>
  11.     ......
  12.     <decorator:body/>
  13.     ......
  14.     从meta中获取变量company的名称:
  15.     <decorator:getProperty property=“meta.company”/>
  16.     ......
  17.     <decorator:usePage id=“myPage" />
  18.     <%=myPage.getRequest().getAttribute(“username”)%>
  19.     ......
  20.     <jsp:include page="/footer.jsp"></jsp:include>
  21.   </body>
  22. </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.被装饰页面

  1. <html lang=“en”>
  2.   <head>
  3.     <title>我的sitemesh</title>
  4.     <meta name="decorator" content="default"/>
  5.     <meta name=“company” content=“smartdot”/>
  6.     <meta name=“Author” content=“zhangsan”/>
  7.     <script>
  8.       function count(){return 10;}
  9.     </script>
  10.   </head>
  11.   <body onload=“count()”>
  12.     <p>这是一个被修饰页面</p>
  13.   </body>
  14. </html>

主动应用装饰器

在装饰模板中和被包装页面中都可以主动应用装饰器。使用的标签为applyDecorator或apply-decorator,可以内嵌param标签提供参数,装饰模板中用getProperty标签可以读取param提供的参数值。

  1. <%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
  2. <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
  3. <%@ taglib uri="http://www.opensymphony.com/sitemesh/page" prefix="page"%>
  4. ......
  5. <body>
  6.   <page:applyDecorator page="/common/top.jsp" name="panel">
  7.     <page:param name="paramName">
  8.       ......
  9.     </page:param>
  10.   </page:applyDecorator>
  11. ......
  12. </body>

panel装饰模板中配置:

  1. <div class="....">
  2.   <decorator:body/> top.jsp的body
  3.   <decorator:getProperty property="paramName"/>
  4. </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

SiteMesh装饰器使用总结的更多相关文章

  1. 关于Springmvc中include与Sitemesh装饰器的基本使用

    关于Springmvc中include与Sitemesh装饰器的使用 !!!转载请注明出处=>http://www.cnblogs.com/funnyzpc/p/7283443.html 静态包 ...

  2. 使用 sitemesh/decorator装饰器装饰jsp页面(原理及详细配置)

    摘要:首先这个Decorator解释一下这个单词:“装饰器”,我觉得其实可以这样理解,他就像我们用到的Frame,他把每个页面共有的东西提炼了出来,也可能我们也会用各种各样的include标签,将我们 ...

  3. sitemesh 2.4 装饰器学习

    SiteMesh 是一个网页布局和修饰的框架,利用它可以将网页的内容和页面结构分离,以达到页面结构共享的目的 SiteMesh是OpenSymphony团队开发的JEE框架之一,它是一个非常优秀的页面 ...

  4. freemarker 集成 sitemesh 装饰html页面 shiro 标签

      guest标签:验证当前用户是否为"访客",即未认证(包含未记住)的用户: shiro标签:<shiro:guest></shiro:guest>  : ...

  5. [转]decorator(HTML装饰器)

    原文地址:https://blog.csdn.net/jzh440/article/details/7770013 1>:每当遇到一个新的技术,首先我会问自己,这个技术是做神马的?用这个技术有神 ...

  6. Python高手之路【四】python函数装饰器

    def outer(func): def inner(): print('hello') print('hello') print('hello') r = func() print('end') p ...

  7. python装饰器

    今天看了装饰器的一些内容,感觉@修饰符还是挺抽象的. 装饰器就是在不用改变函数实现的情况下,附加的实现一些功能,比如打印日志信息等.需要主意的是装饰器本质是一个高阶函数,她可以返回一个函数. 装饰器需 ...

  8. Python(四)装饰器、迭代器&生成器、re正则表达式、字符串格式化

    本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解 ...

  9. [原创]django+ldap实现单点登录(装饰器和缓存)

    前言 参考本系列之前的文章,我们已经搭建了ldap并且可以通过django来操作ldap了,剩下的就是下游系统的接入了,现在的应用场景,我是分了2个层次,第一层次是统一认证,保证各个系统通过ldap来 ...

随机推荐

  1. 核电站问题(codevs 2618)

    题目描述 Description 一个核电站有N个放核物质的坑,坑排列在一条直线上.如果连续M个坑中放入核物质,则会发生爆炸,于是,在某些坑中可能不放核物质. 任务:对于给定的N和M,求不发生爆炸的放 ...

  2. C语言实现大数据除法

    本题要求计算A/B,其中A是不超过1000位的正整数,B是1位正整数.你需要输出商数Q和余数R,使得A = B * Q + R成立. 输入格式: 输入在1行中依次给出A和B,中间以1空格分隔. 输出格 ...

  3. ubuntu下安装jdk

    参考:http://blog.csdn.net/gobitan/article/details/24322561 Ubuntu Linux下安装Oracle JDK Dennis Hu 2014-4- ...

  4. Asp.net MVC 利用自定义RouteHandler来防止图片盗链

    你曾经注意过在你服务器请求日志中多了很多对图片资源的请求吗?这可能是有人在他们的网站中盗链了你的图片所致,这会占用你的服务器带宽.下面这种方法可以告诉你如何在ASP.NET MVC中实现一个自定义Ro ...

  5. WebRTC源码分析四:视频模块结构

    转自:http://blog.csdn.net/neustar1/article/details/19492113 本文在上篇的基础上介绍WebRTC视频部分的模块结构,以进一步了解其实现框架,只有了 ...

  6. uva 10972(边双连通分量)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=33804. 思路:和poj的一道题有点像,不过这道题图可能不连通,因 ...

  7. 建模算法(六)——神经网络模型

    (一)神经网络简介 主要是利用计算机的计算能力,对大量的样本进行拟合,最终得到一个我们想要的结果,结果通过0-1编码,这样就OK啦 (二)人工神经网络模型 一.基本单元的三个基本要素 1.一组连接(输 ...

  8. Hark的数据结构与算法练习之桶排序

    算法说明 桶排序的逻辑其实特别好理解,它是一种纯粹的分而治之的排序方法. 举个例子简单说一下大家就知道精髓了. 假如对11,4,2,13,22,24,20 进行排序. 那么,我们将4和2放在一起,将1 ...

  9. javascript优化--03高质量编码

    使用Object的直接量实例构造轻量级的字典: 使用for/in循环,使用对象字面量来构建,并确保不增加Object.prototype属性来导致for/in循环:(考虑到兼容性,如Array.pro ...

  10. POJ3694 Network(边双连通分量+缩点+LCA)

    题目大概是给一张图,动态加边动态求割边数. 本想着求出边双连通分量后缩点,然后构成的树用树链剖分+线段树去维护路径上的边数和..好像好难写.. 看了别人的解法,这题有更简单的算法: 在任意两点添边,那 ...