您当前的位置: AG亚游集团 > 网站编程 > JSP教程 > JSP 2.0下的动态内容缓存分析讲解

JSP 2.0下的动态内容缓存分析讲解

作者:guanchaofeng 来源:本站整理 发布时间: 2009-11-12 21:51 点击: 次
在Web应用中,内容缓存是最普通的优化技术之一,并且能够很容易地实现。例如,可以使用一个自定义地JSP标签我们将之命名为<jc:cache>由<jc:cache>和</jc:cache>将每一个需要被缓存的页面片段封装起来。任何自定义标签可以控制它所包含部分(也即预先封

AG亚游集团,  方兴东身边从来不缺乏IT界。如前一阵雅虎中国的谢文,就是从互联网实验室走出去的。一个从互联网实验室走出去的人,如今成为雅虎,这个世界第一门户中国站的掌门人,这无疑从一个侧面反映了互联网实验室这个团队的整体素质。科技中国的主题博客也包括部分实验室内部的资深研究人员。更重要的是,科技中国的理念吸引了很多IT评论家的参与,可以预见,今后必将有更多业界精英来科技中国煮酒论英雄。

  后来的事实证明我临走前做的决定是十分正确的,在广元和九寨沟的几天效率极高,基本确定了狗剩2号的结构框架。那几天我们白天根据会务组的安排活动,晚上讨论狗剩2号的结构,并且根据讨论结果形成狗剩2号结构设计的初步文档,每天都到凌晨一、二点。由于处理器的寄存器重命名以及动态调度结构已经基本确定,因此讨论的重点是取指和访存部件的结构。适合女人做的生意  “我对挑字、排版作过不少改革,让工作效率高出了很多。”至今村田还把那段经历看作人生中很辉煌的时刻。

JSP 2.0下的动态内容缓存分析讲解

  在Web应用中,内容缓存是最普通的优化技术之一,并且能够很容易地实现。例如,可以使用一个自定义地JSP标签——我们将之命名为<jc:cache>——由<jc:cache>和</jc:cache>将每一个需要被缓存的页面片段封装起来。任何自定义标签可以控制它所包含部分(也即预先封装的页面片段)在何时执行,并且动态输出结果可以被捕获。<jc:cache>标签使得JSP容器(例如Tomcat)只生成内容一次,作为应用程序范围内的JSP变量,来存储每一个缓存片段。每次JSP页面被执行时,自定义标签将缓存页面片段载入而无需再次执行JSP代码来生成输出结果。作为Jakarta工程的一个部分,标签库的开发使用了这项技术。当被缓存内容无需被每一个用户或者请求所定制的时候,它工作的十分良好。
  
  这篇文章对上面描述的技术做了改进,通过使用JSP2.0表达式语言(EL),允许JSP页面为每一个请求和用户定制缓存内容。缓存页面片段可以包含未被JSP容器赋值的JSP表达式,在每一次页面被执行时,由自定义标签来确定这些表达式的值。因此,动态内容的建立被最优化,但是缓存片段可以含有部分由每一个请求使用本机JSP表达式语言产生的内容。通过JSP2.0ELAPI的帮助,Java开发者可以用表达式语言来使之成为可能。
  
  内容缓存VS数据缓存
  
  内容缓存不是唯一的选择。例如,从数据库中提取的数据同样可以被缓存。事实上,由于存储的信息中不包含HTMLmarkup,以及要求较少的内存,数据缓存可能更加高效率。然而在很多情况下,内存缓存更容易实现。假设在某个案例总,一个应用由大量事务对象,占用重要的CPU资源,产生复杂的数据,并且用JSP页面来呈现这些数据。工作一切良好,直到某天突然地服务器的负载增加,需要一个紧急解决方案。这时在事务对象和呈现表达层之间建立一个缓存层,时一个非常不错和有效的方案。但是必须非常快速和流畅地修改缓存动态内容的JSP页面。相对于简单的JSP页面编辑,应用程序的业务逻辑变化通常要求更多的工作量和测试;另外,如果一个页面从多个复合源聚合信息时,Web层仅有少量的改变。问题在于,当缓存信息变得失去时效时,缓存空间需要被释放,而事务对象应该知道何时发生这种情况。然而,选择实现内容缓存还是数据缓存,或者其他的优化技术,有很多不得不考虑的因素,有时是所开发的程序所特殊要求的。
  
  数据缓存和内容缓存没有必要互相排斥,它们可以一起使用。例如,在数据库驱动的应用中;从数据库中提取出来的数据,和呈现该数据的HTML分别被缓存起来。这与使用JSP实时生成的模板有些相似。这篇文章中讨论的基于ELAPI技术说明如何使用JSPEL来将数据载入到呈现模板中。
  
  使用JSP变量缓存动态内容
  
  每当实现一个缓存机制是,都需要一个存储缓存对象的方法,在这篇文章中涉及的是String类型的对象。一种选择是使用一个对象——缓存框架结构,或者使用Javamaps来实现自定义的缓存方案。JSP已经拥有了称为“scopedattributes”或“JSPvariables”来提供ID——object映射,这正是缓存机制所需要的。对于使用page或者requestscope,这是没有意义的,而在应用范围内,这是一个很好的存储缓存内容的位置,因为它被所有的用户和页面共享。当每一个用户需要单独缓存时,Sessionscope也可以被使用,但这不是很有效率。JSTL标签库可以被是与那个来缓存内容,通过使用JSP变量正如下例所示:
  
  <%@taglibprefix="c"uri="/java5b02sun5b02com/jsp/jstl/core"%><c:iftest="${emptycachedFragment}">
  
  <c:setvar="cachedFragment"scope="application">
  
  ...
  
  </c:set></c:if>
  
  缓存页面片段用下列语句输出结果:
  
  ${applicationScope.cachedFragment}
  
  当缓存片段需要被每一个请求所定制的时候,到底发生了什么?例如,如果希望包含一个计数器,需要缓存两个片段:
  
  <%@taglibprefix="c"uri="/java5b02sun5b02com/jsp/jstl/core"%><c:iftest="${sessionScope.counter==null}"><c:setvar="counter"scope="session"value="0"/></c:if><c:setvar="counter"value="${counter+1}"scope="session"/><c:iftest="${emptycachedFragment1}">
  
  <c:setvar="cachedFragment1"scope="application">
  
  ...
  
  </c:set></c:if><c:iftest="${emptycachedFragment2}">
  
  <c:setvar="cachedFragment2"scope="application">
  
  ...
  
  </c:set></c:if>
  
  可以使用下面语句输出缓存内容:
  
  ${cachedFragment1}${counter}${cachedFragment2}
  
  通过专门的标签库的帮助,需要定制的页面片段的缓存变得异常容易了。上面已经提及,缓存内容可以被开始标签(<jc:cache>)和结尾标签(</jc:cache>)封装起来。而每一个定制可以使用另一个标签(<jc:dynamicexpr="..."/>)输出一个JSP表达式(${...})来表现。动态内容用JSP表达式缓存并在每一次缓存内容被输出时赋值。在下面的部分可以看到这是如何实现的。Counter.jsp缓存了一个包含计数器的页面片段,当每一次用户刷新这个页面的时候计数器会自动+1。
  
  <%@taglibprefix="c"uri="/java5b02sun5b02com/jsp/jstl/core"%><%@taglibprefix="jc"uri="/devsphere5b02com/articles/jspcache"%><c:iftest="${sessionScope.counter==null}">
  
  <c:setvar="counter"scope="session"value="0"/></c:if><c:setvar="counter"value="${counter+1}"scope="session"/><jc:cacheid="cachedFragmentWithCounter">
  
  ...<jc:dynamicexpr="sessionScope.counter"/>
  
  ...</jc:cache>
  
  JSP变量易于使用,对于简单的Webapps,这是一个不错的内容缓存方案。然而,如果应用程序产生大量的动态内容,没有对缓存大小的控制无疑是一个问题。一种专用的缓存框架结构能够提供一个更加有力的方案,允许对缓存的监视,限制缓存大小,控制缓存策略,等等……
  
  使用JSP2.0表达式语言API
  
  JSP容器(例如Tomcat)对应用ELAPI的JSP页面中的表达式予以赋值,并且可以被Java代码所使用。这允许在Web页面外应用JSPEL作开发,例如,对XML文件、基于文本的资源以及自定义脚本。当需要控制何时对Web页面中的表达式进行赋值或者书写与之相关的表达式时,ELAPI同样是有用的。例如,缓存页面片段可以包含自定义JSP表达式,并且当每一次缓存内容被输出时,ELAPI将用来给这些表达式赋值或者重新赋值。
  
  文章提供了一个例子程序(参见文末资源部分),这个应用程序包含了一个Java类(JspUtils)和类中包含一个方法eval(),这个方法有三个参数:JSP表达式、表达式的期望类型和一个JSPcontext对象。Eval()方法从JSPcontext中取得ExpressionEvaluator并且调用evaluate()方法,通过表达式、表达式的期望类型、和一个从JSPcongtext中获得的变量。JspUtils.eval()方法返回表达式的值。
  
  packagecom.devsphere.articles.jspcache;
  
  importjavax.servlet.jsp.JspContext;
  
  importjavax.servlet.jsp.JspException;
  
  importjavax.servlet.jsp.PageContext;
  
  importjavax.servlet.jsp.el.ELException;
  
  importjavax.servlet.jsp.el.ExpressionEvaluator;
  
  importjava.io.IOException;publicclassJspUtils{
  
  publicstaticObjecteval(
  
  Stringexpr,Classtype,JspContextjspContext)
  
  throwsJspException{
  
  try{
  
  if(expr.indexOf("${")==-1)
  
  returnexpr;
  
  ExpressionEvaluatorevaluator
  
  =jspContext.getExpressionEvaluator();
  
  returnevaluator.evaluate(expr,type,
  
  jspContext.getVariableResolver(),null);
  
  }catch(ELExceptione){
  
  thrownewJspException(e);
  
  }
  
  }
  
  ...}
  
  注意:JspUtils.eval()主要封装了标准的ExpressionEvaluator。如果expr不包含${,JSPELAPI不被调用,因为没有JSP表达式。

本文"JSP 2.0下的动态内容缓存分析讲解"由远航站长收集整理而来,仅供大家学习与参考使用。更多AG亚游集团尽在远航站长站。
顶一下
(0)
0%
踩一下
(0)
0%
[点击 次] [返回上一页] [打印]
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 密码: 验证码:
关于本站 - 联系我们 - 广告合作 - 网站声明 - 友情连接- 网站地图 - 站点地图 - 返回顶部
Copyright © 2007-2013 www.yhzhan.com(AG亚游集团). All Rights Reserved .
远航站长:为中小站长提供最佳的学习与交流平台,提供网页制作与网站编程等各类AG亚游集团.
官方QQ:445490277 网站群:26680406 网站备案号:豫ICP备07500620号-4
调查:台湾46%上班族是月光族 其中近15%借钱度日 广州发布企业引进奖励政策 最高奖5000万元 英国一战华工纪念碑筹款将完成 将于2018秋落成 交通部连发三文谈网约车:“烧钱大战”致乱象丛生 摩根大通前高管:银行很快会进入加密货币市场 皇马妖星欢迎巴萨截胡妖星:我们兄弟统治世界! 小伙酒后得知父母又吵架 回家掏出匕首重伤父亲 台“太阳花学运”案二审 黄国昌等22人再被判无罪 再出多少魏则西 才能唤醒百度的价值观? 法国马赛发生枪击事件 蒙面男子开枪造成1人受伤 英国驻华大使认为欧美达成协议对中国并不是坏消息 统计-金软景曾春蕾合砍51分 江苏袁心玥贡献22分
姚明再推小篮球提案:要让孩子从小感受到乐趣 SpaceX未来火箭什么样?马斯克发布新火箭模具照片 美国投资研究公司Zacks:百度股价为何下跌? 赫斯特百年版图背后的商业逻辑:敢于颠覆自己 美军在关岛部署B52H战略轰炸机 称向盟国表决心 男子巴厘岛水下拍摄 “人间天堂”尽是塑料垃圾(图) 明日开赛!上海环球马术冠军赛举行赛前新闻发布会 乔迪:伤病+罚单黄海连遭重击 我们用团结赢得胜利 苹果大涨4%创新高 市值距离突破万亿只差300亿美元! 加拿大数百名医生抗议涨工资 自称已经挣得太多 打造嘉年华 泛珠三角超级赛车节春季赛在即 白俄罗斯食品将从5月起在中国上架
女生发微博称来杭实习遭房东强奸未遂 男方回应 中兴通讯:成立董事会出口合规委员会 黑马、惜败、加洞 超级荔枝双山比洞赛演多场激战 印尼附近海域发生4.6级地震 震源深度66.4公里 “脸书”公开27页内部指引 用户可就被禁内容上诉 工人作业时发生事故死亡 工程负责人伪造现场被拘 欧洲央行维持三大利率不变 确认QE将在12月底结束 2018全球外籍员工高薪地排行:上海香港跻身前十 男子3万元放车顶撒一路 环卫工全数拾回(图) 小投资暴利 2016地摊暴利新产品 马云教你创业 养20头牛一年赚多少钱 AG亚游集团