1. 程式人生 > >getParameter()、getInputStream()和getReader() 三者的區別

getParameter()、getInputStream()和getReader() 三者的區別

getParameter()、getInputStream()和getReader() 三者都是從selvlet中request物件得到提交的資料,但是用途不同。要根據 form 表單提交資料的編碼方式選擇不同的方法。

form表單中enctype 屬性規定在傳送到伺服器之前應該如何對錶單資料進行編碼。
預設地,表單資料會編碼為 “application/x-www-form-urlencoded”。就是說,在傳送到伺服器之前,所有字元都會進行編碼(空格轉換為 “+” 加號,特殊符號轉換為 ASCII HEX 值)。

描述
application/x-www-form-urlencoded 在傳送前編碼所有字元(預設)
multipart/form-data 不對字元編碼。在使用包含檔案上傳控制元件的表單時,必須使用該值。
text/plain 空格轉換為 “+” 加號,但不對特殊字元編碼。

一.getParameter()

enctype=application/x- www-form-urlencoded
通常使用的表單也是採用這種方式編碼的,Servlet 的 API 提供了對這種 編碼方式解碼的支援,只需要呼叫 ServletRequest 類中的 getParameter()方法就可以得到使用者表單中的欄位和資料。但對於傳輸大塊的二進位制資料顯得力不從心。

二.getInputStream()和getReader()

1)、getInputStream()方法返回一個代表實體內容的輸入流物件。
2)、getReader()方法返回一個代表實體內容的BufferedReader物件,實體內容的位元組資料按照請求訊息中指定的字符集編碼轉換成文字字串。

enctype=multipart/form-data表單採用這種編碼時,即使先呼叫request.getParameter()也得不到資料,但是這時呼叫 request.getParameter()方法對 request.getInputStream()或request.getReader()沒有衝突,即使已經呼叫了 request.getParameter()方法也 可以通過呼叫request.getInputStream()或request.getReader()得 到表單中的資料,而request.getInputStream()和request.getReader()在同 一個響應中是不能混合使用的,如果混合使用就會拋異常。

1、getReader和getInputStream適用範圍。

1.1.當請求訊息中的實體內容全部是文字資料,並且Servlet程式也需要以文字方式處理時,適用於getReader方法。如果不處理只是儲存到伺服器檔案系統或者資料庫中,應該使用getInputStream。
1.2.處理檔案上傳,只能用getInputStream返回的ServletInputStream位元組流物件讀取實體內容,因為他讀取的資料是每個位元組的原始內容,而從BufferedReader流物件中讀取的資料是原始內容按某種編碼轉換成的字元文字。

2、getReader特別之處

2.1 .在http請求中,有Header和Body之分,讀取header使用request.getHeader("…");
2.2.讀取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;
                   }

三、注意事項

1.三種方式是衝突的,只能讀取一次。混合使用會拋異常。

參考文獻連結:
1.https://blog.csdn.net/fanyun7654/article/details/21704355
2.http://www.cnblogs.com/jimmy-muyuan/p/5294654.html