Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 503|回复: 0

[servlet学习]Servlet接收JSP参数乱码解决办法

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-10 05:59:02 | 显示全部楼层 |阅读模式
    环境:

    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  

      
      
       
       

         
       

         
       
      
    复制代码

    源码下载:http://file.javaxxz.com/2014/10/10/055902031.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-22 15:05 , Processed in 0.460040 second(s), 50 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表