一、乱码分析与解决:
【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:
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的添加属性;
<property name="url" value="jdbc:mysql://localhost:3306/shopping?useUnicode=true&characterEncoding=UTF-8">
和
<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在查询完后,便会更新数据,这些被转码过的参数就会被存入数据库,便成为乱码;