SKY外语计算机学习

标题: Servlet运行过程 [打印本页]

作者: SKY精英    时间: 2013-6-13 10:30
标题: Servlet运行过程
Servlet运行过程
1.Web浏览器-->发出http请求-->Web容器-->首次访问的话创建目标Servlet对象-->Servlet
2.Web容器-->创建请求和响应对象(request和response)-->调用Servlet的service(ServletResquest,ServletRespons)并且将刚才创建的请求对象和响应对象对象传递给Servlet
3.Servlet程序从请求对象中读取请求信息,将响应信息写入到响应对象当中;

4、service方法结束,程序返回到web容器->web容器从相应对象中读取响应信息->将响应星系生成HTTP消息返回给浏览器
    Servlet、Servlet容器(Web容器)与Servlet API关系
Servlet API只是提供了一组类似于HttpServletRequest、HttpServletResponse的接口定义,而没有这些接口的实现类,具体实现是由各个Web容器来完成的;而Servlet本身不需要关注Servlet容器是如何实现这些接口的,也不需要知道Web容器实现这些接口的具体实现类的名字。
虽然Servlet源程序中引用的是Servlet API,但Servlet运行时真正调用的对象是由Servlet容器中的实现类创建的,所以将Servlet API的jar包增加到CLASSPATH环境变量中,只能保证Servlet程序可以被成功编译,但不能让Servlet程序离开Servlet容器运行

Servlet的线程安全问题

    Servlet引擎采用多线程模式运行,它为并发的每个访问请求都使用一个单独的线程来进行响应,但带来了线程安全问题(例如,多个请求同时并发访问同一个Servlet的时候)。
如果某个Servlet实现了SingleThreadModel接口,那么Servlet引擎将以单线程模式来调用它的service()方法。
signleThreadModel接口中没有定义任何方法,所以我们只需要在Servlet类定义中增加实现SingleThreadModel接口的声明即可。不过,现在已经作废了。

    原理(为什么弃用):对于实现了SingleThreadModel接口的Servlet,Servlet引擎仍然支持对该Servlet的多线程并发访问,其采用的方式是产生多个Servlet实例对象,并发的每个线程分别调用一个独立的Servlet实例对象。这样同时有多个Servlet实例对象在运行,不会出现多个请求同时调用一个Servlet对象;而多个Servlet实例对象共同组成了一个Servlet对象池,当Web容器接收到针对某个Servlet的请求时,就从对象池中挑选一个空闲的实例对象进行响应。由此可见,实现了SingleThreadModel接口的Servlet并不能真正解决线程安全的问题。因为Servlet引擎会创建多个Servlet实例对象,多个并发的请求分别由不同的Servlet实例对象进行处理或者单个Servlet对象逐个依次排队处理,而真正意义上的多线程安全问题是指一个Servlet对象被多个线程同时调用时的问题。
      
推荐方法:涉及到多个并发的service()方法调用Servlet有线程安全问题的,最好在service方法中编写多线程同步控制代码,而不要采用实现了SingleThreadModel接口的单线程运行模式。






欢迎光临 SKY外语计算机学习 (http://join.skywj.com/) Powered by Discuz! X2.5