最近在学习Struts开发时遇到了中文乱码问题,现在终于解决了,呼。。。花了好三天才搞定,真没效率。。。
用Struts做了一个增加数据功能,查看数据库后发现有中文乱码
首先我以为是数据库的编码格式问题,于是修改了表的编码格式(原来是GBK),改为utf8,经过测试发现还是有中文乱码问题,后来做了一个测试表进行测试,不通过Struts进行数据库的操作,没有中文乱码的问题,所以由此判断不是数据库的编码格式,而问题锁定在程序中
Web开发时,我将jsp文件的编码格式都设置为utf-8(在Eclipse工具栏的window->preferences下可以进行编码设置),所以也不是jsp的问题
接下来就是查看页面填写数据后,数据的传递流程(其实也就是struts的操作过程,不过这里不是详细的过程了),页面post数据到相关url后,首先是找到ActionServlet,再找到对应的FormBean进行赋值操作,最后在相关Action进行Excute
我修改了连接数据库的URL,在URL后面加入了"?useUnicode=true&characterEncoding=utf8"
在这之前又在Tomcat配置文件server.xml中的Connector元素加入URIEncoding="UTF-8"
在dao中进行数据insert之前先将数据打印了一下,发现打印出了乱码,于是也判断是数据操作前就有了中文乱码问题;接下来在FormBean的setter方法中写了println(),再次打印数据,发现有中文乱码,于是终于明白是在页面传入到FormBean之前就产生乱码
终于找到了解决的方法,就是创建一个继承HttpServlet并且实现Filter接口的类,实现Filter接口的doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)方法,在web.xml文件中配进行配置
中文乱码问题就解决了
最后我删除了之前在读取数据库操作的URL后的"?useUnicode=true&characterEncoding=utf8"这段代码,也没有中文乱码问题,所以加这段也没什么用
代码如下:
package struts.utils;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
public class EncodingFilter extends HttpServlet implements Filter {
private static final long serialVersionUID = 8303042696511641966L;
@SuppressWarnings("unused")
private FilterConfig filterConfig;
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filterChain) throws IOException, ServletException {
request.setCharacterEncoding("utf-8");
filterChain.doFilter(request, response);
}
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
}
}
web.xml的配置如下
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>struts.utils.EncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>