美文网首页
Servlet工作原理解析

Servlet工作原理解析

作者: ythmilk | 来源:发表于2018-07-13 11:35 被阅读4次

    Tomcat容器模型


    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工作原理解析

          本文链接:https://www.haomeiwen.com/subject/enljpftx.html