在向mysql数据库中插入汉字时候,不能像mysql插入汉字,出现错误。这个是servlet还是mysql的问题,在设置了filter还是出现错误。
这个是servlet的问题还是mysql的问题。

解决方案 »

  1.   

     过滤器的代码如下package com.researchDeclare.charsetfilter;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;public class CharSetClass implements Filter
    {
        protected String       encoding     = null;
        protected FilterConfig filterConfig = null;    public CharSetClass()
        {
    super();
        }    public void destroy()
        {
    // TODO Auto-generated method stub
    this.encoding = null;
    this.filterConfig = null;
        }    public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain filterChain) throws IOException, ServletException
        {
    // TODO Auto-generated method stub
    if (request.getCharacterEncoding() == null)
    {
        String encoding = selectEncoding(request);
        if (encoding != null)
        {
    request.setCharacterEncoding(encoding);
    response.setCharacterEncoding(encoding);
        }
    }
    filterChain.doFilter(request, response);
        }    private String selectEncoding(ServletRequest request)
        {
    // TODO Auto-generated method stub
    return this.encoding;
        }    public void init(FilterConfig arg0) throws ServletException
        {
    this.filterConfig = filterConfig;
    this.encoding = filterConfig.getInitParameter("encoding");
        }
    }
      

  2.   

    都可能有问题,把可能出现问题的地方使用System。out.println大法吧。
    数据库设置成utf-8,页面使用utf-8/post,后台使用iso转gb或iso转gb(浏览器差异)。
    mysql控制台写sql包含中文需要预先写上set charset gbk;
      

  3.   

    web.xML的配置代码如下:<filter>
    <filter-name>CharSetEncoding</filter-name>
    <filter-class>
    com.researchDeclare.charsetfilter.CharSetClass
    </filter-class>
    <init-param>
    <param-name>encoding</param-name>
    <param-value>GB2312</param-value>
    </init-param>
    </filter>
    <filter-mapping>
    <filter-name>CharSetEncoding</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>在加载xml的时候出现的错误2009-12-31 10:15:09 org.apache.catalina.core.StandardContext filterStart
    严重: Exception starting filter CharSetEncoding
    java.lang.NullPointerException
    at com.researchDeclare.charsetfilter.CharSetClass.init(CharSetClass.java:54)
    at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:275)
    at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:397)
    at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:108)
    at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:3709)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4356)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:525)
    at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:924)
    at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:887)
    at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:492)
    at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1147)
    at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
    at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
    at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
    at org.apache.catalina.core.StandardService.start(StandardService.java:516)
    at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:578)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
    2009-12-31 10:15:09 org.apache.catalina.core.StandardContext start
    严重: Error filterStart
    2009-12-31 10:15:09 org.apache.catalina.core.StandardContext start
    严重: Context [/ResearchDeclare] startup failed due to previous errors
      

  4.   

    java.lang.NullPointerException
        at com.researchDeclare.charsetfilter.CharSetClass.init(CharSetClass.java:54)

    com.researchDeclare.charsetfilter.CharSetClass类的54行init方法报空指针异常。
      

  5.   

    在xml中设置了一个初始值GB2312,为什么还出现空指针异常。
      

  6.   


    public void init(FilterConfig arg0) throws ServletException
        {
        this.filterConfig = filterConfig;
        this.encoding = filterConfig.getInitParameter("encoding");
        }
    这里应该是this.filterConfig = arg0吧。
      

  7.   


    public void init(FilterConfig arg0) throws ServletException{
        this.filterConfig = arg0;
        this.encoding = filterConfig.getInitParameter("encoding");
    }
      

  8.   


     
    private String selectEncoding(ServletRequest request)
        {
        // TODO Auto-generated method stub
        return this.encoding;
        }这个方法太不科学吧
      

  9.   

    我试了下上面的方法,在tomcat启动加载的时候没有出现错。在servlet中还是添加汉字,还是打印出还是“???”,是不是在servlet中是不是要引用一下?希望大家帮助帮助一下。
      

  10.   

    那个打印在MyEclipse控制台上,在向数据库插入以前,在servlet中打印的,从数据库读出来是可以在jsp页面显示汉字。
      

  11.   

    对了,我在数据库表格中所有要用到汉字的字段都是设置成为gb2312的编码格式的。那么就有可能是servlet中的编码转换有问题了。那个过滤器好像没有起作用。
      

  12.   

      既然在Servlet中数据都正常的话。那直接可以把过滤器删了
       显然是受网上影响咯。
        虽然说过滤器是王道但你的数据没问题的话,就不要过滤器了。。
          过滤器是最后一招嘿嘿
      

  13.   

    我的意思是说在向数据库更新或者插入之前,在servlet中将sql语句打印出来有汉字的地方都是出现"????"的。
      

  14.   

    看一下这个吧。
       http://29882942.blog.163.com/blog/static/306370112008112185230535/
      

  15.   

    以前写的编码转换类,供参考package con.ok;import java.io.UnsupportedEncodingException;
    public class 网络蜗牛{// "gb2312"到"Unicode"的转码  
        public String toUnicode(String str){
            char[]arChar=str.toCharArray();
            int iValue=0;
             String uStr="";
            for(int i=0;i<arChar.length;i++){
                 iValue=(int)str.charAt(i);          
                if(iValue<=256){
                  // uStr+="&#x00"+Integer.toHexString(iValue)+";";
                     uStr+="\\u00"+Integer.toHexString(iValue);
                 }else{
                  // uStr+="&#x"+Integer.toHexString(iValue)+";";
                     uStr+="\\u"+Integer.toHexString(iValue);
                 }
             }
            return uStr;
         }
       
           // "gb2312"到"ISO-8859-1"的转码  
             public String iso2gb(String str) {  
                 try {  
                      str = new String(str.getBytes("ISO-8859-1"), "gb2312");  
                  } catch (Exception e) {  
                      System.out.println("Encoding Error!");  
                  }  
                 return str;  
              }  
           
             //"ISO-8859-1"到"gb2312"的转码  
             public String gb2iso(String str) {  
                 try {  
                      str = new String(str.getBytes("gb2312"), "ISO-8859-1");  
                  } catch (Exception e) {  
                      System.out.println("Encoding Error!");  
                  }  
                 return str;  
              }    
            
            public String getChinese(String InputString) throws Exception
             {
                byte b[]=InputString.getBytes("ISO-8859-1");
                 String OutputString=new String(b);
                return OutputString;
             }
            
        
        public static void main(String args[]){
             System.out.println(new Native().toUnicode("人"));
         }}
      

  16.   

    dofilter方法中的判断有问题。
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain filterChain) throws IOException, ServletException
        {
            String encoding = selectEncoding(request);
            if (encoding != null)
            {
             request.setCharacterEncoding(encoding);
             response.setCharacterEncoding(encoding);
             filterChain.doFilter(request, response);
            }
        }
      

  17.   

    上边写的不是很健壮
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain filterChain) throws IOException, ServletException
        {
            String encoding = selectEncoding(request);
            if (encoding != null)
            {
             request.setCharacterEncoding(encoding);
             response.setCharacterEncoding(encoding);
             filterChain.doFilter(request, response);
            }else{
            throw new RuntimeException("encoding为空");
             }
        }
      

  18.   

    又有一个话题了,在改写了servlet的编码后,向mysql更新字段胡总有汉字好像不能识别,在表格中就出现式"????",语句是执行成功的了。
    在mysql的命令行中更新数据中,有汉字的字段也不能直接更新,需要将编码改成 gb2312,要执行charset gb2312的命令后才可以。
    那么在java代码中怎样向mysql中插入或者是更新含有汉字的字段。请解答
      

  19.   

    数据库的编码也改成gb2312
    可靠点的方法:重新建表,url的值设置如些
    jdbc:mysql://localhost:3306/数据库名?useUnicode=true&amp;characterEncoding=gb2312
      

  20.   

    这个:  public void init(FilterConfig arg0) throws ServletException
        {
        this.filterConfig = filterConfig;
        this.encoding = filterConfig.getInitParameter("encoding");
        }
    要改成:  public void init(FilterConfig filterConfig) throws ServletException
        {
        this.filterConfig = filterConfig;
        this.encoding = filterConfig.getInitParameter("encoding");
        }