3. 请求与响应
- 取得请求参数与标头
- 处理中文字符请求与响应
- 设置与取得请求范围属性
- 正确使用转发、包含、重定向
Web容器做了什么
Web容器做了几件事:创建 Servlet 实例,并完成 Servlet 名称注册以及 URL 模式的对应。在请求到来的时候转发正确的 Servlet 来处理请求。
当浏览器请求 HTTP 服务器时,而 HTTP 服务器转交请求给容器时,容器会创建一个代表当次请求的 HttpServletRequest
对象,并将请求相关信息设置给该对象。同时,容器会创建一个 HttpServletResponse
对象,作为稍后要对客户端进行响应的 Java 对象。
接着,容器会根据读取的 @WebSerlvet
标注或 web.xml
的设置,找出处理该请求的 Servlet,,调用它的 service()
方法,将创建的 HttpServletRequest
对象、HttpServletResponse
对象作为参数传入。service()
会根据 HTTP 请求的烦事,调用相应的 doXXX()
方法。在 doXXX()
方法中,可以使用 HttpServletRequest
对象、HttpServletResponse
对象。
之后,容器将 HttpServletRequest
对象、HttpServletResponse
对象销毁回收,该次请求响应结束。
因为 HTTP 是基于请求/响应、无状态的协议,每一次的请求/响应之后,服务器端就不会记得任何客户端的信息了。所以容器每次请求都会创建新的 HttpServletRequest
对象、HttpServletResponse
对象,响应后将销毁该次的 HttpServletRequest
对象、HttpServletResponse
对象。下次请求时创建的请求/响应对象就和上次无关了。所以,对HttpServletRequest
对象、HttpServletResponse
对象的设置,时不能延续至下一次请求的。
请求参数的编码处理
要分 post 和 get 两种情况来处理
POST 请求参数编码处理
Content-Type
在 getParameter() 之前调用 setCharacterEncoding()
GET 请求参数编码处理
setCharacterEncoding()
对 GET 请求方法不起作用
通过 String 的 getBytes()
指定编码来取得字符粗的字节数组,然后再重新构造为正确编码的字符串
获取 Body 内容
- getReader()、getInputStream()
- getPart()、getParts() 取得上传文件