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);
      }
}
此方法基本解决了通讯中的中文问题 , 但是在 JavaScript XML 中行不通 , 解决的办法是 : Servlet 的第一行添加语句 request.setCharacterEncoding("utf-8"); 原因可能是 Filter Stream 流的信息也进行了编码 , 所以必须将编码变成 UTF-8.
 
Structs-config.xml forward 的配置中添加 redirect=”true” 要注意 , redirect 中重新定位 , 将会清除本页面范围以内的所有的变量的值. 而不用redirect则将造成表单重复递交,解决的办法是,可以在后台将表单清除 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值