一、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. THREE.js代码备份——canvas - geometry - earth(球体贴纹理)

    <!DOCTYPE html> <html lang="en"> <head> <title>three.js canvas - g ...

  2. Discuz! G变量的使用方法

    1,G变量的使用方法: 例如:$_G['style'][boardlogo] 风格变量篇 $_G['style'] => Array (官方模板区 cr180整理 $_G['style'][st ...

  3. SQL查询性能优化

    使用高效的查询 使用 EXISTS 代替 IN -- 查询A表中同时存在B表的数据 -- 慢 SELECT * FROM Class_A WHERE id IN (SELECT id FROM Cla ...

  4. CAD绘制一个角度标注(com接口VB语言)

    主要用到函数说明: _DMxDrawX::DrawDimAngular 绘制一个角度标注.详细说明如下: 参数 说明 DOUBLE dAngleVertexX 角度标注的顶点的X值 DOUBLE dA ...

  5. Git学习总结(标签管理)

    在Git中打标签非常简单,首先,切换到需要打标签的分支上: 然后,敲命令git tag <name>就可以打一个新标签: $ git tag v1. 可以用命令git tag查看所有标签: ...

  6. 使用jquery将表单自动封装成json对象 /json对象元素的添加删除和转换

    $.fn.serializeObject = function () { var o = {}; var a = this.serializeArray(); $.each(a, function ( ...

  7. 模拟Spring容器的getBean方法(Maven工程)

    Spring容器的getBean方法是通过反射机制实现的,下面的测试程序模拟getBean的实现原理. 步骤一:pom.xml文件配置解析XML文件的dom4j.jar 步骤二:XML文件中配置bea ...

  8. Python OS & sys模块

    os模块(* * * *) os模块是与操作系统交互的一个接口 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname" ...

  9. 6.3.1 使用 pickle 模块读写二进制文件

    Python 标准库 pickle 提供的 dump() 方法 用于将数据进行序列化并写入文件(dump() 方法的protocol 参数为True 时可以实现压缩的效果),而load() 用于读取二 ...

  10. scrapy——4 —反爬措施—logging—重要参数—POST请求发送实战

    scrapy——4 常用的反爬虫策略有哪些 怎样使用logging设置 Resquest/Response重要参数有哪些 Scrapy怎么发送POST请求 动态的设置User-Agent(随即切换Us ...