請求參數的來源
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