转自:https://blog.csdn.net/wangxiaoan1234/article/details/77017546
介绍
SiteMesh 是一个网页布局和修饰的框架,利用它可以将网页的内容和页面结构分离,以达到页面结构共享的目的。
Sitemesh是由一个基于Web页面布局、装饰以及与现存Web应用整合的框架。它能帮助我们在由大量页面构成的项目中创建一致的页面布局和外观,如一致的导航条,一致的banner,一致的版权,等等。它不仅仅能处理动态的内容,如jsp,php,asp等产生的内容,它也能处理静态的内容,如htm的内容,使得它的内容也符合你的页面结构的要求。甚至于它能将HTML文件象include那样将该文件作为一个面板的形式嵌入到别的文件中去。所有的这些,都是GOF的Decorator模式的最生动的实现。尽管它是由java语言来实现的,但它能与其他Web应用很好地集成。
下图是SiteMesh的结构图 :
工作原理
SiteMesh是基于Servlet的filter的,即过滤流。它是通过截取response,并进行装饰后再交付给客户。
其中涉及到两个名词: 装饰页面(decorator page)和 被装饰页面(Content page), 即 SiteMesh通过对Content Page的装饰,最终得到页面布局和外观一致的页面,并返回给客户。
运行SiteMesh3至少需要:
1.JDK 1.5
2.一个Servlet 2.5兼容容器
3.SiteMesh运行时库
配置及使用
1、添加maven依赖
pom.xml文件添加以下依赖:
<!--sitemesh--> <dependency> <groupId>org.sitemesh</groupId> <artifactId>sitemesh</artifactId> <version>3.0.1</version> </dependency>
2、web.xml中添加SiteMesh过滤器
<web-app> ... <filter> <filter-name>sitemesh</filter-name> <filter-class>org.sitemesh.config.ConfigurableSiteMeshFilter</filter-class> </filter> <filter-mapping> <filter-name>sitemesh</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
3、创建一个“装饰页面”(decorator page)
该装饰页面包含Web应用程序中常见得布局和样式,它是一个包含<title>,<head>和<body>元素的模板。它至少要包含:
<HTML> <HEAD> <title> <sitemesh:write property ='title'/> </ title> <sitemesh:write property ='head'/> </HEAD> <BODY> <sitemesh:write property ='body'/> </BODY> </HTML>
标签<sitemesh:write property='...'/>将会被SiteMesh重写,用来包含从“被装饰页面”(content page)中提取到的值。可以从被装饰页面”(content page)中提取更多的属性,并且可以自定义规则 。
在WEB应用程序中创建/decorator.html,其中包含:
<html> <head> <title>SiteMesh example: <sitemesh:write property='title'>Title goes here</sitemesh:write></title> <style type='text/css'> body { font-family: arial, sans-serif; background-color: #ffffcc; } h1, h2, h3, h4 { text-align: center; background-color: #ccffcc; border-top: 1px solid #66ff66; } .disclaimer { text-align: center; border-top: 1px solid #cccccc; margin-top: 40px; color: #666666; font-size: smaller; } </style> <sitemesh:write property='head'/> </head> <body> <h1 class='title'>SiteMesh example site: <sitemesh:write property='title'>Title goes here</sitemesh:write></h1> <sitemesh:write property='body'>Body goes here. Blah blah blah.</sitemesh:write> <div class='disclaimer'>Site disclaimer. This is an example.</div> <div class='navigation'> <b>Examples:</b> [<a href="./">Static example</a>] [<a href="demo.jsp">Dynamic example</a>] </div> </body> </html>
在这个例子中,装饰页面是一个静态的.html文件,但是如果你希望用动态页面,那么可以使用诸如JSP,FreeMarker等技术。
有点模板引擎的意思,装饰页面是模板,以被装饰页面的各类标签为值对模板进行替换
4、创建一个“被装饰页面”(content page)
<html> <head> <title>Hello World</title> </head> <body> <p>Well hello there, fine world.</p> <p>And so concludes this <b>SiteMesh</b> example.</p> <h2>How it works</h2> <ul> <li>This page (<code>/index.html</code>) contains vanilla HTML content.</li> <li>SiteMesh is configured (in <code>/WEB-INF/web.xml</code>) to apply a decorator to all paths (<code>/*</code>).</li> <li>The decorator (<code>/decorator.html</code>) contains the common look and feel that is applied to the site.</li> </ul> </body> </html>
像装饰页面一样,被装饰页面可以是静态文件,也可以是由Servlet引擎动态生成(例如JSP)。
5、配置
SiteMesh配置支持两种方法 : XML或Java。
5.1、XML方式
在工程的 /WEB-INF/sitemesh3.xml中添加以下设置:
<sitemesh> <mapping path="/*" decorator="/decorator.html"/> </sitemesh>
5.1、Java方式
要使用Java的配置方式,自定义的SitMesh过滤器需要继承org.sitemesh.config.ConfigurableSiteMeshFilter并重写applyCustomConfiguration(SiteMeshFilterBuilder builder)方法。
具体如下:
public class MySiteMeshFilter extends ConfigurableSiteMeshFilter { @Override protected void applyCustomConfiguration(SiteMeshFilterBuilder builder) { builder.addDecoratorPath("/*", "/decorator.html"); } }
既然使用Java配置方式,就不再需要sitemesh3.xml文件,但是在web.xml中要使用自己重写的SiteMesh过滤器,替换第二步中的sitemesh过滤器。
即web.xml的设置改成如下所示:
<filter> <filter-name>sitemesh</filter-name> <filter-class>com.xxx.MySiteMeshFilter</filter-class> </filter> <filter-mapping> <filter-name>sitemesh</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
6、查看效果
本地查看内容页面.html效果如下:
通过SiteMesh3装饰后访问效果如下:
查看该效果页面源代码如下:
<html> <head> <title>SiteMesh example: Hello World (Dynamic)</title> <style type='text/css'> body { font-family: arial, sans-serif; background-color: #ffffcc; } h1, h2, h3, h4 { text-align: center; background-color: #ccffcc; border-top: 1px solid #66ff66; } .disclaimer { text-align: center; border-top: 1px solid #cccccc; margin-top: 40px; color: #666666; font-size: smaller; } </style> <style type='text/css'> .date { font-weight: bold; padding: 10px; font-size: larger; } </style> </head> <body> <h1 class='title'>SiteMesh example site: Hello World (Dynamic)</h1> <p>This page demonstrates that dynamic content can be decorated in the same way as static content.</p> <p>This is a simple JSP that shows the date and time on the server is now:</p> <div class='date'>Tue Aug 15 14:25:41 CST 2017</div> <p>Of course, with SiteMesh you are not limited to JSP. Because it's a Servlet Filter, both content and decorators can be generated by any technology in your ServletEngine, including: static files, JSP, Velocity, FreeMarker, JSF, MVC frameworks, JRuby.... you get the point.</p> <div class='disclaimer'>Site disclaimer. This is an example.</div> <div class='navigation'> <b>Examples:</b> [<a href="./">Static example</a>] [<a href="demo.jsp">Dynamic example</a>] </div> </body> </html>
7、高级配置
7.1、XML形式配置
sitemesh3.xml文件如下:
<?xml version="1.0" encoding="UTF-8"?> <sitemesh> <!--默认情况下,sitemesh 只对 HTTP 响应头中 Content-Type 为 text/html 的类型进行拦截和装饰,我们可以添加更多的 mime 类型--> <mime-type>text/html</mime-type> <mime-type>application/vnd.wap.xhtml+xml</mime-type> <mime-type>application/xhtml+xml</mime-type> <!-- 默认装饰器,当下面的路径都不匹配时,启用该装饰器进行装饰 --> <mapping decorator="/default-decorator.html"/> <!--不同的匹配路径采用不同的装饰页面--> <mapping path="/admin/*" decorator="/another-decorator.html"/> <mapping path="/*.special.jsp" decorator="/special-decorator.html"/> <!--一个匹配路径同时采用不同的装饰页面--> <mapping> <path>/articles/*</path> <decorator>/decorators/article.html</decorator> <decorator>/decorators/two-page-layout.html</decorator> <decorator>/decorators/common.html</decorator> </mapping> <!-- 满足该匹配路径将不被装饰 --> <mapping path="/login.htm" exclue="true" /> <!-- 自定义标签 --> <content-processor> <tag-rule-bundle class="com.something.CssCompressingBundle" /> <tag-rule-bundle class="com.something.LinkRewritingBundle"/> </content-processor> </sitemesh>
7.2、Java形式配置
对应Java配置如下(同理还是在web.xml中引用自己的SiteMesh过滤器):
public class MySiteMeshFilter extends ConfigurableSiteMeshFilter { @Override protected void applyCustomConfiguration(SiteMeshFilterBuilder builder) { //默认装饰器,当下面的路径都不匹配时,启用该装饰器进行装饰 builder.addDecoratorPath("/*", "/decorator.html") //添加更多的 mime 类型 .setMimeTypes("text / html","application / xhtml + xml","application / vnd.wap.xhtml + xml") //不同匹配路径采用不同的装饰页面 .addDecoratorPath("/admin/*", "/another-decorator.html") .addDecoratorPath("/*.special.jsp", "/special-decorator.html") //一个匹配路径同时采用不同的装饰页面 .addDecoratorPaths("/articles/*", "/decorators/article.html", "/decoratos/two-page-layout.html", "/decorators/common.html") //满足该匹配路径将不被装饰 .addExcludedPath("/javadoc/*") //添加自定义标签 .addTagRuleBundle(new CssTagRuleBundle()); } }
其中自定义标签类格式如下:
/** * 自定义标签 */ public class CssTagRuleBundle implements TagRuleBundle { @Override public void install(State defaultState, ContentProperty contentProperty, SiteMeshContext siteMeshContext) { defaultState.addRule("my-css", new ExportTagToContentRule(siteMeshContext, contentProperty.getChild("my-css"), false)); defaultState.addRule("my-footer", new ExportTagToContentRule(siteMeshContext, contentProperty.getChild("my-footer"), false)); } @Override public void cleanUp(State defaultState, ContentProperty contentProperty, SiteMeshContext siteMeshContext) { } }
在web.xml中还可以指定请求来源:
<filter> <filter-name>sitemesh</filter-name> <filter-class>com.wangxiaoan1234.MySiteMeshFilter</filter-class> </filter> <filter-mapping> <filter-name>sitemesh</filter-name> <url-pattern>/*</url-pattern> <dispatcher>FORWARD</dispatcher> <dispatcher>REQUEST</dispatche
</head> <body> <p>Well hello there, fine world.</p> <p>And so concludes this <b>SiteMesh</b> example.</p> <my-footer> <div style="text-align: center"> ©wangxiaoan1234.com </div> </my-footer> </body> </html>
效果:
效果页面源码:
<html> <head> <title>SiteMesh example: Hello World</title> <style> div p { color : red; } </style> </head> <body> <div> <p>pppppppppppppppppppppp</p> </div> <div style="text-align: center"> ©wangxiaoan1234.com </div> </body> </html>
相关推荐
除了基本的装饰器配置之外,还可以对`sitemesh3.xml`进行更细致的配置: - **支持多种MIME类型**: ```xml <mime-type>text/html</mime-type> <mime-type>application/vnd.wap.xhtml+xml <mime-type>application...
**SpringMVC、Freemarker与Sitemesh3详解** SpringMVC是Spring框架的一部分,它是一个用于构建Web应用程序的模型-视图-控制器(MVC)架构。SpringMVC提供了一个灵活的处理机制,包括处理器映射、视图解析、数据绑定...
#### 一、简介 SiteMesh是一个强大的Web页面布局工具,它允许开发者在Web应用中使用模板化的设计来构建网页。通过使用SiteMesh,可以很容易地实现对整个网站外观的统一控制,而无需对每个单独的页面进行修改。此...
**3. SiteMesh的配置** - **web.xml配置**:在Web应用的部署描述符中,我们需要配置一个SiteMesh Filter,指定其在过滤链中的位置和相关参数。 - **siteMesh.xml配置**:这是SiteMesh的核心配置文件,用于设置布局...
**Sitemesh简介** Sitemesh 是一个开源的 Web 应用程序装饰框架,主要用于解决网页布局和页面统一风格的问题。它通过拦截 HTTP 请求,将请求的页面内容与预先定义好的模板结合,使得开发者可以轻松地创建出统一的...
#### 一、Sitemesh简介 Sitemesh是一个非常实用且功能强大的Web页面布局和装饰框架,适用于多种Web应用程序,包括但不限于Java(JSP)、PHP、ASP等技术栈下的应用。它能够有效地帮助开发者统一Web应用的界面风格,...
**1.1 SiteMesh简介** SiteMesh是一个基于Java、J2EE和XML的开源框架,主要用于网站内容的装饰和布局管理。当一个企业级Web站点需要整合多种技术(如J2EE、CGI或Microsoft IIS Server)时,如何保持站点的整体一致...
3. **SITEMESH 的标签**: - `<decorator:head>`标签: 用于插入装饰器页面的部分,可以在这里设置CSS链接、JavaScript引用等全局资源。 - `<decorator:body>`标签: 包含了被装饰页面的主要内容,SiteMesh会...
**Sitemesh简介** Sitemesh是一款开源的Web应用程序装饰框架,主要用于网页布局和样式统一。它通过在服务器端对HTTP响应进行拦截,将页面内容与装饰模板结合,实现页面的统一外观和感觉。Sitemesh的核心功能是帮助...
### 分布式框架简介SSM组合+springmvc+mybatis+shiro+restful+bootstrap #### 一、基础知识与入门 本节主要介绍如何基于SSM(Spring、SpringMVC、MyBatis)框架搭建一个简单的Web应用程序,并实现一个HelloWorld...
包括Struts2、Spring、Hibernate3以及Sitemesh等。 ##### 2. 导入基本包 - **Struts2**: - `struts2-core-2.0.11.jar` - `ognl-2.6.11.jar` - `struts2-spring-plugin-2.0.11.jar` - `xwork-2.0.4.jar` - **...
1.2.8 SiteMesh页面布局框架简介 17 1.3 我们为什么要用Struts2 17 1.4 Web项目中使用Struts2初探 20 第2章 Web基础技术简介 31 2.1 B/S和C/S系统区别 31 2.2 JSP和Servlet介绍 32 2.3 XML知识介绍 34 第3章 Struts2...
- SiteMesh 页面布局框架简介:SiteMesh可以集成到Struts2,实现统一的页面布局。 第 2 章:Web基础技术简介 2.1 B/S 和 C/S 系统区别 B/S(Browser/Server)架构基于浏览器和服务器交互,而C/S(Client/Server)...
3. **OGNL(Object Graphical Navigation Language)**:这是一种强大的表达式语言,允许动态地遍历对象图表并执行方法。通过ValueStack,开发者可以透明地访问多个Bean的属性,增强了代码的简洁性和可读性。 4. **...