Article-No.04 深入剖析Tomcat

1、如何实现一个简单的servlet容器(处理静态资源和简单的servlet请求)步骤

    1)创建ServerSocket对象,等待HTTP请求

    2)创建一个ServletRequest对象和一个ServletResponse,前者封装socket获取到的inputsream输入流,后者封装socket获取到的outputstream输出流

    3)如果访问静态资源,调用StaticResourceProcessor类的process方法,传递ServletRequest和ServletResponse实例,并读取静态资源,通过输出流输出

    4)如果访问的是servlet,通过反射机制加载servlet类,并调用service方法,同时传递ServletRequest和ServletResponse实例

    5)处理完成后,将数据封装到ServletResponse对象中,返回

2、异常信息管理类StringManagerorg.apache.tomcat.util.res.StringManager):用于处理Tomcat错误消息,Tomcat每一个包下都有一个对应的存储错误消息在properties文件,每一个properties文件都是由StringManager类实例管理

    StringManger管理类是一个单例类,有一个HashTable对象,以包名+语言(Locale为key,进行存储

3、连接器

    1)Tomcat的Servlet容器名称为Catalina,主要包含两个模块:连接器(connector)和容器(container)

    2)连接器作用:解析HTTP请求头,以便servlet可以获取到header信息和cookie信息以及请求参数信息等,数据保存到httpservletrequest对象中

    3)实现一个简单的连接器,由两部分组成:HttpConnector、HttpProcessor

    HttpConnector作用:1、等待一个HTTP请求,2、为请求创建一个HttpProcessor实例,3、调用HttpProcessor实例的process方法

    HttpProcessor作用:1、创建请求对象(ServletRequest)和响应对象(ServletResponse),2、解析HTTP请求行和请求头,填充到ServletRequest对象中,3、将ServletRequest和ServletResponse对象创建给Servlet,并调用service方法

    4)解析HTTP请求头步骤

    a、读取套接字的输入流;b、解析请求行;c、解析请求头;d、解析Cookie;f、解析获取请求参数

4、Tomcat默认连接器

    1)Tomcat使用的连接器必须满足一下条件:

  • 实现org.apache.catalina.Connector接口

  • 负责创建实现了org.apache.catalina.Reuqest接口的request对象

  • 负责创建实现了org.apache.catalina.Response接口的response对象

    2)HTTP 1.1新特性

  • 持久连接(connection: keep-live):在HTTP 1.1之前,客户端请求服务器资源,服务器将请求的资源返回给客户端后,会关闭HTTP连接。但是网页上还有一些其他资源,诸如:css、js、img等,请求一个页面,还需要下载这些资源,如果每次请求都创建一个HTTP连接,非常的消耗资源和时间。在HTTP 1.1当资源返回后,并不会立即关闭连接,它会等到web页面上所有请求的资源都下载完成后在关闭连接,这样页面和呗页面引用的资源都是同一个连接下载。同一个连接下载所有资源减少了web服务器和web客户端时间和工作量

  • 块编码:在HTTP 1.1中使用一个名为“tranfer-encoding”的特殊请求头,来指明字节流将会以分块发送,每一个块都是【块的长度(以十六进制表)+ \r\n + 具体的块数据】,末尾以一个长度为0的块标记

//原始内容:I'm as helpless as a kitten up a tree
1D\r\n //1D表示第一块为29个字节长度
I'm as helpless as a kitten u
9\r\n
p a tree
0\r\n //表示事务已经完成
  • 状态码100:再发送一个较大请求体之前,客户端不确定服务器能否处理,在发送请求体之前请求头里面添加:Expect: 100-continue,如果服务器返回:HTTP/1.1 100 Continue

        则表示服务器继续读取输入流内容

你可能感兴趣的:(Article-No.04 深入剖析Tomcat)