jsp超引數傳遞中文亂碼400問題,以及解決中文亂碼的全面總結。
目錄
問題出現過程:
NewFile.jsp的我的程式碼:
<%
String haha="關於";
%>
<a href="NewFile1.jsp?name=<%=haha %>">新增使用者</a>
NewFile1.jsp:
<%=request.getParameter("name") %>
在eclipse內建瀏覽器上執行NewFile.jsp:
瞎咕咚了半天,結果發現這不是我程式碼的問題。
我將我的URL放在別的瀏覽器上試了試,發現根本不會報錯,很憂傷....虧我一直在改程式碼,結果不是我的鍋。
so,怎麼解決呢↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
總結一番我自己的理解。
在jsp中會出現兩種編碼錯誤。一種是頁面編碼錯誤,一種是資料編碼錯誤。
頁面編碼錯誤:
最典型的是jsp檔案中的 pageEncoding和charset:設定的都是該頁面的編碼!並不是傳遞資料的編碼!
(注:這裡說的傳遞資料不是任何引數,指的是用來通過request\response\超連結\forward等傳到各種頁面的資料)
pageEncoding和charset的區別在於:
前者是告訴編譯器要根據什麼編碼方式解碼,後者是告訴瀏覽器你要用什麼編碼去顯示介面。
例如很簡單的demo.jsp,在這裡將pageEncoding,charset都設定成UTF-8:
<body>哈哈哈
</body>
請求執行demo.jsp,首先因為我們的pageEncoding=UTF-8,所以編譯器知道要用這個編碼方式去解碼(翻譯我們寫的東西),然後由於charset=utf-8,所以我們看到的介面是中文不亂碼。顯示“哈哈哈”。
資料傳遞中的編碼錯誤:
request亂碼指的是:瀏覽器向伺服器傳送的請求引數中包含中文字元,伺服器獲取到的請求引數的值是亂碼;
response亂碼指的是:伺服器向瀏覽器傳送的資料包含中文字元,瀏覽器中顯示的是亂碼;
傳遞資料,一般都是通過request\response。
1、request帶引數傳遞(接收資料)
例如超引數:
<a href="NewFile1.jsp?name=<%=haha %>">新增使用者</a>
例如forward動作元素:
<jsp:forward page='welcom.jsp'>
<jsp:param value="<%=username %>" name="cuser"/>
</jsp:forward>
還有最常見的表單:
<form action="LoginServlet" method="post">
使用者名稱:<input name="username"><br>
密碼:<input name="passward"><br>
<input type="submit" value="登入">
</form>
解決request引數傳遞亂碼問題,首先要分清楚這個request是以什麼方式發出的?get?post?還是其它?
如果是post發出的,在被接受檔案中加入:
request.setCharacterEncoding("utf-8");
即可,注意!該程式碼只適合處理post方式出現的亂碼!有很多百度知道的回答、部落格都沒分這個!誤人子弟...
如果是get就比較麻煩,例如超引數傳遞就是get方式傳遞的。由於每個人使用的tomcat版本不一樣,同樣的程式碼有的人執行就不報錯,解決方式就是網上說爛的修改各種配置檔案:get方式處理亂碼的方法
2、response帶引數傳遞(傳送資料)
例如響應跳轉:
response.setHeader("refresh","3;url=welcom.jsp?user="+username);
還有重定向:(最好不要用重定向傳參,由於其會觸發兩次request,可能你需要的值的request不是你希望的那個)
response.sendRedirect("NewFile1.jsp?name=zho文");
無論是哪個,都會出現:
可以看到,這個可以直接通過位址列去修改資料的,即相當於url的請求方式(get方式)。
一般response很少會出現編碼錯誤的。所以,只要解決了被接受頁面的request的get方式接受資料的編碼錯誤,就可以了。
一般response出現編碼錯誤,往往是我們的瀏覽器編碼和我們的伺服器不匹配造成的。這時候我們才需要更改我們的response的編碼去匹配瀏覽器。(大部分時候不需要這麼做)
response.setCharacterEncoding("utf-8”);