siteMesh3 官方文档的简单翻译
只是简单的翻译了部分觉得有用的内容
http://wiki.sitemesh.org/wiki/display/sitemesh3/Getting+Started+with+SiteMesh+3
在Web应用程序中,SiteMesh充当服务者过滤器。它允许Servlet引擎正常处理请求,但是生成的HTML(称为内容)将在返回给浏览器之前被拦截。
截获的内容具有提取的某些属性(通常是<title>,<head>和<body>标记的内容,然后传递给第二个请求,该请求应返回该站点的通用外观(称为装饰器)。装饰器包含占位符,用于将从内容提取的属性插入到这些占位符。
在幕后,SiteMesh体系结构的关键组件是内容处理器。这是用于从HTML内容转换和提取内容的高效引擎。对于大多数用户来说,可以使用它,但也可以定义自己的转换和提取规则。
SiteMesh不在乎使用什么技术来生成内容或装饰器。它们可能是静态文件,Servlet,JSP,其他过滤器,MVC框架等。只要由Servlet引擎提供服务,SiteMesh便可以使用它。
依存关系
运行SiteMesh3至少需要:
JDK 1.5
符合Servlet 2.5的容器
SiteMesh运行时库
应该下载SiteMesh库并将其放在/ WEB-INF / lib /中。http://github.com/sitemesh/sitemesh3/downloads
Insert the SiteMesh Filter in /WEB-INF/web.xml
<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>
创建一个装饰器
装饰器包含应应用于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将重写<sitemesh:write property ='...'/>标记,以包括从内容中提取的属性。 可以从内容中提取更多属性,并且可以定义自己的规则-这将在另一篇教程中介绍。
最低限度的装饰器不是很有用。 让我们添加一些样式和一些常见的布局。
在您的网络应用程序中创建文件/decorator.html,其中包含:
<html> <head> <title>SiteMesh example: <sitemesh:write property='title'/></title> <style type='text/css'> /* Some 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; } .mainBody { padding: 10px; border: 1px solid #555555; } .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'/></h1> <div class='mainBody'> <sitemesh:write property='body'/> </div> <div class='disclaimer'>Site disclaimer. This is an example.</div> </body> </html>
在此示例中,装饰器是一个静态的.html文件,但是如果您希望装饰器更加动态,可以使用JSP,FreeMarker等技术。 SiteMesh不在乎-它只需要Servlet引擎可以提供内容的路径。
配置
需要对SiteMesh进行配置,以了解此装饰器及其应如何处理。
配置文件应该在/WEB-INF/sitemesh3.xml中创建:
<sitemesh> <mapping path="/*" decorator="/decorator.html"/> </sitemesh>
这告诉SiteMesh,与路径/ *匹配的请求(即所有请求)都应使用我们刚刚创建的/decorator.html装饰。
如果您不喜欢必须使用XML来配置SiteMesh的想法,请不必担心-存在其他机制,包括直接在WEB-INF / web.xml中,以编程方式通过Java API,通过Spring,通过命名约定, 或您选择插入的任何自定义方式。这些将在另一篇文章中进一步说明。
创建一些内容
现在创建一些内容。 这是用纯HTML内容定义的。 创建/hello.html:
<html> <head> <title>Hello World</title> <meta name='description' content='A simple page'> </head> <body> <p>Hello <strong>world</strong>!</p> </body> </html>
与装饰器一样,内容可以是静态文件,也可以由Servlet引擎(例如JSP)动态生成。
The result
Pointing your browser to http://myserver/hello.html will serve the content you just created, with the decorator applied. The resulting merged HTML will look like this:
<html> <head> <title>SiteMesh example: Hello World</title> <style type='text/css'> /* Some 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; } .mainBody { padding: 10px; border: 1px solid #555555; } .disclaimer { text-align: center; border-top: 1px solid #cccccc; margin-top: 40px; color: #666666; font-size: smaller; } </style> <meta name='description' content='A simple page'> </head> <body> <h1 class='title'>SiteMesh example site: Hello World</h1> <div class='mainBody'> <p>Hello <strong>world</strong>!</p> </div> <div class='disclaimer'>Site disclaimer. This is an example.</div> </body> As you can see, the <title>, <head> and <body> have been extracted from the content and inserted into the decorator template.</html>
摘要
快速回顾:
通过将库jar放在/ WEB-INF / lib中并在/WEB-INF/web.xml中创建过滤器(带有映射)来安装SiteMesh。
可以通过创建/WEB-INF/sitemesh3.xml文件或通过其他配置方法进行配置
筛选器拦截对Content的请求,通过Content Processor运行它,并与Decorator合并
内容由HTML页面定义,该页面包含网站的原始HTML内容
装饰器还由HTML页面定义,该页面包含网站的外观和占位符,以及占位符<sitemesh:write>标记,用于指示应在何处合并内容。
内容处理器包含提取和转换内容的规则-它具有一些简单的默认规则,可以自定义
Configuring SiteMesh 3
SiteMesh supports two main approaches to configurations - XML or Java. It's up to you which you use. In fact, you can even use them both.
xml 特点
- Simplest to get started with
- Automatically reloads when config file changes
- Does not require Java programming
java 特点
- Allows for greater customization of SiteMesh
- Avoids yet another configuration file
- Can be used from higher level languages such as JRuby, Groovy, Scala...
XML based configuration
The configuration file should live in /WEB-INF/sitemesh3.xml in your web-application.
<sitemesh> <mapping path="/*" decorator="/decorator.html"/> <mapping path="/admin/*" decorator="/admin-decorator.html"/> </sitemesh>
Java based configuration
要使用基于Java的配置,请子类org.sitemesh.config.ConfigurableSiteMeshFilter并重载applyCustomConfiguration(SiteMeshFilterBuilder builder)方法。 您将获得一个可用于配置SiteMesh的对象。 然后,您可以将此过滤器部署到Web应用程序中。
public class MySiteMeshFilter extends ConfigurableSiteMeshFilter { @Override protected void applyCustomConfiguration(SiteMeshFilterBuilder builder) { builder.addDecoratorPath("/*", "/decorator.html") .addDecoratorPath("/admin/*", "/admin/decorator.html"); } }
注意:SiteMeshFilterBuilder类支持可链接的API,其中每个方法都返回其自身的实例。 这是一种方便,但是您不必使用此样式。
注意:如果您还有XML配置文件,SiteMesh将在调用applyCustomConfiguration()之前加载此文件。 这使您可以将XML用于某些配置,将Java用于更高级的方面。
Configuring Decorator Mappings
这是应用于SiteMesh的最常见配置-映射根据路径应用装饰器。
您可以做的事情:
将默认的装饰器映射到所有路径
将装饰器映射到特定路径
将多个装饰器映射到路径-每个装饰器都将应用于前一个的结果
排除装饰路径
<sitemesh> <!-- Map default decorator. This shall be applied to all paths if no other paths match. --> <mapping decorator="/default-decorator.html"/> <!-- Map decorators to path patterns. --> <mapping path="/admin/*" decorator="/another-decorator.html"/> <mapping path="/*.special.jsp" decorator="/special-decorator.html"/> <!-- Alternative convention. This is more verbose but allows multiple decorators to be applied to a single path. --> <mapping> <path>/articles/*</path> <decorator>/decorators/article.html</decorator> <decorator>/decorators/two-page-layout.html</decorator> <decorator>/decorators/common.html</decorator> </mapping> <!-- Exclude path from decoration. --> <mapping path="/javadoc/*" exclue="true"/> <mapping path="/brochures/*" exclue="true"/> </sitemesh>
Java
public class MySiteMeshFilter extends ConfigurableSiteMeshFilter { @Override protected void applyCustomConfiguration(SiteMeshFilterBuilder builder) { // Map default decorator. This shall be applied to all paths if no other paths match. builder.addDecoratorPath("/*", "/default-decorator.html") // Map decorators to path patterns. .addDecoratorPath("/admin/*", "/another-decorator.html") .addDecoratorPath("/*.special.jsp", "/special-decorator.html") // Map multiple decorators to the a single path. .addDecoratorPaths("/articles/*", "/decorators/article.html", "/decoratos/two-page-layout.html", "/decorators/common.html") // Exclude path from decoration. .addExcludedPath("/javadoc/*") .addExcludedPath("/brochures/*"); } }
Advanced Configuration
For most users, the decorator mappings above should be enough. But if you want more options...
MIME Types
默认情况下,SiteMesh将仅拦截将Content-Type HTTP标头设置为text / html的响应。
可以对其进行更改以允许SiteMesh截获其他类型的响应。 这仅适用于SiteMesh筛选器-脱机站点构建器将忽略它。
<sitemesh> <mime-type>text/html</mime-type> <mime-type>application/vnd.wap.xhtml+xml</mime-type> <mime-type>application/xhtml+xml</mime-type> ... </sitemesh>
Java
public class MySiteMeshFilter extends ConfigurableSiteMeshFilter { @Override protected void applyCustomConfiguration(SiteMeshFilterBuilder builder) { builder.setMimeTypes("text/html", "application/xhtml+xml", "application/vnd.wap.xhtml+xml"); } }
部署标记规则包
SiteMesh的一项高级功能是能够定义用于处理页面上的标签的自定义规则。 这些是实现org.sitemesh.content.tagrules.TagRuleBundle的类
XML
<sitemesh> <content-processor> <tag-rule-bundle class="com.something.CssCompressingBundle" /> <tag-rule-bundle class="com.something.LinkRewritingBundle"/> </content-processor> ... </sitemesh>
Java
public class MySiteMeshFilter extends ConfigurableSiteMeshFilter { @Override protected void applyCustomConfiguration(SiteMeshFilterBuilder builder) { builder.addTagRuleBundles(new CssCompressingBundle(), new LinkRewritingBundle()); } }
Building Offline Websites with SiteMesh 3
==使用siteMesh3构建脱机网站, ----略