在公司做的项目一般都是英文的,也就是默认的拉丁字符集 ISO-8859-1。在今天做的J+S+H应用中,我想插入保存一个中文的用户名,可是不管怎么样保存,都是问号形式的乱码。
乱码问题一直是个比较头疼而又常见的问题,困扰着我们这些实用Unicode的群众。在Java Web应用中,乱码一般会出现在页面JSP显示层或者数据库持久层。对于前者,我们一般是注意在页面的头部代码中加入
<%@page contentType="text/html;charset=GB2312"%>
或者
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
如果依旧不行,考虑到对request中的数据进行一个ISO-8859到Unicode字符集的转换过程,一般都是通过一个Filter来实现,如下面的样例代码:
package com.array.dinner.utils;
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 SetCharacterEncoding implements Filter {
protected String encoding = null;
protected FilterConfig filterConfig = null;
protected boolean ignore = true;
public void destroy() {
this.encoding = null;
this.filterConfig = null;
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// Conditionally select and set the character encoding to be used
if (ignore || (request.getCharacterEncoding() == null)) {
String encoding = selectEncoding(request);
if (encoding != null)
request.setCharacterEncoding(encoding);
}
// Pass control on to the next filter
chain.doFilter(request, response);
}
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
this.encoding = filterConfig.getInitParameter("encoding");
String value = filterConfig.getInitParameter("ignore");
if (value == null)
this.ignore = true;
else if (value.equalsIgnoreCase("true"))
this.ignore = true;
else if (value.equalsIgnoreCase("yes"))
this.ignore = true;
else
this.ignore = false;
}
protected String selectEncoding(ServletRequest request) {
return (this.encoding);
}
}
对应的web.xml的配置应该添加一下Filter声明:
<filter>
<filter-name>setCharacterEncoding</filter-name>
<filter-class>com.array.dinner.utils.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>gb2312</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>setCharacterEncoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
但是,当我跟踪到JSF的后台bean中,又能完整地看到变量的完整地中文字符。很明显,是在数据库的持久层上出问题了。仔细检查一下了自己的MySQL数据库,发现所有的表都是建立在UTF-8之上的,数据库本身应该是没有问题的。
顺着想一想,结论马上就浮出水面了,我输入的是中文字符GBK的,而数据库接受的却是UTF-8,数据库方面默认用UTF-8来处理和保存一堆传过来的Unicode字符,但是数据库方面是不知道对方来的数据是什么编码的,所以只能用问号表示“抗议”。所以,这里只需要让数据库了解你的数据包的性质,沟通自然就无问题了。废话少说,你只需要在数据库连接url中这样声明一下,多加两个参数useUnicode和characterEncoding:
jdbc:mysql://localhost:3306/dinner?useUnicode=true&characterEncoding=UTF-8
分享到:
相关推荐
标题“JSF1.2+Spring2.0+Hibernate3.2的一个登陆实例”涉及到的是一个集成使用JavaServer Faces(JSF)、Spring框架和Hibernate ORM的登录应用示例。这个项目可能是一个教学资源或者开发者用来学习如何在旧版本的...
【JSF+Spring+Hibernate整合开发】 JSF (JavaServer Faces)、Spring 和 Hibernate 是 Java 开发中的三大核心技术,常用于构建企业级的 Web 应用程序。它们各自扮演着不同的角色,共同构建了一个强大的后端架构。 1...
**JSF+Spring+Hibernate整合应用详解** 在Java Web开发中,JSF(JavaServer Faces)、Spring和Hibernate是三个常用的技术栈,它们分别负责视图层、业务逻辑层和服务数据持久化层。这个"JSF+Spring+Hibernate小例子...
jsf1.2+spring2.0+hibernate3.2整合demo part1
JSF+Spring+Hibernate jar文件压缩包,hibernate最小配置,Spring 2.0 jar, richfaces
这是jsf+spring2.5+jpa(hibernate)的jar包,很多人为了jsj环境而配置半天,在此提供jar包共享。注:除了ajax4jsf和tomahawk-1.1.3.jar,因为csdn只让我上传20mb,大家自己可以下一下自己试试。
### JSF+Spring+JPA(Hibernate实现)的环境搭建详解 #### 一、概述 在当前企业级应用开发中,技术栈的选择至关重要。本文旨在详细介绍如何构建基于JSF(JavaServer Faces)、Spring以及JPA(Java Persistence API,...
**Ajax、JSF、Spring和Hibernate是四种在Java Web开发中广泛应用的技术,它们共同构建了高效、灵活且功能强大的Web应用程序。** **Ajax(Asynchronous JavaScript and XML)** 是一种在无需重新加载整个网页的情况...
JSF+Spring+Hibernate(Annotation)的login小实例,建议入门的朋友看看,老鸟就免了,呵呵。环境:SQLSever2000+jdk5.0+spring2.0+hibernate3.2+jsf
以下是对"JSF+Spring+Hibernate"整合的详细过程的阐述: 1. **JavaServer Faces (JSF)**:JSF是一种基于组件的MVC(模型-视图-控制器)框架,主要用于构建企业级的Web应用程序。它提供了一套预定义的UI组件,使得...
这篇文档"JSF+Spring+JPA_Hibernate实现_的环境搭建.pdf"将引导你一步步建立这样的开发环境,让我们深入探讨其中涉及的知识点。 首先,**JavaServer Faces (JSF)** 是一种Java EE标准的MVC(模型-视图-控制器)框架...
JSF+Spring+Ibatis示例,对学习JAVA企业应用开发有巨大的帮助!