转自:http://lavasoft.blog.51cto.com/62575/274527/
 
环境:
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,才能正确显示中文参数。
 
 
1、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);
 
 
2、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的配置文件,或者添加过滤器等等,糊里糊涂搞,大多数情况问题都能解决掉,其实也仅仅是个瞎猫逮住个死耗子。

本文出自 “熔 岩” 博客,请务必保留此出处http://lavasoft.blog.51cto.com/62575/274527

Servlet接收JSP参数乱码问题解决办法的更多相关文章

  1. openerp 7.0邮件接收中文附件乱码问题解决办法

    openerp 7.0邮件接收中文附件乱码问题解决办法: 修改文件\addons\mail\mail_thread.py #1064 line插入代码: h=email.Header.Header(n ...

  2. struts2中form提交到action中的中文参数乱码问题解决办法(包括取中文路径)

    我的前台页是这样的: <body>      <form action="test.action" method="post">     ...

  3. jsp中文乱码解决办法

    一.JSP页面显示乱码 二.表单提交中文时出现乱码 三.数据库连接 大家在JSP的开发过程中,经常出现中文乱码的问题,可能一至困扰着您,我现在把我在JSP开发中遇到 的中文乱码的问题及解决办法写出来供 ...

  4. ASP+Access UTF-8 网页乱码问题解决办法

    用ACCESS数据库和ASP做网站时用UTF-8编码有时会出现乱码,再者网页出错或者刷新页面后就是乱码,如果数据库取值乱码在开头加上<%@LANGUAGE="VBSCRIPT" ...

  5. 关于jFinal开发中遇到的中文乱码问题解决办法

    关于jFinal开发中遇到的中文乱码问题解决办法 设置tomcat的编码,修改 <Connector port="8080" protocol="HTTP/1.1& ...

  6. Servlet中文乱码问题解决办法

    首先对于源jsp网站和servlet里面的字符集要一样,一般支持中文的字符集为UTF-8最好采用这个字符集(除此之外还有gb2312); 对于源jsp文件的代码中需要设置 设置你的page里面的字符集 ...

  7. tomcat中的URL参数为中文,servlet接收后显示乱码

    URL中参数的值为中文时,servlet接收后显示为乱码,如下图: 这时候需要修改tomcat的中的server.xml文件.该文件路径为 tomcat安装目录下的conf文件夹.   为修改前的se ...

  8. 【WEB】jsp向servlet传参中文乱码问题解决

    传参方式:POST.GET.link方式 servlet向jsp传中文参数msg if(username.equals("") || password.euqals("& ...

  9. loadrunner乱码问题解决办法

    7.LoadRunner回放脚本时,在浏览器显示的中文是乱码 最近,遇到了好多乱码的问题,解决了一些,还有最后一个乱码,能想到的各种办法都试过了,还是不行,很奇怪啊. 解决这些乱码时,涉及到了http ...

随机推荐

  1. 使用GCD的dispatch_once创建单例

    使用GCD的dispatch_once创建单例 介绍了创建单例的方式,不过后来发现其实在ios 4.0后有更加简单的方式. 就是使用GCD的功能 代码如下: + (instantClass *)sha ...

  2. Codeforces 533B Work Group

    http://codeforces.com/problemset/problem/533/B 题目大意: 每个人有一个直接的领导,1是总裁,现在要找一个最大的集合,每个领导领导的人的数量都是偶数,问最 ...

  3. 管理Undo数据

    SQL> select sum(bytes),status from dba_undo_extents group by status; SUM(BYTES) STATUS ---------- ...

  4. Decimal

    Description 任意一个分数都是有理数,对于任意一个有限小数,我们都可以表示成一个无限循环小数的形式(在其末尾添加0),对于任意一个无限循环小数都可以转化成一个分数.现在你的任务就是将任意一个 ...

  5. spring简单入门示例

    1 控制反转IOC\依赖注入DI,因为翻译的不同,因此有两个名字.       控制反转意思就是说,当我们调用一个方法或者类时,不再有我们主动去创建这个类的对象,控制权交给别人(spring). 依赖 ...

  6. cumber + selenium +java自动化测试

    1.新建一个maven项目,pom文件为: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&quo ...

  7. ubuntu14.04 + cocos2d-x-3.6 + eclipse发布android

    cocos2d-x-2.2.6版本 :http://www.cnblogs.com/weishuan/p/4698470.html 接下来是3.6了 ,准备好下面四个东东,我把这些都放在XXX/App ...

  8. js基础例子dom+原型+oop基础知识记录01

    //oo:概念是计算机中对于现实世界的理解和抽象的方法 //由计算机利用编程技术发展到现在的产物 //面向对象几要素 //对象:由属性和方法组成的集合 //属性:保存数据,存储在对象内存空间中的唯一的 ...

  9. FLEX中Tree默认展开全部节点

    这里分两种情况,一种是数据源在MXML文件里,如: <mx:XML id="treeXML" format="e4x"> <root> ...

  10. 网络测试工具netperf

    Netperf是一种网络性能的测量工具,主要针对基于TCP或UDP的传输.Netperf根据应用的不同,可以进行不同模式的网络性能测试,即批量数据传输(bulk data transfer)模式和请求 ...