最近工作中遇到一些中文乱码的问题,其中包括在struts1框架下,通过form的打拼的属性值,如果为中文的话,在Action中得到值全部为“?”
网上找了一些解决的方法,主要有两种,一是添加过滤器,二是重写 RequestProcessor。两种方法在我的系统中只有前者试验成功了,现在把这个解决方案分享一下,也算备份一下!
首先,定义一个过滤器 SetCharacerEncodingFilter.java
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.Filter;
import javax.servlet.FilterConfig;
import javax.servlet.FilterChain;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
public class SetCharacterEncodingFilter extends HttpServlet implements Filter {
protected String encoding = null;
protected FilterConfig filterConfig = null;
protected boolean ignore = true;
/*
* (non-Javadoc)
*
* @see javax.servlet.Filter#destroy()
*/
@Override
public void destroy() {
this.encoding = null;
this.filterConfig = null;
}
/*
* (non-Javadoc)
*
* @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest,
* javax.servlet.ServletResponse, javax.servlet.FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
MyRequest req = new MyRequest((HttpServletRequest) request, this.encoding);
chain.doFilter(req, response);
}
/*
* (non-Javadoc)
*
* @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
*/
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);
}
}
然后,再定义一个代理请求MyRequest.java,这是关键,这个类来处理数据的编码方式的转换
new String(input.getBytes("ISO-8859-1"), "UTF-8");
import java.io.UnsupportedEncodingException;
import javax.servlet.http.HttpServletRequest;
public class MyRequest extends javax.servlet.http.HttpServletRequestWrapper {
HttpServletRequest request;
String formate;
public MyRequest(HttpServletRequest request, String format) {
super(request);
this.request = request;
this.format = format;
}
@Override
public String[] getParameterValues(String name) {
String strs[] = super.getParameterValues(name);
for (int i = 0; i < strs.length; i++) {
strs[i] = this.myEncoding(strs[i]);
}
return strs;
}
private String myEncoding(String input) {
String output = "";
try {
output = new String(input.getBytes("ISO-8859-1"), this.format);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return output;
}
}
最后再把这个过滤器配置到web.xml中去。
<filter>
<filter-name>Encoding</filter-name>
<filter-class>
com.asus.hzia.pms.server.SetCharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>