HttpServletRequest 的三个方法request.getParameter()、request.getInputStream()、request.getReader()

简介: 在 Java Web 开发中,HttpServletRequest 是处理 HTTP 请求的接口,提供了多种方法用于获取客户端请求的不同类型的数据。三种常见的方法是 getParameter()、getInputStream() 和 getReader()。它们各自的作用和使用场景有所不同,下面详细解释这三个方法的区别与应用。
  1. request.getParameter()

作用:

getParameter() 方法用于从请求中获取 表单参数 或 查询字符串(即 URL 参数)中的值。
它返回的是请求中指定参数的值(通常为字符串类型)。如果请求中包含多个同名参数,则返回第一个值。
使用场景:

适用于 GET 请求和 POST 请求,尤其是 表单提交数据(如 application/x-www-form-urlencoded 或 multipart/form-data 类型的表单)。
示例:

String username = request.getParameter("username");
String password = request.getParameter("password");
php
103 Bytes
© 菜鸟-创作你的创作
假设客户端通过 URL 或表单提交如下数据:

GET /login?username=alice&password=secret
php
41 Bytes
© 菜鸟-创作你的创作
或通过表单提交数据:






php
160 Bytes
© 菜鸟-创作你的创作
注意:

getParameter() 总是返回 字符串类型,即使表单元素的数据类型是数字或其他类型,返回的也是字符串。如果需要处理其他数据类型,需要手动转换。
对于 GET 请求,参数会通过 URL 中的查询字符串传递;对于 POST 请求,参数会放在请求体中。

  1. request.getInputStream()

作用:

getInputStream() 方法用于获取 HTTP 请求的 原始字节流。它返回一个 ServletInputStream 对象,允许开发者通过字节流的方式读取请求体中的内容。
适用于读取 非表单的请求数据,如文件上传、JSON、XML 等请求体数据。
使用场景:

适用于 POST 请求,尤其是提交文件或 二进制数据,或者发送非表单数据(如 JSON 或 XML)。
示例:

ServletInputStream inputStream = request.getInputStream();
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
// 处理字节数据
}
inputStream.close();
php
197 Bytes
© 菜鸟-创作你的创作
注意:

getInputStream() 返回的是字节流,因此适用于读取二进制数据或需要精确控制数据格式的情况。读取请求体的内容时,需要自己处理字符编码(如果是文本数据)。
该方法可以用于处理文件上传、读取 XML、JSON 等格式的数据。
一般与 getReader() 不能共用,因为它们都读取请求体,调用其中一个方法后,输入流将会关闭。

  1. request.getReader()

作用:

getReader() 方法返回一个 BufferedReader 对象,用于以字符流的方式读取请求体中的内容。适用于 文本数据,如 JSON、XML 或其他字符编码的数据。
与 getInputStream() 相比,getReader() 更适合处理 字符数据,如 JSON、XML 等格式。
使用场景:

适用于 POST 请求,并且请求体中的数据是 字符编码的文本内容(如 JSON、XML、纯文本等)。
示例:

BufferedReader reader = request.getReader();
StringBuilder stringBuilder = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
stringBuilder.append(line);
}
reader.close();
String body = stringBuilder.toString();
php
243 Bytes
© 菜鸟-创作你的创作
假设客户端发送的是 JSON 数据:

{
"username": "alice",
"password": "secret"
}
php
53 Bytes
© 菜鸟-创作你的创作
注意:

getReader() 返回的是 字符流,适用于处理文本数据。默认会使用 UTF-8 字符编码进行解码(除非设置了其他编码)。
一般用于处理 JSON、XML 等文本格式数据。
不能和 getInputStream() 一起使用,因为它们都操作请求体内容。
总结:

方法 作用 返回值 适用场景 特点
getParameter() 获取请求参数 字符串 表单提交、URL 查询参数 适用于表单数据,自动处理 URL 编码,返回字符串
getInputStream() 获取请求体的字节流 ServletInputStream 文件上传、二进制数据、JSON、XML 适用于二进制数据,需手动处理编码
getReader() 获取请求体的字符流 BufferedReader JSON、XML、文本数据 适用于字符数据,自动处理字符编码(UTF-8)
适用场景:

如果请求数据为 表单数据(如 application/x-www-form-urlencoded 或 multipart/form-data),使用 getParameter()。
如果请求包含 二进制数据 或 文件上传,使用 getInputStream()。
如果请求包含 文本数据(如 JSON 或 XML),使用 getReader()。
了解这三者的区别并选择合适的方法,可以帮助开发者更有效地处理 HTTP 请求中的数据。
https://www.52runoob.com/archives/4074

