一.关于Tomcat组成
先上张图:
Tomcat组成:
1. Server:代表整个 servlet 容器,如Tomcat,JBoss之类的。
2. Service:它由一个或者多个Connector组成,以及一个Engine,负责处理所有Connector所获得的客户请求。
3. Connector:一个Connector将在某个指定的端口上监听客户请求,并且将获得的请求交给Engine来处理,从Engine获得获得回应并且返
回给客户。例如上图中,我们监听了8080和8081端口。
4. Engine:Engine下可以配置多个虚拟主机Virtual Host,每个虚拟主机都有一个域名,当Engine获得一个请求时,它把该请求匹配到某个
Host上,然后把该请求交给该Host来处理,Engine有一个默认(default)虚拟主机,当请求无法匹配到任何一个Host上的时候,将交给该Host来
处理。
5. Host:代表一个虚拟主机,即针对一个域名的专门的处理器,每个虚拟主机下可以部署一个或者多个WebApp,每个
WebApp对应一个Context,每个Context都有一个Context Path,当Host获得一个请求时,将把该请求匹配到某个Context上,然后
把该请求交给该Context来处理。
6. Context:一个Context 对应于一个Web Application,一个Web Application 由一个或者多个Servlet组成,Context在创建的时候将根据
配置文件 $CATALINA_HOME/conf/web.xml和$WEBAPP_HOME/WEB-INF/web.xml载入Servlet类。
如果找到,则执行该类,获得请求的回应,并且返回。
二. 配置文件 $CATALINA_HOME/conf/server.xml 文件说明
该文件描述了如何启动Tomcat Server
......
三. Context的部署配置文件web.xml的说明
一个Context对应一个Web App,每个Web App 是由一个或者多个Servlet组成,当一个Web App被初始化的时候,它将用自己的ClassLoader对象载入 "部署配置文件web.xml"中的定义的每个servlet类, 它首先载入在$CATALINA_HOME/conf/web.xml中部署的servlet类,然后载入在自己的Web App根目录下的WEB-INF/web.xml中部署的servlet类。
web.xml文件有两个部分:Servlet类定义和servlet映射定义,每个被载入的Servlet类都有一个名字,且被填入该Context的映射表中,和某种URL PATTERN 对应,当该Context获得请求的时候,将查询mapping table。找到被请求的servlet,并执行以获得请求回应。
下面是 $CATALINA_HOME/conf/web.xml中的内容
default org.apache.catalina.servlets.DefaultServlet debug 0 listings true 1 invoker org.apache.catalina.servlets.InvokerServlet debug 0 2 jsp org.apache.jasper.servlet.JspServlet logVerbosityLevel WARNING 3 default / invoker /servlet/* ... ... ... ... jsp *.jsp
四. Tomcat Server处理一个http请求的过程
假设来自客户的请求为:
http://localhost:8080/wsota/wsota_index.jsp
1) 请求被发送到本机端口8080,被在那里侦听的Coyote HTTP/1.1 Connector获得
2) Connector把该请求交给它所在的Service的Engine来处理,并等待来自Engine的回应3) Engine获得请求localhost/wsota/wsota_index.jsp,匹配它所拥有的所有虚拟主机Host4) Engine匹配到名为localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机)5) localhost Host获得请求/wsota/wsota_index.jsp,匹配它所拥有的所有Context6) Host匹配到路径为/wsota的Context(如果匹配不到就把该请求交给路径名为”"的Context去处理)7) path=”/wsota”的Context获得请求/wsota_index.jsp,在它的mapping table中寻找对应的servlet8) Context匹配到URL PATTERN为*.jsp的servlet,对应于JspServlet类9) 构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet或doPost方法10)Context把执行完了之后的HttpServletResponse对象返回给Host11)Host把HttpServletResponse对象返回给Engine12)Engine把HttpServletResponse对象返回给Connector13)Connector把HttpServletResponse对象返回给客户browser 参考博客:https://blog.csdn.net/pzxwhc/article/details/47129675