在
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.
定义了一个
FiltersetCharacterEncoding
它的执行路径是
: 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则将造成表单重复递交,解决的办法是,可以在后台将表单清除