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的配置文件,或者添加过滤器等等,糊里糊涂搞,大多数状况问题都能解决掉,其实也仅仅是个瞎猫逮住个死耗子。