Article-No.04 深刻剖析Tomcat

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

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

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

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

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

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

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

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

三、链接器socket

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

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

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

    HttpConnector做用:一、等待一个HTTP请求,二、为请求建立一个HttpProcessor实例,三、调用HttpProcessor实例的process方法

    HttpProcessor做用:一、建立请求对象(ServletRequest)和响应对象(ServletResponse),二、解析HTTP请求行和请求头,填充到ServletRequest对象中,三、将ServletRequest和ServletResponse对象建立给Servlet,并调用service方法

    4)解析HTTP请求头步骤

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

四、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

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

相关文章
相关标签/搜索