我們經常用servlet和jsp, 經常用request.getParameter() 來得到數據。
request.getParameter()
request.getInputStream()
request.getReader()
這三個方法都是從request對象中得到提交的數據,但是用途不同。
要根據<form>表單提交數據的編碼方式選擇不同的方法。
HTML中的form表單的一個關鍵屬性 enctype:
1. enctype=application/x- www-form-urlencoded
這種編碼方式是默認的編碼方式。
編碼后的結果通常是field1=value2&field2=value2&… 的形式,如 name=aaaa&password=bbbb。
通常使用的表單也是采用這種方式編碼的,Servlet 的 API 提供了對這種 編碼方式解碼的支持,只需要調用 ServletRequest 類中的 getParameter()方法就可以得到用戶表單中的字段和數據。
不足:
這種編碼方式( 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;
}