HttpServletRequest知识点

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") 解决(需在获取参数前调用)。
  • 参数获取时机getParameter() 只能获取一次请求体数据(如 POST 请求的表单数据),读取后流会关闭,无法重复获取。
  • 线程安全HttpServletRequest 是线程不安全的,每个请求对应独立实例,不可多线程共享。

总结

HttpServletRequest 是处理 HTTP 请求的核心接口,封装了请求的所有细节,提供了丰富的方法用于获取请求信息、处理参数、共享数据等。掌握它的使用是进行 Java Web 开发的基础,无论是传统 Servlet 开发还是 Spring MVC 等框架,底层都依赖于 HttpServletRequest 处理请求。

相关推荐
tellmewhoisi几秒前
java8 List常用基本操作(去重,排序,转换等)
java·list
都叫我大帅哥30 分钟前
TOGAF应用架构阶段全解析:从理论到Java代码实战
java
Amagi.1 小时前
Java设计模式-建造者模式
java·设计模式·建造者模式
EmpressBoost1 小时前
谷粒商城170缓存序列化报错
java·spring·缓存
fouryears_234171 小时前
@PathVariable与@RequestParam的区别
java·spring·mvc·springboot
wxjlkh1 小时前
powershell 批量测试ip 端口 脚本
java·服务器·前端
萌新小白的逆袭2 小时前
《Maven 核心基础笔记(第一天)》
java·开发语言·spring
一念&2 小时前
Java泛型
java
掉鱼的猫2 小时前
Solon 整合 LiteFlow 规则引擎:概念与实战
java·workflow
她说..2 小时前
Stream API流学习总结
java