getParameter() getInputStream()和getReader() 区别

我们经常用servlet和jsp, 经常用request.getParameter() 来得到数据。

request.getParameter()
request.getInputStream()
request.getReader()
这三个方法都是从request对象中得到提交的数据,但是用途不同。

要根据表单提交数据的编码方式选择不同的方法。

HTML中的form表单的一个关键属性 enctype:
1、enctype=application/x- www-form-urlencoded
这种编码方式是默认的编码方式。
编码后的结果通常是field1=value2&field2=value2&… 的形式,如 name=aaaa&password=bbbb。

不足:
这种编码方式( application/x-www-form-urlencoded )虽然简单,但对于传输大块的二进制数据显得力不从心。

2、对于传输大块的二进制数这类数据,浏览器采用了另一种编码方式,即 “multipart/form-data” 的编码方式:

浏览器可以很容易将表单内的数据和文件放在一起发送。这种编码方式先定义好一个不可能在数据中出现的字符串作为 分界符,然后用它将各个数据段分开,而对于每个数据段都对应着 HTML 页面表单中的一个 Input 区,包括一个 content-disposition 属性,说明了这个数据段的一些信息,如果这个数据段的内容是一个文件,还会有 Content-Type 属性,然后就是数据本身,如果以这种方式提交数据就要用request.getInputStream()或request.getReader()得到 提交的数据,用 request.getParameter()是得不到提交的数据的。

3.需要注意的是:

request.getParameter()、 request.getInputStream()、request.getReader()这三种方法是有冲突的,因为流只能被读一次。
比如:
当form表单内容采用 enctype=application/x-www-form-urlencoded编码时,先通过调用request.getParameter() 方法得到参数后,再调用request.getInputStream()或request.getReader()已经得不到流中的内容,因为在调用 request.getParameter()时系统可能对表单中提交的数据以流的形式读了一次,反之亦然。

当form表单内容采用enctype=multipart/form-data编码时,即使先调用request.getParameter()也得不到数据,所以这时调用request.getParameter()方法对 request.getInputStream()或request.getReader()没有冲突,即使已经调用了 request.getParameter()方法也可以通过调用request.getInputStream()或request.getReader()得 到表单中的数据,而request.getInputStream()和request.getReader()在同一个响应中是不能混合使用的,如果混合使用就会抛异常。

在http请求中,有Header和Body之分,读取header使用request.getHeader(“…”);

读取Body使用request.getReader(),但getReader获取的是BufferedReader,需要把它转换成字符串,下面是转换的方法。

 String str = "";

  InputStream in = request.getInputStream();  

  InputStreamReader reader = new InputStreamReader(in);  

  BufferedReader bd = new BufferedReader(reader);

  while ((inputLine = bd.readLine()) != null) {
       str += inputLine;
  }

转自:http://www.cnblogs.com/jimmy-muyuan/p/5294654.html

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
问题中提到了在拦截器或者过滤器中通过getInputStream()读取参数后,在Controller中无法重复读取,会抛出异常。这是因为在HttpServletRequest对象中,getInputStream()和getReader()方法是互斥的,只能调用其中一个来读取请求体的内容。如果在拦截器或过滤器中已经调用了getInputStream()方法读取了参数,那么在Controller中就不能再调用getReader()方法来读取参数,否则会抛出异常。\[1\] 为了解决这个问题,可以在拦截器或过滤器中将请求体的内容保存下来,然后在Controller中直接使用保存的内容来处理。可以使用RequestReadUtils类中的read方法来读取请求体的内容并保存起来,然后在Controller中使用保存的内容来处理。\[3\] 另外,如果请求的Content-Type是application/json,可以使用getReader()方法来获取参数;如果是multipart/form-data,可以直接使用request.getParameter方法来获取参数。\[2\] #### 引用[.reference_title] - *1* [解决HttpServletRequest 流数据不可重复读](https://blog.csdn.net/thulium_kyg/article/details/120004808)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [异常处理:getReader()/getInputStream() has already been called for this request](https://blog.csdn.net/qq_39517116/article/details/116715835)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值