zoukankan      html  css  js  c++  java
  • Servlet解决参数乱码问题

    为什么会产生乱码?

        之所以会产生乱码,是由于服务器端和客户端的编码方式不一致造成的。客户端与服务器端的交互过程中,存在着两次数据交换:第一次,客户端向服务器端发起请求,第二次数据交换,服务器端响应客户端的请求后做出应答,将处理结果返回给客户端。

    前提了解,无论服务器端是在接受数据还是在返回数据时,如果不指定其数据编码格式,那么他就会以其默认的“iso8859-1”来编码。  

    首先看客户端向服务器端发出请求:

      客户端的页面以何种编码方式打开某个页面,通过http协议发送请求给服务器端时,就以何种编码方式将提交数据转换成其对应的二进制数来进行http传输。这个编码方式是在页面制作时已经指定了的,最常见的是做一个html文件时通过<meta http-equiv="content-type" content="text/html; charset=UTF-8">指定编码格式为utf8。那么,在服务器端接受这些数据时就要通过utf8来将这些二进制数据进行解码。如果用其他的编码方式,比如gbk来解码,就会出现乱码。

      举例:客户端传输“北京”两个字给服务器端,如果页面打开时是utf-8格式,那么就会以utf8来将“北京”转化成其对应的二进制数A:1000100111001010(瞎编的),在服务器端接收时,如果没有指定以utf8来接受这个二进制流A,那么服务器以其默认编码格式ISO8859-1来解码A,以为不同的编码方式对应的码表不一样,同样是1000100111001010,ISO8859-1可能解析不出来相应的字符,那么就会以?或者乱码来代替,然后输出,这是我们就看到了乱码。

      所以我们要做的就是统一两边的编码格式,在服务器端以客户端页面的编码格式来解析传过来的二进制数据流。可在servlet的doGet()和doPost()方法中作如下操作:

    页面以get方法提交表单:

    处理GET 提交方法的servlet 中的doGet()方法

        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            
            String username = request.getParameter("username");
            username = new String(username.getBytes("iso8859-1"),"utf-8");//将接收来的二进制数据流以iso8859-1解码再转换成utf-8
            System.out.println(username);
        }

    对于doPost()方法,代码如下

        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            
            //解决post方法提交数据中的乱码问题
            //
            request.setCharacterEncoding("utf-8");//将解码方式设为来源网页的编码方式即可,这句话加在这个方法的第一句
            String add = request.getParameter("address");
            System.out.println(add);
           
        }

    再看服务器端向客户端返回数据

      原理基本上同客户端向服务器端发送请求,要做到两边编码方式一致。做法就是在服务器响应时,第一,设置客户端相应的http协议它的数据输出编码格式为指定的格式(假如utf8);第二将要输出的数据以utf8格式编码。

    public class RequestAllexampleServlet2 extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            
            response.setContentType("text/html;charset=utf-8");//设置http输出格式
            response.setCharacterEncoding("utf-8");//设置字符编码格式
            response.getWriter().write("北京");
    
        }

    访问这个Servlet结果为:

  • 相关阅读:
    一个简单的Python字符串处理文件
    hexo + Github 搭建问题综述
    node scripts/install.js 停顿解决办法
    Mac下安装hexo Error: Cannot find module './build/Release/DTraceProviderBindings 解决
    Python学习札记(三十八) 面向对象编程 Object Oriented Program 9
    Python学习札记(三十七) 面向对象编程 Object Oriented Program 8 @property
    比较两个目录的文件是否相同
    python Polygon模块安装
    ls操作总结
    导入其他python文件或者python文件的函数
  • 原文地址:https://www.cnblogs.com/Buffalo-L/p/4418778.html
Copyright © 2011-2022 走看看