随笔-211  评论-26  文章-8  trackbacks-0
重大突破,终于搞明白JSPServletFilter过滤器与MySQL中文乱码问题

要说MySQL的中文乱码一直令我很头疼的说。一开始我还是很喜欢MySQL的,开源而且有很多忧点,可是这一寒假基本都是在解决中文乱码问题,差点疯掉。一路走下来回头想想,走了不少弯路,网上也天天在查资料,泡书店,各种解决办法都一一尝试,可到我这儿就没一个成功的。就在昨天,我突然想到原来不用Filter的时候,是这样解决乱码问题的:

public class Chinese {

       public static String toChinese(String source){

              String str=null;

              try {

                     byte[] b=source.getBytes("ISO-8859-1");

                     str=new String(b,"UTF-8");

              } catch (Exception e) {

                     // TODO: handle exception

                     e.printStackTrace();

              }

              return str;

       }

}

我想每个学过Java web的人没有不知道的,通过以上这种方法,把转码的代码封装到一个JavaBean里。这样在每次存取数据操作前进行一下转码,就能解决中文问题。因为JSP页面内部数据的传输为ISO-8859-1,这样对于我们汉字来说双字节要按单字节传,当然会乱码了。这种方法虽然可行,但是也不好。因为每次进行数据库操作之前都要调用这个JavaBean,很烦人的,于是好多人建议我用Filter过滤器。这样每次传参数都由Filter过滤器来完成,一劳永逸 ^_^

就这样我写了一个转码的Filter过滤器。首先声明,在这里,我的MySQL数据库编码设置成了utf8,这样可以适应所有语种的需要,是最佳方案。

Filter过滤器代码:

package pkg;

import javax.servlet.*;

import javax.servlet.http.*;

import java.io.IOException;

public class MyFilter implements Filter {

       private String code=null;

       public void init(FilterConfig fc) throws ServletException{

              this.code=fc.getInitParameter("code");

       }

       public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

              throws ServletException,IOException{

              request.setCharacterEncoding(code);

              response.setContentType("text/html;charset=utf-8");

              chain.doFilter(request, response);

       }

       public void destroy(){

       }

}

相应的web.xml文件配置如下:

<?xml version="1.0" encoding="UTF-8"?>

<web-app version="2.4"

       xmlns="http://java.sun.com/xml/ns/j2ee"

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

       xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee

       http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

<welcome-file-list>

    <welcome-file>index.jsp</welcome-file>

</welcome-file-list>

<filter>

<filter-name>MyFilter</filter-name>

<filter-class>pkg.MyFilter</filter-class>

<init-param>

<param-name>code</param-name>

<param-value>UTF-8</param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name>MyFilter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

这样,Filter过滤器完成!我用了一个最简单的例子进行测试,就是在send.jsp页面上有一个表单,表单有一个文本框、一个提交按钮。运行时,在文本框里输入中文,提交到MySQL数据库,再从库里读书来,显示在show.jsp页面上,如果结果依然是我输入的中文,就说明成功了。

启动Tomcat,一测试就傻了,结果是一堆乱七八糟的东西,啊!乱码?怎么会这样!后来我一点一点测试,使用逐渐排除的方法:

1、首先保证Filter能正常工作

2、保证JSP页面的编码没问题,也就是contentType="text/html;charset=utf-8",这里我要说一句,不论你用什么编码,前后一定要统一。比如MySQL用的是utf8,那么JSP也要用utf8,连接MySQL的字串也是utf8,过滤器是utf8,只有编码一样,前后的路才算通了

3、保证Servlet输出的中文不乱码

以上三条我排除后,再次进行测试,结果依然是乱码。后来我实在是没招儿了,凭着侥幸心理想:“如果我要把那个转码的Bean用上是不是能行呢?”结果意外发生了,一用上那个JavaBean,再运行show.jsp网页,上面清楚的显示了可爱的中文,解决了!可是这也不对啊,我用Filter过滤器的最终目的就是要舍去那个转码的JavaBean,可是怎么还要用它呢?二话不说,我到网上发了个贴子,寻问这是怎么回事。结果一位网友告诉我Filter过滤器只能处理表单提交的post请求,也就是说如果用get提交方式,只用Filter过滤器是无能为力的!于是我再次尝试,把send.jsp表单的提交方式改成了post,然后只用Filter过滤器,哈哈,成功了!可爱的中文还是正常出现在了show.jsp上,真是一言点醒梦中人啊,再这里特意把这些写出来,如果有朋友还在MySQL+JSP乱码上头疼的话,看是不是这个问题:如果只用Filter过滤器,则表单提交一定用post方式!

在此真诚的感谢那位网友!

最后把代码全部帖出来:

show.jsp

<%@ page language="java" contentType="text/html;charset=utf-8"%>

<%@ page import="java.sql.ResultSet" %>

<jsp:useBean id="db" class="pkg.DBSearch" scope="page"/>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

<head>

</head>

<body>

<%!String sql="SELECT * FROM student"; %>

<%

ResultSet rs=db.exeSearch(sql);

while(rs.next()){

    out.println(rs.getString(1));

    out.println(rs.getString(2));

    out.println("<br>");

}

%>

</body>

</html>

TestServlet

package servlet;

import java.io.IOException;

import java.io.PrintWriter;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import pkg.DBUpdate;

public class TestServlet extends HttpServlet {

       public TestServlet() {

              super();

       }

       public void destroy() {

              super.destroy(); // Just puts "destroy" string in log

              // Put your code here

       }

       public void doGet(HttpServletRequest request, HttpServletResponse response)

                     throws ServletException, IOException {

              //response.setContentType("text/html");

              PrintWriter out = response.getWriter();

              DBUpdate db=new DBUpdate();

              String sql="INSERT INTO student(name) values('"+request.getParameter("str")+"')";

              if(db.exeUpdate(sql)){

                     out.println("插入数据成功");

              }

              else{

                     out.println("插入数据失败");

              }

        db.myClose();

              out.close();

       }

       public void doPost(HttpServletRequest request, HttpServletResponse response)

                     throws ServletException, IOException {

              doGet(request,response);

       }

       public void init() throws ServletException {

              // Put your code here

       }

}

posted on 2008-03-12 11:12 dragon 阅读(418) 评论(1)  编辑  收藏 所属分类: jsp mysql 乱码解决方案系列

评论:
# re: MySQL JSP Filter解决中文乱码[未登录] 2008-04-03 11:19 | 花花
谢谢 讲得很清楚 正是我要找的!终于没乱码了!  回复  更多评论