SiteMesh3简介

阅读更多

转自:https://blog.csdn.net/wangxiaoan1234/article/details/77017546

 

 

介绍

SiteMesh 是一个网页布局和修饰的框架,利用它可以将网页的内容和页面结构分离,以达到页面结构共享的目的

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

 

下图是SiteMesh的结构图 :

 
SiteMesh3简介_第1张图片
 

 

工作原理

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文件添加以下依赖:



     org.sitemesh
     sitemesh
     3.0.1
 

 

2、web.xml中添加SiteMesh过滤器


  ...
    
        sitemesh
        org.sitemesh.config.ConfigurableSiteMeshFilter
    
    
        sitemesh
        /*
    

3、创建一个“装饰页面”(decorator page)

该装饰页面包含Web应用程序中常见得布局和样式,它是一个包含,<head>和<body>元素的模板。它至少要包含:</p> <p> </p> <pre name="code" class="java"><HTML> <HEAD> <title> <sitemesh:write property ='title'/> </ title> <sitemesh:write property ='head'/> </HEAD> <BODY> <sitemesh:write property ='body'/> </BODY> </HTML></pre> <p>标签<sitemesh:write property='...'/>将会被SiteMesh重写,用来包含从“被装饰页面”(content page)中提取到的值。可以从被装饰页面”(content page)中提取更多的属性,并且可以自定义规则 。 </p> <p>在WEB应用程序中创建/decorator.html,其中包含:</p> <pre name="code" class="java"><html> <head> <title>SiteMesh example: <sitemesh:write property='title'>Title goes here</sitemesh:write>

SiteMesh example site: Title goes here

Body goes here. Blah blah blah.
Site disclaimer. This is an example.

在这个例子中,装饰页面是一个静态的.html文件,但是如果你希望用动态页面,那么可以使用诸如JSP,FreeMarker等技术。

有点模板引擎的意思,装饰页面是模板,以被装饰页面的各类标签为值对模板进行替换

 

4、创建一个“被装饰页面”(content page)


  
    Hello World
  
  
    

Well hello there, fine world.

And so concludes this SiteMesh example.

How it works

  • This page (/index.html) contains vanilla HTML content.
  • SiteMesh is configured (in /WEB-INF/web.xml) to apply a decorator to all paths (/*).
  • The decorator (/decorator.html) contains the common look and feel that is applied to the site.

 像装饰页面一样,被装饰页面可以是静态文件,也可以是由Servlet引擎动态生成(例如JSP)。

 

5、配置

SiteMesh配置支持两种方法 : XML或Java。

 

  5.1、XML方式

在工程的 /WEB-INF/sitemesh3.xml中添加以下设置:

 


  

 

  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的设置改成如下所示:

 
    sitemesh
    com.xxx.MySiteMeshFilter


    sitemesh
    /*

 

6、查看效果

本地查看内容页面.html效果如下: 

SiteMesh3简介_第2张图片

 

通过SiteMesh3装饰后访问效果如下: 

SiteMesh3简介_第3张图片
 

查看该效果页面源代码如下:


  
    SiteMesh example: Hello World (Dynamic)
    
    
  
  
    

SiteMesh example site: Hello World (Dynamic)

This page demonstrates that dynamic content can be decorated in the same way as static content.

This is a simple JSP that shows the date and time on the server is now:

Tue Aug 15 14:25:41 CST 2017

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.

Site disclaimer. This is an example.

   

7、高级配置

  7.1、XML形式配置

sitemesh3.xml文件如下:



    
    text/html
    application/vnd.wap.xhtml+xml
    application/xhtml+xml 

    
    
 
    
    
    
 
    
    
        /articles/*
        /decorators/article.html
        /decorators/two-page-layout.html
        /decorators/common.html
     
 
    
    
 
    
    
        
        
  

 

  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中还可以指定请求来源:


    sitemesh
    com.wangxiaoan1234.MySiteMeshFilter
  
  
    sitemesh
    /*
      FORWARD
      REQUEST 
  
  
  
    

Well hello there, fine world.

And so concludes this SiteMesh example.

©wangxiaoan1234.com

 

效果:

效果页面源码:

 



  SiteMesh example: Hello World
  
  
  
    

pppppppppppppppppppppp

©wangxiaoan1234.com

 

  • SiteMesh3简介_第4张图片
  • 大小: 40.8 KB
  • SiteMesh3简介_第5张图片
  • 大小: 34.5 KB
  • SiteMesh3简介_第6张图片
  • 大小: 42.3 KB
  • SiteMesh3简介_第7张图片
  • 大小: 5.7 KB
  • 查看图片附件

你可能感兴趣的:(SiteMesh3简介)