你们常常 用servlet和jsp,可是对 request.getInputStream()和request.getReader()比较陌生。
request.getParameter()
request.getInputStream()
request.getReader()
这 三个方法都是从request对象中获得提交的数据,可是用途不一样,要根据<form>表单提交数据的编码方式选择不一样的方法。浏览器
HTML中的form表单有一个关键属性 enctype=application/x-www-form-urlencoded 或multipart/form-data。
enctype=application/x- www-form-urlencoded是默认的编码方式,这种编码方式很简单,编码后的结果一般是field1=value2&field2=value2&… 的形式,如 name=aaaa&Submit=Submit。这种编码的具体规则能够在 rfc2231 里查到, 一般使用的表单也 是采用这种方式编码的,Servlet 的 API 提供了对这种 编码方式解码的支持,只须要调用 ServletRequest 类中的getParameter()方法就可 以获得用户表单中的字段和数据。
这种编码方式( application/x-www-form-urlencoded )虽然简单,但对于传输大块的二进制数据显得力不从心,对于传输这类数据,浏览器 采用了另外一种编码方式,即 "multipart/form-data" 的编码方式,采用这种方式,浏览器能够很容易将表单内的数据和文件放在一块儿发送。这 种编码方式先定义好一个不可能在数据中出现的字符串做为 分界符,而后用它将各个数据段分开,而对于每一个数据段都对应着 HTML 页面表单 中的一个 Input 区,包括一个 content-disposition 属性,说明了这个数据段的一些信息,若是这个数据段的内容是一个文件,还会有 Content-Type 属性,而后就是数据自己,若是以这种方式提交数据就要用request.getInputStream()或request.getReader()获得 提交的数据 ,用 request.getParameter()是得不到提交的数据的。
经过下面的代码能够输出采用 multipart/form-data的编码提交的数据内容:app
Java代码 jsp
从 指定的文件( Receive.log )中能够看到以下的内容:
-----------------------------7d137a26e18
Content-Disposition: form-data; name="name"
123
-----------------------------7d137a26e18
Content-Disposition: form-data; name="introduce"
I am...
I am..
-----------------------------7d137a26e18
Content-Disposition: form-data; name="file3"; filename="C:\Autoexec.bat"
Content-Type: application/octet-stream
@echo off
prompt $d $t [ $p ]$_$$
SET PATH=d:\pf\IBMVJava2\eab\bin;%PATH%;D:\PF\ROSE98I\COMMON
-----------------------------7d137a26e18--
上面是用 IE 进行测试的结果,经过request.getInputStream()或request.getReader()能够获得form表单中提交的数据,但 是还要对数据进行 分 析才能获得form表单提交的每一个参数的值。
最后注意 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()在同 一个响应中是不能混合使用的,若是混合使用就会抛异常。
附带servlet源码:post
Java代码 测试
jsp源码:编码
Java代码 url
request.getInputStream() 大多数用于文件上传等.net