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 处理请求。

相关推荐
空空kkk几秒前
MyBatis——代理Dao方式的增删改查操作
java·数据库·mybatis
Seven9710 分钟前
线性数据结构
java
带刺的坐椅13 分钟前
Solon 不依赖 Java EE 是其最有价值的设计!
java·spring·web·solon·javaee
青云交16 分钟前
Java 大视界 -- 基于 Java 的大数据分布式存储在数字媒体内容存储与版权保护中的应用
java·性能优化·区块链·分布式存储·版权保护·数字媒体·ai 识别
踢球的打工仔33 分钟前
PHP面向对象(5)
android·java·php
Rover.x35 分钟前
错误:找不到或无法加载主类 @C:\Users\AppData\Local\Temp\idea_arg_file223456232
java·ide·intellij-idea
4***172737 分钟前
使用 java -jar 命令启动 Spring Boot 应用时,指定特定的配置文件的几种实现方式
java·spring boot·jar
CoderYanger1 小时前
优选算法-字符串:63.二进制求和
java·开发语言·算法·leetcode·职场和发展·1024程序员节
3***31211 小时前
java进阶1——JVM
java·开发语言·jvm
FeiHuo565151 小时前
微信个人号开发中如何高效实现API二次开发
java·开发语言·python·微信