getParameter() getInputStream()和getReader() 区别 这三种方法是有冲突的,由于流只能被读一次。

咱们常常用servlet和jsp, 常常用request.getParameter() 来获得数据。浏览器

 

request.getParameter()
request.getInputStream()
request.getReader()
这三个方法都是从request对象中获得提交的数据,可是用途不一样。app

要根据<form>表单提交数据的编码方式选择不一样的方法。jsp

HTML中的form表单的一个关键属性 enctype:编码

1. enctype=application/x- www-form-urlencodedurl

   这种编码方式是默认的编码方式。spa

   编码后的结果一般是field1=value2&field2=value2&… 的形式,如 name=aaaa&password=bbbb。code

   一般使用的表单也是采用这种方式编码的,Servlet 的 API 提供了对这种 编码方式解码的支持,只须要调用 ServletRequest 类中的 getParameter()方法就能够获得用户表单中的字段和数据。orm

    不足:对象

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

 

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;

                              }

复制代码
相关文章
相关标签/搜索