Servlet和Jsp乱码处理方式

/**开篇:Java的内核和class文件是基于unicode的,这使Java程序具有良好的跨平台性,但也带来了一些中文乱码问题的麻烦。原因主要有两方面,Java和JSP文件本身编译时产生的乱码问题和Java程序与其他媒介交互产生的乱码问题。
         首先Java(包括JSP)源文件中很可能包含有中文,而Java和JSP源文件的保存方式是基于字节流的,如果Java和JSP编译成 class文件过程中,使用的编码方式与源文件的编码不一致,就会出现乱码。基于这种乱码,建议在Java文件中尽量不要写中文(注释部分不参与编译,写中文没关系),如果必须写的话,尽量手动带参数-ecodingUTF-8或-ecoding 编译;对于JSP,在文件头加上UTF-8基本上就能解决这类乱码问题。*/


1.Jsp页面呈现的在浏览器的三个阶段:
     一:第一阶段是jsp编译成.java,它会根据pageEncoding的设定读取jsp,结果是由指定的编码方案翻译成统一的UTF-8 JAVA源码(即.java),如果pageEncoding设定错了,或没有设定,出来的就是中文乱码。
     二:第二阶段是由JAVAC的JAVA源码至java byteCode的编译,不论JSP编写时候用的是什么编码方案,经过这个阶段的结果全部是UTF-8的encoding的java源码。
     三:第三阶段是Tomcat(或其的application container)载入和执行阶段,输出的结果,也就是在客户端见到的,这时隐藏在阶段一和阶段二的参数contentType就发挥    了功效
2.Jsp/Servlet中处理乱码的四个地方:   
    pageEncoding="UTF-8":负责第一个阶段,如果JSP中没有设置contentType="text/html;charset=UTF-8"的话,在tomcat中,服务器响应客户端时会使pageEncoding来设定;
    contentType="text/html;charset=UTF-8":负责第三阶段应用服务器响应客户端时需要的编码
    request.setCharacterEncoding("UTF-8"):是客户端请求数据到服务器时,为了不出现乱码,将在接受参数之前,将所有的请求参数,再转化为UTF-8的编码;
    response.setCharacterEncoding("UTF-8"):服务器在响应客户端之前,对数据进行重新编码时,使用的就是该编码。
3.服务器接受数据主要有三种方式
      注:无论使用哪种方式提交,如果参数中包含中文,浏览器都会使用当前浏览器编码对其进行URL编码。当前浏览器编码就是你在响应该请求的JSP页面中response.setCharacterEncoding设置的值。所以对于POST表单提交的数据,在获得数据的JSP页面中request.setCharacterEncoding要和生成提交该表单的JSP页面的 response.setCharacterEncoding设置成相同的值。
      处理方式以tomcat为例:
      1.GET方式:GET方式使用request.setCharacterEncoding("UTF-8")是不行的,最简单的方式如下例:
                                String username = new String(request.getParameter("name).getBytes("ISO-8859-1"),"UTF-8");     
      2.POST方式:此种方式可以在服务器端接收参数之前,使用request.setCharacterEncoding("UTF-8")将数据重新编码,然后再使用
      3.浏览器直接使用URL提交数据:处理方式和GET方式一样




总结:以tomcat为例
        1.对于同一个应用,最好统一编码,推荐为UTF-8
        2.正确设置JSP的pageEncoding参数
        3.在所有的JSP/Servlet中设置contentType="text/html;charset=UTF-8"或response.setCharacterEncoding("UTF-8"),从而间接实现对浏览器编码的设置。
        4.对于请求,可以使用过滤器或者在每个JSP/Servlet中设置request.setCharacterEncoding("UTF- 8")。同时,要修改Tomcat的默认配置,推荐将   
           useBodyEncodingForURI参数设置为true,也可以将URIEncoding参数设置为UTF-8(有可能影响其他应用,所以不推荐)。


  以上如有不正确的地方,望指正,谢谢!










 

你可能感兴趣的:(servlet)