文献翻译
题目小型网上商城的设计与实现 学生姓名******
专业班级************************* 学号************ 院(系)软件学院
指导老师(职称)************ 完成时间2015年 4 月14 日
改进性能的JSP切分
作者:Takuya NakaikeIBM Japan, Ltd
摘要
当网页应用服务器能分别存储通过执行JSP片段获得的网页页面片段时,把一个
JSP(Java服务器页面)页面切分成若干个片段能改进JSP页面的执行性能。如果一个JSP
页面根据通过执行JSP页面获得的网页页面的每一个部分的不断跟新被切成若干片段,所有切分的JSP片段不需要被再次执行,只有当需要调用的网页片段在缓存中过期了。另外,一个JSP页面的片段能够被其他的JSP页面再次使用。在这两种情况下,所有的从JSP页面中切分的JSP片段的执行结果必须与在JSP页面切分之前一样。在这篇文章中,本文提出JSP切分,它是一种把JSP页面切分成片段的方法,维持了存在于源JSP页面的数据和控制依赖。JSP切分自动检测了需要维持JSP页面的数据和控制依赖的部分,因为开发者想要从JSP页面中切分这部分。我们使用GUI工具实施JSP切分,并且证实切分的JSP片段和JSP页面切分之前是以同一方式执行的。实验结果显示通过切分一个JSP页面为片段和为通过执行JSP片段获得的网页片段设置不同的存储方法能够减少访问网页的响应时间。
1.引言
当网页应用服务器能够分别的存储通过执行JSP页面的片段获得的网页片段时,把一个JSP页面切分成若干片段能改善一些JSP页面的执行性能。由于内容的动态性,通过JSP引擎产生的存储动态网页的方法是受限的。当通过JSP引擎产生的网页的存储内容被更新,整个JSP页面必须在应用服务器上再次被执行,尽管网页的改变可能很小。由于存储网页的不断更新增加应用服务器上的负载,它合理的把JSP页面切分成为若干个片段,并且为通过执行JSP片段获得的网页片段设置不同的存储方法。当然,网页片段必须被正确的合并为一个最终的网页。IBM的WebSphere应用服务器的动态缓存技术允许网页片段有不同的存储方法。由Apache Jakarta项目提供的存储标签库也为JSP片段支持不同的存储方法。另外,ESI(Edge Side Includes)技术为使用不同的存储方法存储网页片段提供了一个机制,并且在一个边缘服务器上把他们合并成一个最终的网页。
IBM的WebSphere边缘服务器的应用卸载技术是改善JSP页面执行性能的另一种方法。这种技术允许一个或多个JSP片段在边缘服务器上存储或执行。其余的JSP片段部署在应用服务器上并且访问在边缘服务器上执行的JSP片段。因此,一些JSP页面的执行被下载到边缘服务器上。
切分一个JSP页面便于JSP片段的重用。当一个网页应用包含许多JSP页面时,相同的部分倾向于存在许多的JSP页面中。例如框架,横幅,标题等。
当一个JSP页面被切分发为若干个片段时,所有片段的总的执行结果必须与在切分之前是一样的。另外,当JSP页面的片段在不同的服务器上执行时,每一个片段需要在没有其他片段的时候执行。为了满足这些条件,我们提出了JSP切分,它是一种在本文中描述的把一个JSP页面切分成若干片段的方法,由于为了一些特别的目的很难自动的找到最好的方法来把JSP页面切分成若干个片段,我们假设开发者会选择他们想要切分的片段的那部分。为了正确的执行所有分开的JSP页面,JSP切分自动地检测了一些部分,那些部分必须和一些选择的部分被移动或复制到一个片段中。这个检测是基于对存在于JSP页面中的数据和控制依赖做的。JSP切分类似于程序切片技术,它是基于数据和控制依赖切一个程序的。然而,程序的切片技术没有考虑到被切的程序能被的执行,以及切的程序的总的执行结果必须和没有分离以前是一致的。另外,由于数据在JSP页面的执行中被传送到JSP引擎,JSP引擎的源程序,例如Apache Tomcat,为了正确的分析数据依赖是必须的。这是不切实际的,因为JSP引擎的源程序是非常大而且复杂的。JSP切分通过利用JSP特征避免了JSP引擎的分析。
这篇文章的其余编排如下。章节2解释了把JSP页面切分成若干个片段的难点。章节3给出了切分一个JSP页面算法的详情。章节4描述了JSP切分工具是JSP切分的实现工具并演示了由这个工具是如何把一个JSP例子切分的。章节5显示了通过在IBM WebSphere应用服务器上使用不同的存储方法来执行切分JSP片段获得的实验的结果。章节6讨论有关我们的贡献的先前的工作。最后一章节是结论。
2.切分JSP页面的难点
在这篇文章中,切分一个JSP页面意味着JSP页面的一些部分是从JSP页面
中切出来的并且保存为新的JSP页面。这种新的创建JSP页面包括使用一些如jsp(包括标签)的源JSP页面。我们称包含的JSP页面为JSP片段,并且称调用JSP片段的JSP页面为主JSP页面。一个主JSP页面调用JSP片段并且接受通过执行他们获得的网页片段。然后主JSP页面合并它自己的网页片段和从JSP片段中接收的网页片段,并且创建了一个最终的网页。
JSP片段不是总是在同一服务器和同一时间执行的。应用卸载技术允许主JSP页面和JSP片段在不同的服务器上执行。当ESI机制被使用,ESI:包括标签被放入通过执行一个主JSP页面获得的网页片段和在边缘服务器上解释来支持ESI机制。在这种情况下,边缘服务器会检查是否是由ESI指定的网页片段:包括存在于它的缓存中的标签。如果网页片段的内容没有被存储或者已经满了,JSP片段会从边缘服务器调用,并且在一个或多个应用服务器上执行。如果不同的存储方法能够考虑通过执行JSP片段获得的网页片段。每一个JSP片段只有在存储的内容满时才被执行。这种动态存储技术,ESI机制,和存储标签库能够为网页片段提供的不同的存储方法。
当JSP页面被切分成若干片段,下面的两个条件必须满足,即使主JSP页面还是JSP片段没有在同一服务器和同一时间执行。
条件. 1-1主JSP页面和JSP片段的最终执行结果要和JSP页面被切分之前一致。
条件. 1-2每一个JSP页面,无论是一个主JSP页面还是一个JSP片段,能够在没有其它JSP页面下执行。
这些条件通过维持存在于JSP页面被切分成片段后的数据和控制自由来满足。然而,对开发者来说在一个JSP页面中监测数据和控制依赖是困难的,因为JSP页面的数据和控制流量能够在JSP页面中被分开,JSP引擎执行JSP页面,一些Java beans在JSP页面中被使用等等。因此,一个自然的解决方法需要自动地检测连接到开发者想要切分的那部分的数据依赖和控制依赖。
程序的切片技术检测了一组程序申明,它通过分析存在于程序中的数据和控制依赖来影响程序申明S。一个程序片包含了检测的一组程序申明和申明S。当调试和维护大的程序时,这个技术是有用的。因为JSP页面通过使用如Apache Jasper编译器那样的编译器被编译成servlet程序,JSP切分能够通过应用程序分化技术到JSP页面中编译的servlet中获得。然而,程序切片技术不足以切分一
个JSP页面为片段,因为这个技术没有考虑到程序切片被的执行。
图1显示了JSP页面例子的一部分和从JSP页面中编译的servlet 程序的例子。图2(a)显示了从servlet程序中获得的数据依赖图表。在这个程序中,当申明S1分配一个值到一个变量和申明S2跟S1使用那个值,一个真的数据依赖存在于S1和S2之间。这样一个数据依赖被记为S1->S2。在图2(a),基于数据依赖,对于申明S10的程序片包含S1,S9和S10。如果程序片是从servlet程序中切的,剩下的程序申明就有错误因为数据依赖S1->S2,S11和S12和S9->S11和S12是没有实践。因此,程序切片技术对于切分JSP页面没有做的很好。
(a) JSP页面部分
(b)servlet程序部分
图1.一个JSP页面例子和一个从JSP页面中编译得到的servlet程序
(a)正常的(b)对out忽略数据依赖
图2数据依赖图标
3.JSP切分
在这篇文章中,本文提出JSP切分,把JSP页面切分成若干片段的一个方法。这个提出的方法分析了从JSP页面中编译的servlet程序的数据和控制依赖。在分析的时候,JSP切分考虑到切分JSP页面会被的执行,并且可能不会在同一服务器和同一时间执行。首先,开发者想要切分为JSP片段的那部分被选择了。对于选择的部分需要满足条件1-1和1-2来被检测。被检测的部分要被分类到转移和复制的部分,并且为了满足开发者的意图要被最小化。
3.1不容忽略的数据依赖
基本上,JSP切分不允许依赖的申明被分别的切分。然而,如果这个规则太严格的被应用,在图1(b)中显示的申明没有能被分化的,因为从S1到S9开始有交错的依赖。
这里,我们考虑在图1(b)里显示的变量out是怎样使用的。变量out用于写一些网页的文本数据。注意out的值能够从一些JSP引擎中检索。当一个主JSP页面(Jm)包含通过使用JSP得到的JSP片段Jf:包括标签和JSP引擎两个都执行,Jm首先检索JSP引擎中的out的值并且写它自己的文本数据到这个值。接下来,Jm调用Jf。在被调用后,Jf也检索out的值并且写它自己的文本数据到这个值。通过Jf写的文本数据通过JSP引擎被返回到Jm,并且与Jm写的文本数据合并。这意味着out的值能够被一些JSP页面使用并且写入这个值的文本数据由JSP引擎维持。换句话说,当JSP页面被切分成为片段时,检索out的值申明能够存在于从主JSP页面编译的servlet程序和从JSP片段编译的servlet程序。因此,对于变量out的数据依赖在切分JSP页面时能够被忽略。
正如在图2(a)中显示的,当维持存在于图1(b)中显示的servlet程序的数据依赖时没有申明能被切分。然而,如果对于变量out的数据依赖被忽略,那么数据依赖图表就会像图2(b)中显示的那样被改变。像图2(b)中显示的那样使用数据依赖图表使得从组S9,S10,S11和S12中切分S2变得可能,它不能够
依据变量book的数据依赖被分化。
在被Apache Jasper编译器编译的servlet程序中,对于表1里显示的变量的数据依赖能和变量out相同的原因被忽略。由于这些变量的值被定义在每个servlet程序的最高端并且被频繁的提到,如果数据依赖能够被保持,那么大多数申明不能被切分。
一般来讲,无序执行对于没有数据控制依赖的申明是允许的。忽略在表1里显示的变量的数据依赖可能会产生申明的一个错误的执行顺序。例如,如果在图1中显示的S10和S11被切分成一个JSP片段,并且这个JSP片段在S11之前被包含了,一个错误的网页就会产生。为了避免这种错误的执行结果,由于已经忽略了数据依赖的申明,我们的算法不允许改变。
表1 这些变量的数据依赖被忽略
3.2.对于Java beans数据依赖的分析
在一个JSP页面中,Java beans作为属性值被频繁的用来存储和检索数据。每一个Java bean是一个Java项目并且开发者能够通过使用JSP页面中的三种标签来使用Java beans。
●jsp:使用Bean:在它的范围内申明一个Java bean。当这个Java bean的项
目不在它申明的范围内,这个bean就会被实例化。Java beans能够申明在页面,请求,节或者应用的范围内。
●jsp:获得属性:称为获得Java bean项目的方法并且检索属性值。 ●jsp:设置属性:称为设置Java bean项目的方法并且设置属性值。
Java beans必须用jsp申明:在另两个操作之前使用Bean标签。这意味着Java bean的申明和Java bean的所有其他的操作必须包含在同一JSP页面中。这大大了JSP片段的范围。为了缓和这个。JSP切分允许Java beans的申明复制到JSP片段中。为什么Java beans的申明能够被复制的原因是申明没有副作用。当Java bean对象在它的范围内还没有被实例化每一个申明仅仅实例化了一个Java bean对象。换句话说,一个Java bean对象在它的范围内不超过一次被实例化,即使申明被复制到JSP片段中。因此,一些Java bean的操作能够被切分成片段。
当一个属性值通过使用JSP来设置java bean:设置属性标签并且通过使用JSP从JSP bean中检索:获得属性标签,一个真实的数据依赖存在于两个操作之间。当数据依赖申明不能被分化这个规则被应用,对于Java bean的数据依赖操作必须被包含在同一片段中。然而,如果下面的两个条件被满足,当两个操作被切分后,在JSP bean设置一个属性值的操作和另一个检索属性值的操作之间数据依赖被保持着。
条件. 2-1 Java bean的范围是“request”,“ session”,或者是“application”。 条件. 2-2切分的JSP页面在同一JSP引擎中执行。
如果这两个条件被满足,JSP切分允许存在于数据依赖中的操作被切分化成不同的JSP页面,因为在切分的JSP页面执行中,Java bean存在于JSP引擎中。因此,切分的部分和由开发者选择的部分能够被简化。然而,通过执行满足这两种条件的切分的JSP页面获得的网页片段必须有相同的存储周期。如果一个JSP页面被执行并且这个值在JSP页面中被定义而这个被定义的值在另一个页面中使用,由于网页有效的存储内容没有被使用,这是因为数据依赖么有被保持。
当Java bean有页面范围,对于Java bean的依赖操作不能被切分。然而,在页面范围内为Java bean设置一个属性值的每一操作随着一个或多个检索相同属性值的操作能够被复制,因为在页面范围内为Java bean设置属性值的操作没有副作用。
4.JSP切分工具
我们作为Eclipse的一个插件来实现JSP切分的。JSP切分编辑介绍了JSP
页面的源视图和大纲视图。开发者通过或者使用editor或者使用outline选择他们想要切分的那部分。当那部分被开发者选择后,移掉的或者是复制的那部分和选择的那部分被显示在对话框里。所有的部分被放进由开发者指定的一个新的JSP页面里,在源JSP页面中,移掉的部分被替换为标签。当编辑者调用一个JSP页面时,存在于JSP页面的数据和控制依赖被分析。首先,JSP编译器,它是基于Apache Jasper编译器的,把一个JSP页面编译成一个servlet程序。JSP编译器把JSP页面分成几部分然后像表2那样存储,并且为每一部分形成一个或多个Java声明。这时,在JSP页面中的每一部分和servlet程序中的一个或多个申明之间的映射表被形成。
JSP-Servlet映射器转换源组,每一个都把servlet程序中的依赖声明包含在新的组中,每一个都包含在依赖的JSP部分中,通过使用JSP页面中的部分和servlet程序声明之间的映射表。这个映射表在JSP编译阶段之前就形成了。形成的组被发送到JSP分离器。
5.实验
我们通过使用自己的工具来测试JSP页面切分的执行性能。在动态机制启用的情况下,这个JSP页面在WebAphere应用服务器上执行。为了对比,我们把动态形成的网页碎片分离为一个JSP碎片,并且不存储在从JSP碎片中形成的网页,因为形成的网页包含从碎片F2中的信息,然而,其他的文字片段要缓存30秒。我们称这种分离为coarse-grain分离。另外,我们是在网页没有存储的时候测试执行性能的。对于这些测试,我们使用了一个客户程序,它会继续对JSP页面发送请求5分钟,并且记录接收相应的数目。每一次请求被发送到到局部页面应用服务器,在它为先前的请求接收响应后。由于我们的工具使得能很好的分化一个JSP页面变得可能,并且为每一个网页片段按照JSP片段的特色给予一个缓冲期,网页应用服务器可以经常跳过一些JSP页面的执行。这使得响应时间变得更短。
6.相关工作
正如在第二章中提过的,程序切片技术类似于我们的方法。然而,程序切片技术没有采取每个被切分的程序被作为一个的程序被执行,虽然被切片程序的总的执行结果和被切片之前是一致的。因此,程序切片技术不能被应用到JSP页面的切分中。
Extra Method是一种软件重构技术,它包含了若干程序声明在一个新的方法中。这个技术增加了其他方法能够使用提取方法的机会。声明转换成由开发者选择的方法,这个技术类似于我们的方法。当声明被选择后,参数必须被传送到新的方法,然后新方法的返回值被决定。
7.结论
在这篇文章中,本文介绍了JSP切分是作为把JSP页面切分成片段的一种方法,为了提高JSP页面的执行性能和可重用性。JSP切分工具是一个JSP切分的实施工具,它使得开发者想要切分的切分部分变得可能。在将来,我们将要介绍一种方法,通过与开发者的互动,弥补这种信息的缺乏。
参考文献
[1] Edge Side Includes. http://www.esi.org. [2] elcipse.org. http://www.eclipse.org/.
[3] Jakarta Project : Cache Taglib.http://jakarta.apache.org/taglibs/doc/cache-doc/. [4] The Jakarta Project, Apache Tomcat.http://jakarta.apache.org/tomcat/. [5] Java (TM) Servlet 2.4 Specification.http://java.sun.com/products/servlet/. [6] JavaBeansTM Component Architecture.http://java.sun.com/products/javabeans/. [7] JavaServer Pages (TM) 1.2 Specification.http://java.sun.com/jsp. [8] Offloading applications with IBM WebSphere Edge
Server.http://www-106.ibm.com/developerworks/ibm/library/iedge.
[9] WebSphere Application Server. http://www-3.ibm.com/software/webservers/appserv/. [10] M. Fowler. Refactoring: Improving the Design of Existing Code. Addison-Wesley, 1999. [11] K. Maruyama. Automated Method-Extraction Refactoring by Using Block-Based Slicing. In
Proceedings of the 2001.symposium on Software reusability.
[12] F. Ricca and P. Tonella. Web Application Slicing. In Proceedings.IEEE International Conference on Software Maintenance.2001.
[13] M. Weiser. Program Slicing. IEEE Trans. Software Engeneering,1984.