|
|
原来自己也没有注意到这个情况,但是在一次实际的开发过程种遇到了这种情况,就是我需要在同一个页面上实现添加和查询,所以就要用到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=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方法的区别。
|
|