一、乱码分析与解决:

【1】JSP传值给Action过程中出现乱码;

1、前台页面与action:

  从最初的jsp页面说起,如果在jsp页面设置编码与action中的编码

(struts.xml中的<constant name="struts.i18n.encoding" value="UTF-8"></constant>)

不一致的就一定会出现乱码;所以在项目中将有编码统一为UTF-8;

2、服务器::

  如果jsp页面和action中的设置为UTF-8,action中乱码依然出现,说明,服务器tomcat中的编码设置不是UTF-8;可以在tomcat的service.xml配置文件中设置:

<Connector port="8080" protocol="HTTP/1.1" maxThreads="150" connectionTimeout="20000"

redirectPort="8443" URIEncoding="UTF-8"/>;tomcat的编码,众所周知为ISO-8859-1;设为UTF-8;

理论上,这是根本上解决问题的方法,action中就不会有乱码了,但是这个方法,偶尔管用;

  如果,action中依然接收的值是乱码;说明tomcat的设置没有起到作用;这时候,不得不手动在项目中添加一个过滤器filter,手动的将tomcat中传来的值设置为UTF-8的编码;下面为filter:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package
servlets;
import
java.io.IOException;
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
EncodingFilter
implements
Filter {
public
void
init(FilterConfig config)
throws
ServletException {
}
public
void
doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws
IOException, ServletException {
request.setCharacterEncoding(
"utf-8"
);
chain.doFilter(request, response);
}
public
void
destroy() {
}
}
在web.xml注册
<filter>
<filter-name>EncodingFilter </filter-name>
<filter-
class
>servlets.EncodingFilter </filter-
class
>
</filter>
<filter-mapping>
<filter-name>EncodingFilter </filter-name>
<url-pattern>/* </url-pattern>
</filter-mapping>

添加filter之后,确认filter被调用,在action执行前被执行过,这样,在action中的乱码就会彻底解决;

 以前在action中解决乱码,简单的通过new String()转码,这样不是根本方法;通过以上三处(JSP、tomcat、action)通过不同的方式将编码统一为UTF-8;就解决问题了;如果action中乱码依然在;问题就在这三个上面;可以试着不同的方法将他们设置统一编码;

【2】、action和数据库过程中乱码(mysql)

  1、如果测试过,action中传值给Hibernate之前的参数确实为中文,不是乱码;这问题便出现在Hibernate或者数据库本身;

    假设问题在Hibernate上,就可以在Hibernate的配置文件中,将sessionfactory的添加属性;

1
<property name=
"url"
value=
"jdbc:mysql://localhost:3306/shopping?useUnicode=true&amp;characterEncoding=UTF-8"
>

和        

1
2
3
4
5
6
7
8
9
10
<property name=
"hibernateProperties"
>
<props>
<prop key=
"hibernate.dialect"
>org.hibernate.dialect.MySQLDialect</prop>
<prop key=
"hibernate.show_sql"
>
true
</prop>
<prop key=
"hibernate.hbm2ddl.auto"
>update</prop>
<prop key=
"hibernate.query.factory_class"
>
org.hibernate.hql.classic.ClassicQueryTranslatorFactory
</prop>
</props>
</property>

这些属性设置表明Hibernate在数据库存储的时候,会以指定的编码进行存储;这时候数据库中的数据就会想要的中文了;但如果你还是存在数据库乱码;就手动的将数据库的的默认编码改为UTF-8;这样就没有问题了;

插曲:本人,在通过以上的配置,出现一个怪现象;往数据库中save数据时,是中文,但是一旦查询数据,数据便变成乱码;纠结了好久;原来是,在我测试过程中;在Bean层中的实体类的setXXX方法中,将得到的参数通过new String()这种笨蛋方法转码过,所以,第一次save时,参数被这个方法编码为UTF-8,这样参数没有问题地以UTF-8存进数据库了,但是,在查询时,Hibernate会从数据库中,将数据读取查询,同时也会将查询的值传给Bean中的实体类,这些数据库中的中文参数,又一次的被转码编码为UTF-8,Hibernate在查询完后,便会更新数据,这些被转码过的参数就会被存入数据库,便成为乱码;

本文出自 “” 博客,请务必保留此出处