SiteMesh是一个轻量级的web应用框架,实现了Decorator模式。它的目标是将多个页面都将引用的jsp页面通过配置加载到相应的jsp文件中。

在我们的项目中,每个jsp都需要添加两个top和bottom的jsp来完成某些功能。最笨的方法当然就是在每个页面上hard code这些功能的相关代码,但是这样的做法实在是不满足DRY的原则。clean code需要我们最大程度的复用我们的代码,减少代码冗余。

SiteMesh提供了这样的解决方案:使用decorator模式来动态的给每个jsp页面添加额外的职责。使用了Decorator模式后每个页面就可以专注于解决本页面要解决的问题,而不需要关心那些全局上需要每个页面完成的功能模块了。

SiteMesh的工作原理十分简单:使用一个filter对每个发送到服务器的请求进行过滤;对照配置文件确认该请求的目标jsp是否满足decorator的条件(是否需要被decorate);对需要decorate的页面,使用配置文件中指定的装饰规则把指定的文件(如header,footer等)与目标页面组合起来,把结果返回给客户端。

详细的做法是:

1.引入SiteMesh的引用

<dependency>

     <groupId>opensymphony</groupId>

     <artifactId>sitemesh</artifactId>

     <version>2.4.2</version>

</dependency>

2.在web.xml文件中配置filter

<filter>

    <filter-name>sitemesh</filer-name>

    <filter-class>com.opensymphony.sitemesh.webspp.SiteMeshFilter</filter-class>

</filter>

<filter-mapping>

    <filter-name>sitemesh</filter-name>

    <url-pattern>*.jsp</url-pattern>

    <dispatcher>FORWARD</dispatcher>

</filter-mapping>

这样的配置代表我希望对所有的jsp都进行decorate

3.编写decorators.xml

<decorators defaultdir="/path/to/decorators/file">

    <excludes>

         <pattern>/exclude/specific/kind/of/files/in/this/folder</pattern>

    </excludes>

    <decorator name="myDecorator" page="FileNameOfTheDecorateRule">

         <pattern>*.jsp</pattern>

    </decorator>

</decorators>

excludes节点定义了哪些在decorator目录下,但是我又不想其被装饰的文件。

4.编写定义decorate rules的jsp模板

这里的decorate rules就是在decorators.xml文件中定义的“myDecorator”,其中详细定义了对目标文件的装饰规则。包括:用什么文件对目标文件进行装饰,在目标文件的哪个位置进行装饰等等。它一般是一个jsp文件,或者说是一个模板。在这个模板中写入需要decorate的详细内容,格式规范与普通jsp相同,但是有两个重要的标签:

<decorator:head/>

<decorator:body/>

当对目标页面进行装饰的时候,遇到<decorator:head/>就插入目标文件的<head>部分,遇到<decorator:body/>就插入目标文件的<body>部分。

这样,根据目标文件的不同,就动态的生成了具有相同附加职责的不同的页面。

SiteMesh学习笔记的更多相关文章

  1. sitemesh学习笔记(2)

    之前我也是通过网上一些资料来学习sitemesh的,后来发现那些资料都比较老了,现在最近的已经是sitemesh3了而我之前看的是sitemesh2.3,今天重新去看了一些sitemesh3的资料,发 ...

  2. sitemesh学习笔记(1)

    最近在学习web开发的时候,发现很多的页面都存在同样的导航栏,登陆栏,js,jQuery等等相同的元素.这样就感觉开发变得好臃肿啊,并且,有时候改一个元素,就要把所有包含这个元素的页面全部重新码一遍, ...

  3. sitemesh学习笔记(3)

    前两篇博客浅谈了一下sitemesh3.0和2.4的区别和简单用法,今天我做了一个结合sturts2的sitemesh构架,由于strusts2只能用sitemesh2.x的版本,与3.0目前还不能兼 ...

  4. Struts2 学习笔记(概述)

    Struts2 学习笔记 2015年3月7日11:02:55 MVC思想 Strust2的MVC对应关系如下: 在MVC三个模块当中,struts2对应关系如下: Model: 负责封装应用的状态,并 ...

  5. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  6. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  7. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  8. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

  9. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

随机推荐

  1. HDU 5679 Substring 后缀数组判重

    题意:求母串中有多少不同的包含x字符的子串 分析:(首先奉上FZU官方题解) 上面那个题就是SPOJ694 ,其实这两个题一样,原理每次从小到大扫后缀sa数组,加上新的当前后缀的若干前缀,再减去重复的 ...

  2. 《Python核心编程》 第八章 条件和循环

    8–1.条件语句. 请看下边的代码 # statement A if x > 0: # statement B pass elif x < 0: # statement C pass el ...

  3. KindEditor Asp.net

    最近在使用KindEditor,其中遇到三个问题: 1.textarea添加 runat="server" 后整个editor在运行的时候不能显示出来,我没找到原因,于是我就把ru ...

  4. C# 空值判断

    (1)NULL null 关键字是表示不引用任何对象的空引用的文字值.null 是引用类型变量的默认值.那么也只有引用型的变量可以为NULL,如果 int i=null,的话,是不可以的,因为Int是 ...

  5. bzoj 3997 [TJOI2015]组合数学(DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3997 [题意] 给定一个nm的长方形,每次只能使经过格子权值减1,每次只能向右向下,问 ...

  6. 《Genesis-3D开源游戏引擎完整实例教程-2D射击游戏篇03:子弹发射》

    3.子弹发射 子弹发射概述: 在打飞机游戏中,子弹是自动发射的.子弹与子弹之间间隔一定的时间,玩家通过上下左右控制游戏角色,来达到躲避敌人及击中敌人的操作. 发射原理: 抽象理解为有两个容器存放子弹, ...

  7. Hadoop上路-03_Hadoop JavaAPI

    一.Eclipse安装 1.下载解压 下载:http://www.eclipse.org/downloads/ 解压:SHELL$ sudo tar -zxvf eclipse.tar.gz 2.快捷 ...

  8. HDU4869:Turn the pokers(快速幂求逆元+组合数)

    题意: 给出n次翻转和m张牌,牌相同且一开始背面向上,输入n个数xi,表示xi张牌翻转,问最后得到的牌的情况的总数. 思路: 首先我们可以假设一开始牌背面状态为0,正面则为1,最后即是求ΣC(m,k) ...

  9. 详解 jupyter notebook 集成 spark 环境安装

    来自: 代码大湿 代码大湿 1 相关介绍 jupyter notebook是一个Web应用程序,允许你创建和分享,包含活的代码,方程的文件,可视化和解释性文字.用途包括:数据的清洗和转换.数值模拟.统 ...

  10. homework-04

    1.准备工作 本次结对编程我们对项目本身就行了分工,既然是测试来驱动开发,那么我们就把本次工作分成了测试与生成两个部分,小明同学负责生成测试数据,而我写测试程序检测测试结果是否正确,相对来说还是小明同 ...