目录
相关文章
|
JSON Java 应用服务中间件
HttpServletRequest核心方法以及获取请求参数
HttpServletRequest核心方法以及获取请求参数
3571 0
|
XML Java 数据格式
Spring从入门到入土(xml配置文件的基础使用方式)
本文详细介绍了Spring框架中XML配置文件的使用方法,包括读取配置文件、创建带参数的构造对象、使用工厂方法和静态方法创建对象、对象生命周期管理以及单例和多例模式的测试。
1007 7
Spring从入门到入土(xml配置文件的基础使用方式)
|
11月前
IDEA 使用 lombak 时的一个小警告:Generating equals/hashCode implementation but without a call to superclass
今日在IDEA中使用Lombok时遇到@Data注解的黄色警告,提示equals和hashCode未调用父类方法。虽不影响运行,但影响美观。可通过@EqualsAndHashCode(callSuper = true)或在lombok.config中配置默认行为解决,推荐后者统一管理,彻底消除警告。
|
前端开发 JavaScript Java
Java中将图片转换为base64格式的技巧
这样,你就可以在Java中将图片转换为Base64格式了。这个方法的实现非常简单,只需要使用Java的内置库,无需任何额外的库。希望这个方法对你有所帮助。
1036 22
|
缓存 安全 Java
Spring Boot 3 集成 Spring Security + JWT
本文详细介绍了如何使用Spring Boot 3和Spring Security集成JWT,实现前后端分离的安全认证概述了从入门到引入数据库,再到使用JWT的完整流程。列举了项目中用到的关键依赖,如MyBatis-Plus、Hutool等。简要提及了系统配置表、部门表、字典表等表结构。使用Hutool-jwt工具类进行JWT校验。配置忽略路径、禁用CSRF、添加JWT校验过滤器等。实现登录接口,返回token等信息。
8024 14
Spring Boot 3 集成 Spring Security + JWT
|
关系型数据库 MySQL
MySQL数据表添加字段(三种方式)
本文解析了数据表的基本概念及字段添加方法。在数据表中,字段是纵向列结构,记录为横向行数据。MySQL通过`ALTER TABLE`指令支持三种字段添加方式:1) 末尾追加字段,直接使用`ADD`语句;2) 首列插入字段,通过`FIRST`关键字实现;3) 指定位置插入字段,利用`AFTER`指定目标字段。文内结合`student`表实例详细演示了每种方法的操作步骤与结构验证,便于理解与实践。
|
Java 数据库连接 应用服务中间件
从“ClassNotFoundException”到“终于搞定!”——一次 Web 应用排查之旅
本文详细记录了在开发 Web 应用过程中遇到的多个典型问题及解决方法,包括 JSP 编译失败、MyBatis 核心类加载错误、配置文件混乱以及映射文件路径不匹配等。通过逐步排查和调整目录结构、分离配置文件、正确管理依赖,最终解决了所有问题。文章总结了调试经验,强调了目录结构的重要性、配置文件的清晰划分以及日志分析的价值,为开发者提供了实用的参考。
813 0
|
JSON NoSQL Java
redis的java客户端的使用(Jedis、SpringDataRedis、SpringBoot整合redis、redisTemplate序列化及stringRedisTemplate序列化)
这篇文章介绍了在Java中使用Redis客户端的几种方法,包括Jedis、SpringDataRedis和SpringBoot整合Redis的操作。文章详细解释了Jedis的基本使用步骤,Jedis连接池的创建和使用,以及在SpringBoot项目中如何配置和使用RedisTemplate和StringRedisTemplate。此外,还探讨了RedisTemplate序列化的两种实践方案,包括默认的JDK序列化和自定义的JSON序列化,以及StringRedisTemplate的使用,它要求键和值都必须是String类型。
redis的java客户端的使用(Jedis、SpringDataRedis、SpringBoot整合redis、redisTemplate序列化及stringRedisTemplate序列化)
|
安全 Java API
Java根据URL获取文件内容的实现方法
此示例展示了如何安全、有效地根据URL获取文件内容。它不仅展现了处理网络资源的基本技巧,还体现了良好的异常处理实践。在实际开发中,根据项目需求,你可能还需要添加额外的功能,如设置连接超时、处理HTTP响应码等。
1426 4
|
Java 开发者 Spring
Springboot中ApplicationContextInitializer的使用及源码分析
`ApplicationContextInitializer` 是 Spring Boot 提供的一个强大的接口,它允许开发者有机会在应用上下文刷新之前,注入自定义的启动逻辑或预处理。通过合理地利用这个接口,可以提升应用的可配置性和灵活性。了解如何运用 `ApplicationContextInitializer` 可以让你在 Spring Boot 应用的早期启动阶段,有更多控制权。
631 4