1. 程式人生 > >servlet獲得引數的問題

servlet獲得引數的問題

請求引數的來源
  1. 請求 URL 的查詢串, 如 /localhost/abc/test?abc=ddd&bbb=ccc, 在問號後面的字串
  2. POST 請求時, 如果 Content-Type = "application/x-www-form-urlencoded", 則引數來自請求內容(格式同查詢串)
  對於第一種情況, 請求引數可以在任何情況下使用 getParameter 系列方法讀取, 採用 ISO-8859-1 編碼
  對於第二種情況, 則有點複雜, 它涉及到 ServletRequest 以下幾個方法
  getParameter 系列方法
  getCharacterEncoding
  getInputStream
  getReader
  getCharacterEncoding
  一般情況下, 請求 characterEncoding 來自於 Content-Type 的 charset 引數, 如果 charset 引數未設, 則為 null
  getInputStream 和 getReader (糾正手記1的錯誤)
  這兩個方法用於讀取請求內容, 並且不能同時使用, 如果使用其中一個後再試圖使用另一個, 則丟擲 IllegalStateException
  getReader方法返回 BufferedReader 物件, 該物件使用 getCharacterEncoding 對字串進行編碼, 如果為 null, 則使用 ISO-8859-1
  getParameter 系列方法
  當引數來自於請求內容時, 由於要讀取請求內容而用到流, 所以
  1. 當使用 getParameter 系列方法之前使用了 getInputStream 和 getReader 方法, 則不能使用 getParameter 系列方法得到請求引數
  2. 當使用 getParameter 系列方法後再使用流, 則流應該已到了結尾, 此時可以得到請求引數
  3. 使用 getCharacterEncoding 對引數編碼, 如果為 null, 則使用 ISO-8859-1
  4. 不直接使用 getInputStream 或 getReader 方法來得到流用以解析引數, 因為這會影響狀態, 造成 getInputStream 或 getReader 方法丟擲 IllegalStateException
[color=red]
當使用 getParameter 系列方法後再使用流時,可能會報EOF異常,這時可以把getParameter 系列方法放在流後面試試。[/color]