sitemesh入门
今天在公司用到了sitemesh这个框架。
网上的资料已经有很多了。 在此就不做具体介绍了, 仅仅做个笔记。
sitemesh是一种模板框架,是为了解决页面重复代码而设计的。
设计思想
sitemesh的设计思想是装饰者设计模式。
由于本文讨论的是sitemesh,并不是设计模式。故在此简单地说明一下装饰者这个设计模式。
java io就是常见的装饰者设计模式应用的地方。 用各种FilterInputStream装饰InputStream。
一个常见的例子就是读取文本文件中的文本。
用FileInputStream这种文件流读取的时候,速度较慢,而用BufferedInputStream装饰FileInputStream的时候效率提高了很多。
因为BufferedInputStream对FileInputStream读取的数据做了二次处理,内部有个缓冲区对读取的数据进行暂存。
sitemesh也是同样的道理,通过装饰器将返回的页面需要装饰的部分用其他页面先装饰好,然后再处理不需要装饰的页面。
实例
实例使用idea作用ide,用maven构建项目。 前端框架使用bootstrap和jQuery。
项目结构如下:

maven加入sitemesh依赖即可。
<dependency>
<groupId>opensymphony</groupId>
<artifactId>sitemesh</artifactId>
<version>2.4.2</version>
</dependency>
效果图:

