网站开发进阶 (四)Tomcat Server 处理 http 请求过程详解
Tomcat Server
处理http
请求过程如下:
假设用户在浏览器输入:
http://localhost:8080/wsota/shq5785.jsp
tomcat 处理过程如下:
请求被发送到本机端口 8080,被在那里侦听的
Coyote HTTP/1.1 Connector
获得;Connector
把该请求交给它所在的Service
的Engine
来处理,并等待来自Engine
的回应;Engine
获得请求localhost/wsota/shq5785.jsp
,匹配它所拥有的所有虚拟主机 Host;Engine
匹配到名为 localhost 的 Host(即使匹配不到也把请求交给该 Host 处理,因为该 Host 被定义为该 Engine 的默认主机);localhost Host 获得请求
/wsota/shq5785.jsp
,匹配它所拥有的所有Context
;Host 匹配到路径为/wsota 的
Context
(如果匹配不到就把该请求交给路径名为""的Context
去处理);path="/wsota"
的Context
获得请求/shq5785.jsp
,在它的mapping table
中寻找对应的servlet
;Context
匹配到URL PATTERN
为*.jsp
的servlet
,对应于JspServlet
类;构造
HttpServletRequest
对象和HttpServletResponse
对象,作为参数调用JspServlet
的doGet
或doPost
方法;Context
把执行完了之后的HttpServletResponse
对象返回给Host
;Host
把HttpServletResponse
对象返回给Engine
;Engine
把HttpServletResponse
对象返回给Connector
;Connector
把HttpServletResponse
对象返回给客户browser
;
<Connector>元素
<Connector>
元素由Connector
接口定义。<Connector>
元素代表与客户程序实际交互的给件,它负责接收客户请求,以及向客户返回响应结果. 一个“Connector
”(连接器)代表一个请求被接收和应答所需要的端点。每个连接器通过相关的“Container
”(容器)处理请求。
<Host>元素
它由Host
接口定义。一个Engine
元素可以包含多个<Host>
元素。每个<Host>
的元素定义了一个虚拟主机。它包含了一个或多个 Web 应用.。
注: name 是虚拟主机的名字,appBase
是虚拟主机指向的目录,Tomcat 启动时,会自动加载appBase
下的应用。 unpackWARs
表示是否自动解压缩appBase
下已打成WAR
包的应用,autoDeploy
表示在服务器运行的时候,将一个应用放入 appBase
下,是否自动部署。
<Context>元素
它由Context
接口定义,是使用最频繁的元素。每个<Context>
元素代表了运行在虚拟主机上的单个 Web 应用。一个<Host>
可以包含多个<Context>
元素。每个 web 应用有唯一的一个相对应的Context
代表 web 应用自身。
path
: 该Context
的路径名是""
,故该Context
是该Host
的默认Context
;docBase
: 该Context
的根目录是webapps/mycontext/
;reloadable
:如果这个属性设为true
,Tomcat
服务器在运行状态下会监视在WEB-INF/classes
和Web-INF/lib
目录CLASS
文件的改动。如果监视到有class
文件被更新,服务器自重新加载 Web 应用;useNaming
:指定是否支持JNDI
,默认值为了true
;cookies
:指定是否通过Cookies
来支持Session
,默认值为true
;
<Service>元素
该元素由org.apache.catalina.Service
接口定义,它包含一个<Engine>
元素,以及一个或多个<Connector>
,这些Connector
元素共享用同一个Engine
元素。
redirectPort
指定服务器正在处理http
请求时收到了一个SSL
传输请求后重定向的端口号。
第一个<Service>
处理所有直接由Tomcat
服务器接收的 web 客户请求。
第二个<Service>
处理所有由Apahce
服务器转发过来的 Web 客户请求 。
注:Server
元素下可以有多个Service
,端口就是在Service
元素下配置的。
其中protocal
制定了该端口侦听的协议类型,HTTP/1.1
表示侦听客户的HTTP
请求,即我们通过浏览器访问需要输入的端口,当端口号是 80 的时候,可以不用在浏览器地址栏输入端口号,这就是我们访问很多网站不需要指定端口的原因。有时候protocal
没有指定,这时候默认的是HTTP/1.1
。注意这个端口必须是闲置的。
Service
元素下必须有一个Engine
元素,Engine
有一个名称,和一个默认的虚拟主机名。
版权声明: 本文为 InfoQ 作者【No Silver Bullet】的原创文章。
原文链接:【http://xie.infoq.cn/article/09c7b37d109a9607a7e0f079b】。文章转载请联系作者。
评论