編寫一個RegistServlet處理用戶的Get請求數據

1 public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { 2 // 處理響應數據的格式和編碼 3 response.setCharacterEncoding("utf-8"); 4 response.setContentType("text/html;charset=utf-8"); 5 // 獲取字符輸出流對象 6 PrintWriter out = response.getWriter(); 7 // 獲取請求參數 8 String name = request.getParameter("uname"); 9 String address = request.getParameter("address"); 10 // 輸出數據 11 out.println("name="+name); 12 out.println("<br/>"); 13 out.println("address="+address); 14 }
運行結果發現輸入中文提交后顯示結果為亂碼:
jsp頁面中 <meta http-equiv="content-type" content="text/html; charset=UTF-8">通知瀏覽器以utf-8解碼
get請求編碼方式和post請求提交編碼方式不同,get是把數據直接放到url中,例如以上的uname,IE瀏覽器先對中文進行utf-8編碼(一個中文3個字符表示 太長),繼而為了縮短字符又用ISO8859-1編碼后傳遞給服務器。服務器的doGet方法中要先進行ISO8859-1解碼再utf-8解碼才能看到中文。
而post請求則在瀏覽器端把數據以utf-8的形式存儲到http的請求體中,不用通過url傳輸,繼而只要 request.setCharacterEncoding("utf-8");通知request以utf-8形式解碼就行,因為request默認以ISO8859-1進行解碼的。
使用代碼解決亂碼問題
1 public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { 2 // 處理響應數據的格式和編碼,通知瀏覽器數據的顯示方式 3 response.setCharacterEncoding("utf-8"); 4 response.setContentType("text/html;charset=utf-8"); 5 // 獲取字符輸出流對象 6 PrintWriter out = response.getWriter(); 7 // 獲取請求參數 8 String name = request.getParameter("uname"); 9 String address = request.getParameter("address"); 10 // 獲取ISO8859-1的原始數據 11 byte [] bs = name.getBytes("ISO8859-1"); //內部編碼字節流,其實中文字符經過utf-8編碼后的字節 都是英文可以表示的,只是 //ISO8859-1顯示數據以一個字節一個字節顯示,而utf-8以幾個字節一起表示 12 name = new String(bs,"UTF-8"); 13 bs = address.getBytes("ISO8859-1"); 14 address = new String(bs,"UTF-8"); 15 // 輸出數據 16 out.println("name="+name); 17 out.println("<br/>"); 18 out.println("address="+address); 19 }
如果使用以上的代碼解決GET亂碼每一個請求參數都需要重新的解碼太繁瑣,因此可以直接使用服務器通知瀏覽器以指定的方式進行編碼字符數據。
使用URIEnoding方式解決GET亂碼問題
1 <Connector port="8080" protocol="HTTP/1.1" 2 connectionTimeout="20000" 3 redirectPort="8443" 4 URIEncoding="utf-8"/>
URIEncoding主要指定的是%E5%8D%A1%E5%8D%A1的數據的解碼方式,如果沒有指定那么默認是ISO8859-1,如果指定那么采用指定的碼表進行解碼。因此服務器端就沒有必要使用兩個中編碼方式進行轉碼了。
注意:在實際的生產環境中我們代碼的亂碼問題不可能以來服務器幫助我們解決,因此推薦使用第一個轉碼方式。后期可以直接實現一個亂碼的過濾器實現處理亂碼的問題。
http://localhost:8080/day07/regist?uname=焦寧波 在地址欄中輸入需要的中文數據【亂碼】
<a href="/day07/regist?uname=人人">單擊我傳遞中文數據</a> 【亂碼】
以上兩個代碼出現亂碼狀況一致:地址欄中直接原樣出現了中文。
因此對於以上的參數在傳遞的過程中必須進行基本的中文編碼處理。
URLEncoder.encode(需要編碼的字符, 需要編碼碼表)
那么在服務器端使用GET亂碼的解決方案即可。
http://blog.sina.com.cn/s/blog_673c81990100t1lc.html