一、SiteMesh介绍

SiteMesh是一个网页布局和修饰的框架,利用它可以将网页的内容和页面结构分离,以达到页面结构共享的目的。[来自百度百科]

通俗的理解就是,SiteMesh把页面中变化的和不变的分离开来,用不变的去装饰各种变化的内容。从而使页面具有统一的布局,而且方便页面的管理。不变的页面称之为装饰页面,内容变化的页面称之为被装饰页面。
      装饰页面一般包括:页面标题、头部、底部、主体以及公共的css、js。
      被装饰页面只需要写它自己需要的内容就可以了。

根据页面需要,装饰页面可以有多个,被装饰页面也可以有不被装饰而保持自己风格的选择,这只需要在配置文件中配置一下就可以了。
      siteMesh3.0运行环境:servlet、  jdk

二、SiteMesh使用

SiteMesh的使用也非常简单。这里使用的是sitemesh3.0。整个项目结构如图:

1. 下载sitemesh3.0 ,将disk文件夹下的sitemesh-3.0-alpha-2.jar放到lib目录下。

2. 建立装饰页面,装饰页可以是静态文件,也可以是动态文件,这里用jsp来测试

(1)带有菜单栏的装饰页面:decorator.jsp

  1. <html xmlns="http://www.w3.org/1999/xhtml">
  2. <head>
  3. <sitemesh:write property='head'/>
  4. <style type='text/css'>
  5. .mainBody {
  6. padding: 10px;
  7. border: 1px solid #555555;
  8. }
  9. .conbgbtm {
  10. width:100%;
  11. min-height:400px;
  12. height:auto;
  13. overflow:hidden;
  14. zoom:1;
  15. }
  16. </style>
  17. </head>
  18. <body>
  19. <!--头部  -->
  20. <div align="center">
  21. <h1 >头部信息:
  22. <sitemesh:write property='title' />
  23. </h1>
  24. </div>
  25. <hr>
  26. <!--左侧菜单栏  -->
  27. <div class="conbgbtm">
  28. <div class="leftbox">
  29. <ul>
  30. <li><a href="#">菜单1</a></li>
  31. <li><a href="#">菜单2</a></li>
  32. <li><a href="#">菜单3</a></li>
  33. </ul>
  34. </div>
  35. <sitemesh:write property='body'></sitemesh:write>
  36. </div>
  37. <hr>
  38. <div align="center">
  39. <span>Copyright © 2012-2013 廊坊信息技术提高班 版权所有</span>
  40. </div>
  41. </body>
  42. </html>

(2)不带菜单栏的装饰页面:registerDecorator.jsp

  1. <html xmlns="http://www.w3.org/1999/xhtml">
  2. <head>
  3. <sitemesh:write property='head'/>
  4. <style type='text/css'>
  5. .mainBody {
  6. padding: 10px;
  7. border: 1px solid #555555;
  8. }
  9. .conbgbtm {
  10. width:100%;
  11. min-height:400px;
  12. height:auto;
  13. overflow:hidden;
  14. zoom:1;
  15. }
  16. </style>
  17. </head>
  18. <body>
  19. <!--头部  -->
  20. <div align="center">
  21. <h1 >头部信息:
  22. <sitemesh:write property='title' />
  23. </h1>
  24. </div>
  25. <hr>
  26. <!--主体内容  -->
  27. <div class="conbgbtm">
  28. <sitemesh:write property='body'></sitemesh:write>
  29. </div>
  30. <hr>
  31. <!--底部  -->
  32. <div align="center">
  33. <span>Copyright © 2012-2013 廊坊信息技术提高班 版权所有</span>
  34. </div>
  35. </body>
  36. </html>

3. 建立被装饰页

(1)index首页

  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=GB18030">
  4. <title>SiteMesh3   title</title>
  5. </head>
  6. <body>
  7. <span>sitemesh3 body</span>
  8. </body>
  9. </html>

(2)logon.jsp、register.jsp页面

  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=GB18030">
  4. <title></title>
  5. </head>
  6. <body>
  7. <div align="center">
  8. <p>用户名:<input type="text" id="userName" ></p>
  9. <p>密码:    <input type="text" id="pwd"></p>
  10. <p>验证码:<input type="text" id="validate"></p>
  11. </div>
  12. </body>
  13. </html>

