栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

学习Tomcat(五)之Context和Wrapper容器

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

学习Tomcat(五)之Context和Wrapper容器

前面的文章中,我们介绍了Tomcat的Engine和Host容器,我们知道一个Tomcat最多只有一个Engine容器,一个Engine容器可以包含多个Host容器,请求中的不同的Host对应不用的Host容器。本章我们会介绍Tomcat的另外两个容器:Context容器和Wrapper容器。一个Host容器可以包含多个Context容器:同一个Host下面可以包含多个应用,每个应用对应一个Context容器。一个Context容器又可以包含多个Wrapper容器:每个Wrapper容器包含一个Servlet容器,意味着Tomcat允许一个应用有多个servlet实现。

Tomcat请求流程

我们现在知道Tomcat最重要的组件是连接器和四种类型的容器,下面的图展示了Tomcat的一次请求是如何在连接器和四种容器之间流转的,假设Http请求头为"GET /appB/servletB/some-url HTTP/1.1 Host: www.krishnan.com",当请求访问到Tomcat容器时,会经过以下流转步骤:

  1. Tomcat的连接器监听SocketServer,发现这个请求,按照指定的协议和IO方式处理请求Socket消息,解析Socket为对应的Request实体,并提供回写报文的Response实体。
  2. 连接器将Request/Response交给Engine容器,Engine容器存储了请求域名和Host容器之间的映射关系。比如"www.krishnan.com"域名对应于krishnan_webapps Host容器。
  3. Engine容器将请求交给对应的Host容器,Host容器开始解析请求中的路径,如果配置了路径和应用之间的关系,比如"/appB"对应于appB Context容器,Host容器会安装配置将请求交给对应应用的Context容器。
  4. Host容器解析路径并将应用交给Context容器之后,如果一个应用有多个Servlet,那么这个应用的Context容器也会包含多个Wrapper容器,我们可以通过路径来将不同的请求映射到不同的Servlet容器。比如图中的"/servletB"对应servletB Wrapper容器,Context容器将请求交给Wrapper容器。
  5. Context容器按照路径将请求交给对应的Wrapper容器,Wrapper容器会加载对应的Servlet实现类,调用servlet实现类中的逻辑处理Request并将处理结果写入Response中。

Context容器

我们在配置Tomcat应用程序的时候,总是需要配置一个web.xml文件,这个文件就是Context容器去解析的。tomcat默认的web.xml的配置如下所示,该配置中配置了两个WrapperContext,分别对应于两个Servlet配置。在web.xml中,我们经常可以看到listener标签,主要是用于监听Context容器的声明周期事件。



  UTF-8
  UTF-8
    
        default
        org.apache.catalina.servlets.DefaultServlet
        
            debug
            0
        
        
            listings
            false
        
        1
    

    
        jsp
        org.apache.jasper.servlet.JspServlet
        
            fork
            false
        
        
            xpoweredBy
            false
        
        3
    

    
        default
        /*
    

    
    
        jsp
        *.jsp
        *.jspx
    

    
        30
    

    
        index.html
        index.htm
        index.jsp
    


Wrapper容器

Wrapper容器是最小的容器,每个Wrapper都可以对应一个Servlet的实例。当请求转发到Wrapper容器之后,wrapper容器在调用Pipeline方法之后,会使用特定的类加载器去加载servlet类,对servlet进行实例化和初始化,然后将请求交给servelt的service方法进行处理。

我们常见的Spring的DispatchServlet是线程安全的,所以Tomcat不需要保证Servlet的并发安全。对于非线程安全的servlet,则可以通过SingleThreadModel来保证多请求下servlet的正常运行。

Wrapper容器的主要作用就是载入servlet类并进行实例化,并调用service方法。当第一次请求某个servlet类的时候,Wrapper容器会载入servlet类。Tomcat提供了专门的类加载器用于加载servlet,关于这个类加载器我会在我的其它文章中介绍。

Wrapper容器的基本阀门StandardWrapperValve还会在调用servelt容器之前调用用户配置的过滤器链Filter。

我是御狐神,欢迎大家关注我的微信公众号:wzm2zsd

本文最先发布至微信公众号,版权所有,禁止转载!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/283892.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号