Servlet工作原理解析

Tomcat容器模型


Servlet工作原理解析_第1张图片
image002.jpg

真正管理 Servlet 的容器是 Context 容器,一个 Context 对应一个 Web 工程。

Servlet 容器的启动过程

Tomcat 的 addWebapp 方法的代码如下:

public Context addWebapp(Host host, String url, String path) { 
       silence(url); 
       Context ctx = new StandardContext(); 
       ctx.setPath( url ); 
       ctx.setDocBase(path); 
       if (defaultRealm == null) { 
           initSimpleAuth(); 
       } 
       ctx.setRealm(defaultRealm); 
       ctx.addLifecycleListener(new DefaultWebXmlListener()); 
       ContextConfig ctxCfg = new ContextConfig(); 
       ctx.addLifecycleListener(ctxCfg); 
       ctxCfg.setDefaultWebXml("org/apache/catalin/startup/NO_DEFAULT_XML"); 
       if (host == null) { 
           getHost().addChild(ctx); 
       } else { 
           host.addChild(ctx); 
       } 
       return ctx; 
}

添加一个 Web 应用时将会创建一个 StandardContext 容器,并且给这个 Context 容器设置必要的参数,url 和 path 分别代表这个应用在 Tomcat 中的访问路径和这个应用实际的物理路径,ContextConfig负责整个Web应用配置的解析。

  1. ContextConfig 的 init 方法将会主要完成以下工作:
  2. 创建用于解析 xml 配置文件的 contextDigester 对象
  3. 读取默认 context.xml 配置文件,如果存在解析它
  4. 读取默认 Host 配置文件,如果存在解析它
  5. 读取默认 Context 自身的配置文件,如果存在解析它
  6. 设置 Context 的 DocBase

ContextConfig 的 init 方法完成后,Context 容器的会执行 startInternal 方法,这个方法启动逻辑比较复杂,主要包括如下几个部分:
创建读取资源文件的对象
创建 ClassLoader 对象
设置应用的工作目录
启动相关的辅助类如:logger、realm、resources 等
修改启动状态,通知感兴趣的观察者(Web 应用的配置)
子容器的初始化
获取 ServletContext 并设置必要的参数
初始化“load on startup”的 Servlet

Web 应用的初始化工作

Web 应用的初始化工作是在 ContextConfig 的 configureStart 方法中实现的,应用的初始化主要是要解析 web.xml 文件,这个文件描述了一个 Web 应用的关键信息,也是一个 Web 应用的入口。

解析web.xml文文WebXml对象
将WebXml对象中的熟悉设置到Context容器中,包括( Servlet 对象、filter、listener 等等)

除了将 Servlet 包装成 StandardWrapper 并作为子容器添加到 Context 中,其它的所有 web.xml 属性都被解析到 Context 中

创建 Servlet 实例

如果 Servlet 的 load-on-startup 配置项大于 0,那么在 Context 容器启动的时候就会被实例化
Servlet 的 init方法

其中 ServletConfig 是在 Servlet 初始化时就传给 Servlet 了,而后两个是在请求达到时调用 Servlet 时传递过来的

参考:Servlet工作原理:https://www.ibm.com/developerworks/cn/java/j-lo-servlet/

你可能感兴趣的:(Servlet工作原理解析)