从实例可以看出,头部logo和底部,还有导航条这3个东西是固定不变的。
点击导航条这些内容是不变的,变的只是导航条下面的内容。 因此sitemesh在这种场景就用上了。
使用sitemesh还是非常简单的。 只需要3步。
1. 配置filter
<filter>
<filter-name>SiteMeshFilter</filter-name>
<filter-class>com.opensymphony.sitemesh.webapp.SiteMeshFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SiteMeshFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
这里注意一下,sitemesh老版本的filter是PageFilter。 目前这个Filter已经过时,使用新的SiteMeshFilter。
2.在WEB-INF文件夹下创建decorators.xml文件,内容如下:
<?xml version="1.0" encoding="utf-8"?>
<decorators defaultdir="/layouts/"> <excludes>
<pattern>/static/*</pattern>
</excludes> <decorator name="default" page="default.jsp">
<pattern>/*</pattern>
</decorator> </decorators>
根标签decorators有个defaultdir属性,也就是前缀目录。下面的decorator标签的属性中的page属性default.jsp这个模板页面具体位置就需要加上之前那个前缀目录。也就是/layouts/default.jsp。项目结构中已说明的很清楚。同时这个模板页面作用于所有的页面,因为它的pattern是/*,这个跟filter类似。excludes这个标签顾名思义,也就是排除某些url,使之不使用模板。 比如一些静态的html页面和不需要使用模板的页面。
3.建立模板文件
模板文件也就是/layouts/default.jsp。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="decorator" uri="http://www.opensymphony.com/sitemesh/decorator" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title><decorator:title/></title>
<link rel="stylesheet" href="static/bootstrap.min.css"/>
<link rel="stylesheet" href="static/bootstrap-theme.min.css"/>
<script type="text/javascript" src="static/jquery1.11.0.js"></script>
<style>
.body,.foot {
margin-top: 50px;
}
</style>
</head>
<body>
<div class="head">logo</div>
<div class="body">
<div>
<ul class="nav nav-pills" id="nav">
<li id="home"><a href="index.jsp">Home</a></li>
<li id="page1"><a href="page1.jsp">Page1</a></li>
<li id="page2"><a href="page2.jsp">Page2</a></li>
</ul>
</div>
<div>
<decorator:body/>
</div>
</div>
<div class="foot">address...</div>
</body>
</html>
引用了1个标签库。 decorator, 也就是sitemesh提供的标签库。 模板文件中<decorator:body/>和<decorator:title/>这两部分是需要引用具体页面的。其他的内容均引用自这个页面。
原理
当浏览器进入页面首页的时候,会进入index.jsp.
index.jsp内容如下
<head>
<title>主页</title>
</head>
<body>
<h1 style="background-color: red;">除body之外其他的内容已经全部在/layout/default.jsp中定义了。</h1>
<input type="button" value="click"/>
<script type="text/javascript">
$("#nav li").removeClass('active');
$("#home").addClass('active');
</script>
</body>
由于配置了filter。因此进入这个页面之前,请求已经被filter截取。
filter会先得到模板页面,也就是/layout/default.jsp这个页面。
由于default.jsp这个页面有两处内容需要具体页面渲染,因此这两处内容就由新进入的这个页面进行渲染。即<decorator:title/>对应"主页",<decorator:body/>对应body标签内的内容。
同理,page1和page2页面也这样处理。
page1.jsp
<head>
<title>页面1</title>
</head>
<body>
<h1 style="background-color: green;">页面1.....</h1>
<script type="text/javascript">
$("#nav li").removeClass('active');
$("#page1").addClass('active');
</script>
</body>
page2.jsp
<head>
<title>页面2</title>
</head>
<body>
<h1 style="background-color: blue;">页面2.....</h1>
<script type="text/javascript">
$("#nav li").removeClass('active');
$("#page2").addClass('active');
</script>
</body>
总结
sitemesh配置简单,因为只对response回去的code进行二次渲染,这样基本不会影响业务逻辑,非常推荐使用。
sitemesh入门的更多相关文章
- SiteMesh入门(1-1)SiteMesh是什么?
1.问题的提出 在开发Web 应用时,Web页面可能由不同的人参与开发,因此开发出来的界面通常千奇百怪.五花八门,风格难以保持一致. 为了统一界面的风格,Struts 框架提供了一个标签库Tiles ...
- SiteMesh学习入门
http://www.java3z.com/cwbwebhome/article/article2/2962.html?id=1668 demo下载 简介: sitemesh应用Decorat ...
- Tiles入门及项目实战
1.Apache Tiles™ Apache Tiles是一个模板布局框架.最初是为了简化Web应用界面开发,如今已不限于JavaEE Web环境. Tiles允许开发人员定义页面片段,它们在运行时会 ...
- 1、Struts2基本入门
一.了解了这几个主要的优点,会促使你考虑使用Struts2 : 1.POJO表单及POJO操作 - Struts2 去除掉了Struts框架中的Action Forms部分.在Struts2框架下,你 ...
- Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求
上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...
- ABP入门系列(1)——学习Abp框架之实操演练
作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...
- Oracle分析函数入门
一.Oracle分析函数入门 分析函数是什么?分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计 ...
- Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数
上一篇:Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数 之前介绍了简单的路由以及传参,这篇文章我们将要学习复杂一些的路由以及传递其他附加参数.一个好的路由系统可以使我们 ...
- Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数
上一篇:Angular2入门系列教程-服务 上一篇文章我们将Angular2的数据服务分离出来,学习了Angular2的依赖注入,这篇文章我们将要学习Angualr2的路由 为了编写样式方便,我们这篇 ...
随机推荐
- GATK--数据预处理,质控,检测变异
版权声明:本文源自 解螺旋的矿工, 由 XP 整理发表,共 13781 字. 转载请注明:从零开始完整学习全基因组测序(WGS)数据分析:第4节 构建WGS主流程 | Public Library o ...
- 20145202马超 2016-2017-2 《Java程序设计》第9周学习总结
20145202马超 2016-2017-2 <Java程序设计>第9周学习总结 教材学习内容总结 JDBC 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交 ...
- mfc 函数重载
函数重载的概念 for循环中变量 一. 函数重载的概念 函数重载允许我们使用相同的函数名定义多个函数. 提示: 函数参数类型不同,可重载. 类型相同时,则需要参数个数不同. int max(int a ...
- 7-[多线程]-Event、定时器、队列、堆栈
1.Event对象 线程的一个关键特性是每个线程都是独立运行且状态不可预测. 如果程序中的其他线程需要通过判断某个线程的状态来确定自己下一步的操作,这时线程同步问题就会变得非常棘手. 为了解决这些问题 ...
- 4542: [Hnoi2016]大数
4542: [Hnoi2016]大数 链接 分析: 如果p等于2或者5,可以根据最后一位直接知道是不是p的倍数,所以直接记录一个前缀和即可. 如果p不是2或者5,那么一个区间是p的倍数,当且仅当$\f ...
- HDU - 5877 Weak Pair (dfs+树状数组)
题目链接:Weak Pair 题意: 给出一颗有根树,如果有一对u,v,如果满足u是v的父节点且vec[u]×vec[v]<=k,则称这对结点是虚弱的,问这棵树中有几对虚弱的结点. 题解: 刚开 ...
- node的 node-sass@^4.11.0 出现:npm: no such file or directory, scandir '.../node_modules/node-sass/vendor'
解决办法: 查看node_modules文件夹,发现,并无vender 文件夹.如下图: 2. 在 node_modules/node-sass 下创建 vendor 文件夹 3. 最后运行: n ...
- JTree实现电脑资源管理器
0.前言 最近老师布置了一项用Java写资源管理器的任务,一开始以为简单,但是实际操作起来,却发现网上的资源用起来相对生疏.在使用中,我也遇到了许多问题,虽然不能像其他博主一样,写的非常齐全,但我还是 ...
- Docker创建数据卷
当程序在容器中运行时,需要与其他容器中的程序或者容器外部的程序进行文件读写操作时,就需要进行数据的交换:容器内部的文件系统,是一个临时层,当容器停止运行并被删除时,这个临时层就会被一同丢弃:为了达到从 ...
- 【SIKIA计划】_07_Unity3D游戏开发-坦克大战笔记
[新增分类][AudioClips]音频剪辑[AudioMixers]音频混合器[Editor][Fonts]字体[Materials]材质[Models]模型[Standard Assets] [渲 ...