我在测试的过程中,发现当发帖(前面说的postAction)时候,以及当url传值有中文时,都有乱码现象。看了许多网上的文章,大致有下面3种解决方案:
1、struts2的版本太低
2、利用前文说的拦截器,在jsp传值到action前完成转码。
3、自定义一个过滤器,在过滤器里完成。
第一个方法我没有去试,本着学习的态度,我试了第2、3个方案。
先看未用拦截器时,当点击板块”你好“,则进入主题页,但发现主题页面的板块名称”你好“成了乱码。如图:
点击“你好”的链接为:http://localhost:8080/PengBBS/post_viewTopics.action?boardId=1&page=1&boardName=你好
红圈中即是板块名称的乱码。原本应该是”你好“。
一、利用拦截器。
代码如下:
import java.io.UnsupportedEncodingException;
import java.util.Iterator;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.StrutsStatics;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class EncodingInterceptor extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation arg0) throws Exception {
ActionContext actionContext = arg0.getInvocationContext();
HttpServletRequest request= (HttpServletRequest) actionContext.get(StrutsStatics.HTTP_REQUEST);
/**
* 此方法体对GET 和 POST方法均可
*/
if( request.getMethod().compareToIgnoreCase("post")>=0){
try {
request.setCharacterEncoding("UTF-8"); //这里我jsp是utf-8的,所以这样写
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else{
Iterator iter=request.getParameterMap().values().iterator();
while(iter.hasNext())
{
String[] parames=(String[])iter.next();
for (int i = 0; i < parames.length; i++) {
try {
parames[i]=new String(parames[i].getBytes("iso8859-1"),"UTF-8");//这里我jsp是utf-8的,所以这样写
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
}
return arg0.invoke();
}
}
在xml注册拦截器如下:
<interceptors>
<!-- 编码拦截器 -->
<interceptor name="Encoding" class="pengbbs.controller.EncodingInterceptor"></interceptor>
<!--判断是否登录-->
<interceptor name="login" class="pengbbs.controller.LoginInterceptor" />
<interceptor-stack name="myStack">
<interceptor-ref name="Encoding"></interceptor-ref>
<interceptor-ref name="login"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myStack"></default-interceptor-ref>
这样就显示正常了。
如图:
二、设置过滤器
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;
import org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter;
public class SysFilter extends StrutsPrepareAndExecuteFilter implements Filter {
private FilterConfig config = null;
private String encoding = null;
@Override
public void init(FilterConfig config) throws ServletException {
this.config = config;
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
if (encoding == null) {
encoding = config.getInitParameter("encoding");
}
request.setCharacterEncoding(encoding);
response.setCharacterEncoding(encoding);
chain.doFilter(request, response);
}
@Override
public void destroy() {
config = null;
encoding = null;
}
}
在web.xml中添加:
<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>pengbbs.controller.SysFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
我在实际应用中,发现第二个方法无法解决乱码,也许是我的方法写错了,目前也先只能这样了。
因此我选择了拦截器来解决传值的乱码问题。