Struts中文乱码

来源:互联网 发布:帝国cms 中华养生 编辑:程序博客网 时间:2024/04/30 00:58

框架:struts1.2,使用struts标签编写页面,Web容器:Tomcat 5.5  JDK:1.5

问题描述:做完demo,在<html:text>输入中文,点击提交,存在中文乱码

可能是问题太初级也太老,网上相关解决方案很多,也有很多人整理过,拿过来验证梳理一下,以下三种方式均运行通过,都能达到解决问题的目的。

方案一:重新ActionServlet类的process方法,dongyp511 博客(http://blog.csdn.net/dongyp511/)上的推荐方法

1.写一个MyActionServlet来并重写ActionServlet中的process()方法。 

protected void process(HttpServletRequest request, HttpServletResponse response) throws java.io.IOException, javax.servlet.ServletException {
    
/**@todo Override this org.apache.struts.action.ActionServlet method*/
    request.setCharacterEncoding(
"UTF-8");//就加着一行一切都解决了,我用的编码UTF-8,^_^
    super.process(request, response);
  }

2.修改一下web.xml里面的配置,把<servlet-class>中默认的 org.apache.struts.action.ActionServlet 换成,你的MyActionServlet如 strutsdemo.MyActionServlet

<servlet-name>action</servlet-name>
 
<servlet-class>strutsdemo.MyActionServlet</servlet-class>

结论:问题解决,一劳永逸

方案二:使用ISO_8895_1直接转码,String str2=new String(str.getBytes("ISO_8859_1"),"UTF-8");

1. 做成通用方法如下:

 

public static String isoToGB(String src)
...

2.在Action中调用上述方法,转码成功该方式可行,不知流传的不成功为何,不过感觉这样做比较麻烦。

方案三:使用 过滤器filter

1. 添加一个过滤类(继承Filter) SetCharacterEncodingFilter ,完整代码(注:假如我们是用tomcat作服务器的话,那就更方便了,我们可以直接在tomcat的webapps/jsp-examples/Web-INF/classes/filters目录中的SetCharacterEncodingFilter.java复制到你使用的包下即可)如下:

 

package com.jesun.character.Filter;

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;

/**
@author Jesun
* @date 2008-2-16
* 源码来自Internet,我只作了简单的修改
* 解决Struts中文显示乱码问题
*/

public class SetCharacterEncodingFilter implements Filter {
protected String encoding = null
protected FilterConfig filterConfig = null
protected boolean ignore = true//在web.xml文件里定义filter时要用到此参数

public void destroy() {
   
// TODO Auto-generated method stub
         this.encoding = null;
           
this.filterConfig = null;
}

public void doFilter(ServletRequest request, ServletResponse response,
    FilterChain chain) 
throws IOException, ServletException {
   
// TODO Auto-generated method stub
     
// Conditionally select and set the character encoding to be used
        if (ignore || (request.getCharacterEncoding() == null)) {
            String encoding 
= selectEncoding(request);

            
if (encoding != null)
                request.setCharacterEncoding(encoding);
        }
        
//Pass control on to the next filter
        chain.doFilter(request, response);

}

public void init(FilterConfig filterConfig) throws ServletException {
   
// TODO Auto-generated method stub
   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);
    }

}
//class end

2 配置web.xml文件,添加filter,

 

<!-- 定义Filter,解决struts中文问题 -->
<filter>
    
<filter-name>Set Character Encoding</filter-name>
    
<filter-class>com.jesun.character.Filter.SetCharacterEncodingFilter</filter-class>//包名
    
<init-param>
   
<!-- 定义编码格式,我用的是UTF-8-->
      
<param-name>encoding</param-name>
      
<param-value>UTF-8</param-value>
    
</init-param>
    
<init-param>
    
<!-- innore参数是在过滤器类定义的 -->
      
<param-name>ignore</param-name>
      
<param-value>true</param-value>
    
</init-param>
</filter>
<filter-mapping>
    
<filter-name>Set Character Encoding</filter-name>
    
<servlet-name>action</servlet-name>
</filter-mapping>
<filter-mapping>
    
<filter-name>Set Character Encoding</filter-name>
    
<servlet-name>*.jsp</servlet-name>
</filter-mapping>
<!-- Filter 定义结束 -->
<servlet>
    
<servlet-name>action</servlet-name>
    
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
    
<init-param>
      
<param-name>config</param-name>
      
<param-value>/WEB-INF/struts-config.xml</param-value>
    
</init-param>
    
<init-param>
      
<param-name>debug</param-name>
      
<param-value>3</param-value>
    
</init-param>
    
<init-param>
      
<param-name>detail</param-name>
      
<param-value>3</param-value>
    
</init-param>
    
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
    
<servlet-name>action</servlet-name>
    
<url-pattern>*.do</url-pattern>
</servlet-mapping>

3 jsp页面的编码格式要设成和配置文件中一致的格式

 

<%@page contentType="text/html;charset=UTF-8"%>

<META http-equiv=Content-Type content="text/html;charset=UTF-8">

rascal_hu博客(http://hi.baidu.com/rascal_hu/blog/item/e6dd2a342647b84a241f1470.html)

zhanglixin2006博客(http://zhanglixin2006.bokee.com/viewdiary.12273650.html)

结论:问题解决,虽然看似很复杂,解决的过程中需要做的不是很多

小结:应该还有其他的很多方法吧,第一种和第三种要做的东西基本类似,添加类和修改配置文件,能方便的应用于整个系统,不用在程序中嵌入大量的代码,个人感觉都不错。

 

原创粉丝点击