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