spring+hibernate+struts2应用mysql数据库乱码问题

更新时间:2024-03-16 18:05:02 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

乱码问题,主要出现在三个方面: 1.中文展现的乱码问题 2.中文写入数据库乱码问题 3.参数传递的乱码问题

工具:eclipse 3.0 mysql 5.0 项目结构如下:

1.jsp页面展现出现乱码的处理

================================================================= 首先workspace里面文件本身编码设置为utf-8,这样可以解决很多问题 进行设置的位置:window ->preference->Workspace

1.1静态页面的中文显示

----------------------------------------------------------------------------------------------------------------------------------- 在index.jsp里面添加中文,在浏览器正常显示

<%@ page language=\pageEncoding=\%>

你好

1

<%@ page language=\pageEncoding=\%> 把这里的pageEncoding去掉,则会出现:

因为jsp默认页面编码为iso-8859-1,它不支持中文,所以中文无法写入页面

1.2 数据库读取中文并展示

----------------------------------------------------------------------------------------------------------------------------------- 我们新建一个表user,数据库和表的编码都采用utf-8,如下:

index.jsp里面加入动态代码:

<%@ page language=\

<%@ page import=\<%@ page import=\<%@ page import=\

2

<%

IUserservice userS = new UserserviceImpl(); User user = userS.getUserByName(\%>

<%=user.getUsername()%>
<%=user.getAddr()%>

效果如下:

<%@ page language=\pageEncoding=\%> 同样把这里的pageEncoding去掉,则会出现:

下面我们再来看一个问题:

----------------------------------------------------------------------------------------------------------------------------------- <%@ page language=\UTF-8\

3

<%@ page import=\<%@ page import=\<%@ page import=\<%@ page contentType=%utf-8\

<%

IUserservice userS = new UserserviceImpl(); User user = userS.getUserByName(\%>

<%=user.getUsername()%>
<%=user.getAddr()%>

大家都知道<%@ page contentType=%utf-8\这句设置浏览器使用的字符编码类型, 页面编码和客户端查看编码一致,这绝对没有任何问题,但是如果我们这样

<%@ page language=\UTF-8\

<%@ page import=\<%@ page import=\<%@ page import=\

<%@ page contentType=\gb2312\

多么的神奇,现在设定客户端浏览器使用gb2312编码,我们可以看到正确的结果:

这还不够我们再试试另一种:

<%@ page language=\gb2312\

4

<%@ page import=\<%@ page import=\<%@ page import=\<%@ page contentType=%utf-8\

天呐,页面依旧正常显示.并且你再选择其他编码就会出现乱码.这究竟是为什么?

注:pageEncoding的内容只是用于jsp输出时的编码,不会作为header发出去的。

如果 jsp 文件是编码 A ,但是想要在网络上以 B 编码 传输,以及浏览器以 B 编码来显示服务器信息,则这时候只能设置 jsp 文件 pageEncoding 为 A ,contentType charset 为 B编码 。

2.中文写入数据库乱码问题

================================================================= 2.1 我们加入struts 1.3 并对其做一个登陆功能:

----------------------------------------------------------------------------------------------------------------------------------

数据库里面出现乱码:

注:数据库的编码为:utf-8

使用debug可以看到在进入到action的时候就已经乱码:

这个时候我们一般会写一个编码过滤器:

package org.jb.common.filter;

import javax.servlet.Filter;

5

import javax.servlet.FilterConfig;

import javax.servlet.ServletException; import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse; import javax.servlet.FilterChain; import java.io.IOException;

public class SetCharacterEncodingFilter implements Filter {

protected FilterConfig filterConfig; protected String encodingName; protected boolean enable;

public SetCharacterEncodingFilter() { this.encodingName = \ this.enable = false; }

public void init(FilterConfig filterConfig) throws ServletException { this.filterConfig = filterConfig; }

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

throws IOException, ServletException { request.setCharacterEncoding(\ chain.doFilter(request, response); }

public void destroy() { } }

2.web.xml配置加

encodefilter

org.jb.common.filter.SetCharacterEncodingFilter

encodefilter /*

结果如下:

6

数据库内:

2.2 对于jdbc编码的设置:

---------------------------------------------------------------------------------------------------------------------------------- jdbc:mysql://localhost:3306/racegame?useUnicode=true&characterEncoding=UTF-8

useUnicode

Should the driver use Unicode character encodings when handling strings? Should only be used when the driver can't determine the character set mapping, or you are trying to 'force' the driver to use a character set that MySQL either doesn't natively support (such as UTF-8), true/false, defaults to 'true'

虽然说缺省值是TRUE,实际对于各个不同的版本可能是TRUE也可能是FALSE,为保险起见,还是设为\吧; characterEncoding

If 'useUnicode' is set to true, what character encoding should the driver use when dealing with strings? (defaults is to 'autodetect')

设置处理中文使用的字符集,一般用GB2312就行了,但有生僻字时就需要GBK了,例如\

3.参数传递的乱码问题

================================================================= 3.1该问题的出现一般是因为传递中文参数,如:

---------------------------------------------------------------------------------------------------------------------------------- http://127.0.0.1:8080/webs/user.jsp?username=杰克

Tomcat编码改成UTF-8在server.xml里面增加URIEncoding=\GB2312\

7

效果如下:

3.2 useBodyEncodingForURI=\

----------------------------------------------------------------------------------------------------------------------------------

在默认情况下,该参数为false。useBodyEncodingForURI则是根据响应该请求的页面的

request.setCharacterEncoding参数对数据进行的重新编码(解码),不同的页面可以有不同的重新编码(解码)的编码。

另外还可以设置URIEncoding=\指定编码\,但不是很好的方法,如果tomcat有多个项目,每个项目编码不同,则行不通。

URIEncoding和useBodyEncodingForURI区别是,URIEncoding是对所有GET方式的请求的数据进行统一的重新编码 (解码),而useBodyEncodingForURI则是根据响应该请求的页面的request.setCharacterEncoding参数对数 据进行的重新编码(解码),不同的页面可以有不同的重新编码(解码)的编码。

所以对于URL提交的数据和表单中GET方式提交的数据,可以修改 URIEncoding参数为浏览器编码或者修改

useBodyEncodingForURI为true,并且在获得数据的JSP页面中 request.setCharacterEncoding参数设置成浏览器编码。 总结:

在项目中尽量把编码统一为utf-8

对于中文,需要将页面或者tomcat里面参数设置为gb2312

8

本文来源:https://www.bwwdw.com/article/g4i8.html

Top