4. web-inf/lib下建立Sitemesh3.xml配置文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <sitemesh>
  3. <!--register页面的装饰页面为没有菜单栏 的registerDecorator.jsp -->
  4. <mapping>
  5. <path>/register.jsp</path>
  6. <decorator>/decorator/registerDecorator.jsp</decorator>
  7. </mapping>
  8. <!--带有菜单栏的装饰页面  -->
  9. <mapping decorator="/decorator/decorator.jsp"/>
  10. <!--登录页面不被装饰。没有配置为true的页面,表示使用装饰页面,例如index.jsp -->
  11. <mapping path="/logon.jsp" exclue="true"/>
  12. </sitemesh>

5. Web.xml里加载sitemesh模板系统

  1. <!-- 加载sitemesh模板系统 -->
  2. <filter>
  3. <filter-name>sitemesh</filter-name>
  4. <filter-class>org.sitemesh.config.ConfigurableSiteMeshFilter</filter-class>
  5. </filter>
  6. <filter-mapping>
  7. <filter-name>sitemesh</filter-name>
  8. <url-pattern>/*</url-pattern>
  9. </filter-mapping>
 
     其中1-5功能块就可以直接运行,6以后的当做补充
 

6. sitemesh3.xml 配置详解

 1 <sitemesh>
2 <!--默认情况下,
3 sitemesh 只对 HTTP 响应头中 Content-Type 为 text/html 的类型进行拦截和装饰,
4 我们可以添加更多的 mime 类型-->
5 <mime-type>text/html</mime-type>
6 <mime-type>application/vnd.wap.xhtml+xml</mime-type>
7 <mime-type>application/xhtml+xml</mime-type>
8 ...
9
10 <!-- 默认装饰器,当下面的路径都不匹配时,启用该装饰器进行装饰 -->
11 <mapping decorator="/default-decorator.html"/>
12
13 <!-- 对不同的路径,启用不同的装饰器 -->
14 <mapping path="/admin/*" decorator="/another-decorator.html"/>
15 <mapping path="/*.special.jsp" decorator="/special-decorator.html"/>
16
17 <!-- 对同一路径,启用多个装饰器 -->
18 <mapping>
19 <path>/articles/*</path>
20 <decorator>/decorators/article.html</decorator>
21 <decorator>/decorators/two-page-layout.html</decorator>
22 <decorator>/decorators/common.html</decorator>
23 </mapping>
24
25 <!-- 排除,不进行装饰的路径 -->
26 <mapping path="/javadoc/*" exclue="true"/>
27 <mapping path="/brochures/*" exclue="true"/>
28
29 <!-- 自定义 tag 规则 -->
30 <content-processor>
31 <tag-rule-bundle class="com.something.CssCompressingBundle" />
32 <tag-rule-bundle class="com.something.LinkRewritingBundle"/>
33 </content-processor>
34 ...
35
36 </sitemesh>

7 . 自定义 tag 规则

Sitemesh 3 默认只提供了 body,title,head 等 tag 类型,我们可以通过实现 TagRuleBundle 扩展自定义的 tag 规则:

 1 public class MyTagRuleBundle implements TagRuleBundle {
2 @Override
3 public void install(State defaultState, ContentProperty contentProperty,
4 SiteMeshContext siteMeshContext) {
5 defaultState.addRule("myHeader", new ExportTagToContentRule(contentProperty.getChild("myHeader"), false));
6
7 }
8
9 @Override
10 public void cleanUp(State defaultState, ContentProperty contentProperty,
11 SiteMeshContext siteMeshContext) {
12 }
13 }

最后在 sitemesh3.xml 中配置即可:

1 <content-processor>
2 <tag-rule-bundle class="com.lt.common.ext.sitemesh3.MyTagRuleBundle" />
3 </content-processor>
 
转载自:http://blog.csdn.net/liusong0605/article/details/9773723
      http://www.cnblogs.com/luotaoyeah/p/3776879.html

SiteMesh3使用实例和详解的更多相关文章

  1. Android EventBus 3.0 实例使用详解

    EventBus的使用和原理在网上有很多的博客了,其中泓洋大哥和启舰写的非常非常棒,我也是跟着他们的博客学会的EventBus,因为是第一次接触并使用EventBus,所以我写的更多是如何使用,源码解 ...

  2. Java经典设计模式之十一种行为型模式(附实例和详解)

    Java经典设计模式共有21中,分为三大类:创建型模式(5种).结构型模式(7种)和行为型模式(11种). 本文主要讲行为型模式,创建型模式和结构型模式可以看博主的另外两篇文章:Java经典设计模式之 ...

  3. Java经典设计模式之七大结构型模式(附实例和详解)

    博主在大三的时候有上过设计模式这一门课,但是当时很多都基本没有听懂,重点是也没有细听,因为觉得没什么卵用,硬是要搞那么复杂干嘛.因此设计模式建议工作半年以上的猿友阅读起来才会理解的比较深刻.当然,你没 ...

  4. mybatis中的mapper接口文件以及selectByExample类的实例函数详解

    记录分为两个部分,第一部分主要关注selectByExample类的实例函数的实现:第二部分讨论Mybatis框架下基本的实例函数. (一)selectByExample类的实例函数的实现 当你启动项 ...

  5. Java设计模式之七大结构型模式(附实例和详解)

    博主在大三的时候有上过设计模式这一门课,但是当时很多都基本没有听懂,重点是也没有细听,因为觉得没什么卵用,硬是要搞那么复杂干嘛.因此设计模式建议工作半年以上的猿友阅读起来才会理解的比较深刻.当然,你没 ...

  6. Java设计模式之十一种行为型模式(附实例和详解)

    Java经典设计模式共有21中,分为三大类:创建型模式(5种).结构型模式(7种)和行为型模式(11种). 本文主要讲行为型模式,创建型模式和结构型模式可以看博主的另外两篇文章:J设计模式之五大创建型 ...

  7. js replace 与replaceall实例用法详解

    这篇文章介绍了js replace 与replaceall实例用法详解,有需要的朋友可以参考一下stringObj.replace(rgExp, replaceText) 参数 stringObj 必 ...

  8. (转)Java经典设计模式(3):十一种行为型模式(附实例和详解)

    原文出处: 小宝鸽 Java经典设计模式共有21中,分为三大类:创建型模式(5种).结构型模式(7种)和行为型模式(11种). 本文主要讲行为型模式,创建型模式和结构型模式可以看博主的另外两篇文章:J ...

  9. (转)Java经典设计模式(2):七大结构型模式(附实例和详解)

    原文出处: 小宝鸽 总体来说设计模式分为三大类:创建型模式.结构型模式和行为型模式. 博主的上一篇文章已经提到过创建型模式,此外该文章还有设计模式概况和设计模式的六大原则.设计模式的六大原则是设计模式 ...

随机推荐

  1. 一文读懂架构师都不知道的isinstance检查机制

    起步 通过内建方法 isinstance(object, classinfo) 可以判断一个对象是否是某个类的实例.但你是否想过关于鸭子协议的对象是如何进行判断的呢? 比如 list 类的父类是继 o ...

  2. 基于fpga的256m的SDRAM控制器

    2018/7/26 受教于邓堪文老师,开始真真学习控制sdram 由于自己买的sdram模块是256的,原来老师的是128,所以边学边改,不知道最后好不好使,但是我有信心 一.sdram的初始化 sd ...

  3. WING IDE 快捷键

    工欲善其事必先利其器,所以我们无论使用什么编译器,都要熟悉一些快捷键. Ctrl+N新建文件 Ctrl+O 打开文件夹 Ctrl+W 关闭当前文件 Ctrl+S 保存文件 Ctrl+shif+S 另存 ...

  4. HUD 1426 Sudoku Killer (DFS)

    链接 : Here! 思路 : 记录下所有 "?" , 出现的位置, 然后 $DFS$ 一下, 对于每个位置来说都可以填充 $9$ 种数值, 然后对于判断填充是否合法需要三个标记数 ...

  5. C++ 中 字符数组 和 指针 区别

    char str1[] = "abc"; char str2[] = "abc"; const char str3[] = "abc"; c ...

  6. THUSC2019 退役记

    Day -inf 这一个半月潜心搞文化课,把文化课的坑填上了不少,我文化课的底子真是薄啊 一年前没想过我还挺有希望进队的,最后还差点冲上 一年后说不定会发现我搞文化课也能搞得不错呢? 一切都是未知 t ...

  7. ubuntu系统中java开发环境的搭建

    Java环境可选择 Oracle 的 JDK,或是 OpenJDK,按http://wiki.apache.org/hadoop/HadoopJavaVersions中说的,新版本在 OpenJDK ...

  8. 第三节:Web爬虫之BeautifulSoup解析库

    Beautiful Soup官方说明: Beautiful Soup提供一些简单的.python式的函数用来处理导航.搜索.修改分析树等功能.它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为 ...

  9. C++数组查重

    今天课上实验课,遇到一道题目,需要查找一个数组中出现次数最多的元素和次数,并且输出.第一次用struct模拟字典,十分麻烦而且复杂度是O(n*n).其实,运用转化的思想,可以先将其排序,然后再查找即可 ...

  10. 字符串拼接原理 javac 和 javap

    一.新建一个 Test1 类 public class Test1 { public static void main(String[] args) { String a = "a" ...