网站开发进阶 (四)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】。文章转载请联系作者。










评论