servlet框架基础

来源:互联网 发布:淘宝开店创业 编辑:程序博客网 时间:2024/06/06 19:35

1、Web Client向Servlet容器发出http请求

2、Servlet容器接收Web Client的请求

3、Servlet容器创建一个HttpRequest对象,将Web Client请求的信息封装到这个对象中

4、Servlet容器创建一个HttpResponse对象

5、Servlet容器调用HttpServlet对象的service方法,把HttpRequest对象与HttpResponse对象作为参数传给HttpServlet对象

6、HttpServlet调用HttpRequest对象的有关方法,获取Http请求信息

7、HttpServlet调用HttpResponse对象的有关方法,生成响应数据

8、Servlet容器把HttpServlet的响应结果传给Web Client


Servlet生命周期:

加载阶段:Tomcat从文件系统,远程文件系统或其他网络服务中通过类加载器来加载Servlet,并调用Servlet的默认构造方法

init方法:当Servlet容器启动时,读取web.xml配置文件中的信息,构造指定的Servlet对象,根据配置文件的信息创建ServletConfig对象,并将其作为参数传递给init方法进行调用

;tomcat启动后:用户首次想对某个Servlet对象发送请求,tomcat会判断内存中是否存在指定的servlet对象,如果没有则会去创建它,然后 创建HttpRequest,HttpResponse对象,抵用service方法处理用户的请求

响应客户请求阶段service方法:

service方法是在客户端第一次访问servlet时执行的,其实init方法同样也是在有客户端访问servlet的时候才调用。当存在不同的会话访问相同的servlet时,tomcat会开启一个线程处理这个新的会话,但是此时tomcat容器不会实例化这个servlet对象,也就是有多个线程在共享这个servlet实例。Servlet在多线程下并未使用同步机制,因此,在并发编程下servlet是线程不安全的

destroy方法的调用


servlet采用多线程来处理多个请求同时访问,tomcat容器维护了一个线程池来服务请求。线程池实际上是等待执行代码的一组线程叫做工作组线程,tomcat容器使用一个调度线程来管理工作组线程

当容器收到一个Servlet请求,Dispatcher线程从线程池中选出一个工作组线程,将请求传递给该线程,然后由该线程来执行Servlet的service方法

当这个线程正在执行的时候,容器收到另一个请求,调度者线程将从线程池中选出另外一个工作组线程来服务这个新的请求,容器并不关心这个请求是否访问的是同一个Servlet还是另一个Servlet。当容器收到对同一个Servlet的多个请求的时候,这个servlet的service方法将在多线程中并发的执行


多线程和单线程Servlet区别:多线程下每个线程对局部变量都会有自己的一份copy,但是对于实例变量来说,由于servlet在tomcat中是以单例模式存在,所有线程共享实例变量,多个线程对共享资源的访问造成线程不安全问题

对于单线程不存在这方面问题(static变量除外)


属性的线程安全

ServletContext:线程不安全,多线程下可以同时进行读写,因此我们要对其读写操作进行同步或者深度的clone;

HttpSession:线程不安全(需维持当前用户的信息,会被多次使用,也会被同一个用户的多个页面使用)

ServletRequest线程安全,对于每一个请求由一个工作线程来执行,都会创建一个ServletRequest对象



0 0