SiteMesh项目简介

OS(OpenSymphony)的SiteMesh是一个用来在JSP中实现页面布局和装饰(layout and decoration)
的框架组件,能够帮助网站开发人员较容易实现页面中动态内容和静态装饰外观的分离。
  • 1
  • 2
  • 3

Sitemesh是由一个基于Web页面布局、装饰以及与现存Web应用整合的框架。它能帮助我们在由大 
量页面构成的项目中创建一致的页面布局和外观,如一致的导航条,一致的banner,一致的版权,等等。 
它不仅仅能处理动态的内容,如jsp,php,asp等产生的内容,它也能处理静态的内容,如htm的内容, 
使得它的内容也符合你的页面结构的要求。甚至于它能将HTML文件象include那样将该文件作为一个面板 
的形式嵌入到别的文件中去。所有的这些,都是GOF的Decorator模式的最生动的实现。尽管它是由java语言来实现的,但它能与其他Web应用很好地集成。

官方:http://www.opensymphony.com/sitemesh/

下载地址:http://www.opensymphony.com/sitemesh/download.action 目前的最新版本是Version 2.3;

为什么要使用SiteMesh?

我们的团队开发J2EE应用的时候,经常会碰到一个比较头疼的问题:

由于Web页面是由不同的人所开发,所以开发出来的界面通常是千奇百怪,通常让项目管理人员苦笑不得。

而实际上,任何一个项目都会要求界面的统一风格和美观,既然风格统一,那就说明UI层肯定有很多可以抽出来 
共用的静态或动态部分;如何整合这些通用的静态或动态UI呢?Apache Tiles框架站了出来很好的解决了这一问题, 
再加上他与struts的完美集成,导致大小项目都把他作为UI层的首选框架,

但是:

Tiles确实有着它很多的不足之处,下文我会介绍,本文想说的是,除了Apache Tiles框架,其实我们还有更好的解 
决方案,那就是:SiteMesh;

本文

介绍了一个基于Web页面的布局、装饰以及应用整合的框架Sitemesh,它能帮助你为你的应用创建一致的外观, 
很好的取代Apache Tiles;

SiteMesh VS Apache Tiles

用过struts的朋友应该对Apache Tiles的不会陌生,我曾经有一篇文章介绍过struts中tiles框架的组合与继承, 
现在怎么看怎么觉得复杂;

从使用角度来看,Tiles似乎是Sitemesh标签的一个翻版。其实sitemesh最强的 
一个特性是sitemesh将decorator模式用在过滤器上。任何需要被装饰的页面都不知道它要被谁装饰,所以它就 
可以用来装璜来自php、asp、CGI等产生的页面了。你可以定义若干个装饰器,根据参数动态地选择装饰器, 
产生动态的外观以满足你的需求。它也有一套功能强大的属性体系,它能帮助你构建功能强大而灵活的装饰器。 
相比较而言,在这方面Tiles就逊色许多。

个人觉得在团队开发里面,Apache Tiles框架会导致所有人不仅仅要了解并且清楚Apache Tiles的存在, 
并且要特别熟悉每一个Tiles layout模板的作用,否则就可能出现用错模板的情况;除此之外,每个人涉及到 
的所有WEB页面都需要去配置文件里面逐个配置,不仅麻烦出错的几率还高; 
而以上所有的不足都是SiteMesh所不存在的;

SiteMesh的基本原理

一个请求到服务器后,如果该请求需要sitemesh装饰,服务器先解释被请求的资源,然后根据配置文件 
获得用于该请求的装饰器,最后用装饰器装饰被请求资源,将结果一同返回给客户端浏览器。

如何使用SiteMesh

这里以struts2+spring2+hibernate3构架的系统为例 
1、下载SiteMesh 
下载地址:http://www.opensymphony.com/sitemesh/download.action 目前的最新版本是Version 2.3;

2、在工程中引入SiteMesh的必要jar包,和struts2-sitemesh-plugin-2.0.8.jar;

3、修改你的web.xml,在里面加入sitemesh的过滤器,示例代码如下:

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

注意过滤器的位置:应该在struts2的org.apache.struts2.dispatcher.ActionContextCleanUp过滤器之后,org.apache.struts2.dispatcher.FilterDispatcher过滤器之前,否则会有问题;

4、在下载的SiteMesh包中找到sitemesh.xml,(\sitemesh-2.3\src\example-webapp\WEB-INF目录下就有)

