找回密码
 注册
搜索
热搜: 超星 读书 找书
查看: 327|回复: 0

[【推荐】] 让Servlet学会与其他对象合作

[复制链接]
发表于 2010-2-27 08:46:03 | 显示全部楼层 |阅读模式
在一个比较复杂的Web应用中,靠Servlet单干往往是不行的。Servlet其功能毕竟有限。在实际工作中,笔者往往会结合其他技术,让他们相互融合,发挥各自的优势。在这篇文章中,笔者将自己在这方面的经验供大家分享,与各位开发人员共同进步。

  一、Serlvet与其他技术合作的前景分析。

  在一些中大型的Web应用程序中,一个Servlet往往只完成一项特定的功能。如现在有一个学生成绩管理系统需要完成两项任务,分别为计算平均成绩和统计平均成绩以上的人数。如果这个系统使用的用户比较多,则使用一个Servlet来完成所有的功能显然是不合理的,会降低应用程序的性能。为此往往需要设置多个Servlet来独立的完成相关的功能。随着Web程序的规模越来越大,其内部需要实现的逻辑也越来越复杂。为此将这些功能分散在多个Servlet中就可以使得应用程序更加便于管理与更新。所以Servlet首先需要学会同其他的Servlet进行协作。

  其次Web各个构件之间的分工也是不同的。在《Servlet应用程序生命周期分析》文中中笔者谈到过Servlet应用程序的一个缺陷,即将展示层与业务层混合在一起。也就是说,将数据的逻辑运算与展示在同一个层面上体现,这不利于后续应用程序的开发。在实际过程中,往往将Servlet与JSP一起使用。其中Servlet主要负责业务逻辑方面的内容,而JSP则主要负责数据显示界面。因此在Web应用程序中,各个构件只有相互利用和补充,才能够扬长避短,发挥各自的优势。

  第三在Web程序之间往往还需要相互调用。而仅仅通过HTML超链接的形式是不够的。如上面讲到的一个成绩管理系统的案例,要统计平均分数以上的人数就需要调用另外一个计算平均成绩的模块。为此Servlet应该和同一Web程序或者不同Web程序之间实现灵活的合作。只有如此才是一个高可扩展性的应用程序。

  二、Servlet应用程序和其他技术合作的主要手段分析。

  据笔者所知,现在Servlet应用程序与其他技术合作,主要包括三种形式,分别为Servlet链接、饱含响应内容和和转递请求。这三种合作方式各有各的特点,往往适用于不同的场合。作为程序开发人员,需要连接着三种合作方式的差异,并在实际工作中根据需要选择合适的合作方式。

  最早的一种合作方式叫做Servlet链接。这个比较好理解,就是一个Servlet调用另外一个Servlet应用程序。利用专业的术语,就叫做多个Servlet依次处理用户的请求并最终将结果返回给客户。Web服务器通过这里合作方式,可以让同一个Servlet链接内的Servlet能够看到前一个输出结果。笔者上面举的一个成绩管理系统的案例,用的就是Servlet链接方法。这里需要注意的是,其调用Serlvet具有一定的顺序。如现在有个用户请求一个Servlet链接SERVLET=1,2。则服务器会依次调用Servlet1、Servlet2,而且后面的Servlet可以调用前面Servlet运算出来的结果。在以前的Web程序中这种方法比较常见。但是随着Web应用程序的复杂程度逐渐增加,其缺陷也不断显现出来。如难以控制、管理复杂等等。为此在一些大型Web应用中,现在已经很难看到其踪影,而是被其他更先进的方式所取代。

  第二种合作方式是“在响应中包括其他Web资源”。在打开一个Web应用程序时,用户会发现往往不同的网页会有相同的元素。如公司的图标、导航栏等等。要实现这个功能的话,选择这种合作方式会取得比较不错的效果。也就是说,在某些情况下,开发人员希望在一个Servlet中包含其他的Web资源,此时可以让多个Servlet包含相同的通用信息。如此的话,当需要更改商标或者导航栏等通用信息的时候,只需要更改一个Servlet即可,而不需要到每个Servlet中去改动相关的内容。这个特性其实跟Java语言的继承非常相似,有异曲同工之妙。

  第三种合作方式是向其他Web构件转递请求。这是什么意思呢?简单的说,就是由Servlet先完成部分功能(如数据运算、数据类型转换等等),然后再将结果交给其他的Web构件来完成后续的任务。JSP与Servlet协作就是这种方式的一个代表。Servlet将数据运算的结果传递给JSP,然后JSP负责根据用户定义的格式向用户显示最终的结果。可见这种合作方式是分工的结果。

  可见这三种合作方式基本上没有重合的地方,而是分别对应于不同的场合。其中Serlvet链接主要用在Servlet之间相互调用完成一件工作;在响应中包含其他Web资源主要用来简化通用信息的管理;而向其他Web构件转递请求则是应对Web构件之间相互合作的问题。具体方法的使用并不是难点,其难就难在开发人员要根据实际的需求来判断到底使用哪种合作方式比较合理。一个合适的选择,能够简化应用程序的开发量。相反,一个不恰当的判断,反而会让原本简单的事情更加的复杂。

  三、RequestDispatcher的使用分析。

  在“响应中包括其他Web资源”这个方式中,其关键就在于RequestDispatcher对象处理的是否恰当。当Servlet需要嵌入另外一个Web资源时,需要首先建立一个请求分派对象,即RequestDispatcher,然后利用这个对象的include方法在响应中包含其他Web资源。在实际工作中,笔者利用这个方法最多,就以这个方法为例,谈谈RequestDispatcher对象的生成方式以及注意技巧。

  从技术上来说,RequestDispatcher对象主要有两种生成方式,一是使用ServletRequest接口的GetRequestDispatcher方法。其主要原理就是返回一个Web资源路径给RequestDispatcher对象。这个资源可以是动态的(如其他Web构件动态产生),也可以是静态的,如公司的图标文件。在使用这个方法的时候,主要需要注意的就是其路径的格式。如意/符号开头,并不表示绝对路径,而是表示Web程序路径+资源路径。这跟操作系统中的路径表示可是有所区别。

  第二种方式是使用ServletContext接口的GetRequestDispatcher方法。注意他们虽然方法名字相同,而只是接口不同。不过在具体使用的时候,仍然有一些差异需要引起大家的重视。首先前面一种方法,其路径可以使用相对路径。而在这一种方法中,则只能够使用相对当前Web程序的路径。即没有后面资源路径的表示方法。这一点很多人在使用的时候容易搞混。其次两个方法在使用范围上也有所差异。前面第一种方法其使用范围比较小,只能够在同一个Web程序内部不同Servlet之间使用。而第二种方法则可以通过getcontext方法获得其他Web程序的资源,即可以实现在不同Web程序之间的资源共享。

  总而言之,RequestDispatcher对象的两种方法有比较大的差异。特别是在使用范围上的差异,决定了在不同的场合中该使用哪种实现方式。切记要对号入座。


http://webservices.ctocio.com.cn/wsjavtec/388/9380388.shtml

推荐:

在一个比较复杂的Web应用中,靠Servlet单干往往是不行的。Servlet其功能毕竟有限。在实际工作中,笔者往往会结合其他技术,让他们相互融合,发挥各自的优势。在这篇文章中,笔者将自己在这方面的经验供大家分享,与各位开发人员共同进步。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|网上读书园地

GMT+8, 2024-11-18 11:21 , Processed in 0.195149 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表