Servlet接收JSP參數亂碼問題解決辦法
環境:
apache-tomcat-6.0.24.zip
jdk1.6.0_16
WindosXP 簡體中文版
Netbeans6.8
目標:
解決Servlet接收到JSP傳遞的參數後亂碼問題,亂碼發生在Servlet一方。
JSP向Serlvet傳遞參數有兩種方式,一種是GET方式,另外一種是POST方式,爲了解決亂碼問題,必須對這兩種方式工做原理有個深入理解才行。
這裏先寫一個簡單的JSP(工程全部的源代碼文件編碼均爲GBK),裏面有兩種提交參數的方式:
<
%@page
contentType
="text/html"
pageEncoding
="GBK"%
>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<
html
>
<
head
>
<
meta
http-equiv
="Content-Type"
content
="text/html; charset=UTF-8"
>
<
title
>JSP Page
</title>
</head>
<
body
>
<
h1
>頁面提交中文測試!
</h1>
<
h2
>GET方式
</h2>
<a href="/testweb/TestServlet?param=中文">GET方式提交中文測試</a>
<
h2
>POST方式
</h2>
<form action="/testweb/TestServlet" method="post">
<input type="text" name="param" value="中文"/>
<button type="submit" name="提交中文參數測試" value="提交中文參數測試"/>
</form>
</body>
</html>
而後定義一個Servlet接收提交的參數。
這裏強調一點,在此使用的tomcat沒有通過任何的修改與配置。
當頁面經過兩種方式請求Servlet的時候,參數的編碼本來爲GBK,在經過HTTP服務將請求發送出去的時候,會將參數從新按照ISO-8859-1編碼後發送。所以,無論GET或POST方式,Servlet接收到的參數數據的編碼均爲ISO-8859-1,必須從新轉碼爲GBK,才能正確顯示中文參數。
一、GET方式的請求與接收過程
頁面中參數「param=中文」的編碼本來爲GBK,當用GET方式發送參數的時候,參數值會被Web服務器從GBK轉碼爲ISO-8859-1。
Servlet接收到的GET請求參數的編碼固然爲ISO-8859-1了,對於中文確定顯示不了,所以要將ISO-8859-1轉換爲GBK就能夠正常顯示中文了。
String param = request.getParameter(
"param");
String x =
new String(param.getBytes(
"ISO-8859-1"),
"GBK");
System.out.println(
"GET方式獲取的中文參數值:" + x);
二、POST方式請求與接收過程
頁面中參數「param=中文」的編碼本來爲GBK,當點擊頁面中提交按鈕後,參數會以GBK編碼格式發送給Servlet,所以Servlet接收參數的時候必須將請求的編碼明確設定爲GBK,這樣才能正確接收中文。
request.setCharacterEncoding(
"GBK");
String param = request.getParameter(
"param");
System.out.println(
"POST方式獲取的中文參數值:" + param);
或者,能夠按照get方式來接收post的參數:
String param = request.getParameter(
"param");
String x =
new String(param.getBytes(
"ISO-8859-1"),
"GBK");
System.out.println(
"GET方式獲取的中文參數值:" + x);
疑問:爲何在GET方式下不設定請求的編碼格式呢?緣由是GET方式使用的編碼爲ISO-8859-1,用GBK、UTF-8等接收效果都是同樣的(都是一堆字母和符號),編不編都一個樣,若是指定ISO-8859-1編碼是多一翻手續,若是指定了非ISO-8859-1編碼,是腦子還不清醒,沒搞明白這個原理,所以,GET方式就不要指定請求的編碼了。
下面看看Servlet的寫法:
package jweb.lavasoft;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public
class DealPageParamServlet
extends HttpServlet {
protected
void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String param = request.getParameter(
"param");
String x =
new String(param.getBytes(
"ISO-8859-1"),
"GBK");
System.out.println(
"GET方式獲取的中文參數值:" + x);
}
protected
void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding(
"GBK");
String param = request.getParameter(
"param");
System.out.println(
"POST方式獲取的中文參數值:" + param);
}
}
其實,只要搞明白了編碼過程,遇到亂碼問題就能從容應對了。
經常見到有人遇到亂碼了,就開始修改Tocmat的server.xml的配置文件,或者添加過濾器等等,糊里糊塗搞,大多數狀況問題都能解決掉,其實也僅僅是個瞎貓逮住個死耗子。