博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

使用Struts,前台提交给后台的汉字为乱码

Posted on 2013-12-16 22:14  刚泡  阅读(1599)  评论(0编辑  收藏  举报

首先产生乱码的根本原因为前台JSP页面和后台Action的编码方式不同!

  • Struts的默认编码方式为UTF-8
  • JSP的默认编码方式为GB18030

 

 

解决方案:

  • 前后台编码方式一致;
  • 结合拦截器的使用;
  • 表单传输方式的指定;

 

只用三种方式结合使用才能根本上解决乱码问题。

 

1:首先指定前后台编码方式:

前台:

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

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

 

后台Struts.xml配置文件:

<constant name="struts.i18n.encoding" value="UTF-8"/>

 

2:指定拦截器

可以自己编写拦截器也可以使用Spring提供的拦截器(用于SSH整合)。

使用Spring提供的拦截器需要在web.xml中添加如下配置:

<!--配置编码过滤器 -->

<filter>

<filter-name>encodingFilter</filter-name>

<filter-class>

org.springframework.web.filter.CharacterEncodingFilter

</filter-class>

<init-param>

<param-name>encoding</param-name>

<param-value>UTF-8</param-value>

</init-param>

<init-param>

<param-name>forceEncoding</param-name>

<param-value>true</param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name>encodingFilter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

 

encoding:用来指定一个具体的字符集。

forceEncoding:Spring的早期版本这个参数作用很单一,当request中已经被指定了一个字符集的时候是否再将用endcoding对应的字符集设置到request中去。举个例子来说明,假如说过滤器该字段被配置为false,当请求被提交之后,过滤器会判断request.getCharacterEncoding()是否为null,如果是null那么就会进行request.setCharacterEncoding("UTF-8")的操作,如果不是null那么过滤器什么也不会做。如果被配置成了true,则每次都会进行request.setCharacterEncoding("UTF-8")的操作。

 

3:表单指定传输方式:

使用表单提交参数的时候一定要显示的指定传输的方式,将其指定为post方式。如果不显示指定传输方式默认为get方式,get方式会将参数拼接在URL中,而编码方式为ISO-8859-1。这种情况下(使用get方式)即使你做到了步骤1和步骤2(即统一了前后台编码方式和设置了拦截器)也仍然会出现汉字乱码的问题。除非你在后台使用如下方式对存储汉字的参数做一下处理:

String str = new String(name.getBytes("ISO-8859-1"),"UTF-8");

但是如果存储汉字的参数特别多的话,手工进行转换就很麻烦和得不偿失了。

所以一定要指定表单传输方式为POST!

 

综上,乱码的问题就会得以解决。