Servlet工作原理
Servlet是Java Web技术的核心基础。
一、Servlet容器
以Tomcat为例来介绍Servlet容器是如何管理Servlet的。
Tomcat容器分为4个等级,真正管理Servlet容器的是Contect容器,一个Contect对应一个Web工程,在Tomcat的配置文件中可以得到验证。
二、Servlet容器的启动过程
一个Web应用对应一个Contect容器,也就是Servlet运行时的Servlet容器。添加一个web应用时会将创建一个StandardContect容器,并给这个Context容器设置必要的参数(url和path),然后把这个Context容器加到父类的Host中。最后调用Tomcat的start方法启动Tomcat.
三、Web应用的初始化工作
Web应用的初始化工作是在ContectConfig的configureStart方法中实现的,应用的初始化主要是解析web.xml文件。
工作流程:
1) Tomcat首先会找globalWebXml
2) 然后找hostWebXml
3) 然后找应用的配置文件 example/WEB-INF/web.xml
4) web.xml文件的中各项配置项都会被解析成响应的属性保存在webXML对象中。
5) 最后会将webXml对象的属性设置到Context容器中(包括创建Servlet对象、Filter、Listener等)
除了将Servlet包装成StanderWrapper并作为子容器添加到Context中外,其他所有的web.xml属性都被解析到Context中。所以,Context容器才是真正运行Servlet的Servlet容器。一个Web应用对应一个Context容器,容器的配置属性由应用的web.xml指定。
四、创建Servlet实例
(一)创建Servlet对象:创建Servlet实例的方法是Wrapper.loadServlet,该方法是获取servletClass,然后把它交给InstanceManager去创建一个基于servletClass.class的对象。
(二)初始化Servlet:方法是StandardWrapper中的initServlet方法,该方法调用Servlet的init()方法,同时把包装了StandardWrapper对象的StanderWrapperFacade作为ServletConfig传给Servlet。
事实上Servlet从被web.xml解析到完成初始化,过程非常复杂,包括各种容器状态的转化引起的监听事件的出发,各种访问权限的控制和一些不可预料的错误发生的判断行为。
五、Servlet生命周期
1,初始化阶段——调用init()方法
2,响应客户请求阶段——调用service()方法
3,终止阶段——调用destroy()方法