1.出现中文乱码的原因
在上节中,我们提交表单后发现Servlet里面接收的中文数据存在中文乱码现象。在java web开发中出现的中文问题无外乎是以下几种情况造成的:
根据我们分析,得知上节出现的中文乱码是tomcat服务器本身设置问题。如果,我们换成jetty服务器,重写运行上节案例,就不会出现中文乱码现象。
比如:把项目部署到jetty服务器后,启动填写如下表单:

控制台输出结果如下:
********注册用户资料*********
Users{username='zhangsan', password='123456', email='zhangsan@126.com', salary=10000.0, gender='F', education=6, province='山东', birthday=Wed Mar 15 00:00:00 CST 1995, favorites=[internet, nba], introduce='程序猿', accept='true'}
2.Filter解决中文乱码
那么对于使用Tomcat服务器,以post方式提交表单时的中文乱码如何解决呢?我们推荐使用过滤器解决。
过滤器(Filter),顾名思义就是过滤用的,它可以在请求、响应、或者servlet中请求转发等操作发生时先进行执行,之后程序再往下执行,这里起到一个对request/response过滤的作用。
实现过程:
1)创建com.filter包,编写EncodingFilter过滤器类。
package com.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import java.io.IOException;
@WebFilter(displayName = "EncodingFilter",value="/*",initParams ={@WebInitParam(name="encoding",value="utf-8")})
public class EncodingFilter implements Filter {
private String encoding = null;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
this.encoding = filterConfig.getInitParameter("encoding");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setCharacterEncoding(this.encoding);
servletResponse.setCharacterEncoding(this.encoding);
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
}
}
2)测试过滤器
启动tomcat服务器,填写注册表单如下:

点击注册提交按钮后,控制台输出效果如下:
********注册用户资料*********
Users{username='张三丰', password='123456', email='zhangsanfeng@126.com', salary=10000.0, gender='M', education=5, province='陕西', birthday=Tue Apr 16 00:00:00 CST 1996, favorites=[internet, nba], introduce='程序猿', accept='true'}
3)xml配置
也可以在web.xml中配置过滤器。
<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>com.filter.EncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
注意:对于Tomcat服务器使用get方式提交数据出现的中文乱码现象,要具体问题具体分析,不能一概而论。但是通常的做法是在server.xml中配置 URIEncoding="UTF-8"。