Struts1.X 和 Struts2.X中文乱码解决方法

转载 2012年12月31日 18:48:37

由于Struts框架直接把表单数据发送给了ActionForm,所以这里面没有对HttpRequestServlet进行SetCharacterEncoding,所以默认是按照ISO-8859-1(参见Tomcat 源代码中的org.apache.catalina.connector.HttpRequestBase中的protected void parseParameters()方法),解决的方法,就是在表单提交到ActionForm之前对request进行编码(Struts1.x 与 Struts2.X 处理方式不同)。

 
1.Struts1.x 中:

第一种方法,就是写一个过滤器,对所有请求进行过滤,过滤器代码如下:
  
package com.ssh.common.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;


public class FilterEncoding implements Filter {
    protected String encoding; // 接收字符编码 
    protected boolean ignore; // 是否忽略大小写 
    protected FilterConfig filterConfig; // 初始化配置 
    
    public void init(FilterConfig filterConfig) throws ServletException {
        // 从web.xml文件中读取encoding的值 
        encoding = filterConfig.getInitParameter("encoding"); 
        // 从web.xml文件中读取ignore的值 
        String value = filterConfig.getInitParameter("ignore"); 
        
        // 以下三种情况均为忽略大小写 
        if(value == null) {
            ignore = true; 
        } else if(value.equalsIgnoreCase("yes")) {
            ignore = true; 
        } else if(value.equalsIgnoreCase("true")) {
            ignore = true; 
        }
    }
    
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
        throws IOException, ServletException {
        
        if(ignore || request.getCharacterEncoding() == null) {
            // 如果为空先从web.xml中得到 
            String encoding = selectEncoding(request); 
            if(encoding != null) {
                // 设置字符集编码 
                request.setCharacterEncoding(encoding); 
            }
        }
        
        // 继续执行
        chain.doFilter(request, response); 
    }
    
    // 得到字符编码 
    private String selectEncoding(ServletRequest request) {
        return encoding;
    }
    
    public void destroy() {
        
    }
}


web.xml配置:

