How Tomcat Work——Tomcat 的默认连接器
  7W9CSZ5LYIu0 2023年11月12日 16 0


注意: 本章中提及的“默认连接器”是指Tomcat4的默认连接器。即使默认的连机器已经被弃用,
被更快的,代号为Coyote的连接器所代替,它仍然是一个很好的学习工具。
Tomcat 连接器是一个可以插入 servlet 容器的独立模块,已经存在相当多的连接器了,包
括Coyote, mod_jk, mod_jk2和mod_webapp。一个Tomcat连接器必须符合以下条件:
1. 必须实现接口org.apache.catalina.Connector。
2. 必须创建请求对象,该请求对象的类必须实现接口org.apache.catalina.Request。
3. 必须创建响应对象,该响应对象的类必须实现接口org.apache.catalina.Response。
Tomcat4的默认连接器类似于第3章的简单连接器。它等待前来的HTTP请求,创建request
和 response 对象,然后把 request 和 response 对象传递给容器。连接器是通过调用接口
org.apache.catalina.Container 的 invoke 方法来传递 request 和 response 对象的。invoke
的方法签名如下所示:

public void invoke( 

org.apache.catalina.Request request,

org.apache.catalina.Response response);


在 invoke 方法里边,容器加载 servlet,调用它的 service 方法,管理会话,记录出错日
志等等。
本章中的应用程序是一个和默认连接器管理的简单容器。然而,本章的焦点不是简单容器而
是默认连接器。我们将会在第5章中讨论容器。不管怎样,为了展示如何使用默认连接器,将会
在接近本章末尾的“简单容器的应用程序”一节中讨论简单容器。
另一个需要注意的是默认连接器除了提供HTTP0.9和HTTP1.0的支持外,还实现了HTTP1.1
的所有新特性。为了理解HTTP1.1中的新特性,你首先需要理解本章首节解释的这些新特性。在
这之后,我们将会讨论接口
org.apache.catalina.Connector和如何创建请求和响应对象。假如你理解第3章中连接器如何
工作的话,那么在理解默认连接器的时候你应该不会遇到任何问题。
本章首先讨论HTTP1.1的三个新特性。理解它们是理解默认连接器内部工作机制的关键所在。
然后,介绍所有连接器都会实现的接口 org.apache.catalina.Connector。你会发现第3章中遇
到的那些类,例如 HttpConnector, HttpProcessor 等等。不过,这个时候,它们比第 3 章那些
类似的要高级些。

HTTP 1.1 新特性
本节解释了HTTP1.1的三个新特性。理解它们是理解默认连接器如何处理HTTP请求的关键。
[b]持久连接 [/b]
在 HTTP1.1 之前,无论什么时候浏览器连接到一个web 服务器,当请求的资源被发送之后,
连接就被服务器关闭了。然而,一个互联网网页包括其他资源, 例如图片文件,applet 等等。
因此,当一个页面被请求的时候,浏览器同样需要下载页面所引用到的资源。加入页面和它所引
用到的全部资源使用不同连接来 下载的话,进程将会非常慢。那就是为什么 HTTP1.1引入持久
连接的原因了。使用持久连接的时候,当页面下载的时候,服务器并不直接关闭连接。相反,它
等待web客户端请求页面所引用的全部资源。这种情况下,页面和所引用的资源使用同一个连接
来下载。考虑建立和解除HTTP连接的宝贵操作的话,这就为 web服务器,客户端和网络节省了
许多工作和时间。
持久连接是 HTTP1.1 的默认连接方式。同样,为了明确这一点,浏览器可以发送一个值为
keep-alive的请求头部connection:
connection: keep-alive
[b]
块编码 [/b]
建立持续连接的结果就是,使用同一个连接,服务器可以从不同的资源发送字节流,而客户
端可以使用发送多个请求。结果就是,发送方必须为每个请求或响应发送 内容长度的头部,以
便接收方知道如何解释这些字节。然而,大部分的情况是发送方并不知道将要发送多少个字节。
例如,在开头一些字节已经准备好的时 候,servlet 容器就可以开始发送响应了,而不会等到
所有都准备好。这意味着,在content-length头部不能提前知道的情况下,必须有一种 方式来
告诉接收方如何解释字节流。
即使不需要发送多个请求或者响应,服务器或者客户端也不需要知道将会发送多少数据。在
HTTP1.0中,服务器可以仅仅省略content-length 头部,并保持写入连接。当写入完成的时候,
它将简单的关闭连接。在这种情况下,客户端将会保持读取状态,直到获取到-1,表示已经到达
文件的尾部。
HTTP1.1使用一个特别的头部transfer-encoding来表示有多少以块形式的字节流将会被发
送。对每块来说,在数据之前,长度(十六进 制)后面接着 CR/LF 将被发送。


状态100(持续状态)的使用
在发送请求内容之前,HTTP 1.1客户端可以发送Expect: 100-continue头部到服务器,并
等待服务器的确认。这个一般发生在当客户端需要发送一份长的请求内容而未能确保服务器愿意
接受它的时候。如果你 发送一份长的请求内容仅仅发现服务器拒绝了它,那将是一种浪费来的。
当接受到 Expect: 100-continue头部的时候,假如乐意或者可以处理请求的话,服务器响
应100-continue头部,后边跟着两对CRLF字符。
HTTP/1.1 100 Continue
接着,服务器应该会继续读取输入流。

[b]Connector 接口[/b]
Tomcat连接器必须实现org.apache.catalina.Connector接口。在这个接口的众多方法中,
最重要的是getContainer,setContainer, createRequest和createResponse。
setContainer 是用来关联连接器和容器用的。getContainer 返回关联的容器。
createRequest为前来的HTTP请求构造一个请求对象,而createResponse 创建一个响应对象。
类 org.apache.catalina.connector.http.HttpConnector是 Connector 接口的一个实现,
将会在下一 节“HttpConnector类”中讨论。现在,仔细看一下Figure 4.1中的默认连接器的
UML 类图。注意的是,为了保持图的简单化,Request 和 Response 接口的实现被省略了。除了
SimpleContainer类,org.apache.catalina前缀也同样从类型名中被省略了。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月12日 0

暂无评论

推荐阅读
7W9CSZ5LYIu0