Servlet接收JSP参数乱码问题解决办法(转)

--------------------------------------------------------------------------------

环境:
apache-tomcat-6.0.24.zip
jdk1.6.0_16
WindosXP 简体中文版
Netbeans6.8

目标:
解决Servlet接收到JSP传递的参数后乱码问题,乱码发生在Servlet一方。

JSP向Serlvet传递参数有两种方式,一种是GET方式,另一种是POST方式,为了解决乱码问题,必须对这两种方式工作原理有个深刻理解才行。

这里先写一个简单的JSP(工程所有的源代码文件编码均为GBK),里面有两种提交参数的方式:

Java代码 复制代码
  1. <%@page contentType="text/html" pageEncoding="GBK"%>    
  2. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"    
  3.      "http://www.w3.org/TR/html4/loose.dtd">    
  4.   
  5. <html>    
  6.         <head>    
  7.                 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">    
  8.                 <title>JSP Page</title>    
  9.         </head>    
  10.         <body>    
  11.                 <h1>页面提交中文测试!</h1>    
  12.                 <h2>GET方式</h2>    
  13.                 <a href="/testweb/TestServlet?param=中文">GET方式提交中文测试</a>    
  14.                 <h2>POST方式</h2>    
  15.                 <form action="/testweb/TestServlet" method="post">    
  16.                         <input type="text" name="param" value="中文"/>    
  17.                         <button type="submit" name="提交中文参数测试" value="提交中文参数测试"/>    
  18.                 </form>    
  19.         </body>    
  20. </html>   
<%@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,才能正确显示中文参数。


1、GET方式的请求与接收过程
页面中参数“param=中文”的编码原本为GBK,当用GET方式发送参数的时候,参数值会被Web服务器从GBK转码为ISO-8859-1。
Servlet接收到的GET请求参数的编码当然为ISO-8859-1了,对于中文肯定显示不了,因此要将ISO-8859-1转换为GBK就可以正常显示中文了。
Java代码 复制代码
  1. String param = request.getParameter("param");    
  2.                String x = new String(param.getBytes("ISO-8859-1"), "GBK");    
  3.                System.out.println("GET方式获取的中文参数值:" + x);    
 String param = request.getParameter("param"); 
                String x = new String(param.getBytes("ISO-8859-1"), "GBK"); 
                System.out.println("GET方式获取的中文参数值:" + x); 
 

            

2、POST方式请求与接收过程
页面中参数“param=中文”的编码原本为GBK,当点击页面中提交按钮后,参数会以GBK编码格式发送给Servlet,因此Servlet接收参数的时候必须将请求的编码明确设定为GBK,这样才能正确接收中文。
Java代码 复制代码
  1. request.setCharacterEncoding("GBK");    
  2.                String param = request.getParameter("param");    
  3.                System.out.println("POST方式获取的中文参数值:" + param);   
 request.setCharacterEncoding("GBK"); 
                String param = request.getParameter("param"); 
                System.out.println("POST方式获取的中文参数值:" + param); 

              

或者,可以按照get方式来接收post的参数:
Java代码 复制代码
  1. String param = request.getParameter("param");    
  2.                String x = new String(param.getBytes("ISO-8859-1"), "GBK");    
  3.                System.out.println("GET方式获取的中文参数值:" + x);   
 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的写法:
Java代码 复制代码
  1. package jweb.lavasoft;    
  2.   
  3. import java.io.IOException;    
  4. import java.io.PrintWriter;    
  5. import javax.servlet.ServletException;    
  6. import javax.servlet.http.HttpServlet;    
  7. import javax.servlet.http.HttpServletRequest;    
  8. import javax.servlet.http.HttpServletResponse;    
  9.   
  10. public class DealPageParamServlet extends HttpServlet {    
  11.   
  12.         protected void doGet(HttpServletRequest request, HttpServletResponse response)    
  13.                         throws ServletException, IOException {    
  14.                 String param = request.getParameter("param");    
  15.                 String x = new String(param.getBytes("ISO-8859-1"), "GBK");    
  16.                 System.out.println("GET方式获取的中文参数值:" + x);    
  17.         }    
  18.   
  19.         protected void doPost(HttpServletRequest request, HttpServletResponse response)    
  20.                         throws ServletException, IOException {    
  21.                 request.setCharacterEncoding("GBK");    
  22.                 String param = request.getParameter("param");    
  23.                 System.out.println("POST方式获取的中文参数值:" + param);    
  24.         }    
  25. }   
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的配置文件,或者添加过滤器等等,糊里糊涂搞,大多数情况问题都能解决掉,其实也仅仅是个瞎猫逮住个死耗子。



版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。
[url]http://lavasoft.blog.51cto.com/62575/274527 [/url]

本文原文出自 “熔 岩” 博客,博主: leizhimin,原文链接: http://lavasoft.blog.51cto.com/62575/274527

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值