`

struts中文问题解决方法

阅读更多

最近正在学习struts,学习过java的人都知道,中文乱码是的问题的。今次运用struts框架同样需要解决这个问题的。这次运用在从页面提交数据到ationForm中时出现的乱码问题。只有从页面提交至actionForm的乱码问题解决以后,我们再能说怎么解决提交至数据库的 乱码问题。

        (一)自己编写一个类,来覆盖ActionServlet中的RequestProcessor方法。大致的意思就是说当使用到RequestProcessor方法时,并不是使用ActionServlet中提供的方法,而是使用我们自己定义的方法(其实是废话!呵呵!),提供代码如下:
package cn;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.RequestProcessor;

public class MyRequestProcessor extends RequestProcessor { 
 protected boolean processPreprocess(HttpServletRequest request,HttpServletResponse response){
  try{
   request.setCharacterEncoding("GB2312");
  }
  catch(Exception e){
   System.out.println("set character failed!");
  }
  return true;
 }
}

很简单的几行代码。
还需要在struts-config.xml中设置一下。
<controller processorClass="cn.MyRequestProcessor" />
这个配置的位置必须要放正确,使用过struts的人都知道的。放在<action-mappings/>之后,<message-resources/>之前。否则是不正确的。
这样就可以实现从表单提交至actionForm的改成中文编码,而不会是乱码。

(二)使用filter过滤器
同样需要自己添加一个类,具体代码如下:
package cn;
/*
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 javax.servlet.UnavailableException;

public class SetEncodingFilter  implements Filter{
  protected String encoding=null;
  
  protected FilterConfig filterConfig=null;
  
  protected boolean ignore=true;
  
  public void destory(){
   this.encoding=null;
   this.filterConfig=null;
  }
  
  public void doFilter(ServletRequest request,
    ServletResponse response,
    FilterChain chain)throws IOException,ServletException{
   if(ignore||(request.getCharacterEncoding()==null)){
    request.setCharacterEncoding(selectEncoding(request));
   }
   chain.doFilter(request,response);
  }
  
  public void init(FilterConfig filterConfig)throws ServletException{
   this.encoding=filterConfig.getInitParameter("encoding");
   String value=filterConfig.getInitParameter("ignore");
   if(value==null)
    this.ignore=true;
   else if(value.equalsIgnoreCase("true")||value.equalsIgnoreCase("yes"))
   this.ignore=true;
   else
    this.ignore=false;
  }
  
  protected String selectEncoding(ServletRequest request){
   return (this.encoding);
  }
  
  public FilterConfig getFilterConfig(){
   return filterConfig;
  }
  
  public void setFitlerConfig(FilterConfig filterConfig){
   this.filterConfig=filterConfig;
  }
 }

我们需要在web.xml文件中做以下配置:
<filter>
   <filter-name>Set Character Encoding</filter-name>
   <filter-class>cn.SetEncodingFilter</filter-class>
   <init-param>
    <param-name>encoding</param-name>
    <param-value>GB2312</param-value>
   </init-param>
   <init-param>
    <param-name>enable</param-name>
    <param-value>true</param-value>
   </init-param>
  </filter>
   
  <filter-mapping>
   <filter-name>Set Character Encoding</filter-name>
   <url-pattern>/*</url-pattern>   
  </filter-mapping>
  <filter-mapping>
   <filter-name>Set Character Encoding</filter-name>
   <servlet-name>Action Servlet</servlet-name>
  </filter-mapping>
  <filter-mapping>
   <filter-name>Set Character Encoding</filter-name>
   <servlet-name>Faces Servlet</servlet-name>
  </filter-mapping>

这部分配置放在哪?看了几个网页的方法,就拿来用,居然不能成功。最后发现是位置不对。应该放在</servlet-mapping>后面。我之前放在了<servlet>之前。怎么弄都不成功。最后换了一下位置就OK了!

还需要说明的一点是:
   <init-param>
    <param-name>encoding</param-name>
    <param-value>GB2312</param-value>
   </init-param>

需要在页面中使用<%@page language="java" contentType="text/html; charset=GB2312"%>才行。如果换成其他编码,那么这个<param-value>的值也需要更换。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics