今天在用超鏈接傳值時,遇到了傳遞中文到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
