SiteMesh 是一个网页布局和修饰的框架,利用它可以将网页的内容和页面结构分离,以达到页面结构共享的目的
SiteMesh是OpenSymphony团队开发的JEE框架之一,它是一个非常优秀的页面装饰器框架,它通过对所有的用户请求进行过滤,并对服务器向客户端响应也进行过滤,从而给原始的服务器响应加入一定的装饰,可以是header,footer等,然后将经过装饰后的页面送回浏览者.对于被装饰的页面而言,它无需知道自身被谁装饰,也无从知道自身被谁装饰,SiteMesh通过配置文件来配置指定的装饰器,用于过滤某些页面,则该装饰器会装饰这些页面,从而提供更好的页面效果,通过SiteMesh的页面装饰,可以提供更好的代码复用,所有的页面装饰效果耦合在目标页面中,无需使用include指令来显式包含装饰效果,目标页面与装饰页面完全分高.提供更好的解耦,而且可以应用中所有的页面都使用相同的装饰页面,整个Web应用会有更统一的风格,会提供更好的整体效果.

SiteMesh通过Filter来截取request和response,然后给原始的页面加入一定的装饰,再把结果返回给客户端.

这里值得一提的是,SiteMesh只会把最终生成的html填充到装饰的页面,至于关于之前拦截到需要被装饰的jsp里面引入了一些c标签什么的都不会自动引入到装饰页面的,因为sitemesh只会把最终生成的html加入到装饰页面!!所以这里就造成了几个问题

1.装饰的页面如果要用到通用的非静态资源(jstl标签,page),由于服务器是直接跳转到被装饰页面,然后处理jstl等成为普通html才把被装饰页面加入到装饰页面,所以在被装饰页面引入的一些非静态资源是不会加入到装饰页面的,装饰页面还要在引一片通用的 tag,也就是jstl标签。结果就是被装饰页面和装饰页面引tag(也就是非静态资源)都要引两遍

使用sitemesh的步骤

1. 添加jar文件到classpath

maven地址

  1. <dependency>
  2. <groupId>opensymphony</groupId>
  3. <artifactId>sitemesh</artifactId>
  4. <version>2.4.2</version>
  5. </dependency>


