學習struts2建bbs總結四:解決jsp/action中文傳值亂碼問題
阿新 • • 發佈:2019-01-24
我在測試的過程中,發現當發帖(前面說的postAction)時候,以及當url傳值有中文時,都有亂碼現象。看了許多網上的文章,大致有下面3種解決方案:
1、struts2的版本太低
2、利用前文說的攔截器,在jsp傳值到action前完成轉碼。
3、自定義一個過濾器,在過濾器裡完成。
第一個方法我沒有去試,本著學習的態度,我試了第2、3個方案。
先看未用攔截器時,當點擊板塊”你好“,則進入主題頁,但發現主題頁面的板塊名稱”你好“成了亂碼。如圖:
紅圈中即是板塊名稱的亂碼。原本應該是”你好“。
一、利用攔截器。
程式碼如下:
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>
我在實際應用中,發現第二個方法無法解決亂碼,也許是我的方法寫錯了,目前也先只能這樣了。
因此我選擇了攔截器來解決傳值的亂碼問題。