博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
sitemesh入门
阅读量:6258 次
发布时间:2019-06-22

本文共 2596 字,大约阅读时间需要 8 分钟。

今天在公司用到了sitemesh这个框架。

网上的资料已经有很多了。  在此就不做具体介绍了, 仅仅做个笔记。

sitemesh是一种模板框架,是为了解决页面重复代码而设计的。

设计思想

sitemesh的设计思想是装饰者设计模式。

由于本文讨论的是sitemesh,并不是设计模式。故在此简单地说明一下装饰者这个设计模式。

java io就是常见的装饰者设计模式应用的地方。 用各种FilterInputStream装饰InputStream。

一个常见的例子就是读取文本文件中的文本。

用FileInputStream这种文件流读取的时候,速度较慢,而用BufferedInputStream装饰FileInputStream的时候效率提高了很多。

因为BufferedInputStream对FileInputStream读取的数据做了二次处理,内部有个缓冲区对读取的数据进行暂存。

 

sitemesh也是同样的道理,通过装饰器将返回的页面需要装饰的部分用其他页面先装饰好,然后再处理不需要装饰的页面。

实例

实例使用idea作用ide,用maven构建项目。 前端框架使用bootstrap和jQuery。

项目结构如下:

maven加入sitemesh依赖即可。

opensymphony
sitemesh
2.4.2

效果图:

 从实例可以看出,头部logo和底部,还有导航条这3个东西是固定不变的。

点击导航条这些内容是不变的,变的只是导航条下面的内容。 因此sitemesh在这种场景就用上了。

 

使用sitemesh还是非常简单的。 只需要3步。

1. 配置filter

SiteMeshFilter
com.opensymphony.sitemesh.webapp.SiteMeshFilter
SiteMeshFilter
/*

 这里注意一下,sitemesh老版本的filter是PageFilter。 目前这个Filter已经过时,使用新的SiteMeshFilter。

2.在WEB-INF文件夹下创建decorators.xml文件,内容如下:

/static/*
/*

根标签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" %>    
<decorator:title/>
logo
address...

引用了1个标签库。 decorator, 也就是sitemesh提供的标签库。 模板文件中<decorator:body/>和<decorator:title/>这两部分是需要引用具体页面的。其他的内容均引用自这个页面。

原理

当浏览器进入页面首页的时候,会进入index.jsp. 

index.jsp内容如下

    主页    

除body之外其他的内容已经全部在/layout/default.jsp中定义了。

由于配置了filter。因此进入这个页面之前,请求已经被filter截取。

filter会先得到模板页面,也就是/layout/default.jsp这个页面。

由于default.jsp这个页面有两处内容需要具体页面渲染,因此这两处内容就由新进入的这个页面进行渲染。即<decorator:title/>对应"主页",<decorator:body/>对应body标签内的内容。

 

同理,page1和page2页面也这样处理。

page1.jsp

    页面1    

页面1.....

page2.jsp

    页面2    

页面2.....

 

总结

sitemesh配置简单,因为只对response回去的code进行二次渲染,这样基本不会影响业务逻辑,非常推荐使用。

转载于:https://www.cnblogs.com/fangjian0423/p/3559270.html

你可能感兴趣的文章
window下在同一台机器上安装多个版本jdk,修改环境变量不生效问题处理办法
查看>>
How to update WPF browser application manifest and xbap file with ‘mage.exe’
查看>>
SQL Server T-SQL高级查询
查看>>
通过配置CPU参数 worker_cpu_affinity 提升nginx性能
查看>>
解决的方法:warning: Clock skew detected. Your build may be incomplete.
查看>>
技术型创业者easy遇到的三大问题
查看>>
无法打开SQL Server的连接
查看>>
java泛型中的对象
查看>>
进程和线程区别理解
查看>>
php创建token
查看>>
Android 系统API实现数据库的增删改查和SQLite3工具的使用
查看>>
95、Android下在onCreate中获取控件的宽度和高度(通过回调)
查看>>
UML在需求分析阶段的应用
查看>>
JavaScript:JavaScript事件的处理
查看>>
WEB安全测试的类型
查看>>
ES6笔记(7)-- Promise异步编程
查看>>
早睡早起
查看>>
C#软件监控外部程序运行状态
查看>>
几款开源的图形化Redis客户端管理软件推荐
查看>>
数据库设计中常见表结构的设计技巧
查看>>