解决struts1中文乱码有关问题
解决struts1中文乱码问题
最近工作中遇到一些中文乱码的问题,其中包括在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>