将其拷贝到/WEB-INF目录下;

5、在sitemesh.xml文件中有一个property结点(如下),该结点指定了decorators.xml在工程中的位置,让sitemesh.xml能找到他; 
按照此路径新建decorators.xml文件,当然这个路径你可以任意改变,只要property结点的value值与其匹配就行; 
<property name="decorators-file" value="/WEB-INF/sitemesh/decorators.xml"/>

6、在WebRoot目录下新建decorators目录,并在该目录下新建一个模板jsp,根据具体项目风格编辑该模板,
如下示例:我的模板:main.jsp

<%@ page language="java" pageEncoding="UTF-8"%>
<%@taglib prefix="decorator"uri="http://www.opensymphony.com/sitemesh/decorator"%>
<%@taglib prefix="page" uri="http://www.opensymphony.com/sitemesh/page"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<%response.setHeader("Pragma", "no-cache");response.setHeader("Cache-Control", "no-cache");response.setDateHeader("Expires", 0);
%>
<html><head><title><decorator:title default="kangxm test" /></title><!-- 页面Head由引用模板的子页面来替换 --><decorator:head /></head><body id="page-home"><div id="page-total"><div id="page-header"><table width="100%" border="0" cellspacing="0" cellpadding="0"><tr><td><div class="topFunc">我的账户 |退出 </div></td></tr></table></div></div><!-- end header --><!--   Menu Tag begin --><div id="page-menu" style="margin-top: 8px; margin-bottom: 8px;"><div>这里放菜单 </div></div><!--   Menu Tag end --><div id="page-content" class="clearfix"><center><table width="100%" border="0" cellpadding="0" cellspacing="0"><tr><td><decorator:body /><!-- 这里的内容由引用模板的子页面来替换--></td></tr></table></center></div><!-- end content --><div id="page-footer" class="clearfix">这里放页面底部 <!-- end footer --></div><!-- end page --></body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62

这就是个简单的模板,页面的头和脚都由模板里的静态HTML决定了,主页面区域用的是标签; 
也就是说凡是能进入过滤器的请求生成的页面都会默认加上模板上的头和脚,然后页面自身的内容将自动放到 
<decorator:body />标签所在位置;

<decorator:title default="Welcome to test sitemesh!" />:读取被装饰页面的标题,并给出了默认标题。 
<decorator:head />:读取被装饰页面的<head>中的内容; 
<decorator:body />:读取被装饰页面的<body>中的内容;

7、说到这里大家就要想了,那如果某个特殊的需求请求路径在过滤器的范围内,但又不想使用模板怎么办? 
你总不能这么不讲道理吧! 
大家放心吧,SiteMesh早就考虑到这一点了,上面第5步说道的decorators.xml这个时候就起到作用了!

下面是我的decorators.xml:

