一.擷取請求訊息中的實體內容getInputStream和getReader方法
1.getInputStream方法是位元組的輸入資料流對象,返回的是一個代表實體內容的實體物件。類型為javax.servlet.ServletInputStream
2.getReader方法是返回的是一個BufferedReader的對象,返回的BufferedReader對象將實體內容中的位元組資料按照請求訊息中指定的字元集編碼轉換成文本字串
註:在調用getRader方法之前,可以調用setCharacterEncoding方法指定其返回的BufferedReader對象所使用的字元集編碼。
3.執行個體是檔案上傳-----------讀取實體內容的舉例
第一步:在html文檔中寫一個表單
<form method="post" action="testInput" name="form1" enctype="multipart/form-data">
請輸入第一個參數:<input type="text" name="param1"/><br/>
<!-- 上傳檔案 -->
<input type="file" name="f1"/>
//提交
<input type="submit" name="ok" value="submit"/>
</form>
註:enctype="multipart/form-data"是來確保匿名上傳檔案的正確編碼.
第二步:
第一種:
// 擷取字元的輸入資料流對象
BufferedReader br = request.getReader();
FileWriter fw = new FileWriter(“d:/ouc.txt”);
// 把讀取到的字元放到數組裡來儲存
char[] arr = new char[1024];
// 並讀取出來顯示
while (br.read(arr) != -1) {
讀取的字元數組從控制台輸出或輸入到一個指定的檔案中
System.out.println(new String(arr, 0, arr.length));
//fw.write(arr);
}
fw.close();
第二種:
// 擷取字元的輸入資料流對象
BufferedReader br = request.getReader();
//通過內容物件擷取它的對象
ServletContext context = this.getServletContext();
//擷取指定檔案的真實路徑
String filename = context.getRealPath("/out.txt");
//輸出資料流把讀取到的內容寫到檔案中去
FileWriter fw = new FileWriter(filename);
// 把讀取到的字元放到數組裡來儲存
char[] arr = new char[1024];
// 並讀取出來顯示
while (br.read(arr) != -1) {
讀取的字元數組從控制台輸出或輸入到一個指定的檔案中
System.out.println(new String(arr, 0, arr.length));
//fw.write(arr);
}
fw.close();
二.請求參數中中文的讀取問題
學習的原因:解決亂碼的原因
1、 瞭解中文字元的URL編碼
對Java中的某個字串進行URL編碼,其實是在對它的某種字元集編碼(非Unicode碼)資料進行URL編碼,而Java中的字串是以Unicode字元集編碼存在的,所以,在對Java中的字串進行URL編碼時,必須指定是對這個字串的哪種非Unicode的字元集編碼進行URL編碼。
瀏覽器對請求參數中的字元的某種字元進行的編碼是URL編碼
2、瀏覽器解析的步驟:
中(從文字框中輸入的) ------utf-8的字元集是E4B8AD -----à 伺服器會對它進行URL編碼(%E4%B8%AD)----à 在解碼後成為位元組數組,按照某種字元編碼進行解碼, 編譯之後的字元發送給Web伺服器
3、 出現亂碼的解決辦法:
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)setCharauanycterEncoding方法設定的是請求訊息中的實體內容的字元集編碼名稱,它隻影響getParameter方法對POST方式下的“application/x-www-form-urlencoded”編碼格式的實體內容進行URL解碼的結果,而不能影響getParameter方法對HTTP請求訊息的請求行中的URL地址後的參數進行URL解碼的結果。
註:Web伺服器從請求訊息中把每一個參數名和參數值分離出來的每一個參數名和參數值也會針對某種字元集編碼進行URL解碼
字元的編碼方式是對實體內容的設定
4、 亂碼出現的原因有幾種情況
(1) 是在html文檔中有設定字元編碼的,
(2) 是在request中設定編碼字元集
request.setCharacterEncoding("utf-8");
(3)是在request中設定編碼字元集,
response.setContentType("text/html;charset=utf-8");
(4)在提交方式不同的時候,比如是用get方法提交的話,在控制台視窗就可能輸出亂碼,可以再service中修改為:
<Connector executor="tomcatThreadPool"
port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" useBodyEncodingForURL="true"/>