JSP及Servlet中文乱码问题

一、JSP乱码

这种是最常见的,如果在eclipse中新建一个JSP默认是下面这种:

<%@ page language="java" contentType="text/html;charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>

由上述代码可以看出,它默认的页面编码和传输编码都是ISO-8859-1,这是用于欧洲国家的编码。因此,如果想要支持中文的话,需要将ISO-8859-1改为UTF-8。
具体做法,可以先选中ISO-8859-1,然后Ctrl+F,在弹出的窗口中,将ISO-8859-1全部提换为UTF-8,即可。

  • 注:上面编码涉及到的两个地方:charset和pageEncoding
    charset是指服务器发往客户端展现时的编码。 pageEncoding用于设置JSP页面本身的编码。
    JSP在部署后提供给用户使用,会经过三个阶段:
    1. JSP生成Java文件:这个阶段会使用pageEncoding所定义的编码格式进行转换。
    2. Java文件生成class文件:这个阶段由tomcat服务器自动使用UTF-8把Java文件转换成字节码class文件。
    3. 通过读取class文件展现给用户:这个阶段由tomcat服务器获取字节码内容,通过使用contentType所定义的编码格式展示给用户。

二、request中文乱码

在进行表单提交中,在前台注册页面提交部分数据,在处理页面中通过request.getParameter调用时,得到一堆乱码。原因是在前面的JSP中虽然设置了编码格式,但是在当前获取数据的页面中并没有设置获取数据的编码格式。

  1. 使用下面的代码,设置request获取请求内容的数据编码:
request.setCharacterEncoding("utf-8");

作用:

设置从request中取得的值或从数据库中取出的值的编码方式。

注意事项:

(1)在执行setCharacterEncoding()之前,不能执行任何getParameter()操作。 (2)通过setCharacterEncoding()设置的编码方式只对POST方式提交的表单有效,对GET方式无效。

分析原因:

(1)在执行第一个getParameter()的时候,java将会按照编码分析所有的提交内容,而后续的getParameter()不再进行分析,所以setCharacterEncoding()无效。 (2)对于GET方式提交的表单,提交内容在URL中,一开始就已经按照编码分析提交的内容了,因而setCharacterEncoding()也就无效了。

  1. setCharacterEncoding()对URL传参这种JSP请求是不起作用的。例如:
<a href="jspControl.jsp?username=胡歌">click</a>

这种情况下任然会出现乱码,这种URL传参的方式,只能修改tomcat服务器的传输编码格式。修改tomcat安装文件apache-tomcat-9.0.14\conf目录下的server.xml,向其中添加URIEncoding="UTF-8",就可以解决URL传递参数造成的中文乱码问题了。
图-1

三、Servlet中文乱码

1. post请求乱码处理:

用户在表单中填写的内容在http体中被提交给Servlet.当我们在表单中输入中文时,servlet的request的编码与客户端不一致,则服务器无法解析,则会出现乱码。
解决方法: 改变http请求体中的字符编码对于get无效,因为get提交在请求头中)改变http请求体中的字符编码为UTF8 : request.setCharacterEncoding("UTF-8")

2. get请求乱码处理

URL的参数没有使用编码(即使用了ISO-8859-1等),则在服务器端获取get的参数的时候使用String一个可以指定编码的构造函数。

String username = request.getParameter("username");
String resultname = new String(username.getBytes(IS0-8859-1*","utf-8);

3. 终极解决方法设置中文过滤器

在eclipse中新建一个web工程,然后在Java Resources/src下创建一个名为filter的包,然后在该包中新建一个名为characterEncoding的servlet类,类中内容如下:
图-2
接着在WebContent/WEB-INF/web.xml中配置该servlet类,配置内容如下:
图-3

猜你喜欢

转载自www.cnblogs.com/alex-jzw/p/12396086.html