HttpServletRequest知识点
HttpServletRequest
是 Java Servlet 规范中定义的接口,用于封装客户端(如浏览器)向服务器发送的 HTTP 请求信息,是 Web 开发中处理请求的核心对象之一。
1. 核心作用
- 封装 HTTP 请求的所有信息(请求行、请求头、请求参数、请求体等)。
- 提供方法供开发者获取请求细节(如 URL、参数、客户端信息等)。
- 作为 Servlet 中
doGet()
、doPost()
等方法的参数,是处理请求的入口。
2. 常用方法分类
(1)获取请求行信息
请求行格式:请求方法 请求路径 HTTP协议版本
(如 GET /user?id=1 HTTP/1.1
)
java
// 获取请求方法(GET/POST/PUT/DELETE等)
String getMethod();
// 获取请求路径(不包含协议、域名、端口)
String getRequestURI(); // 例:/user
String getRequestURL(); // 例:http://localhost:8080/user(完整URL)
// 获取上下文路径(Web应用部署的根路径)
String getContextPath(); // 例:/myapp
// 获取HTTP协议版本(如 HTTP/1.1)
String getProtocol();
(2)获取请求参数
请求参数是客户端发送的键值对数据(如表单提交、URL查询参数)
java
// 根据参数名获取单个值(适用于单选、单个值)
String getParameter(String name);
// 根据参数名获取多个值(适用于复选框等多值情况)
String[] getParameterValues(String name);
// 获取所有参数的键值对集合
Map<String, String[]> getParameterMap();
// 解决参数中文乱码(POST请求有效,需在获取参数前调用)
void setCharacterEncoding(String encoding); // 例:setCharacterEncoding("UTF-8")
(3)获取请求头信息
请求头是 HTTP 协议中描述请求的元数据(如浏览器类型、内容类型等)
java
// 根据头名称获取头信息
String getHeader(String name);
// 获取所有头名称的枚举
Enumeration<String> getHeaderNames();
// 获取特定头的数值形式(如 Content-Length)
int getIntHeader(String name);
long getDateHeader(String name); // 日期类型头(如 If-Modified-Since)
// 常见头信息示例:
// User-Agent:客户端浏览器/设备信息
// Content-Type:请求体的数据类型(如 application/json、multipart/form-data)
// Cookie:客户端发送的Cookie
(4)获取客户端信息
java
// 获取客户端IP地址
String getRemoteAddr();
// 获取客户端端口
int getRemotePort();
// 获取服务器IP地址
String getLocalAddr();
// 获取服务器端口
int getLocalPort();
(5)请求域属性操作
用于在请求处理过程中共享数据(仅在当前请求生命周期内有效)
java
// 存储属性到请求域
void setAttribute(String name, Object value);
// 从请求域获取属性
Object getAttribute(String name);
// 移除请求域中的属性
void removeAttribute(String name);
// 获取所有属性名
Enumeration<String> getAttributeNames();
(6)请求转发
将请求转发到另一个资源(Servlet/JSP/HTML),属于服务器内部跳转
java
// 获取请求调度器,参数为目标资源路径(相对路径)
RequestDispatcher getRequestDispatcher(String path);
// 示例:转发到 /success.jsp
request.getRequestDispatcher("/success.jsp").forward(request, response);
3. 生命周期
HttpServletRequest
对象由 Servlet 容器(如 Tomcat)创建,随每次 HTTP 请求产生。- 生命周期与当前请求一致:请求处理完成后,对象被容器销毁。
- 只能在当前请求的处理线程中使用,不可跨请求共享。
4. 常见应用场景
- 接收表单数据 :通过
getParameter()
获取用户提交的表单字段。 - 处理 RESTful 请求 :通过
getRequestURI()
解析资源路径,结合getMethod()
判断请求类型。 - 获取客户端信息 :如通过
User-Agent
判断设备类型,实现自适应页面。 - 请求域传值 :在 Servlet 中处理数据后,通过
setAttribute()
传递给 JSP 渲染。 - 文件上传 :结合
Part
接口(Servlet 3.0+)处理multipart/form-data
类型的文件上传请求。
5. 注意事项
- 中文乱码问题 :
- GET 请求:参数在 URL 中,乱码需在服务器配置(如 Tomcat 的
server.xml
中设置URIEncoding="UTF-8"
)。 - POST 请求:通过
request.setCharacterEncoding("UTF-8")
解决(需在获取参数前调用)。
- GET 请求:参数在 URL 中,乱码需在服务器配置(如 Tomcat 的
- 参数获取时机 :
getParameter()
只能获取一次请求体数据(如 POST 请求的表单数据),读取后流会关闭,无法重复获取。 - 线程安全 :
HttpServletRequest
是线程不安全的,每个请求对应独立实例,不可多线程共享。
总结
HttpServletRequest
是处理 HTTP 请求的核心接口,封装了请求的所有细节,提供了丰富的方法用于获取请求信息、处理参数、共享数据等。掌握它的使用是进行 Java Web 开发的基础,无论是传统 Servlet 开发还是 Spring MVC 等框架,底层都依赖于 HttpServletRequest
处理请求。