<?xml version="1.0" encoding="ISO-8859-1"?>
<decorators defaultdir="/decorators"><!-- Any urls that are excluded will never be decorated by Sitemesh --><excludes><pattern>/index.jsp*</pattern><pattern>/login/*</pattern></excludes><decorator name="main" page="main.jsp"><pattern>/*</pattern></decorator>
</decorators>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

decorators.xml有两个主要的结点: 
decorator结点指定了模板的位置和文件名,通过pattern来指定哪些路径引用哪个模板 
excludes结点则指定了哪些路径的请求不使用任何模板

如上面代码,/index.jsp和凡是以/login/开头的请求路径一律不使用模板;

另外还有一点要注意的是:decorators结点的defaultdir属性指定了模板文件存放的目录;

实战感受

刚刚做完一个用到sitemesh的项目,跟以前用tiles框架相比,最大的感受就是简单,系统设计阶段就把模板
文件和sitemesh框架搭好了!哪些页面使用框架哪些不使用,全部都通过UI Demo很快就定义出来了;
在接下来的开发中所有成员几乎感受不到sitemesh的存在,各自仅仅关心自己的模块功能实现。
  • 1
  • 2
  • 3
  • 4

七、总结

使用sitemesh给我们带来的是不仅仅是页面结构问题,它的出现让我们有更多的时间去关注底层业务逻辑,
而不是整个页面的风格和结构。它让我们摆脱了大量用include方式复用页面尴尬局面,也避免了tiles
框架在团队开发中的复杂度,它还提供了很大的灵活性以及给我们提供了整合异构Web系统页面的一种方案。
  • 1
  • 2
  • 3
  • 4

SiteMesh框架相关推荐

  1. SiteMesh:一个优于Apache Tiles的Web页面布局、装饰框架

    一.SiteMesh项目简介 OS(OpenSymphony)的SiteMesh是一个用来在JSP中实现页面布局和装饰(layout and decoration) 的框架组件,能够帮助网站开发人员较 ...

  2. SiteMesh介绍

    1. SiteMesh简介 SiteMesh是由一个基于Web页面布局.装饰以及与现存Web应用整合的框架.它能帮助我们在由大量页面构成的项目中创建一致的页面布局和外观,如一致的导航条,一致的bann ...

  3. java web主流框架整合开发 光盘_开发者突击:Java Web主流框架整合开发(第2版)(附CD光盘1张)...

    序言 一.了解软件架构 (一)基本概念 (二)软件架构的历史 (三)软件架构的目标 二.J2EE开发模型分析 (一)一层架构模式 (二)两层架构模式Model 1 (三)三层架构模式Model 2 ( ...

  4. SiteMesh 2学习(1):入门简介和简单实例

    SiteMesh简介  * 资料参考:  SIteMesh官方地址:http://www.opensymphony.com/sitemesh/  SIteMesh下载地址:http://java.ne ...

  5. 详解Java中的复合视图设计模式

    使用由多个子视图组成的复合视图.整个模板的每个子视图可以整体动态地包括在内,并且可以独立于内容来管理页面的布局. Apache Tiles和SiteMesh 框架使用Composite View De ...

  6. Shiro 核心功能案例讲解 基于SpringBoot 有源码

    Shiro 核心功能案例讲解 基于SpringBoot 有源码 从实战中学习Shiro的用法.本章使用SpringBoot快速搭建项目.整合SiteMesh框架布局页面.整合Shiro框架实现用身份认 ...

  7. IT知识免费学习视频地址大全

    Jquery2.0实战 http://edu.ibeifeng.com/view-index-id-318.html 使用SSH框架技术开发学籍管理系 统-Hibernate 部分 http://ed ...

  8. Openfire简单教程

    导言 插件是增强 Openfire 功能. 这份文件是一个开发人员创建插件指南. 结构的一个插件 插件存放在 插件 openfireHome 目录 . 当部署一个 jar 或 war 插件文件,它会自 ...

  9. SiteMesh JSP布局框架介绍

    SiteMesh 是一个网页布局和修饰的框架,利用它可以将网页的内容和页面结构分离,以达到页面结构共享的目的. Sitemesh是由一个基于Web页面布局.装饰以及与现存Web应用整合的框架.它能帮助 ...

  10. 别再用那些已经淘汰的技术了!2020 年 9 大顶级 Java 框架出炉!!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源:Patricia Neil towardsdatascien ...

最新文章

  1. “区块链”究竟是什么
  2. Python是一门杰出的语言,值得你去学习
  3. 模组使用之NB-IoT模组的工作模式、PSM、DRX和eDRX状态说明
  4. 希尔排序(Shell's Sort)的C语言实现
  5. java面试题二 %运算符的问题
  6. sklearn中常用的数据预处理方法
  7. Android Studio中 no module 问题,解决方法
  8. 多线程进行http请求
  9. CORS 跨域 实现思路及相关解决方案
  10. 将byte[]转为各种进制的字符串
  11. Exchange 2007 前端 IIS 内存占用过高
  12. 有一定的php基础,求推荐PHP框架,本人有一定PHP基础。
  13. Android JS 通过X5WebView相互调用详解
  14. Linux系统:安装QQ教程
  15. iOS - 距离传感器
  16. java 折线图_用Java绘制简单的折线图
  17. 高性价比的“小985”院校推荐!认可度超高
  18. h5 微信公众号获取当前位置
  19. c语言程序编写字体,c语言程序设计练习题
  20. 牛客网 18 二维数组中的查找

热门文章

  1. protues 选项卡说明
  2. Android PreferenceScreen
  3. oracle客户端odbc安装程序,Oracle Instant Client ODBC 安装说明
  4. C语言中的指针与下标,C语言下标和指针的关系
  5. fm核武破解 java出错_关闭Java时后台的FM无法恢复
  6. HIbernate二级缓存的缓存策略
  7. 计算机组成原理第9章,计算机组成原理第9章习题参考答案
  8. 关于dev c++z中文乱码的问题
  9. 软件设计师考试大纲2018
  10. 使用Windows自带的录音机进行wav转mp3的操作