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()方法。