Struts+Hibernate+MySql 中文乱码问题解决方案

 

Struts+Hibernate+MySql 中文乱码问题解决方案

 

 

项目:china

数据库版本:4.0.23

 

几个关键地点:

 

一、MySql数据库:配置my.ini文件,内容如下:

#This File was made using the WinMySQLAdmin 1.4 Tool

#2005-10-25 17:36:48

 

#Uncomment or Add only the keys that you know how works.

#Read the MySQL Manual for instructions

 

[mysqld]

basedir=D:/mysql

#bind-address=192.168.0.23

datadir=D:/mysql/data

default-character-set=gb2312

#language=D:/mysql/share/your language directory

#slow query log#=

#tmpdir#=

#port=3306

#set-variable=key_buffer=16M

[WinMySQLadmin]

Server=D:/mysql/bin/mysqld-nt.exe

user=root

password=root

红色标注处为MySql缺省字符集配置

 

二、Hibernate.cfg.xml配置文件

在JDBC的URL处写:

jdbc:mysql://localhost:3306/china?useUnicode=true&characterEncoding=gb2312

此处由于环境问题在我的机器上不写?useUnicode=true&characterEncoding=gb2312也可以通过,但是在其他同学机器上就会出现乱码,保守一点写上比较好。

 

 

三、struts.action.NameAction.java

 

package struts.action;

 

import java.io.UnsupportedEncodingException;

 

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

import org.apache.struts.action.Action;

import org.apache.struts.action.ActionForm;

import org.apache.struts.action.ActionForward;

import org.apache.struts.action.ActionMapping;

 

import struts.form.NameForm;

import bo.NameFacade;

import po.Name;

 

/**

 * MyEclipse Struts

 * Creation date: 12-26-2005

 *

 * XDoclet definition:

 * @struts:action path="/name" name="nameForm" input="/form/name.jsp" scope="request" validate="true"

 */

public class NameAction extends Action {

 

    // --------------------------------------------------------- Instance Variables

 

    // --------------------------------------------------------- Methods

 

    /**

     * Method execute

     * @param mapping

     * @param form

     * @param request

     * @param response

     * @return ActionForward

     */

    public ActionForward execute(

        ActionMapping mapping,

        ActionForm form,

        HttpServletRequest request,

        HttpServletResponse response) {

        //response.setContentType("text/html;charset=UTF-8");

        /*try {

            request.setCharacterEncoding("gb2312");

        } catch (UnsupportedEncodingException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }*/

        NameForm nameForm = (NameForm) form;

       

        String name = nameForm.getName();

        if(name!=null)

            try {

                name = new String(name.getBytes("ISO-8859-1"),"gb2312");

            } catch (UnsupportedEncodingException e) {

                // TODO Auto-generated catch block

                e.printStackTrace();

            }

        System.out.println("+++action+++"+name);

        NameFacade nameFacade = new NameFacade();

        Name namedb = new Name();

        namedb.setName(name);

        nameFacade.addUser(namedb);

        // TODO Auto-generated method stub

        return mapping.findForward("suc");

    }

}

红色代码段为从用户表单所得到的数据并经过Form,其为ISO-8859-1编码,将其用getBytes方法转换成gb2312编码。

 

四、china.jsp

<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>

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

    <title>My JSP 'china.jsp' starting page</title>

  </head>

  <body>

    <form name="form1" method="post" action="/china/name.do">

      <input type="text" name="name">

      <input type="submit" name="Submit" value="提交">

   </form>

   <a href="/china/view.do">查看</a>

</body>

</html>

红色标注处统一为gb2312编码。

 

五、view.jsp 如上修改,另外struts.form.NameForm.java不需要任何修改。

 

备注:经测试,增加、查看两相操作没有发现中文乱码问题

      数据库中的数据应为转码后的数据,转码前的数据有待进一步测试

最后说一下我理解的数据流向:

浏览器IE,JSP&HTML    ——>  Form   ——>     Action     ——>    BO    ——>   PO   ——>   DB

    (ISO-8859-1)        (ISO-8859-1) (ISO-8859-1——>gb2312)  (gb2312)      (gb2312)    (gb2312)

如有问题发生,欢迎批评指教!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章