原来自己也没有注意到这个情况,但是在一次实际的开发过程种遇到了这种情况,就是我需要在同一个页面上实现添加和查询,所以就要用到javascript传值了,我采用的架构是MVC,操作系统是XP,服务器是Tomcat5.0.19,数据库是用的Mysql, 我的情况是这样的:
我在添加的时候在jsp页面提交的时候用的是Form的Action,method用的是Post,中间的过程也是按照我上次写的文章《tomcat下中文的彻底解决》(http://www.javaresearch.org/article/showarticle.jsp?column=106&thread=19240)这篇文章配置过滤器的,数据库用的是链接池,配置也是同上。在我提交代码的时候没有什么大的问题,但是在我查询的时候出现了情况,我在查询的时候采用的是javaScript传值,具体的代码是这样的
function doQuery(){
var flag=FormVerify();
if(flag){
var sUrl="/workshop/queryMaterial.do?materialcode=" + document.MaterialForm.materialcode.value+"&materialname="+document.MaterialForm.materialname.value;
self.location.href="http://www.chinaitpower.com/A200507/2005-07-24/sUrl;
}
return flag;
}
后来我发现我存在数据库里的数据都不能显示,这个是什么原因呢,在Form里面打了log,发现我在里面输入名字以后,到MVC里面的Form里出现了乱码,结果就导致后面的SQL语句不能识别。为了能让Sql语句识别,我采用了各种转换的方式,比如我想直接在页面里把String的编码转换成UTF-8的,和我页面上的一致,我采用了下面的转换方法:
public static String toUtf8String(String s) {
StringBuffer sb = new StringBuffer();
for (int i=0;i<s.length();i++) {
char c = s.charAt(i);
if (c >= 0 && c <= 255) {
sb.append("="+c);
} else {
byte[] b;
try {
b = Character.toString(c).getBytes("utf-8");
} catch (Exception ex) {
System.out.println(ex);
b = new byte[0];
}
for (int j = 0; j < b.length; j++) {
int k = b[j];
if (k < 0) k += 256;
sb.append("=" + Integer.toHexString(k).
toUpperCase());
}
}
}
return sb.toString();
}
但是还是效果不好。有的网友说在接收的时候把代码给修改一下,但是还是不能搞定,如果是用JSP+javaBean的时候这种办法还是可以的,但是我的主要是用的MVC,接受的是后用的Form,这种方法不是很好。
public String toGb(String uniStr){
String gbStr = "";
if(uniStr == null){
uniStr = "";
}
try{
byte[] tempByte = uniStr.getBytes("ISO8859_1");
gbStr = new String(tempByte,"GB2312");
}
catch(Exception ex){
}
return gbStr;
}
为什么我的添加的按钮都没有出现乱码,而查询就出现了呢,我反复的看,终于我发现了问题是处在我的查询的URL的链接,大家可以看一下这个链接:sUrl="/workshop/queryMaterial.do?materialcode=" + document.MaterialForm.materialcode.value+"&materialname="+document.MaterialForm.materialname.value;这个是一个典型的method用的是Get的方法,从$TOMCAT_HOME/webapps/tomcat-docs/config/http.html下的URIEncoding属性可以知道,用get方法传递的时候,这个方法你加过滤器和在页面上指定编码都是不可用的,你如果在服务器的server.xml里如果没有配置这一项的时候,采用Get提交的时候,服务器就会默认的是服务器内部的ISO-8859-1的编码,所以JavaScript传递中文出现乱码的问题根本上就是服务器提交时候Get方法和Post方法的不同,所以就导致了乱码的出现。如果你认识到这里,那就有解决的办法了。
具体的解决办法是:
1) 打开tomcat的server.xml文件,找到区块,加入如下一行URIEncoding="GBK",具体的代码如下:
<Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="GBK"/>
2)重启tomcat,一切OK。不过我为了统一代码的时候我用了UTF-8,结果是中文中有一个字是出现乱码,比如我要是输入中国的时候,我的log就会出现中是正常的,而国是?,后来我改用了字符集,用了GBK就可以搞定。
这样的话就解决了javascript传递中文出现乱码的问题了。实质上就是Form中post和get方法的区别。






