论坛首页 Java企业应用论坛

Servlet工作原理

浏览 14560 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (11) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-03-10   最后修改:2011-03-12

一、Servlet工作原理

 

     Servlet是运行在Servlet容器中的,由Servlet容器来负责Servlet实例的查找、创建以及整个生命周期的管理,Servlet整个生命周期可以分为四个阶段:类装载及实例创建阶段、实例初始化阶段、服务阶段以及实例销毁阶段。

类装载及实例创建阶段

 

      默认情况下,Servlet实例是在接受到第一个请求时进行创建并且以后的请求进行复用,如果有Servlet实例需要进行一些复杂的操作,需要在初始化时就完成,比如打开文件、初始化网络连接等,可以配置在服务器启动时就创建实例,具体配置方法为在声明servlet标签中添加<load-on-startup>1</load-on-startup>标签。

初始化 init(ServletConfig config)

 

     一旦Servlet实例被创建,将会调用Servlet的inint方法,同时传入ServletConfig实例,传入Servlet的相关配置信息,init方法在整个Servlet生命周期中只会调用一次。

服务 services()

 

     为了提高效率,Servlet规范要求一个Servlet实例必须能够同时服务于多个客户端请求,即service()方法运行在多线程的环境下,Servlet开发者必须保证该方法的线程安全性。    

销毁 destory()

 

      当Servlet容器将决定结束某个Servlet时,将会调用destory()方法,在destory方法中进行资源释放,一旦destory方法被调用,Servlet容器将不会再发送任何请求给这个实例,若Servlet容器需再次使用该Servlet,需重新再实例化该Servlet实例。

 

二、Servlet执行流程

 

web服务器接受到一个http请求后,web服务器会将请求移交给servlet容器,servlet容器首先对所请求的URL进行解析并根据web.xml 配置文件找到相应的处理servlet,同时将request、response对象传递给它,servlet通过request对象可知道客户端的请求者、请求信息以及其他的信息等,servlet在处理完请求后会把所有需要返回的信息放入response对象中并返回到客户端,servlet一旦处理完请求,servlet容器就会刷新response对象,并把控制权重新返回给web服务器。

 

三、与其它技术的比较

 

   与其它服务相比servlet有以下的一些优点:

 

1、运行速度上比CGI快,因为使用了多线程

2、servlet使用了标准的api,可被许多web服务支持

3、与系统无关性,一次编译多次使用


   发表时间:2011-03-11  
其实吧,如果能阅读Web容器相关源码,应该能了解得更多!
0 请登录后投票
   发表时间:2011-03-11  
qz小峰 写道
其实吧,如果能阅读Web容器相关源码,应该能了解得更多!


嗯,赞成,一直在找时间想系统的研究一下。
0 请登录后投票
   发表时间:2011-03-11   最后修改:2011-03-11
Servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁。

而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于Servlet 。

servlet与CGI区别应该是这个
0 请登录后投票
   发表时间:2011-03-11  
我晕,还以为 是servlet的实现方式。
0 请登录后投票
   发表时间:2011-03-11  
t42dw 写道
Servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁。

而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于Servlet 。

servlet与CGI区别应该是这个

有没有可能容器实现的不是单例模式,而是对象池模式呢?
0 请登录后投票
   发表时间:2011-03-11  
nianien 写道
t42dw 写道
Servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁。

而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于Servlet 。

servlet与CGI区别应该是这个

有没有可能容器实现的不是单例模式,而是对象池模式呢?


恩,好象听说过有用对象池的,不过就算是对象池模式应该也是维护一定数量的对象不可能每来一个请求创建一个不
0 请登录后投票
   发表时间:2011-03-11  
面试宝典。。。。
0 请登录后投票
   发表时间:2011-03-11  
默认情况下,Servlet实例是在接受到第一个请求时进行创建并且以后的请求进行复用,如果有Servlet实例需要进行一些复杂的操作,需要在初始化时就完成,比如打开文件、初始化网络连接等,可以配置在服务器启动时就创建实例,具体配置方法为在声明servlet标签中添加<load-on-startup>1</load-on-startup>标签。
学习啦
0 请登录后投票
   发表时间:2011-03-12  
楼主,关键的方法名称都搞错了,赶紧改免得误人啊
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics