首先声明,博主使用的Tomcat8.5.37版本的,编辑器是Intelij IDEA 浏览器统一是Chrome
Servlet的执行过程
首先我们需要考虑这样一个问题,在浏览器上输入http://localhost//firstservlet/first 发生了什么事情??
通过思考上面的问题我们引出了本文的主要意图:servlet 的执行过程。在将Servlet执行过程之前我们需要了解Tomcat的组成结构
Tomcat的组成结构
Tomcat本身是由一系列可配置的组件构成,其核心组件是Servlet容器组件,它是其他Tomcat组件的顶层容器,每一个组件都可以在Tomcat安装目录/conf/serve.xml文件中对应一种配置元素,我们可以通过XML形式展示各种Tomcat 组件之间的关系。
图一、TomCat各组件之间的关系
Tomcat的体系架构:
- Server :
一个server可以包含多个service - service : 每一个service里面有一个或者多个Connector组成,此外还有一个Engine,负责处理所有Connector获得客户请求。
- Connector:TOMCAT有两个典型的Connector,一个直接侦听来自browser的http请求,一个侦听来自WebServer的请求Coyote Http/1.1 Connector 在端口8080处侦听来自客户browser的http请求
Coyote JK2 Connector 在端口8009处侦听来自其它WebServer(Apache)的servlet/jsp代理请求。 - Engine:Engine下面有多个虚拟主机visual Host ,每一个虚拟主机都拥有一个域名.当Engine获得一个请求的时候就会把请求匹配个某一个Host,由host进行处理,每一个Engine都会有一个默认的虚拟主机,当无法匹配到Host的时候,Engine就会把请求自动分配给它的默认虚拟主机,由默认主机进行处理。
- Host: 代表一个Virtual Host,虚拟主机,每个虚拟主机和某个网络域名Domain Name相匹配
每个虚拟主机下都可以部署(deploy)一个或者多个Web App,每个Web App对应于一个Context,有一个Context path当Host获得一个请求时,将把该请求匹配到某个Context上,然后把该请求交给该Context来处理匹配的方法是“最长匹配”,所以一个path==”"的Context将成为该Host的默认Context所有无法和其它Context的路径名匹配的请求都将最终和该默认Context匹配。 - Context: Context 相当于是一个 web Application ,一个Application由一个或者多个Servlet组成,Context在创建的过程中会根据配置文件 C A T A L I N A H O M E / c o n f / w e b . x m l 和 CATALINA_HOME/conf/web.xml和 CATALINAHOME/conf/web.xml和WEBAPP_HOME/WEB-INF/web.xml载入Servlet类,当Context获得请求的时候会在自己的映射表里面进行相应的匹配的Servlet 类,如果找到了,那么将执行该类,并将结果返回。
执行过程
由Tomcat的组成结构和体系结构,我们知道当我们在浏览器输入http://localhost//firstservlet/first 的时候,Servlet 的执行过程如下:
1.首先被监听的80端口号的 connector HTTP 1.1接收,接受之后将请求转发给Engine 处理。
2.Engine 将请求匹配给虚拟主机localhost(仅以此例,不同的请求会匹配不同的虚拟主机)这是一个虚拟主机,当无法匹配到其他虚拟主机的时候会交给他执行。
3.虚拟主机加收到请求之后,会将请求路径进行改变变成/firstservlet/first,也就是说,到这一步的时候,已经找到/localhost了,之后会在host节点下面继续搜寻Context节点,也就是 Web Application 的应用名。
4.找到firstservlet应用之后,将请求转发该应用/first,之后再去相应web.xml中去搜索/first。通过对应的url-pattern 找到 servlet-name,在通过name 找到相应的class文件,之后加载到该class文件。
5.检查是否有该servlet的实例,有的话,则不会执行init方法,没有的话就会创建一个实例对象,执行init方法。
6.Tomcat创建一个用于封装HTTP请求消息的HttpServeletRequest对象和一个代表HTTP响应消息的HttpServeletResponse对象,然后调用相应的Servlet的service()方法并将请求和响应对象作为参数传递进去。
7.WEB应用程序被停止或重新启动之前,Servelet引擎将卸载Servelet,并在卸载之前,调用Servlet的destroy()方法。