今天在用超链接传值时,遇到了传递中文到Action中出现乱码的问题。经过在网上查找,找到了原因和一些解决办法:
一、出现问题的原因:(超连接传递值的基本方法是get方法 tomcat提供的默认编码方式-默认编码 :ISO-8859-1),在 tomcat4 中 get 与 post 的编码是一样的,所以只要在过滤器中通过 request.setCharacterEncoding 设定一次就可以解决 get 与 post 的问题。然而,在 tomcat5 中,get 与 post 的却进行了不同的处理,对于post方法,采用了和tomcat4的编码处理方法,通过request.setCharacterEncoding进行编码处理,而get方法将通过URI提交处理,tomcat会查找server.xml文件中Connector 元素中的参数URIEncoding的值进行对URI进行encoding,如果没有这个值,将用iso8859-1进行encoding,这样所产生了一个无法同时解决post和get的提交编码。这样一来就说明产生问题的原因并不是encoding的问题,而是tomcat处理的问题。
二、解决的办法:
1、修改tomcat的server.xml的配置文件,使其支持中文,在Connector标签下加入URIEncoding="GBK"(或“UTF-8”)
1 <Connector port="8080" maxHttpHeaderSize="8192" 2 maxThreads="150" minSpareThreads="25" maxSpareThreads="75" 3 enableLookups="false" redirectPort="8443" acceptCount="100" 4 connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="GBK" />
2、在Action或目的页面中接收参数的值时,指定编码方式
1 try { 2 name = new String(name.getBytes("ISO-8859-1"), "utf-8"); 3 } catch(Exception e) { 4 e.printStackTrace(); 5 }
但是使用这种方式,会有一种问题,那就是当一个页面既有用表单提交的内容(如:name1),也有用超链接提交这个内容(name1)时,在接收界面就要判断到底是用那种方式提交过来的,如果是前者(post),则不需要用上面的指定编码方式的方法来接收,若果用了,反而会乱码。如果是后者(get),则必须使用上面指定编码方式的方法来接收。这样一来,还需要在跳转的url中多加一个标志位来判断到底是用哪种方式提交过来的。不是很方便。
3、超链接提交转化为表单的post提交(这是网上别人的blog里写的,我就直接拷贝过来了)
1 function linkClick(linkObject) { 2 3 var formObject = document.createElement(‘form‘); 4 document.body.appendChild(formObject); 5 formObject.setAttribute(‘method‘, ‘post‘); 6 var url = linkObject.href; 7 var uri = ‘‘; 8 var i = url.indexOf(‘?‘); 9 10 if(i == -1) { 11 formObject.action = url; 12 } else { 13 formObject.action = url.substring(0, i); 14 } 15 16 if( i >= 0 && url.length >= i + 1) { 17 uri = url.substring(i + 1, url.length); 18 } 19 20 var sa = uri.split(‘&‘); 21 22 for(var i = 0; i < sa.length; i++) { 23 var isa = sa[i].split(‘=‘); 24 var inputObject = document.createElement(‘input‘); 25 inputObject.setAttribute(‘type‘, ‘hidden‘); 26 inputObject.setAttribute(‘name‘, isa[0]); 27 inputObject.setAttribute(‘value‘, isa[1]); 28 formObject.appendChild(inputObject); 29 } 30 31 formObject.submit(); 32 33 return false; 34 }
1 <a href=‘./servlet/MyServlet?name=世界&id=1‘ onclick="return linkClick(this)">click me</a> <br>
使用这种方式,就把超链接的跳转方式转变成为了表单的提交方式,统一为了post方法,那么在目的界面或Action类中接收此参数时,直接接收就行了,不必进行多余的操作。
4、看到还有一种说是在传递中文前,先用java.net.URLEecoder.encode(value),进行编码,在接收时再用java.net.URLDecoder.decode(value) 通过这个语句进行解码,不过我没有弄成功(js代码中URLEecoder.encode(value)没有通过),希望用这种方法成功的人,能告诉我是什么原因,怎么弄。
三、附上我查资料是所看的几篇帖子地址
http://www.iteye.com/topic49/1879
http://blog.csdn.net/rodjohnsondoctor/article/details/6989273
http://xuxiaolei.iteye.com/blog/187024