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. replace() MySQL批量替换指定字段字符串

    mysql replace实例说明: UPDATE tb1 SET f1=REPLACE(f1, 'abc', 'def'); REPLACE(str,from_str,to_str) 在字符串 st ...

  2. 用VBS脚本发邮件

    需求是这样的:针对账号的管理,如果发现该账号的管理员给账号加了批注,(比如要过期,修改密码,完善资料等),就需要找到这样的账号及其管理的邮件,然后发邮件给他们的管理员同时抄送给账号以达到提醒的目的.那 ...

  3. PHP 系统命令函数

    function execute($cmd) { $res = ''; if ($cmd) { if(function_exists('system')) { @ob_start(); @system ...

  4. 马上着手开发Mac应用程序

    你是否想要开发 Mac 应用程序却又不知道从哪里入手?本路线图提供了 Mac 应用程序开发的绝佳起点,即使你已经是一个 iOS 开发专家,本路线图对你依然适用.Apple让开发应用程序和提交应用程序到 ...

  5. C++实现网格水印之调试笔记(六)——补充

    调用matlab生成的网格水印特征向量矩阵 从文件中读取的原始网格的特征向量矩阵 好吧,之前得出的结果不正确是因为代码写错了.因为实现论文中的提取方案时代码写错了,自己想了另外一个方法,结果方向两者在 ...

  6. codevs1796-最小完全图

    表示第一篇就是水题. 根据Prim的思想,我们可以证明:dis ( a , b ) > max { a b 最小生成树路径上的边权 } 把所有边sort一遍用并查集维护就可以了 #include ...

  7. HDU 5607 graph(DP+矩阵乘法)

    [题目链接] http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=663&pid=1002 [题意] 给定一个有向 ...

  8. Hbase Basic Prerequisites

    Table 2. Java HBase Version   JDK 6      JDK 7       JDK 8 1.0 Not     Supported yes Running with JD ...

  9. AHOI2013 Round2 Day1 简要题解

    第一题,好吧这是个dp.(搜素也能在BZOJ上卡过). 第二题,BFS搜索碰到的立方体面数,智硬没有想到... 第三题,其实一看就有思路,但关键是求x坐标不交的矩形对数+y坐标不交的矩形对数 - x, ...

  10. Windows下GNU之gcc体验方法

    Windows 现在在Windows下开发C/C++程序一般都是用微软的编译器,当年的Borland已经成为传说.但是如果你不想付钱的话,也可以考虑Windows下的GCC. 在Windows下体验G ...