Servlet接收JSP參數亂碼問題解決辦法

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的配置文件,或者添加過濾器等等,糊里糊塗搞,大多數狀況問題都能解決掉,其實也僅僅是個瞎貓逮住個死耗子。
相關文章
相關標籤/搜索