使用SiteMesh 简化网页布局

本文介绍如何利用SiteMesh简化网页布局。通过配置装饰器和映射器,开发者无需关心页面的具体位置,仅需关注业务逻辑。系统改版时,只需调整装饰器即可。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用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 来确定那一个装饰器需要被应用。

4Servlet 向包含装饰器的 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 中配置装饰器文件及其匹配方式。当有页面需要输出到客户端时,将根据这些配置选择相应的装饰器来进行装饰,将装饰结果返回给客户界面。

内容概要:本书《Deep Reinforcement Learning with Guaranteed Performance》探讨了基于李雅普诺夫方法的深度强化学习及其在非线性系统最优控制中的应用。书中提出了一种近似最优自适应控制方法,结合泰勒展开、神经网络、估计器设计及滑模控制思想,解决了不同场景下的跟踪控制问题。该方法不仅保证了性能指标的渐近收敛,还确保了跟踪误差的渐近收敛至零。此外,书中还涉及了执行器饱和、冗余解析等问题,并提出了新的冗余解析方法,验证了所提方法的有效性和优越性。 适合人群:研究生及以上学历的研究人员,特别是从事自适应/最优控制、机器人学和动态神经网络领域的学术界和工业界研究人员。 使用场景及目标:①研究非线性系统的最优控制问题,特别是在存在输入约束和系统动力学的情况下;②解决带有参数不确定性的线性和非线性系统的跟踪控制问题;③探索基于李雅普诺夫方法的深度强化学习在非线性系统控制中的应用;④设计和验证针对冗余机械臂的新型冗余解析方法。 其他说明:本书分为七章,每章内容相对独立,便于读者理解。书中不仅提供了理论分析,还通过实际应用(如欠驱动船舶、冗余机械臂)验证了所提方法的有效性。此外,作者鼓励读者通过仿真和实验进一步验证书中提出的理论和技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值