getParameter() getInputStream()和getReader() 區別


我們經常用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;

                              }

 

       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM