2018-03-15面试之Servlet的执行过程

以下内容均参考:http://blog.csdn.net/lcore/article/details/8967528

一、请描述一下Servlet的执行过程。

  在Servlet框架中所有的Servlet类都必须实现Servlet这个借口,其中定义了三个方法。分别为:

  1.init方法:负责初始化Servlet对象。

  2.service:用于响应客户端的请求

  3.destroy:销毁Servlet对象,释放占用的资源。

  Servlet一共分为4个阶段分别为:

  1.加载阶段:加载并实例化(创建Servlet实例)

  2.初始化阶段:调用init()方法

  3.响应客户请求阶段:调用service()方法、doGet、doPost

  4.终止阶段:调用destroy()方法

  

  加载阶段

  Tomcat从文件系统,远程文件系统或其它网络服务中通过加载器来加载Servlet,并调用Servlet的默认构造方法(不带参数构造器)

  初始化阶段init()方法

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

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

  init方法是在实例化Servlet之后调用的,其参数ServletConfig是在Servlet初始化阶段Tomcat根据web.xml配置信息,和操作系统的相关环境生成并传递给init方法的。  

  响应客户请求阶段service方法

  service()方法是在客户端第一次访问servlet时执行的,其实init方法同样也是在有客户访问servlet的时候才被调用。不过需要特别注意的是讨论init方法在session级别上时,当存在不同的会话访问相同的servlet时,Tomcat会开启一个线程处理这个新的会话,但是此时Tomcat容器不会实例化这个servlet对象,也就是有多个线程在共享servlet实例。换句话说Servlet对象在Servlet容器中是以单例的形式存在的!然而查看其源代码可以发现,Servlet在多线程并未使用同步机制,因此,在并发编程下Servlet是线程不安全的。

  基于HTTP通信协议的HttpServlet在进行客户端响应处理的时候根据客户请求,响应类别的不同分别调用不同的方法,其中最常用的就是doGet、doPost方法,这两个方法是我们在编写Servlet中的主要逻辑处理阶段。

  终止阶段:destroy()方法的调用

  servlet对象在Tomcat服务器Stop、Web项目reload、tomcat容器所在的服务器shutdown时会执行destroy()方法。

posted @ 2018-03-15 22:11  空能净  阅读(140)  评论(0编辑  收藏  举报