连接器
*本章将会建立一个连接器
增强第二章的application
用一种更好的方法创建request和response对象*
兼容servlet2.3和2.4规范的连接器必须要负责创建javax.servlet.http.HttpServetRequest和javax.servlet.http.HttpServletResponse实例,并传入service方法 //??不大明白在说什么
连接器并不知道第2章的servlet的对象的类型
本章application中,连接器解析http头,使servlet能获取到头cookie等信息
StringManager类
Tomcat 把错误消息保存到properties文件中
并且划分到不同的包中
每个properties都是用org.apache.catalina.StringManager类的一个实例处理的
获取错误信息
public String getString(String key);
应用程序
代码量大,要把握全局
不需要逐个看下去,有点知道构造方法和用法就行
启动模块
只用一个类 Bootstrap类 负责启动application
连接模块
可分为五个类型
- 连接器及其支持类 HttpConnector和HttpProcesser
- Http请求类(HttpRequest)及其支持类
- Http响应类(HttpResponse)及其支持类
- 外观类(HttpRequestFacade和HttpResponseFacade类)
- 常量类
核心模块
- servletProcessor类
- StaticResourceProcessor类
整体把握
- 启动 Bootstrap类main方法中 实例化HttpConnector 并调用start方法开启线程
- 创建serverSocket类 等待HTTP请求
- 创建HttpProcessor实例 并且调用process方法
- process方法中 创建HttpRequest和HttpResponse 解析请求
- 静态请求
- servlet请求调用service方法
解析http请求
- 读取套接字的输入流
input = new SocketInputStream(socket.getInputStream(), 2048);
之所以使用SocketInputStream类就是为了调用其readRequestLine()方法和readHeader方法
- 解析请求行
private void parseRequest(SocketInputStream input, OutputStream output)
- 解析请求头
新类HttpHeader
- 无参构造
- 传参给SocketInputStream的readHeader方法
- 获取请求头的名字和值
String name = new String(header.name, 0, header.nameEnd);
String value = new String(value.name, 0, value.nameEnd);
- 解析Cookie
请求头是Cookie: username password
org.apache.catalina.util.RequestUtil类实现 - 获取参数
org.apache.Catalina.util.ParameterMap类实现