Struts + Spring + Hibernate + Mysql中文乱码问题解决

Struts + Spring + Hibernate + Mysql中文问题解决
本文摘自于《 诗意的活着》的博客

如果你在开发java web项目中遇到了让人麻烦的中文乱码问题,并且在搜索引擎中找到了这篇文章,希望你用一点时间读一下它,我相信它对你解决碰到的乱码问题会有帮助。

  这几天在做一个小的 Struts + Spring + Hibernate + Mysql 的练习,以前也听朋友们说过这个框架里的中文乱码挺棘手,开始也没当回事,毕竟在处理这个问题上还算老道,在做的当中确实碰到了一些问题,所以我把这个小经验写下来,以方便更多的开发人员,下面我们开始。

  首先说struts中的.properties文件的中文显示问题:

  struts 在调用 .properties 文件时,首先会取得当前系统的本地语言,用HttpServletRequest.getLocale() 取得相应的 java.util.Locale 对象,然后用 java.util.Locale.getLanguage() 取得当前语言,由此来判断到底该用哪个具体的 .properties 文件,中文当然是 _zh.properties 了。

  我们在定义自己的中文 properties 文件时,在 key 后面填写对应的中文,保存文件(这里我们保存成 temp.properties ),我们要做的是对它做编码的转换,可以直接用JDK提供的native2ascii工具,命令格式如下:

native2ascii -encoding charsetname resource-file target-file

  这个是这里的样例:

native2ascii -encoding GBK D:/workspace/eclipse/myapp/WEB-INF/classes/temp.properties D:/workspace/eclipse/myapp/WEB-INF/classes/MyMessageResources_zh.properties

  各位在写得时候要根据自己的实际情况来定义。

[小笋在处理这个问题时是用了一个插件,能自动将 *.properties ]中的中文转成 UTF-8 的编码。插件会在文章末尾附上。]

  在做完这次转换,我们就得到了想要的 .properties 文件,这个时候如果是用 eclipse 开发就要注意了,我们用 eclipse 编写的 .properties 文件,默认编码是 ISO-8859-1 ,所以即便我们用 native2ascii 转换后,文件中的中文还是??? ,在这里,我们需要对 eclipse 做一些小小的配置。 在 window - property - General - Content type - text - java properties file ,在这里我们可以配置 property 文件的默认编码,将编码设置成 GBK [小笋设置的是UTF-8],然后我们再用 native2ascii 对刚才我们用 eclipse 编写的 property 文件做一次转换,你可以看到不一样的效果。

  做完以上操作,我们的property文件就没问题了,放心的使用吧。

  OK,上面我们介绍完了 property 文件的编码设置问题,现在我们来看看 Struts 中 request 传递 Form 数据的字符集问题。

  相信大家对这个已经很熟悉了,不过作为 Struts Spring Hibernate Mysql 中的一部分,在这里我还是要介绍一下,这样才显得完整。

  其实也就是一个filter,再没有什么特别的了,我们可以直接使用tomcat给我们提供的现成的filter,位置在 Tomcat_Home/webapps/servlet-examples/WEB-INF/classes/filters,在这里我们可以找一个 SetCharacterEncoding.java 的文件,对了,就是它,copy 到你的项目中,然后在 web.xml 中做一下配置:

<filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>com.ifite.schoolreporter.dong.filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>



  当然了,要把 encoding 的 value 改一下嘛,要不然我们做这个filter干什么啊,至于改成什么,解决中文,肯定是 GBK 咯,呵呵,OK了,就这么简单,不过有一点要注意,在配置 filter 时候,我们一定要把它写在 <servlet></servlet> 的前面,要不然在启动 filter 的时候会报错,filter 也将不工作。

[小笋安装 Tomcat 时没有安装这个示例程序,所以临时在网上找了一个,修改一下编码设置就能用了,内容如下:]

package com.lp521.filter;
import java.io.*;
import javax.servlet.*;
public class SetCharacterEncodingFilter implements Filter{
public void destroy(){
}

public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException,ServletException{
request.setCharacterEncoding("GB2312");
chain.doFilter(request, response);
}

public void init(FilterConfig filterConfig) throws ServletException{
}
}


  好了,到这里 request 传递 form 数据的字符问题也解决了,剩什么了?

  数据入库

  好,那么在这个框架中,我们要在两个地方对数据库做配置,hibernate 中的配置我就不说了,因为没什么特别的,参考它官方提供的写法就搞定了,这里介绍 spring 里的 applicationContext.xml 中的配置写法。

  这是我自己项目中实际的写法:

