方法一:
1、jsp中代碼
var userNo = $('#prisoner_id').val();
userNo = encodeURI(userNo);
allPrisonerGrid.datagrid('options').url = 'mobilemanage!allPrisonerPage.action?test=' + userNo;
allPrisonerGrid.datagrid('reload');
2、action中代碼
String userNo = "";
try {
userNo = URLDecoder.decode(request.getParameter("test"),"utf-8");
if(!"".equals(userNo)){
mobileManage.setUserNo(userNo);
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
方法二:
假設我們頁面中擁有一個輸入框、一個提交按鈕,當我們點擊提交按鈕時獲取輸入框中用戶輸入的值,然后利用URL傳遞參數的方式,將輸入框的值傳遞到后台。我們假設后台對應web層處理技術使用Struts2的Action進行數據處理,假設Action中處理數據的URL為/say。具體頁面急請求Action代碼如下:
html代碼:
<input type="text" id="name" name="name" value="${user.name}" />
<button id="sub" onclick="sub()">提交</button>
javascript代碼:
<script type="text/javascript">
function sub(){
var name = document.getElementById("name").value;①
window.location = "sayHello?user.name=" + name;②
}
</script>
以上代碼首先從id為name的輸入框中取得輸入框的值,然后利用window.localtion請求URL為sayHello的Action,在此action后面利用key=value這樣的格式,傳入的參數,並根據Struts2的機制利用傳入的輸入框中的值,更新了后台User實體的name屬性 。
URL編碼及解碼原理:
由於我們利用URL傳遞參數這種方式是依賴與瀏覽器環境中的,也就是說URL及URL中包含的各個key=value格式的傳遞參數鍵值對參數是在瀏覽器地址欄中的處理原理處理相應編碼后傳遞至后台進行解碼的。
由於我們沒有進行任何處理,此時javascript請求URL並傳參數存在中文時(也就是說輸入框中輸入中文時),對URL的中文參數進行編碼是按照瀏覽器機制進行編碼的。此時編碼存在亂碼問題。
假設輸入框中輸入的內容為“測試”二字,后台Action接受到的參數值為亂碼。javascript中利用encodeURI()方法進行編碼。
1、利用encodeURI()在javascript中對中文URL參數進行編碼時,“測試”二字會被轉換為“%E6%B5%8B%E8%AF%95”
2、但是瀏覽器機制會認為“%”是一個轉義字符,瀏覽器會把地址欄URL中的傳遞的已轉換參數“%”與“%”之間的已轉義字符進行處理傳遞到后台Action中。這樣會造成與實際經過encodeURI()編碼后的URL不符,因為瀏覽器誤認為“%”是轉義字符字符了,它並未將“%”認為是個普通字符。
3、要使得通過encodeURI()轉換后的URL被瀏覽器正常處理,必須在外層再用encodeURI()處理一次已被encodeURI()編碼后的RUL。這此處理encodeURI()會將已編碼后的URL中被瀏覽器解析為轉義字符的“%”再次進行編碼,轉換為普通字符。
4、正常處理后,前面javascript代碼中②處代碼為:
window.location = encodeURI(encodeURI("sayHello?user.name=" + name));
5、處理后的URL不在是通過一次 encodeURI()轉換后的字符串”%E6%B5%8B%E8%AF%95“,而是經過上一步兩層encodeURI()處理URL處理后的字符串”%25E6%B255%258B%25E8%AF%2595“,通過再次編碼原有被瀏覽起解析為轉義字符的”%“被再次編碼,轉換成了普通字符轉”%25“。
此時前端javascript代碼對帶有中文的URL編碼已經完成,並通過URL傳遞參數的方式傳遞到后台Action等待處理,Action獲取到正常轉換切無亂碼的參數為”%25E6%B255%258B%25E8%AF%2595“,此字符串對應的中文正是我們輸入的”測試“二字。
Action獲取到這樣的字符串無法進行處理,因為它並不是我們前端輸入的源數據”測試“二字,而是進過兩次encodeURI()編碼后的字符串。於是我們需要利用后台的一個API對前端編碼后的參數字符串進行解碼,對應解碼API是URLDecoder.decode(user.getName(),"UTF-8")。
URLDecoder的decode(String str,String ecn)方法有兩個參數,第一個參數為待解碼的字符串,第二個參數為解碼時的對應編碼。我么在后台使用此API進行解碼的代碼為:
URLDecoder.decode(user.getName(),"UTF-8");
總結:
此時我們完成了URL傳入中文參數出現亂碼的問題,總結步驟大致分為一下階段:
1、在javascript中利用encodeURI()兩次嵌套對URL中的中文參數進行編碼
2、在后台獲取到進過前端encodeURI()編碼后的字符串,使用decode(String str,String ecn)方法進行解碼
經過以上步驟URL中的中文內容亂碼問題成功解決!