使用SiteMesh 简化网页布局
1. 基本原理
SiteMesh 是以 Servlet 2.3API 为基础。它包含一个引擎,用来解析输出的网页或者网页片段,决定是否需要应用装饰器以及合并合适的装饰器。
SiteMesh 与应用内容无关,适用的内容格式包括 Html 、 JSP 、 Servlet 、 XSL ,甚至 CGI 。
2. 实现流程
1)当为 Servlet 容器指定一个Http请求时,SiteMesh 截取请求,使用一个 Servlet Filter,然后捕捉 Html 结果。
2)然后这个 Html 被解析,并且任何相关的内容都被提取到一个 Page 对象中。
3)询问 DecoratorMapper 来确定那一个装饰器需要被应用。
4)Servlet 向包含装饰器的 JSP 发送请求。
5)装饰器生成带有从 page 对象中获得的内容的 Html 布局。
大致流程如下图:
http://www.blogjava.net/images/blogjava_net/faith/13332/o_Sitemesh%e6%b5%81%e7%a8%8b.jpg
Sitemesh 这样的好处是,所有具体业务页面的开发者无需考虑该页面将处在最终输出页面的那个位置。无需 include 一大堆页面,以后如果系统整体改版,那么只需要改写装饰器页面及重新配置装饰规则即可完成,方便快捷,可维护性极好。
3. 在项目中使用 Sitemesh
1)将 sitemesh_[version].jar 包加到 WEB-INF\lib 下
2)在 web.xml 中增加
< filter >
< filter-name > sitemesh </ filter-name >
< filter-class > com.opensymphony.module.sitemesh.filter.PageFilter </ filter-class >
</ filter >
< filter-mapping >
< filter-name > sitemesh </ filter-name >
< url-pattern > /* </ url-pattern >
</ filter-mapping >
表示对系统中所有 url 请求均使用 sitemesh Filter 进行拦截。
3)在 WEB-INF 下配置 sitemesh.xml 和 decorator.xml 配置文件。
Sitemesh.xml
< sitemesh >
< property name ="decorators-file" value ="/WEB-INF/decorators.xml" />
< excludes file ="${decorators-file}" />
< page-parsers >
< parser default ="true" class ="com.opensymphony.module.sitemesh.parser.HTMLPageParser" />
< parser content-type ="text/html"
class ="com.opensymphony.module.sitemesh.parser.HTMLPageParser" />
< parser content-type ="text/html;charset=ISO-8859-1"
class ="com.opensymphony.module.sitemesh.parser.HTMLPageParser" />
</ page-parsers >
< decorator-mappers >
<!-- for print -->
< 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 >
< mapper class ="com.opensymphony.module.sitemesh.mapper.ConfigDecoratorMapper" >
< param name ="config" value ="${decorators-file}" />
</ mapper >
</ decorator-mappers >
</ sitemesh >
Decorator.xml
< decorators defaultdir ="/decorators" >
< excludes >
< pattern > /demos/* </ pattern >
< pattern > /resources/* </ pattern >
< pattern > /test* </ pattern >
< pattern > /FCKeditor/* </ pattern >
</ excludes >
<!-- decoratorforprint(hasparameter:printable=true) -->
< decorator name ="printable" page ="decPrintable.jsp" />
< decorator name ="login" page ="decLogin.jsp" >
< pattern > *login* </ pattern > <! —url映射模式-- >
</ decorator >
< decorator name ="default" page ="decDefault.jsp" >
< pattern > /* </ pattern > <! —缺省的装饰器-- >
</ decorator >
</ decorators >
在 sitemesh.xml 中配置了两个 DecoratorMapper : PrintableDecoratorMapper 和 ConfigDecoratorMapper 。
PrintableDecoratorMapper 是供打印专用,在 url 后加上 printable=true 即会使用 decorator.xml 中指定的 printable 装饰器来对页面进行装饰,一般来说打印页面是只需要打印本页面的内容,其余的如头、脚、导航栏、左右菜单等是不需要打印的,通过装饰器可以轻松实现打印页面的过滤。
4)创建一个装饰器 JSP 页面,建议所有装饰器页面放到 decorators 目录,并且以 dec[ 功能 ].jsp 作为命名方式,如 decPrintable.jsp 、 decDefault.jsp 。
下面是一个装饰器的代码:
<! DOCTYPEhtmlPUBLIC " -//W3C//DTDXHTML1.0Transitional//EN "
" http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd " >
<%-- Includecommonsetoftaglibrarydeclarations for eachlayout --%>
<% @includefile = " /common/taglibs.jsp " %>
< htmlxmlns = " http://www.w3.org/1999/xhtml " xml:lang = " en " >
< head >
< decorator:head />
</ head >
< body
< decorator:getPropertyproperty = " body.id " writeEntireProperty = " true " />
< decorator:getPropertyproperty = " body.onload " writeEntireProperty = " true " />
< decorator:getPropertyproperty = " body.onunload " writeEntireProperty = " true " />
>
<% @includefile = " /common/header.jsp " %>
< h1 >< decorator:getPropertyproperty = " page.heading " /></ h1 >
<% @includefile = " /common/messages.jsp " %>
< decorator:body />
< jsp:includepage = " /common/footer.jsp " />
</ body >
</ html >
注意其 <decorator:…> 标签,这些标签将被装饰的 page 页面的相应内容作为属性传入。 Page 页面的相关内容将放在 decorator 标签所指定的位置。
Title :标题
Head :头部,一般是公共的 js 、 css 及 meta 。
Body :被装饰的 page 的主体内容。
5) Sitemesh 通过在 sitemesh.xml 中配置 DecoratorMapper 配置映射器,通过在 decorator.xml 中配置装饰器文件及其匹配方式。当有页面需要输出到客户端时,将根据这些配置选择相应的装饰器来进行装饰,将装饰结果返回给客户界面。
分享到:
相关推荐
#### 使用SiteMesh简化网页布局 SiteMesh是一款用于Web应用程序中的页面布局和装饰的框架。它采用Decorator模式,通过过滤器(filter)拦截请求和响应,将不同的页面组件如头部(head)、主体内容(content)以及...
Sitemesh 是一个流行的页面布局和装饰框架,它可以为我们的应用程序提供统一的外观和感觉。Tiles2 虽然功能强大,但在某些情况下,Sitemesh 提供了更简单、更轻量级的解决方案。 首先,让我们理解 Spring MVC 和 ...
虽然Sitemesh简化了页面布局,但也要注意不要过度依赖装饰模板,因为过于复杂的设计可能会导致调试困难。同时,Sitemesh可能与某些复杂的JavaScript或AJAX交互不兼容,需要额外的调整。 总之,Sitemesh是提高Web...
SiteMesh 是一个开源的 Web 应用程序框架,主要用于页面布局和装饰,它可以帮助开发者实现网站的统一界面风格,简化页面的布局工作。在本示例中,我们将深入探讨 SiteMesh 的基本用法,特别是在登录和注册页面的应用...
总的来说,Sitemesh是一个强大且灵活的工具,它简化了Web页面布局的管理,让开发者能够专注于业务逻辑,而不必过于关心页面样式的一致性。通过这个简单的入门教程,你可以快速掌握Sitemesh的基本操作,并将其应用到...
Java Sitemesh是一个开源的页面布局和装饰框架,它的主要目标是帮助开发者统一网站的外观和感觉,提高代码复用性,并简化页面的复杂性。Sitemesh通过将页面分为内容区域和装饰模板来实现这一目标,使得开发者可以...
SiteMesh是一种用于Java Web应用的装饰器设计模式框架,主要通过拦截Web页面请求,动态...使用SiteMesh可以提高开发效率,简化Web应用的维护过程,并且可以随时更改网站的布局和风格而不需要修改每一个单独的页面文件。
而Sitemesh则是一个页面布局和装饰框架,主要用于处理Web应用中的页面布局问题,比如统一头部、底部和侧边栏,提升用户体验并简化开发。 将Spring MVC与Sitemesh结合使用,可以实现更高效的Web应用开发。以下是对这...
总的来说,Sitemesh是一个强大的工具,可以简化网页布局的设计和维护。通过学习和实践"Sitemesh 例子",你将能够有效地组织和美化你的Java Web应用。在实际开发中,你可以根据需要自定义装饰器,实现复杂布局,同时...
Sitemesh 是一个开源的 Web 应用程序装饰框架,主要用于解决网页布局和页面统一风格的问题。它通过拦截 HTTP 请求,将请求的页面内容与预先定义好的模板结合,使得开发者可以轻松地创建出统一的网站外观和感觉。在...
总的来说,Sitemesh通过提供页面装饰功能,简化了Web应用的界面设计,使开发者可以专注于业务逻辑,而无需过多关注页面布局。在Openfire这样的大型项目中,Sitemesh的应用可以提升整体的用户体验,同时降低了维护...
通过这种方式,Sitemesh简化了网页布局的工作,使得开发者能够专注于内容的创建,而无需关心页面的外观一致性。这种装饰器(decorator)的概念是软件设计模式中的一个重要概念,它允许你对对象的行为进行扩展,而...
- **性能考虑**:虽然Sitemesh简化了页面布局的处理,但在大型项目中仍需关注性能问题,特别是在部署到生产环境时,需确保资源的高效加载和缓存策略的有效实施。 通过上述步骤,可以有效地将Freemarker和Sitemesh...
6. **工具集成**:许多现代的开发环境和构建工具,如 Maven 或 Gradle,都有插件可以简化 SiteMesh 的集成。例如,使用 Maven 的 `sitemesh-maven-plugin` 可以帮助你在构建过程中自动处理 Decorator。 7. **最佳...
优点:SiteMesh简化了页面布局的管理,提供了强大的页面装饰能力,并且易于集成到现有的MVC框架中。缺点:对于复杂的页面布局和动态生成的内容,配置可能会变得复杂。 8. **最佳实践**: - 尽量保持装饰器模板...
通过使用 Sitemesh,我们可以将通用的头部、底部和侧边栏等元素统一管理,从而简化页面模板的设计,提高代码复用率。 在本文中,我们将探讨 Sitemesh 的基本原理和如何在实际项目中应用装饰器。 首先,我们需要...
在本项目中,Spring MVC与两个额外的技术——Sitemesh和Velocity进行了整合,增强了应用的模板渲染和页面布局能力。 Sitemesh 是一个开源的Web应用装饰器框架,主要用于统一网站的页面布局和样式。通过Sitemesh,...
SiteMesh则是一个网页布局和装饰框架,它允许开发者定义全局的页面头部、底部和侧边栏,以便在多个页面间共享。将Struts2与SiteMesh整合,可以实现更加统一和规范化的网站外观,并减少重复代码。 整合Struts2和...