这几天尝试着编一个类似于贴吧的东西,勉为其难叫他贴吧好了。基于ssh的,包括登录,注册,增删查改帖子,写评论什么的。
最近发现一直用英文作为贴吧的输入语言,发帖回复什么的都使用英语。偶尔使用中文输入却发现无法将帖子等信息通过hibernate持久化到mysql数据库表中。
这可让我有点小尴尬。
起先,在书上找了个filter过滤器,当然这个过滤器写在web.xml上:
<!-- 定义解决汉字编码转换的过滤器 -->
<filter>
<filter-name>chinacode</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>chinacode</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 定义解决汉字编码转换的过滤器 -->
尝试了一下,是不是由于过滤器没有设置导致的无法持久化。在调用持久化方法save()前,我使用输出方法将要插入数据库的数据显示在控制台上,发现控制台上好好的写着中文的数据。Plan A 宣告失败。
查阅了百度经验,发现有网友也出现同样的问题,他们的解决方案是将数据库中的数据字符集修改为UTF-8,因为默认的是什么I开头的一个单词,反正我也记不住了,反正就是保证数据库和网页中的数据编码类型相同均为UTF-8。说干就干,上图:
全部改完后,将贴吧重新部署,发现仍然没有将中文数据插入到数据库中去。
Plan B宣告失败。爆句脏口~艹~
仔细分析一下,既然mysql数据库中编码形式正确,前端数据编码也是正确的,那么只有在调用hibernate的save()方法时才出现问题,而本贴吧是由spring来控制hibernate的
故要去applicationContext.xml中找到控制hibernate的配置,经过查阅资料,原来可以通过如下代码控制hibernate的编码方式
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url"value="jdbc:mysql://localhost:3306/你的数据库名称?characterEncoding=UTF-8"></property>
</bean>
终于,搞定了:
以后一定要记住在开发javaweb的时候,数据库,网页等有关于数据增删查改的动作一定要规范编码格式,保持一致,不能太混乱。