<filter>
<filter-name>FilterEncoding</filter-name>
<filter-class>com.ssh.common.filter.FilterEncoding</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
      <filter-name>FilterEncoding</filter-name>
      <url-pattern>/*</url-pattern>
</filter-mapping>

此例,所有的请求的数据,都会经过参数encoding设定的值来编码。具体编码方式根据页面编码进行设置,如果所有页面使用UTF-8就使用UFT-8,如果GBK,就设置GBK。

第二种方法是替换默认的控制器org.apache.struts.action.ActionServlet子类代码:

package jp.co.ricoh.gtis.others.profile.controllers;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionServlet;

public class SetEncodingActionServlet extends ActionServlet {

 protected void process(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
          // TODO Auto-generated method stub
          String encoding = getInitParameter("encoding");
          request.setCharacterEncoding(encoding);
          super.process(request, response);
     }
}


配置文件web.xml

 <servlet>
        <servlet-name>testAction</servlet-name>
        <servlet-class>jp.co.ricoh.gtis.others.profile.controllers.SetEncodingActionServlet</servlet-class>
        <init-param>
          <param-name>config</param-name>
          <param-value>/WEB-INF/struts-config.xml</param-value>
        </init-param>
        <init-param>
          <param-name>encoding</param-name>
          <param-value>utf-8</param-value>
        </init-param>
        <load-on-startup>2</load-on-startup>
      </servlet>

  <servlet-mapping>
        <servlet-name>testAction</servlet-name>
        <url-pattern>*.do</url-pattern>
      </servlet-mapping>

 </servlet>
 
此例,凡是通过*.do来请求的数据,都会经过参数encoding设定的值来编码。具体编码方式根据页面编码进行设置,如果所有页面使用UTF-8就使用UFT-8,如果GBK,就设置GBK。
   
2.Struts2.X 中:

第一种方法,修改Struts2核心架包struts2-core-2.x.x.jar中default.properties文件的struts.i18n.encoding属性

    struts2-core-2.x.x.jar包中路径为struts2-core-2.0.6\org\apache \struts2有一个default.properties 文件,把struts.i18n.encoding=UTF-8改为struts.i18n.encoding=GBK,或者反过来,具体编码方式根据页面编码进行设置,如果所有页面使用UTF-8就使用UFT-8,如果GBK,就设置GBK。


第二种方法,修改Struts2的默认属性配置文件struts.properties中的struts.i18n.encoding属性:

在struts.properties文件中设置struts.i18n.encoding=GBK或者struts.i18n.encoding=UTF-8,具体编码方式根据页面编码进行设置,如果所有页面使用UTF-8就使用UFT-8,如果GBK,就设置GBK。

第三种方法,在struts.xml文件内添加struts.i18n.encoding常量属性配置:

<constant name="struts.i18n.encoding" value="GBK"/>或者<constant name="struts.i18n.encoding" value="UTF-8"/>具体编码方式根据页面编码进行设置,如果所有页面使用UTF-8就使用UFT-8,如果GBK,就设置GBK。


struts1.x和struts2.x之间的一些区别

web框架,struts
  • a13935302660
  • a13935302660
  • 2017年06月03日 13:52
  • 438

windows 控制台cmd乱码的解决办法

有时在cmd中输出的中文乱码 解决办法如下: 在cmd中输入 CHCP 65001
  • taoshujian
  • taoshujian
  • 2017年03月04日 14:27
  • 9942

request.getParameter(“参数名”) 中文乱码解决方法

] 解决问题,先要研究问题,URL传中文参数为什么会出现乱码? 原因:Http请求传输时将url以ISO-8859-1编码,服务器收到字节流后默认会以ISO-8859-1编码来解码成字符流(造成...
  • yjaspire
  • yjaspire
  • 2016年05月30日 11:26
  • 434

Windows下CMD中文乱码问题解决方法

解决命令行的乱码以及编码的问题  命令 chcp  功能:  显示或设置活动代码页编号    CHCP [nnn]    nnn 指定代码页编号。    不加参数键入 CHCP 显示活动代...
  • u011250882
  • u011250882
  • 2015年08月31日 17:15
  • 13782

解决ssh出现中文乱码

一、是前台发送到后台时就出现乱码 1、确保项目编码格式为utf-82、确保所有前台页面的编码格式为utf-8 3、确保jsp编码pageEncoding="UTF-8" 4、前台提交到后台,如果不加m...
  • u011053107
  • u011053107
  • 2015年01月29日 15:18
  • 652

以字节流读取文件时中文乱码解决(二)

以字节流读取文件时中文乱码解决
  • u013260480
  • u013260480
  • 2016年07月27日 10:15
  • 5965

intellij idea 15 控制台输出中文乱码问题解决办法

初次使用intellij idea 15的时候遇到了在项目中控制台输出的中文会变成乱码,下面给出解决办法 1.在File -Setting中设置如下图所示 把IDE 和项目都设置成为UTF-8 ...
  • liuhailiuhai12
  • liuhailiuhai12
  • 2017年02月24日 20:43
  • 869

linux shell中文乱码问题

linux shell中文乱码问题经常碰到, 以前也碰到过, 就听之任之了。 实际上, 有很多方法可以解决这个显示问题, 下面我来提供一种, 聊作记录: taoge@localhost test> l...
  • stpeace
  • stpeace
  • 2015年12月17日 22:53
  • 4213

Unity3d游戏开发之monoDevelop乱码问题

unity自带的monodevelop的项目视图在我电脑(win7)上一直乱码,项目名称,项目结构树,以及文件名称全部显示成方框,今天调了下字体,把默认字体改成Consolas,无心插柳解决了这个问题...
  • book_longssl
  • book_longssl
  • 2015年02月06日 09:29
  • 1308

linux各种中文乱码解决办法整理

远程登录服务器用vim在终端下编辑查看文件经常会遇见各种中文乱码问题。 做如下设置可基本解决vim中文乱码问题 首先查看系统对中文的支持 locale -a | grep zh_CN ...
  • wusuopuBUPT
  • wusuopuBUPT
  • 2016年03月21日 15:52
  • 21290
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Struts1.X 和 Struts2.X中文乱码解决方法
举报原因:
原因补充:

(最多只允许输入30个字)