<bean id="dataSource1" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://127.0.0.1:3306/schoolreporter</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value>root</value>
</property>
</bean>


  我这样的配置,进入mysql中的中文字符已经是 OK 的,如果这样写不行的话,可以试一下把上面的 url 的值写成这样:

<property name="url">
<value>jdbc:mysql://127.0.0.1:3306/schoolreporter?username=root&password=root&useUnicode=true&characterEncoding=gbk </value>
</property>


  然后,要把下面的 username 项和 password 去掉,具体为什么,我想兄弟们不因该问了吧,应为在 url 中就已经都设置了呗,当然大家现在可能已经注意到了,以前语句中的“&”,在这里被写成了“&”,对了!!!就是这样,至于这个原因,请自行 google;(备注:第二个写法小东我没有测试,不过按照理论是可以通过的,如果在 spring 加载时报错,小东只能说声对不起,请参照第一种设置,那个是通过测试的)

  好了,基本上做完了上面的工作后 Struts Spring Hibernate Mysql 的中文问题已经全部搞定。

  当然了,这里还要介绍一下我的环境:JDK1.5;Tomcat5.5;mysql4.1;mysql-jconnector-3.1.7。

  开发工具及组件环境:eclipse3.1;struts1.2.7;spring1.2.2;hibernate3.0。

  还有一点要注意的是,在 mysql 中,我们要存多字节数据,为了保险,应该保证所有层面的字符集都是 GBK,尤其保证 client , database , table , coulmn,其实索性全部设置成 GBK 来的更好,具体设置方法这里就不再介绍了,请自行查阅 mysql 提供的使用手册。

  OK,上面的介绍我个人认为已经是比较详细的了,在写这篇文章的时,参考了网上很多文章,配合了一下自己的测试,通过后记录下来,以便方便更多的开发者。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一.功能简介 1. 实现一个图书管理系统。图书信息存放到一个数据库中。图书包含信息:图书号、图书名、作者、价格、备注字段。 2. 系统要实现如下的基本管理功能: (1)用户分为两类:系统管理员,一般用户。 (2)提供用户注册和用户登录验证功能;其中登录用户的信息有:登录用户名,登录密码等。 (3)管理员可以实现对注册用户的管理(删除),并实现对图书的创建、查询、修改和删除等有关的操作。 (4)一般用户,只能查询图书,并进行借书、还书操作,每个用户最多借阅8本,即当目前借书已经是8本,则不能再借书了,只有还书后,才可以再借阅。 二.涉及技术 Struts2框架、Hibernate框架、MySQL数据库、C3P0数据池、Jsp、HTML、CSS、JavaScript等技术。 三.设计思路 1. 基于Struts2框架和Hibernate框架进行编程设计,连接MySQL数据库实现数据的增删查改,应用Jsp、HTML、CSS、JavaScript对访问页面进行编写和美化。 2. 分别创建book表和user表,用以存放图书信息和用户数据。其中user表中,设有flag以区分管理员和普通用户。 3. 分别创建Book类和User类,与数据表相对应。每本书和每个用户都有唯一的id与之对应。 4. 创建映射文件User.hbm.xml和Book.hbm.xml。 5. 创建数据库配置文件hibernate.cfg.xml。 6. 创建数据库连接工具类。 7. 设计数据库操作类:UserDao类和BookDao类。UserDao用于实现所有对user表的操作,BookDao用于实现所有对book表的操作。 8. 创建分别对应UserDao类和BookDao类的Action:UserAction和BookAction。采用基于注解的方式进行Action配置。 9. 用户账号分为管理员账号和普通用户账号,注册时加以区分,登录时即可自动判断进入对应的操作主页面。 10. 管理员可实现对用户的查询显示,模糊查询,删除,批量删除,全选和取消全选等功能;可实现对图书的查询显示,模糊查询,添加,删除,批量删除,全选和取消全选等功能。 11. 普通用户可实现借书和还书功能,借书功能通过对book表的查询,将未借出的图书按照id顺序排列显示,点击表格后方的“借阅”按钮,进行确认借阅,将book表中本书的borrowperson列的值改为本用户账号。对于借阅成功的图书可以在“当前借阅”中进行查看。还书功能通过在“当前借阅”中点击“还书”按钮,进行确认还书,将book表中本书的borrowperson列的值改为“空”,本书信息将可以在“借书”界面查看。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值