一、如何实现一个简单的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对象中,返回服务器
二、异常信息管理类StringManager(org.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
则表示服务器继续读取输入流内容