咱们常常用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;
}