在windows xp MyEclipse5.5+tomcat6+jdk1.6+MySQL5.0的环境下调试一个struts框架的图书管理程序,最开始出现了输入中文后,写入数据库成功,但数据库中的数据和页面显示为“?”乱码。
1、查看了jsp页面的中有<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>
2、之后又查看了MySQL的字符集,设置了gb2312。查看了my.ini中,确实设置的是gb2312
3、确认JDBC连接数据库代码
  "jdbc:mysql://127.0.0.1:3306/db_librarySys?user=root&password=root&useUnicode=True&characterEncoding=gb2312"
4、最后我看了代码中的提交数据的部分,下面就是处理数据的部分:
   写了一个ChStr.java类
   package com.core;public class ChStr {
public static String toChinese(String strvalue) {
try {
if (strvalue == null) { //当变量strvalue为null时
strvalue=""; //将变量strvalue赋值为空

} else {
strvalue = new String(strvalue.getBytes("ISO8859_1"), "GBK"); //将字符串转换为GBK编码
strvalue = strvalue.trim(); //去除字符串的首尾空格

}
} catch (Exception e) {
strvalue=""; //将变量strvalue赋值为空
}
return strvalue; //返回转换后的输入变量strvalue
} // 处理字符串中的空值
public static final String nullToString(String v, String toV) {
    if (v == null || "".equals(v)) { //当输入变量v为空时
        v = toV; //将输入变量v赋值为输入变量toV
    }
    return v; //返回转换后的输入变量v
}
//过滤危险字符
public static final String filterStr(String str){
str=str.replaceAll(";","");
str=str.replaceAll("&","&amp;");
str=str.replaceAll("<","&lt;");
str=str.replaceAll(">","&gt;");
str=str.replaceAll("'","");
str=str.replaceAll("--"," ");
str=str.replaceAll("/","");
str=str.replaceAll("%","");
return str;
}
}
之后页面调用
libraryname=chStr.toChinese(libraryForm.getLibraryname());来重新编写form中获取的数据。5、感觉上面都没什么问题,之后查找了struts出
现乱码的解决办法。下面是解决办法:
写一个过滤器,转换中文
public class MyRequestProcessor extends org.apache.struts.action.RequestProcessor{
 protected boolean processPreprocess(HttpServletRequest request,
          HttpServletResponse response){
  try{
   request.setCharacterEncoding("gb2312");//出现乱码,换编码方式参数
  }
  catch(Exception e){
    e.printStackTrace();
  }
  
  return true;  //继续执行请求的相关操作                      
 }
 
}在struts-config.xml中配置这个过滤器:
在<action-mappings>之后
<controller processorClass="类全名(包名+类名)" />问题:可是问题了来了,用完这个方法后,似乎从前台无法对数据库进行修改了,每次修改提示不成功。在未用到上面的的方法时,还能成功在前台写入数据,就是写入的数据和显示的数据都是问号“?”乱码,但用完该方法后就不能通过前台修改数据库了,(用中文不能修改,用英文仍然可以修改)我从头至尾分析了代码但也没找出异常。没找到哪里阻止了对数据库的写入。
不知道我说没说明白,我一个新手,请大家见谅。请大家帮我看看还能是哪出了问题?!?!

解决方案 »

  1.   

    没用过楼主这过滤器,我都是直接实现filter接口,还好没出现什么错误
      

  2.   

    既然用了过滤器,你的toChinese就别再用了。
      

  3.   

    在ChStr 类中已经进行处理了,就不要再toChinese了!
      

  4.   

    1、直接实现filter接口处理乱码,在struts中检查数据是否有乱码,如果有,先处理,在检查其他的;如果没有,就是数据库问题。
    2、可以在actionform中重写reset方法处理乱码,检查方式同上。
    org.apache.struts.action.RequestProcessor是请求控制器,重写需要调用父类构造器,否则不会执行请求。
      

  5.   

    用了过滤器,你的toChinese就别再用了。下面是我用的filterpackage com.zhs.filter;
    import java.io.IOException;
    import javax.servlet.*;public class GBKEncodingFilter implements Filter {
        private FilterConfig config = null;    public void init(FilterConfig arg0) throws ServletException {
            this.config = arg0;    }    public void doFilter(ServletRequest req, ServletResponse res, FilterChain fc) throws IOException, ServletException {
            if (this.config == null) {
                return;
            }
            req.setCharacterEncoding("GBK");
            fc.doFilter(req, res);
        }    public void destroy() {
        }}
    用了这个过滤后,还要对mysql进行设置。详细的过程请看
    http://blog.csdn.net/ytsmtxxi/archive/2009/05/12/4174689.aspx
      

  6.   

    "jdbc:mysql://127.0.0.1:3306/db_librarySys?user=root&password=root&useUnicode=True&characterEncoding=gb2312" 
    将characterEncoding值改成utf8试试!
      

  7.   

    一个 JSP 需要两个部分,你提到了:
    <%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %> 这是给 JSP 编译器用的。每个 JSP 页面你还需要一个给浏览器和服务器用的,因为你还需要告诉浏览器和服务器里面的数据是什么字符集。
    <META  xxxx = "text/html; charset=gb2312" >
      

  8.   

    charset 用一下gbk试一下了,我有时在那里改一下就行了。或者是sql数据库在安装时设置时没设置成gbk