2. 在web.xml中增加过滤器

  1. <!-- Sitemesh -->
  2. <filter>
  3. <filter-name>sitemesh</filter-name>
  4. <filter-class>com.opensymphony.module.sitemesh.filter.PageFilter</filter-class>
  5. </filter>
  6. <filter-mapping>
  7. <filter-name>sitemesh</filter-name>
  8. <url-pattern>/*</url-pattern>
  9. </filter-mapping>

3. 在/WEB-INF中创建decorators.xml文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <decorators defaultdir="/layouts/">
  3. <!-- 不需要过滤的请求 -->
  4. <excludes>
  5. <pattern>/static/*</pattern>
  6. <pattern>/remote/*</pattern>
  7. </excludes>
  8. <!-- 定义装饰器要过滤的页面 -->
  9. <decorator name="default" page="default.jsp">
  10. <pattern>/*</pattern>
  11. </decorator>
  12. </decorators>

ps:
1.在这里配置的decorator标签的page属性指向的jsp是装饰页面,下面拦截的/*是真正的普通页面,要被page指定的页面所装饰,装饰页面就是写了一堆sitemesh的标签,然后把pattern标签上url拦截到的被装饰页面的对应装饰页面标签的head和body抠过来填充到装饰页面这个意思
2.excludes标签下配置的是不需要拦截忽略的url
3.这里可以不用<pattern>进行拦截被装饰页面,也可以使用html meta进行拦截,参考sitemesh 学习之 meta 引入
在根目录下新建文件夹layouts,然后新建三个JSP,一个是默认,一个输出头,一个输出尾,默认页面引用其他两个。
默认页面default.jsp:

  1. <%@ page contentType="text/html;charset=UTF-8"%>
  2. <%@ taglib prefix="sitemesh" uri="http://www.opensymphony.com/sitemesh/decorator" %>
  3. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
  4. <html>
  5. <head>
  6. <title>SiteMesh示例-<sitemesh:title/></title>
  7. <sitemesh:head/>
  8. </head>
  9. <body>
  10. <%@ include file="/layouts/header.jsp"%>
  11. <div id="content">
  12. <sitemesh:body/>
  13. </div>
  14. <%@ include file="/layouts/footer.jsp"%>
  15. </body>
  16. </html>


简单说明:

  • 引入了SiteMesh标签。
  • <sitemesh:title/> 会自动替换为被过滤页面的title。
  • <sitemesh:head/> 会把被过滤页面head里面的东西(除了title)放在这个地方。
  • <sitemesh:body/> 被过滤的页面body里面的内容放在这里。
  • 头部引入js和css,都可以在其他重用。

这里在装饰页面引用了header.jsp,里面可以用一些通用的css,js ,footer.jsp同理,可以加入一些通用的底部样式页面

header.jsp

  1. <%@ page contentType="text/html;charset=UTF-8" %><meta http-equiv="Content-Type" content="text/html;charset=utf-8" /><meta name="author" content="http://jeesite.com/"/>
  2. <meta name="renderer" content="webkit"><meta http-equiv="X-UA-Compatible" content="IE=8,IE=9,IE=10" />
  3. <meta http-equiv="Expires" content="0"><meta http-equiv="Cache-Control" content="no-cache"><meta http-equiv="Cache-Control" content="no-store">
  4. <script src="${ctxStatic}/jquery/jquery-1.8.3.min.js" type="text/javascript"></script>
  5. <link href="${ctxStatic}/bootstrap/2.3.1/css_${not empty cookie.theme.value ? cookie.theme.value : 'cerulean'}/bootstrap.min.css" type="text/css" rel="stylesheet" />
  6. <script src="${ctxStatic}/bootstrap/2.3.1/js/bootstrap.min.js" type="text/javascript"></script>
  7. <link href="${ctxStatic}/bootstrap/2.3.1/awesome/font-awesome.min.css" type="text/css" rel="stylesheet" />
  8. <!--[if lte IE 7]><link href="${ctxStatic}/bootstrap/2.3.1/awesome/font-awesome-ie7.min.css" type="text/css" rel="stylesheet" /><![endif]-->
  9. <!--[if lte IE 6]><link href="${ctxStatic}/bootstrap/bsie/css/bootstrap-ie6.min.css" type="text/css" rel="stylesheet" />
  10. <script src="${ctxStatic}/bootstrap/bsie/js/bootstrap-ie.min.js" type="text/javascript"></script><![endif]-->
  11. <link href="${ctxStatic}/jquery-select2/3.4/select2.min.css" rel="stylesheet" />
  12. <script src="${ctxStatic}/jquery-select2/3.4/select2.min.js" type="text/javascript"></script>
  13. <link href="${ctxStatic}/jquery-validation/1.11.0/jquery.validate.min.css" type="text/css" rel="stylesheet" />
  14. <script src="${ctxStatic}/jquery-validation/1.11.0/jquery.validate.min.js" type="text/javascript"></script>
  15. <link href="${ctxStatic}/jquery-jbox/2.3/Skins/Bootstrap/jbox.min.css" rel="stylesheet" />
  16. <script src="${ctxStatic}/jquery-jbox/2.3/jquery.jBox-2.3.min.js" type="text/javascript"></script>
  17. <script src="${ctxStatic}/My97DatePicker/WdatePicker.js" type="text/javascript"></script>
  18. <script src="${ctxStatic}/common/mustache.min.js" type="text/javascript"></script>
  19. <link href="${ctxStatic}/common/jeesite.css" type="text/css" rel="stylesheet" />
  20. <script src="${ctxStatic}/common/jeesite.js" type="text/javascript"></script>
  21. <script type="text/javascript">var ctx = '${ctx}', ctxStatic='${ctxStatic}';</script>

开始验证

index.jsp

  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  2. <%
  3. String path = request.getContextPath();
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
  5. %>
  6. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  7. <html>
  8. <head>
  9. <base href="<%=basePath%>">
  10. <title>有人拦截我吗?</title>
  11. </head>
  12. <body>
  13. 有人拦截我吗?
  14. </body>
  15. </html>

同 /static/index.jsp 跟上面一样的代码

index.jsp页面的title和body内的内容都会加到装饰页面default.jsp里面配置的<sitemesh:title/> 和 <sitemesh:body/>上,内容替换这两个标签

测试 index.jsp拦截到了  
/static/index.jsp没有拦截
这是由于 static这个url在上面decorators.xml 里面的 excludes 标签内配置了忽略拦截  end


sitemesh 2.4 装饰器学习的更多相关文章

  1. Python 装饰器学习

    Python装饰器学习(九步入门)   这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 1 2 3 4 5 6 7 8 # -*- c ...

  2. (转载)Python装饰器学习

    转载出处:http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html 这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方 ...

  3. Python装饰器学习

    Python装饰器学习(九步入门)   这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 ? 1 2 3 4 5 6 7 8 # -*- ...

  4. Python装饰器学习(九步入门)

    这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 ? 1 2 3 4 5 6 7 8 # -*- coding:gbk -*- '''示 ...

  5. Python 装饰器学习心得

    最近打算重新开始记录自己的学习过程,于是就捡起被自己废弃了一年多的博客.这篇学习笔记主要是记录近来看的有关Python装饰器的东西. 0. 什么是装饰器? 本质上来说,装饰器其实就是一个特殊功能的函数 ...

  6. python装饰器学习详解-函数部分

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 最近阅读<流畅的python>看见其用函数写装饰器部分写的很好,想写一些自己的读书笔记. ...

  7. python 装饰器学习(decorator)

    最近看到有个装饰器的例子,没看懂, #!/usr/bin/python class decorator(object): def __init__(self,f): print "initi ...

  8. Python 装饰器学习以及实际使用场景实践

    前言 前几天在看Flask框架,对于非常神奇的@语法,不是非常的理解,回来补装饰器的功课.阅读很多的关于装饰器的文章,自己整理一下,适合自己的思路的方法和例子,与大家分享. app = Flask(_ ...

  9. python装饰器学习笔记

    定义:本质上就是个函数,(装饰器其他函数)就是为了给其他函数添加附加功能 原则:1.不能修改被装饰的函数的源代码 2.不能修改被装饰的函数的调用方式 #-*-coding:utf-8-*- 1 imp ...

随机推荐

  1. scikit-learn入门学习记录

    一加载示例数据集 from sklearn import datasets iris = datasets.load_iris() digits = datasets.load_digits() 数据 ...

  2. http://www.blogjava.net/crespochen/archive/2011/04/22/348819.html

    http://blog.csdn.net/supersky07/article/details/7407523 http://blog.csdn.net/cuker919/article/detail ...

  3. JNI_Android项目中调用.so动态库

    JNI_Android项目中调用.so动态库 2014年6月3日 JNI学习 參考:http://blog.sina.com.cn/s/blog_4298002e01013zk8.html 上一篇笔者 ...

  4. Flex的 Event中属性currentTarget与target的差别

    Flex的 Event中属性currentTarget与target的差别 1.差别 (1)currentTarget是事件的处理对象(event processor) (2)target是事件的调用 ...

  5. C#/Sqlite-单机Window 程序 sqlite 数据库实现

    数据库分析和选择 Excel 文件 做数据源 限制性比较强,且不适合查询,分析 等操作 Access 数据库 Access 管理数据界面和功能不强 mysql 和sql server 功能满足,但需要 ...

  6. 【笔记】git 的常用操作命令(持续更新。。。)

    项目正在如火如荼的开展,代码量的繁多不得不令我们运用 git 这个有用的工具去管理我们共同协作的代码 git 在这里不作什么介绍了,百度一大堆的教程 首推廖雪峰老师的:http://www.liaox ...

  7. iOS开发之使用UICollectionView实现美团App的分类功能【偶现大众点评App的一个小bug】

    郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 游戏官方下 ...

  8. [Functional Programming Monad] Substitute State Using Functions With A State Monad (get, evalWith)

    We take a closer look at the get construction helper and see how we can use it to lift a function th ...

  9. 算法笔记_053:最优二叉查找树(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 在了解最优二叉查找树之前,我们必须先了解何为二叉查找树? 引用自百度百科一段讲解: 二叉排序树(Binary Sort Tree)又称二叉查找树(B ...

  10. Can rename table but can not truncate table

    一个表无法truncate可是能够rename,这个乍听起来认为好奇怪,以下模拟该过程. 3个session: session1运行truncate和rename操作. session2运行lock表 ...