一、乱码分析与解决:

 【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&amp;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在查询完后,便会更新数据,这些被转码过的参数就会被存入数据库,便成为乱码;