参考tomcat-5.5.20
1)核心流程涉及到的几个类
1.1)org.apache.catalina.connector.Request
(这个就是我们在servlet中看到的HttpServletRequest的tomcat实现,有一个非常常见的属性ParameterMap parameterMap)
1.2)org.apache.coyote.Request
(原始的tomcat请求数据结构)
1.3)org.apache.tomcat.util.http.Parameters
(我们通过http传递的参数的数据结构)
注意:org.apache.tomcat.util.http.Parameters有非常重要的几个属性:
- String encoding:
用于post数据的编码
- String queryStringEncoding:
用于get数据的编码
- MessageBytes queryMB:
原始的get请求部分的字节
- CoyoteInputStream inputStream
原始的post请求部分的字节(实际上来自coyoteRequest[org.apache.coyote.Request的实例]的inputBuffer)
- MessageBytes decodedQuery:
在对请求字节进行解码时,会拷贝queryMB即decodedQuery是queryMB 涉及请求参数那部分字节的拷贝
这里所说的解码会在下面的请求过程中详细描述
- Hashtable paramHashStringArray:
把解码后的字节(包括key和value)转为字符保存在hashtable 中,编码的选取规则如下:
get请求对应queryStringEncoding,post对应encoding
paramHashStringArray也是HttpServletRequest.getParameterMap的来源
3者的关系如下:
1)包含 2),2)包含 3)
见下图: