在windows xp MyEclipse5.5+tomcat6+jdk1.6+MySQL5.0的环境下调试一个struts框架的图书管理程序,最开始出现了输入中文后,写入数据库成功,但数据库中的数据和页面显示为“?”乱码。
1、查看了jsp页面的中有<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>
2、之后又查看了MySQL的字符集,设置了gb2312。查看了my.ini中,确实设置的是gb2312
3、确认JDBC连接数据库代码
"jdbc:mysql://127.0.0.1:3306/db_librarySys?user=root&password=root&useUnicode=True&characterEncoding=gb2312"
4、最后我看了代码中的提交数据的部分,下面就是处理数据的部分:
写了一个ChStr.java类
package com.core;public class ChStr {
public static String toChinese(String strvalue) {
try {
if (strvalue == null) { //当变量strvalue为null时
strvalue=""; //将变量strvalue赋值为空
} else {
strvalue = new String(strvalue.getBytes("ISO8859_1"), "GBK"); //将字符串转换为GBK编码
strvalue = strvalue.trim(); //去除字符串的首尾空格
}
} catch (Exception e) {
strvalue=""; //将变量strvalue赋值为空
}
return strvalue; //返回转换后的输入变量strvalue
} // 处理字符串中的空值
public static final String nullToString(String v, String toV) {
if (v == null || "".equals(v)) { //当输入变量v为空时
v = toV; //将输入变量v赋值为输入变量toV
}
return v; //返回转换后的输入变量v
}
//过滤危险字符
public static final String filterStr(String str){
str=str.replaceAll(";","");
str=str.replaceAll("&","&");
str=str.replaceAll("<","<");
str=str.replaceAll(">",">");
str=str.replaceAll("'","");
str=str.replaceAll("--"," ");
str=str.replaceAll("/","");
str=str.replaceAll("%","");
return str;
}
}
之后页面调用
libraryname=chStr.toChinese(libraryForm.getLibraryname());来重新编写form中获取的数据。5、感觉上面都没什么问题,之后查找了struts出
现乱码的解决办法。下面是解决办法:
写一个过滤器,转换中文
public class MyRequestProcessor extends org.apache.struts.action.RequestProcessor{
protected boolean processPreprocess(HttpServletRequest request,
HttpServletResponse response){
try{
request.setCharacterEncoding("gb2312");//出现乱码,换编码方式参数
}
catch(Exception e){
e.printStackTrace();
}
return true; //继续执行请求的相关操作
}
}在struts-config.xml中配置这个过滤器:
在<action-mappings>之后
<controller processorClass="类全名(包名+类名)" />问题:可是问题了来了,用完这个方法后,似乎从前台无法对数据库进行修改了,每次修改提示不成功。在未用到上面的的方法时,还能成功在前台写入数据,就是写入的数据和显示的数据都是问号“?”乱码,但用完该方法后就不能通过前台修改数据库了,(用中文不能修改,用英文仍然可以修改)我从头至尾分析了代码但也没找出异常。没找到哪里阻止了对数据库的写入。
不知道我说没说明白,我一个新手,请大家见谅。请大家帮我看看还能是哪出了问题?!?!
1、查看了jsp页面的中有<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>
2、之后又查看了MySQL的字符集,设置了gb2312。查看了my.ini中,确实设置的是gb2312
3、确认JDBC连接数据库代码
"jdbc:mysql://127.0.0.1:3306/db_librarySys?user=root&password=root&useUnicode=True&characterEncoding=gb2312"
4、最后我看了代码中的提交数据的部分,下面就是处理数据的部分:
写了一个ChStr.java类
package com.core;public class ChStr {
public static String toChinese(String strvalue) {
try {
if (strvalue == null) { //当变量strvalue为null时
strvalue=""; //将变量strvalue赋值为空
} else {
strvalue = new String(strvalue.getBytes("ISO8859_1"), "GBK"); //将字符串转换为GBK编码
strvalue = strvalue.trim(); //去除字符串的首尾空格
}
} catch (Exception e) {
strvalue=""; //将变量strvalue赋值为空
}
return strvalue; //返回转换后的输入变量strvalue
} // 处理字符串中的空值
public static final String nullToString(String v, String toV) {
if (v == null || "".equals(v)) { //当输入变量v为空时
v = toV; //将输入变量v赋值为输入变量toV
}
return v; //返回转换后的输入变量v
}
//过滤危险字符
public static final String filterStr(String str){
str=str.replaceAll(";","");
str=str.replaceAll("&","&");
str=str.replaceAll("<","<");
str=str.replaceAll(">",">");
str=str.replaceAll("'","");
str=str.replaceAll("--"," ");
str=str.replaceAll("/","");
str=str.replaceAll("%","");
return str;
}
}
之后页面调用
libraryname=chStr.toChinese(libraryForm.getLibraryname());来重新编写form中获取的数据。5、感觉上面都没什么问题,之后查找了struts出
现乱码的解决办法。下面是解决办法:
写一个过滤器,转换中文
public class MyRequestProcessor extends org.apache.struts.action.RequestProcessor{
protected boolean processPreprocess(HttpServletRequest request,
HttpServletResponse response){
try{
request.setCharacterEncoding("gb2312");//出现乱码,换编码方式参数
}
catch(Exception e){
e.printStackTrace();
}
return true; //继续执行请求的相关操作
}
}在struts-config.xml中配置这个过滤器:
在<action-mappings>之后
<controller processorClass="类全名(包名+类名)" />问题:可是问题了来了,用完这个方法后,似乎从前台无法对数据库进行修改了,每次修改提示不成功。在未用到上面的的方法时,还能成功在前台写入数据,就是写入的数据和显示的数据都是问号“?”乱码,但用完该方法后就不能通过前台修改数据库了,(用中文不能修改,用英文仍然可以修改)我从头至尾分析了代码但也没找出异常。没找到哪里阻止了对数据库的写入。
不知道我说没说明白,我一个新手,请大家见谅。请大家帮我看看还能是哪出了问题?!?!
解决方案 »
- 一个JAVA编的高斯消去法的程序,请高手指点错误
- mysql能和sql2000用在一台电脑上吗?
- 请问:在有三张表,同时插入数据然后用同一个事物如何进行提交(spring框架)?
- struts 入门问题(我是新手)
- Tomcat6.0无法运行
- 用java实现控制打印机打印
- 我用freemarker导出的xml文件在我的机器上显示是中文内容,为什么到别的机器上就成了乱码呢?
- 请问如何判断一个表达式是正确的SQL表达式(数据库Oracle)
- jsp+javamail发送日文邮件乱码问题,急啊>_<
- invalid hex number 非Blob和Clob字段插入报的错
- jxl怎么合并单元格
- 考试系统中的问题
2、可以在actionform中重写reset方法处理乱码,检查方式同上。
org.apache.struts.action.RequestProcessor是请求控制器,重写需要调用父类构造器,否则不会执行请求。
import java.io.IOException;
import javax.servlet.*;public class GBKEncodingFilter implements Filter {
private FilterConfig config = null; public void init(FilterConfig arg0) throws ServletException {
this.config = arg0; } public void doFilter(ServletRequest req, ServletResponse res, FilterChain fc) throws IOException, ServletException {
if (this.config == null) {
return;
}
req.setCharacterEncoding("GBK");
fc.doFilter(req, res);
} public void destroy() {
}}
用了这个过滤后,还要对mysql进行设置。详细的过程请看
http://blog.csdn.net/ytsmtxxi/archive/2009/05/12/4174689.aspx
将characterEncoding值改成utf8试试!
<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %> 这是给 JSP 编译器用的。每个 JSP 页面你还需要一个给浏览器和服务器用的,因为你还需要告诉浏览器和服务器里面的数据是什么字符集。
<META xxxx = "text/html; charset=gb2312" >