1 亂碼處理
GET請求使用直接通過地址欄回車或超鏈接的單擊以及form表單中method的get數據提交過來的請求,該請求和傳遞用戶參數的方式是http://www.jnb.com?name=jack&age=36 因此可見get方式的請求參數有限(小于1K)。而且傳遞的數據直接在地址欄可見。如: 百度的搜索關鍵字。
1.1 編寫一個提交get數據的一個注冊表單
<form action="/day07/regist" method="get"> <table align="center" border="1"> <tr> <td>用戶:</td> <td><input type="text" name="uname"/></td> </tr> <tr> <td>地址:</td> <td><input type="text" name="address"/></td> </tr> <tr align="center"> <td colspan="2"> <input type="submit" value="注冊"/> <input type="reset" value="重置"/> </td> </tr> </table> </form>
2 編寫一個RegistServlet處理用戶的Get請求數據
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { // 處理響應數據的格式和編碼 response.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); // 獲取字符輸出流對象 PRintWriter out = response.getWriter(); // 獲取請求參數 String name = request.getParameter("uname"); String address = request.getParameter("address"); // 輸出數據 out.println("name="+name); out.println("<br/>"); out.println("address="+address); }
運行結果發現輸入中文提交后顯示結果為亂碼:
3 分析亂碼的原因
4 使用代碼解決亂碼問題
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { // 處理響應數據的格式和編碼 response.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); // 獲取字符輸出流對象 PrintWriter out = response.getWriter(); // 獲取請求參數 String name = request.getParameter("uname"); String address = request.getParameter("address"); // 獲取ISO8859-1的原始數據 byte [] bs = name.getBytes("ISO8859-1"); name = new String(bs,"UTF-8"); bs = address.getBytes("ISO8859-1"); address = new String(bs,"UTF-8"); // 輸出數據 out.println("name="+name); out.println("<br/>"); out.println("address="+address); }
如果使用以上的代碼解決GET亂碼每一個請求參數都需要重新的解碼太繁瑣,因此可以直接使用服務器通知瀏覽器以指定的方式進行編碼字符數據。
5 使用URIEnoding方式解決GET亂碼問題
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="utf-8"/>
URIEncoding主要指定的是%E5%8D%A1%E5%8D%A1的數據的解碼方式,如果沒有指定那么默認是ISO8859-1,如果指定那么采用指定的碼表進行解碼。因此服務器端就沒有必要使用兩個中編碼方式進行轉碼了。
注意:在實際的生產環境中我們代碼的亂碼問題不可能以來服務器幫助我們解決,因此推薦使用第一個轉碼方式。后期可以直接實現一個亂碼的過濾器實現處理亂碼的問題。
POST請求主要是以form表單的method=”post”發送的請求。該請求的數據在HTTP協議的請求體中。可以傳遞任意大小的數據。因此比較適合上傳文件。
修改以上的注冊頁面提交方式為post,那么在doPost()直接獲取數據并輸出同樣出現亂碼。
使用代碼解決亂碼
public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { // 處理響應數據的格式和編碼 response.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); // 處理post請求參數亂碼 request.setCharacterEncoding("utf-8"); // 獲取字符輸出流對象 PrintWriter out = response.getWriter(); // 獲取請求參數 String name = request.getParameter("uname"); String address = request.getParameter("address"); // 輸出數據 out.println("name="+name); out.println("<br/>"); out.println("address="+address);}
總結:以后在實際的開發中避免不了給頁面輸出中文數據以及中文的參數。那么以后在處理用戶請求的doGet和doPost方法中我們應直接編寫如下三句:
response.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=utf-8");request.setCharacterEncoding("utf-8");
|
新聞熱點
疑難解答