tomcat之处理连接过程

tomcat处理http静态,和jsp动态请求的处理过程...

tomcat与nginx/httpd处理请求的区别

nginx/httpd

​ nginx于httpd都是先有监听进程或线程监听请求,建立连接,对于建立好的连接,放到已连接的队列,等待工作线程去消费,即处理该连接,之后的通信是工作进程/线程通过该已经建立的连接套接字直接和客户端通信

​ 即请求建立是通过监听套接字,实际数据通信是通过连接套接字

tomcat

​ connector负责监听请求,建立连接,请求时,通过connector经过engine、host、context、wrapper的层次处理,生成响应数据,最后再经由wraper、context、host、engine,最后再经由connector返回给客户端;

即connector是唯一的关口,请求与响应都经过该connector

tomcat处理jsp动态请求

请求www.pc.com/img/index.jsp时处理过程;

配置如下:

<Server>
	<Service>
		<Connector .../>
		<Engine name="Catalina" defaultHost="localhost">

		 <Host name="www.pc.com" appBase="webapps/pc"
                unpackWARs="true" autoDeploy="true">

                <Context path="" docBase="" reloadable="true"/>
                <Context path="/img" docBase="img" reloadable="true"/>

        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
                prefix="pc_access_log" sufffix=".txt"
                pattern="%h %l %t &quot;%r&quot; %s %b" />
      </Host>
	
		</Engine>
	</Service>
</Server>
  1. connector接收后,procotolhandler分析协议,processor处理并交给绑定的engine

  2. engine分析后,找到对应的host,找不到就发给定义的默认host

  3. host接收后,根据path匹配,交给对应context处理,找不到就用默认的path=""的context处理,没定义path=""时,就用/ROOT/目录去响应

  4. context接收后,以www.pc.com/img/index.jsp为例,img的context被匹配,然后先找webapps/pc/WEB-INF/web.xml文件,根据其文件定义匹配index.jsp决定如何处理该文件,如果没有定义webapps私有的web.xml,就找/conf/web.xml的默认配置;

  5. 根据<prefix>/conf/web.xml定义:被匹配到的servlet-name是jsp,进而找到下方对应的servlet,其内部指定的类是org.apache.jasper.servlet.JspServlet
       
    <servlet-mapping>
            <servlet-name>jsp</servlet-name>
            <url-pattern>*.jsp</url-pattern>
            <url-pattern>*.jspx</url-pattern>
        </servlet-mapping>
           
    #
           <servlet>
            <servlet-name>jsp</servlet-name>
            <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
            <init-param>
                <param-name>fork</param-name>
                <param-value>false</param-value>
            </init-param>
            <init-param>
                <param-name>xpoweredBy</param-name>
                <param-value>false</param-value>
            </init-param>
            <load-on-startup>3</load-on-startup>
        </servlet>
       
    # 于是采用lib/jasper.jar进行处理,jar展开后,依据org.apache.jasper.servlet.JspServlet找到对应类,于是就用该类处理index.jsp文件
    [root@host2 tomcat]# pwd
    /usr/local/tomcat
    [root@host2 tomcat]# ll lib/jasper.jar 
    -rw-r----- 1 root root 599412 Jul  1 05:50 lib/jasper.jar
       
    

    image-20200904124708342

  6. jspSerlet将jsp文件翻译为java源代码,再编译为.class文件,

  7. 编译后目录及文件,在/work目录下

  8. [root@host2 tomcat]# pwd
    /usr/local/tomcat
    [root@host2 tomcat]# ll work/Catalina/www.pc.com/img/org/apache/jsp/
    total 16
    -rw-r----- 1 root root 5462 Sep  3 11:24 index_jsp.class
    -rw-r----- 1 root root 4825 Sep  3 11:24 index_jsp.java
       
    
  9. index_jsp.class就是要执行的servlet程序,包含输出数据和html代码

tomcat处理静态资源

对于静态资源,也是采用servlet进行处理,下方是/conf/web.xml的有关静态资源处理的类定义:

# 静态资源文件匹配到的default的servlet-name
<servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    
# 名为default的servlet由org.apache.catalina.servlets.DefaultServlet实现
  <servlet>
        <servlet-name>default</servlet-name>
        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <init-param>
            <param-name>listings</param-name>
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    
# 对应jar包为lib/catalina.jar
[root@host2 tomcat]# ll lib/catalina.jar 
-rw-r----- 1 root root 1703845 Jul  1 05:50 lib/catalina.jar

展开catalina.jar包后,找到对应的DefaultServlet.class即为处理静态资源的servlet

image-20200904130126922

举例:

www.pc.com/img/index.jsp 由动态的servlet处理

www.pc.com/img/index.html
www.pc.com/img/index.htm
www.pc.com/img/index.txt
www.pc.com/img/index.js 都是由静态servlet处理
updatedupdated2020-10-192020-10-19
加载评论