Hibernate3 中一个不能查询与插入中文字符的问题解决办法

 
Hibernate3 中发现了一个不能查询与插入中文字符的问题,通过网上查阅资源,原来是Hibernate3中的一个Bug, 最后没有办法,JSP2.0技术手册中看到可以通过Filter来解决中文问题,将其代码摘录下来,结果发现,不仅HTML传过来的表单没有了任何中文问题,而且Hibernate的中文问题也解决了.下面就将整个过程描述如下:
因为Filter 的是起过滤的作用,它运行于Servlet Service()之前,所以,在表单还没有到达Service()之前会执行Filter. 添加Filter 的方法和我们添加Servlet 的方法是一样的. 都要配置Web.xml, 下面是解决中文问题的Web.xml配置:
 
      <filter>
<filter-name>setCharacterEncoding</filter-name>
<filter-class>wills.servlet.SetCharacterEncodingFilter</filter-class>
<init-param>
      <param-name>encoding</param-name>
      <param-value>gb2312</param-value>
</init-param>
      </filter>
      <filter-mapping>
       <filter-name>setCharacterEncoding</filter-name>
       <url-pattern>/*</url-pattern>
</filter-mapping>
 
上面的配置说明了: 1.定义了一个Filter setCharacterEncoding 它的执行路径是: wills.servlet.SetCharaterEncodingFilter 初始化参数是: encoding gb2312等下我们来看它们是什么意思. 2. 定义了对于哪些文件通过的时候执行setCharacterEncoding 上面我们可以看出所有的相关Jsp也好,Serlet也好等等,都执行setCharacterEncoding. 下面是setCharacterEncoding.java
 
package wills.servlet;
 
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 SetCharacterEncodingFilter implements Filter {
      protected String encoding = null;
      protected FilterConfig filterConfig = null;
      protected boolean ignore = true;
 
      public void destroy() {
 
           this.encoding = null;
           this.filterConfig = null;
 
      }
 
      public void doFilter(ServletRequest request, ServletResponse response,
                 FilterChain chain) throws IOException, ServletException {
 
           // Conditionally select and set the character encoding to be used
           if (ignore || (request.getCharacterEncoding() == null)) {
                 String encoding = selectEncoding(request);
                 if (encoding != null)
                      request.setCharacterEncoding(encoding);
           }
           // Pass control on to the next filter
           chain.doFilter(request, response);
 
      }
 
      public void init(FilterConfig filterConfig) throws ServletException {
           this.filterConfig = filterConfig;
           this.encoding = filterConfig.getInitParameter("encoding");
           String value = filterConfig.getInitParameter("ignore");
           if (value == null)
                 this.ignore = true;
           else if (value.equalsIgnoreCase("true"))
                 this.ignore = true;
           else if (value.equalsIgnoreCase("yes"))
                 this.ignore = true;
           else
                 this.ignore = false;
 
      }
 
      protected String selectEncoding(ServletRequest request) {
           return (this.encoding);
      }
}
此方法基本解决了通讯中的中文问题,但是在JavaScriptXML中行不通,解决的办法是: Servlet的第一行添加语句request.setCharacterEncoding("utf-8"); 原因可能是FilterStream流的信息也进行了编码,所以必须将编码变成UTF-8.
 
Structs-config.xmlforward的配置中添加redirect=”true” 要注意, redirect中重新定位,将会清除本页面范围以内的所有的变量的值. 而不用redirect则将造成表单重复递交,解决的办法是,可以在后台将表单清除 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值