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

相关推荐
深入云栈43 分钟前
Netty 4.2.x 源码深度解析 (二十三):ByteBuf 核心设计 —— 索引、类型与零拷贝
java·后端·架构
wang_shu_mo_ran2 小时前
MyBatis 从入门到进阶(一)
java·spring·mybatis
量化分析码农3 小时前
股票历史数据的复权参数对照:多级别返回的字段与数值差异
java·javascript·后端
猫猫不是喵喵.3 小时前
从0到1创建一个微服务项目
java·数据库·微服务·1024程序员节
瑞雪兆丰年兮4 小时前
JavaWeb-day13-SpringBootWeb事务管理&AOP
java·开发语言·springboot·javaweb·事务·web·aop
曲径海盗4 小时前
Try-Except怎么用,3个追问解答在自动化下的应用
java·jvm·oracle
Cosolar5 小时前
极简智库:快速搭建你的开源项目教程阅读平台,让 docs/ 目录被更多人看见
java·架构·github
nice_lcj5205 小时前
【从零理解 Spring AI · 16】Agent 与工作流:什么该写死,什么该让模型决定
java·人工智能·后端·spring ai·ai应用开发
北京云帆互联科技5 小时前
云帆培训考试系统更新说明:v9.3.0
java·学习
学长毕设6 小时前
基于SpringBoot的景点管理系统-附源码
java·spring boot·后端