当前位置: 首页 > ds >正文

HttpServletRequest知识点

HttpServletRequest知识点

HttpServletRequest 是 Java Servlet 规范中定义的接口,用于封装客户端(如浏览器)向服务器发送的 HTTP 请求信息,是 Web 开发中处理请求的核心对象之一。

1. 核心作用

  • 封装 HTTP 请求的所有信息(请求行、请求头、请求参数、请求体等)。
  • 提供方法供开发者获取请求细节(如 URL、参数、客户端信息等)。
  • 作为 Servlet 中 doGet()doPost() 等方法的参数,是处理请求的入口。

2. 常用方法分类

(1)获取请求行信息

请求行格式:请求方法 请求路径 HTTP协议版本(如 GET /user?id=1 HTTP/1.1

// 获取请求方法(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查询参数)

// 根据参数名获取单个值(适用于单选、单个值)
String getParameter(String name); // 根据参数名获取多个值(适用于复选框等多值情况)
String[] getParameterValues(String name); // 获取所有参数的键值对集合
Map<String, String[]> getParameterMap(); // 解决参数中文乱码(POST请求有效,需在获取参数前调用)
void setCharacterEncoding(String encoding); // 例:setCharacterEncoding("UTF-8")
(3)获取请求头信息

请求头是 HTTP 协议中描述请求的元数据(如浏览器类型、内容类型等)

// 根据头名称获取头信息
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)获取客户端信息
// 获取客户端IP地址
String getRemoteAddr(); // 获取客户端端口
int getRemotePort(); // 获取服务器IP地址
String getLocalAddr(); // 获取服务器端口
int getLocalPort();
(5)请求域属性操作

用于在请求处理过程中共享数据(仅在当前请求生命周期内有效)

// 存储属性到请求域
void setAttribute(String name, Object value); // 从请求域获取属性
Object getAttribute(String name); // 移除请求域中的属性
void removeAttribute(String name); // 获取所有属性名
Enumeration<String> getAttributeNames();
(6)请求转发

将请求转发到另一个资源(Servlet/JSP/HTML),属于服务器内部跳转

// 获取请求调度器,参数为目标资源路径(相对路径)
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 处理请求。

http://www.xdnf.cn/news/16366.html

相关文章:

  • 线性代数 下
  • Oracle转Mysql建表脚本
  • RocketMQ常见问题梳理
  • IDM:registered with a fake serial number
  • 【JavaEE】Spring Web MVC(上)
  • NineData 数据库 DevOps 全面支持 GaussDB,国产化管理再升级!
  • Canal 1.1.7的安装
  • 焊接机器人节能先锋
  • Kafka——多线程开发消费者实例
  • 华为云DRS实现Oracle到GaussDB数据库迁移的全流程技术方案
  • 配置Mac/Linux终端启动执行脚本
  • 【小沐学GIS】基于Unity3d绘制三维数字地球Earth(Unity3d、OpenGL、GIS)
  • Linux 网络与 Vim 编辑器操作
  • MySQL 事务管理
  • Linux 中 `chown`、`chgrp` 和 `chmod` 命令详解
  • Java学习第七十三部分——Redis
  • Gin 框架的中间件机制
  • 【08】C#入门到精通——C# 文件操作 读取并删除指定文件 修改指定文件名
  • LLM中典型的Transformer层中:MLP Residual; LN Agg: μ, σ; SM Agg 是什么意思
  • 从0开始学习R语言-Day56--空间变系数模型
  • 【Git知识】Git 常用知识集合之基础--分支系统与 Tag 标签机制
  • 华为仓颉编程语言的表达式及其特点
  • Lua协同程序(coroutine)
  • iOS网络之异步加载
  • YOLO算法演进综述:从YOLOv1到YOLOv13的技术突破与应用实践,一文掌握YOLO家族全部算法!
  • 图像认知与OpenCV——图像预处理2
  • 【Unity开发】飞机大战项目实现总结
  • Python 程序设计讲义(15):Python 的数据运算——位运算
  • Unity VS Unreal Engine ,“电影像游戏的时代” 新手如何抉择引擎?(1)
  • 读书笔记(黄帝内经)