`
teder
  • 浏览: 7873 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

sitemesh解析

阅读更多

你还在不断地include 公用css,公用js,公用的页头,页尾吗?还在这样重复劳动嘛,那就让sitemesh让我们偷懒吧.

 

1.Sitemesh简介

    Sitemesh是由一个基于Web页面布局、装饰以及与现存Web应用整合的框架。它能帮助我们在由大量页面构成的项目中创建一致的页面布局和外观,
    如一致的导航条,一致的banner,一致的版权,等等。它是运用Decorator模式的生动的实现页面的装饰.

 

2.Decorator


 Sitemesh运用了Decorator模式.先来了解下Decorator模式的运行机制.
 Decorator定义:
 动态给一个对象添加一些额外的职责,就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活.


  为什么使用Decorator?

 

我们通常可以使用继承来实现功能的拓展,如果这些需要拓展的功能的种类很繁多,那么势必生成很多子类,增加系统的复杂性,同时,使用继承实现功能拓展,我们必须可预见这些拓展功能,这些功能是编译时就确定了,是静态的.


我们有一个只输出的body的BodyPrinter,如果我们要加一个页头,那么我们新一个Class,叫HeadClass,继承BodyPrinter,在新Class中加上页头.如果再要加一个页尾,那我们要一个新的Class来继承HeadClass.那还要加页尾呢,再继承地?再加再继承?那就会每一个不同的组合都会形成一种Class.系统会不会复杂了呢?那我们就用Decorato模式搞定.    

 

public class TestDecorator {
 
	 //抽象类,每个装饰类都要继承它.也可以用interface
	 private abstract class Component{
	         public abstract void print();
	 }
	 
	 
	 //输出body.最原始的被装饰对象
	 private class BodyPrinter extends Component{
	         @Override
	         public void print() {
	                 System.out.println("it is body!");
	        }
	 }
 
	 //装饰上header
	 private class HeaderPrinter extends Component{
	           private Component component;
	           public HeaderPrinter(Component com){
	                     this.component=com;
	           }
	
	           @Override
	           public void print() {
	                     System.out.println("it is head");
	                     component.print();
	            }
	  
	 }

	 //装饰上footer
	 private class FooterPrinter extends Component{
	             private Component component;
	             public FooterPrinter(Component com){
	                     this.component=com;
	             }
	
	              @Override
	              public void print() {
	                     component.print();
	                     System.out.println("it is foot");
	              }
	 }

	 /**
	  * @param args
	  */
	 public  void Test() {
	           //以这样的方式装修对象,想怎么样装饰就怎么样装饰,灵活多变
	          Component b = new HeaderPrinter(new FooterPrinter(new BodyPrinter()));
	           b.print();
	           Component p = new HeaderPrinter(new HeaderPrinter(new BodyPrinter()));
	           p.print();
	
	 }
 
	 public static void main(String[] args){
	     TestDecorator t= new TestDecorator();
	     t.Test();
	 }
}
 

sitemesh的修饰机制就是运用了Decorator模式.其主要体现在DecoratorMapper上.要我们来看看.

 

3.sitemesh实现的效果

 

 

4.sitemesh 装饰流程

filter:和配置相应的url进入filter,进行装饰
pageParse: 当struts返回页面时,pageParse对页面解析成对象Page.page中的含有head,title,body,等属性
Page:struts返回页面的另一种表面形式
DecoratorMapper:确定什么样的方式来装饰页面,多种DecoratorMapper运用Decorator模式来动态装饰.
Decorator:确定以什么方式来装饰后,就开始装饰了.
View:装饰完了.

 

5.相应的配置文件:


 web.xml:

<?xml version="1.0" encoding="UTF-8"?>
	<!--
		如果在Decorators.xml中配置的装饰页面中,要取得struts的ActionContext的值时,要配置这个filter.看其原代码,
		在request中设置了一个计数值.如果值为零了就会清除actionContext
	-->
<filter>
	<filter-name>strutscleanup</filter-name>
	<filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp
	</filter-class>
</filter>
	<!-- freemarker 装饰页面用freemarkerPageFilter;jsp,html页面用PageFilter-->
<filter>
	<filter-name>sitemesh</filter-name>
	<!--
		<filter-class>org.apache.struts2.sitemesh.FreeMarkerPageFilter</filter-class>
	-->
	<filter-class>com.opensymphony.module.sitemesh.filter.PageFilter
	</filter-class>
</filter>
<filter>
	<filter-name>struts</filter-name>
	<filter-class>org.apache.struts2.dispatcher.FilterDispatcher
	</filter-class>
</filter>
<filter-mapping>
	<filter-name>strutscleanup</filter-name>
	<url-pattern>*.do</url-pattern>
</filter-mapping>
<filter-mapping>
	<filter-name>sitemesh</filter-name>
	<url-pattern>*.do</url-pattern>
</filter-mapping>
<filter-mapping>
	<filter-name>struts</filter-name>
	<url-pattern>*.do</url-pattern>
</filter-mapping>
	<!--
		如果Struts的result
		Type是freemarker的,要在freemaker页面中运用jsp标签,struts标签,就要配置下一个servlet
	-->
<servlet>
	<servlet-name>JspSupportServlet</servlet-name>
	<servlet-class>org.apache.struts2.views.JspSupportServlet
	</servlet-class>
	<load-on-startup>1</load-on-startup>
</servlet>
 

 

 Sitemesh.xml: 

<?xml version="1.0" encoding="UTF-8"?>
<!-- 如果有请求不用sitemesh来装饰,就就来配置这个哦.excludes相应的url-->
<property name="decorators-file" value="/WEB-INF/decorators.xml" />
<excludes file="${decorators-file}" />

<!-- 从struts返回的页面解析到page对象-->
<page-parsers>
	<parser default="true"
		class="com.opensymphony.module.sitemesh.parser.DefaultPageParser" />
	<parser content-type="text/html"
		class="com.opensymphony.module.sitemesh.parser.FastPageParser" />
</page-parsers>

<!--
sitemesh的核心.选择什么样来装饰页面.sitemesh启动的时候,会预先加载.会从下往上加载,由Decorator模式我们知道,下面的是上面的父类,所以在装饰的时候,会从下面的mapper往上装饰
-->
<decorator-mappers>

	<!--通过参数来决定用什么装饰器,如果有参数,那个最下面的mapper就失效-->

	<mapper
		class="com.opensymphony.module.sitemesh.mapper.PrintableDecoratorMapper">
		<param name="decorator" value="printable" />
		<param name="parameter.name" value="printable" />
		<param name="parameter.value" value="true" />
	</mapper>

	<!--根据语言会在原模板文件名上加了"-en","-zh",从而改变模板的文件名.当然可能会出现"-ie-zh",这样的形式-->
	<mapper
		class="com.opensymphony.module.sitemesh.mapper.LanguageDecoratorMapper">
		<param name="match.en" value="en" />
		<param name="match.zh" value="zh" />
	</mapper>

	<!--根据浏览器类型在原模板文件名上加上"-ie","-zh", -->
	<mapper class="com.opensymphony.module.sitemesh.mapper.AgentDecoratorMapper">
		<param name="match.MSIE" value="ie" />
		<param name="match.Mozilla" value="ns" />
		<param name="match.Opera" value="opera" />
		<param name="match.Lynx" value="lynx" />
	</mapper>

	<mapper class="com.opensymphony.module.sitemesh.mapper.RobotDecoratorMapper">
		<param name="decorator" value="robot" />
	</mapper>

	<!--通过参数来决定用什么装饰器,如果有参数,那个最下面的mapper就失效-->
	<mapper
		class="com.opensymphony.module.sitemesh.mapper.ParameterDecoratorMapper">
		<param name="decorator.parameter" value="decorator" />
		<param name="parameter.name" value="confirm" />
		<param name="parameter.value" value="true" />

	</mapper>

	<mapper class="com.opensymphony.module.sitemesh.mapper.FileDecoratorMapper">
	</mapper>

	<!-- 不同的url不同的装饰页面-->
	<mapper class="com.opensymphony.module.sitemesh.mapper.ConfigDecoratorMapper">
		<param name="config" value="/WEB-INF/decorators.xml" />
	</mapper>

</decorator-mappers>
 

 Decorators.xml:

 

<excludes>
	<pattern>/exclude/exclude.do</pattern>
	<pattern>/example/exclude.do</pattern>
</excludes>
<decorator name="main" page="main.jsp">
	<pattern>/example/*.do</pattern>
</decorator>
 

 

6注意点:


Decorator 模式 运用在DecoratorMapper,注意mapper的顺序,下面是的上面的父亲
在模板中运用ActionContext 内容
模板如果用freemarker,filter 作一个相应的修改FreemarkerFilter
模板是运用的缓存
有请求不用sitemesh,exclude

 

7:sitemesh和freemarker结合


1.web.xml中修改为freemarkerFilter


2.strtus.xml中action的result type="freemarker"


3.freemaker个人觉得不错的特点.
 速度好.robbin也说过"freemarker性能绝对没问题.其实view就不知道了"
 关于freemarker的${name},这样的形式,如果name为空就会出现黄黄的错误提示.个人觉得这个的出错提示,可以保证在view中展现的饱满度,而不会出现空信息的情况.


 freemaker中引用宏,宏是一个可以把页面结构做成函数的样式,重复利用.
 usermacro.ftl:

 <#macro greet mes="greet">
 <font size="2">${mes}</font>
 <#nested>
 </#macro>
 

 

 my.ftl: 

<#include "/example/usermacro.ftl" >
 <#assign ss=JspTaglibs["/WEB-INF/tld/struts-tags.tld"] />
 <html>
 <head>
     <title>this is title</title>
     this is head
 </head>

 <body>
 <h2>
 <@greet>this is nested</@greet><br>
 <@ss.property value="message"/>
 </h2>

 </body>
 </html>


 
分享到:
评论

相关推荐

    sitemesh-3.0.0的库和源码

    sitemesh-3.0.0的库和源码;从官网(https://github.com/sitemesh/sitemesh3)上下载的!

    SiteMesh教程及SiteMesh官方文档翻译

    web布局框架 SiteMesh教程及SiteMesh官方文档翻译

    sitemesh

    sitemesh 装饰 母版

    siteMesh demo+文档

    siteMesh demo siteMesh使用文档

    sitemesh.jar包

    sitemesh.jar包 sitemesh.jar 包sitemesh.jar 包sitemesh.jar包

    sitemesh-3.0.1-javadoc

    SiteMesh是一个网页布局和装饰框架以及Web应用程序集成框架,可帮助创建由页面组成的网站,这些页面需要一致的外观,导航和布局方案。 SiteMesh会拦截对通过Web服务器请求的任何静态或动态生成的HTML页面的请求,...

    MiddleGen+Sitemesh.zip

    MiddleGen-Hibernate: 本书使用版本:2.1 ... modtime=1096973436&big_mirror=0 下载文件:middlegen-2.1.zip MiddleGenIDE插件: 本书使用版本:1.2.0 ...(7)Sitemesh: ...下载文件:sitemesh-2.3.zip

    sitemesh-2.2.1.jar sitemesh-2.2.1.jar

    sitemesh-2.2.1.jar

    sitemesh-3.0.1.jar

    sitemesh 装饰页面技术.

    sitemesh框架简单例子

    很简单的sitemesh入门教程,希望对大家有所帮助

    Struts2整合SiteMesh技巧

    Struts 2.0提供一个Sitemesh插件,允许在Sitemesh模板中使用Struts标记。 要使用Sitemesh需要包含Freemark,Sitemesh和Sitemesh插件库文件。 配置过滤器 如果需要使用Freemark模板文件作为装饰器文件,需要在web....

    sitemesh-2.4.1.jar

    sitemesh-2.4.1.jar sitemesh-2.4.1.jar sitemesh-2.4.1.jar sitemesh-2.4.1.jar sitemesh-2.4.1.jar sitemesh-2.4.1.jar

    sitemesh jar包

    sitemesh jar包sitemesh jar包sitemesh jar包sitemesh jar包sitemesh jar包sitemesh jar包sitemesh jar包

    springMVC与sitemesh的结合

    springMVC与sitemesh的结合,

    SiteMesh教程.pdf

    SiteMesh教程.pdf

    JSP布局框架SiteMesh.zip

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

    spring-boot-sitemesh源码整合

    spring-boot-sitemesh 源码整合

    sitemesh 完美合集 4个资料和jar文件

    Sitemesh简介: SiteMesh是一个Web页面布局修饰框架, 用于构建包含大量页面, 需要一致的外观样式(look/fell), 导航和布局机制的大型网站. sitemesh应用Decorator模式,用filter截取request和response,把页面组件...

    sitemesh入门demo

    sitemesh入门demo。博客 Sitemesh入门和使用笔记 对应源码

    页面装饰器(sitemesh)实例源代码

    用sitemesh页面装饰器,将大名鼎鼎的开源即时通讯服务器openfire中运用的,布局页面抽取出来。MyEclipse中可以直接部署的代码。

Global site tag (gtag.js) - Google Analytics