|
|
2#

楼主 |
发表于 2007-12-19 13:15:19
|
只看该作者

Servlet生命周期
Servlet的生命周期可以被归纳为以下几点:
·装载Servlet。这项操作一般是动态执行的。然而,Server通常会提供一个管理的选项,用于在Server启动时强制装载和初始化特定的Servlet(1);
·Server创建一个Servlet的实例(2);
·Server调用Servlet的init()方法(3);
·一个客户端的请求到达Server(1);
·Server创建一个请求对象(4);
·Server创建一个响应对象(5);
·Server激活Servlet的service()方法(6),传递请求(7)和响应(8)对象作为参数;
·service()方法获得关于请求对象的信息,处理请求,访问其他资源(9),获得需要的信息(10);
·service()方法使用响应对象的方法,将响应传回Server(11)、(12),最终到达客户端(13)。service()方法可能激活其它方法以处理请求,如doGet()或doPost()或程序员自己开发的新的方法;
·对于更多的客户端请求,Server创建新的请求和响应对象,仍然激活此Servlet的service()方法,将这两个对象作为参数传递给它。如此重复以上的循环,但无需再次调用init()方法。一般Servlet只初始化一次;
·当Server不再需要Servlet时(一般当Server关闭时),Server调用Servlet的Destroy()方法。
Servlet与CGI程序的比较
CGI(Common Gateway Interface)程序,主要用Perl、Shell Script或C编写,能够向客户端提供动态内容,即每次客户端浏览器访问某一页面时,可以看到不同的内容。这里对完成相同功能的CGI程序和Java Servlet程序作一比较,以便更清楚地看到Servlet的简单特性。
这里CGI和Servlet程序的功能均为获得客户端在浏览器表单中输入的参数(Firstname,Lastname),并将返回给客户端。相应的CGI程序和Servlet程序分别如下:
·CGI程序(Perl):
$query—string=$ENV{?QUERY—STRING?};
$query—string=As/%([dA-Fa-f][dA-Fa-f])/pack(″C″,hex()$1))/eg;$query—string=As/+//g;
@pairs=split(/&/,$query—string);
foreach $pair(@pairs) {
($key,$value)=split(/=/,$pair);
$form—data{$key}=$value;
}
$firstname=$form—data{″firstname″};
$lastname=$form—data{″lastname″};
print ″Hello,$firstname $lastname. Thank you for your visit! ″;
·Servlet程序:
public void service(HttpServletRequest request,HttpServletResponse response)
throws ServletExeption,IOExeption
{
ServletOutputStreamout=response.getOutputStream();
response.setContentType(″text/html″);
String firstname=request.getParameter(″firstname″);
String lastname=request.getParameter(″lastname″);
out.println(″Hello,″+firstname+″ ″+lastname+″.″);
out.println(″Thank you for your visit!″);
out.lose()
}
可以很明显地看到Java Servlet源代码比相应的CGI Perl Script简单许多。这里需要导入三个package:javax.servlet、javax.servlet.http和java.io。定义Servlet的类扩展了HttpServlet class,而不是GenericServlet class,因为此Servlet需要与HTML form进行交互。
在CGI程序中有很大一部分用于处理对参数的提取和解码过程,而在Servlet程序中,解码传递的参数部分并不需要额外编写。从HttpServlet class继承来的基本函数可以自动完成解码的过程。因此,程序员可以在Servlet service()方法中直接获取由客户端创建和编码的Key-value对。解码后的Key-value对可以直接从HttpServlet class的service()方法的第一个参数中获得。这将极大地减少程序员的劳动量和重复的代码劳动,并降低编码难度。
综上所述,Servlet在性能、编写难度、可移植性等方面比CGI有明显优势。在WebSphere Application Server中提供了功能强大的Servlet API,它们比JSDK拥有更多的功能和更优的性能,为Servlet的编程提供了很好的支持。随着WAS的日益推广和Java技术的普及,可以预见,Servlet技术将取代CGI,成为对Web Server功能扩充的标准技术。 |
|