擷取請求訊息的實體內容
getInputStream與getReader方法
通過getInputStream與getReader方法擷取到二進位的位元組輸入資料流和字元輸入資料流
1、 getInputStream 方法用於返回的一個代表實體內容的輸入資料流對象,其類型為javax.servlet.ServletInputStream。
2、 getReader方法用於返回的一個代表實體內容的BufferedReader對象,返回的BufferedReader對象將實體內容中的位元組資料按照請求訊息中指定的字元集編碼轉換成文本字串。
3、 在調用getReader方法之前,可以調用ServletRequest的setCharacterEncoding方法指定其返回的BufferedReader對象所使用的字元集編碼。
分析檔案上傳的請求訊息結構
ServletInputStream sis = request.getInputStream();
String filePath = getServletContext().getRealPath("/body.out");
FileOutputStream fos = new FileOutputStream(filePath);
byte[] buf = new byte[1024];
int len = sis.read(buf,0,1024);
while(len != -1)
{
fos.write(buf,0,len);
len = sis.read(buf,0,1024);
}
fos.close();
sis.close();
請求域屬性
1、 儲存在ServletRequest對象中的對象稱之為請求域屬性,屬於同一個請求的多個處理模組之間可以通過請求域屬性來傳遞對象資料。
2、 與請求域屬性相關的方法:
ü setAttribute方法
ü getAttribute方法
ü removeAttribute方法
ü getAttributeNames方法
請求域屬性的典型應用
1、 MVC設計模式將一次請求的響應過程分成三個功能模組(一般稱之為層)來協同完成,這三個模組分別是Model(模型層)、View(視圖層)、Controller(控制層)。
2、 Model是可作為JavaBean使用的業務對象;View是負責建立顯示介面的JSP頁面;Controller通常是一個接收使用者請求的Servlet程式,它根據請求建立相應的model對象和調用model對象的業務方法,最後再選擇一個View去建立網頁文檔內容並回送給用戶端。
3、 Controller調用RequestDispatcher.forward方法將請求轉寄給作為View的JSP頁面,同時將Model對象作為請求域屬性傳遞過去,作為View的JSP頁面再從請求域中檢索出Model對象。
請求參數的中文讀取問題
1、 對Java中的某個字串進行URL編碼,其實是在對它的某種字元集編碼(非Unicode碼)資料進行URL編碼,而Java中的字串是以Unicode字元集編碼存在的,所以,在對Java中的字串進行URL編碼時,必須指定是對這個字串的哪種非Unicode的字元集編碼進行URL編碼。
2、 JDK的java.net包中有兩個類:URLEncoder和URLDecoder,URLEncoder類中定義了一個encode靜態方法來完成URL編碼,URLDecoder類中定義了一個decode靜態方法來完成URL解碼。
(1)public static String encode(String s,String enc)
throws UnsupportedEncodingException
(2)public static String decode(String s,String enc)
throws UnsupportedEncodingException
1、 瀏覽器對FORM表單中輸入的中文字元都會進行URL編碼後再傳送給WEB伺服器。
2、 對於頁面中的FORM表單中輸入的內容,瀏覽器將按照當前顯示頁面時所採用的字元集編碼來進行URL編碼。
與請求參數的字元集編碼相關的方法
1、 getCharacterEncoding方法
2、 setCharacterEncoding方法
getParameter方法的中文問題
1、 getParameter等方法在讀取的參數資訊時,需要進行URL解碼。
2、 對於HTTP請求訊息的請求行中的URL地址後的參數,getParameter等方法進行URL解碼時所採用的字元集編碼在Servlet規範中沒有明確規定Tomcat中的ServletRequest對象的getParameter等方法預設採用ISO8859-1字元集編碼進行URL解碼,因此無法返回正確的中文參數資訊 。
3、 對於POST方式下的“application/x-www-form-urlencoded”編碼格式的實體內容,getParameter等方法以ServletRequest對象的getCharacterEncoding()方法返回的字元集編碼對其進行URL解碼。
4、 getCharacterEncoding()方法的傳回值通常為null,對於這種情況,ServletRequest對象的getParameter等方法將使用預設的ISO8859-1字元集編碼對實體內容中的參數進行URL解碼,因此也將無法返回正確的中文參數資訊。
5、 ServletRequest介面中定義了一個setCharacterEncoding方法來佈建要求訊息中的實體內容的字元集編碼名稱,getParameter方法將以該方法設定的字元集編碼對實體內容進行URL解碼。
6、 setCharacterEncoding方法設定的是請求訊息中的實體內容的字元集編碼名稱,它隻影響getParameter方法對POST方式下的“application/x-www-form-urlencoded”編碼格式的實體內容進行URL解碼的結果,而不能影響getParameter方法對HTTP請求訊息的請求行中的URL地址後的參數進行URL解碼的結果。
字元亂碼與解決辦法的原理分析
1、 如果提交FORM表單的頁面與處理表單請求的Servlet程式都是由同一個人或同一個項目組開發的,那麼只要在處理表單提交的Servlet程式中將傳遞給setCharacterEncoding方法的字元集編碼設定為該表單所在頁面的字元集編碼即可。
2、 如果Servlet程式可以接收來自多個其他網站的FORM表單提交的資料,而每個其他網站的頁面所採用的字元集編碼可能各不一樣,要想讓Servlet程式知道FORM表單內容的字元集編碼,可以在FORM表單中增加一個隱藏欄位來傳遞當前FORM內容的字元集編碼名稱。
3、 只要超連結、FORM表單的action屬性設定、請求轉寄和重新導向的URL等任何一種請求路徑中要包含參數,就必須對參數部分進行URL編碼。對參數進行URL編碼時所選擇的字元集編碼應盡量與當前頁面的字元集編碼保持一致,也可以用一個參數來指定URL編碼內容的字元集編碼名稱。
4、 所有標準的瀏覽器和客戶機終端都支援UTF-8編碼,如果WEB伺服器要能相容處理各個國家和地區版本的瀏覽器所傳遞的FORM表單資訊,網頁文檔應當使用UTF-8編碼格式。
5、 在編寫應用程式時應該注意一些隱性的字元編碼錯誤。有些程式在輸出時有編碼轉換錯誤,在讀取輸入時返回的字串也有轉換錯誤,當該程式輸出它所讀取到的有問題的字串時,顯示的結果可能是正常的中文字元。