|
|
上海地区专业的网上书店 一次性购物满100元即可享受VIP会员价格优惠 |
|
| 首页 | 新书上市 | 畅销推荐 | 礼品图书 | 分类浏览 | 在线阅读 | 出版社专区 | 图书热评 | 求购登记 | 顾客留言 | 图书拾零 |
| 您的当前位置:新书城>在线阅读>Java/J2EE/JSP | |
[转帖]活用SiteMesh,一个装饰器就可支撑整个网站结构来源:CSDN 作者:fly_ryan 发布时间:2008-4-1 人气:884 |
|
在寻求网站结构的高效统一上,SiteMesh通过Decorator的设计模式,十分利索地达到了目的。其设计思想是,用户发送request至服务器,服务器根据此request生成动态数据,生成网页,准备返回给客户端。就在返回前,SiteMesh进行拦截,对此网页进行解析,将title、body等部分拆解出来,套上模板后,再返回给客户端。由于SiteMesh在返回客户端的最后一步工作,此时的网页已经具备了标准的html网页格式,因此SiteMesh只需解析标准的html网页,无需考虑各个Web应用是应用了JSP、ASP,还是Velocity技术,相当灵活。 一般情况下,我们在decorators.xml文件中定义一个模板main.jsp,来自动套用未加装饰的网页: <decorators defaultdir="/decorators"> main_decorator.jsp是默认的装饰器,其pattern应用于所有的网页。其典型的代码如下: 1: <%@page contentType="text/html"%> 假设有一个未加装饰的网页index.jsp如下: <%@page contentType="text/html; charset=gb2312"%> 当SiteMesh工作时,它会分解出title及body的内容,并将其分别通过<decorator:title>及<decorator:body>套用到默认的main.jsp上。 好,首页工作得很好,我们准备装饰第二个网页downlaod.jsp。此网页的内容如下: <%@page contentType="text/html; charset=gb2312"%> 我们发现,当main_decorator.jsp这个装饰器装饰此网页上时,title及body均没问题。但在第34行,作为下载页面的sidebar不应该是rootsidebar,而应是downloadsidebar,即第34行的代码应为: 34: <page:applyDecorator page="/downloadsidebar.jsp" name="sidebar" /> 很显然,我们需要另外一个装饰器,于是我们将第34行改后另存为一个名为download_decorator.jsp的装饰器,还是存于/decorators下面。 相应地,在download.jsp的<title>此行上加上: <meta name="decorator" content="download_decorator" /> SiteMesh将根据此元数据的指示,自动调用download_decorator.jsp的装饰器。 但观察两个装饰器,只有第34行不同。只因为一行不同而需要创建另一个装饰器,代价较高。而往下,每一个需要不同的sidebar的页面都必须另行创建一个新装饰器。看来这种方式令人无法忍受。我们注意到,title、body与sidebar都是被装饰的部分,但title及body却可以不用修改装饰器实现共享,而sidebar的装饰部分却不行。title及body均是由<decorator>标签来实现,而sidebar由<page:applyDecorator>来实现。看来不同的结果就源自于这两个标签的不同之上。 我们来看SiteMesh后台的实现原理。SiteMesh在装饰网页时,先分解出index.jsp及download.jsp的title及body,然后读取装饰器,遇到<decorator>标签时,换入title及body的内容。遇到<page:applyDecorator>时,读取其page属性所指定的网页,然后应用名为sidebar的另一个装饰器来装饰sidebar,装饰完后再将结果换进main_decorator。看来,两者的区别在于<decorator>所加工的素材是未装饰的网页已经主动提供的,而因为我们不能主动提供素材给<page:applyDecorator>,因此main_decorator必须自己去找。这就是它们的本质区别。 这使我们想起设计思想中的依赖注入模式。<decorator>就是一个setter,而<page:applyDecorator>则是一个getter,因此它必须自己去寻找所需的素材。如果我们能根据依赖注入模式,为其注入所需素材,那么,就像<decorator>一样,它也不需要再变了。 实现的思路是,download.jsp负责传递一个含有具体page文件名的参数给<page:applyDecorator>,然后,<page:applyDecorator>将其值赋于page属性。对于download.jsp来讲,存放于参数的好地方是网页中的<meta>部分。因此,在其<title>之上加上这一行: <meta name="sidebar" content="/downloadsidebar.jsp" /> 这样,<page:applyDecorator>就有机会读取此参数了。配合使用SiteMesh的另一个标签<decorator:usePage>,我们可以顺利地为page属性设定值。 <decorator:usePage id="myPage" /> 通过这种方法,将原来的由main_decorator主动索取sidebar文件名的方式,改为其被动地接收参数,然后由在各个页面中通过设定meta name="sidebar"的方式,将sidebar文件名传入。从对象责任的角度来看,也正应页面才能知道其sidebar是什么。从而在SiteMesh中成功地应用于依赖注入的模式。 这样,只需一个装饰器,就可以支撑整个网站的结构了。 本文地址:http://read.newbooks.com.cn/info/196576.html |
|
| 正在装载数据…… | |
|
上一篇: 在Dreamweaver中显示struts标签 下一篇: JSP页面如何访问Servlet |
|
| 本站所有文章由本站会员原创或转载,与本网站无关,如您认为侵权请来信说明。 |
·电话:021-66822880 ·邮箱: ·客服时间( 周一 至 周六 9:00-18:00
)Copyright © 新书城 2006-2007 , All Rights Reserved 沪ICP备06028173号 |
||