問題描述:
我是在一個jsp頁面有一個保存按鈕,點擊時會觸發saveForm()的js函數,在saveForm()函數里經過校驗后,會通過ajax發送數據請求,這樣就不用通過提交表單來傳輸數據了,ajax估計就是這樣的好處吧,目前對ajax還不太熟悉。
ajax傳輸亂碼時的代碼:
1 function saveForm(){ 2 if(document.theformadd.onsubmit()){ 3 disableAllBtn(true); 4 j$.ajax({ 5 type:"get", 6 url:"add_form_do.jsp", 7 data:{ 8 problem_id : j$("#problem_id").val(), 9 product_id : "<%=product_id%>", 10 productId : j$("#productId").val(), 11 depart_id : j$("#depart_id").val(), 12 fk_busi_id : j$("#fk_busi_id").val(), 13 fk_type : j$("#fk_type").val(), 14 fk_source : j$("#fk_source").val(), 15 fk_info : j$("#fk_info").val(), 16 fk_name : j$("#fk_name").val(), 17 fk_bank_name : j$("#fk_bank_name").val(), 18 fk_bank_acct : j$("#fk_bank_acct").val(), 19 sk_name : j$("#sk_name").val(), 20 sk_bank_name : j$("#sk_bank_name").val(), 21 sk_bank_acct : j$("#sk_bank_acct").val(), 22 fk_money : j$("#fk_money").val(), 23 fk_summary : j$("#fk_summary").val(), 24 fk_date : j$("#fk_date").val(), 25 input_man : "<%=input_operatorCode%>" 26 }, 27 success:function(ret){ 28 if(ret == 1) { 29 sl_alert("保存成功!"); 30 }else{ 31 sl_alert(ret); 32 33 } 34 35 window.returnValue=true; 36 window.close(); 37 38 39 } 40 }); 41 } 42 }
然后我們在add_form_do.jsp中獲取數據
1 <%@ page contentType="text/html; charset=GBK" import="java.math.*,com.enfo.intrust.intrust.vo.*,java.io.*, com.enfo.intrust.web.*,java.util.*,com.enfo.intrust.dao.*,com.enfo.intrust.intrust.*,com.enfo.intrust.tools.*,com.enfo.intrust.project.*" %> 2 <script type="text/javascript" src="<%=request.getContextPath()%>/ext2.0/ext-base.js"></script> 3 <script type="text/javascript" src="<%=request.getContextPath()%>/ext2.0/ext-all.js"></script> 4 <%@ include file="/includes/operator.inc" %> 5 <% 6 try{ 7 product_id = Utility.parseInt(Utility.trimNull(request.getParameter("product_id")),product_id); 8 9 UnpostwarrantLocal local = EJBFactory.getUnpostwarrant(); 10 11 Integer problem_id = Utility.parseInt(request.getParameter("problem_id"),new Integer(0)); 12 13 Integer depart_id = Utility.parseInt(request.getParameter("depart_id"),new Integer(0)); //部門 14 Integer productId = Utility.parseInt(Utility.trimNull(request.getParameter("productId")),product_id); 15 String fk_busi_id = Utility.trimNull(request.getParameter("fk_busi_id")); //字典1206 費用 16 String fk_type = Utility.trimNull(request.getParameter("fk_type")); //付款方式 2103 17 String fk_source = Utility.trimNull(request.getParameter("fk_source")); //付款依據 2104 18 String fk_info = Utility.trimNull(request.getParameter("fk_info")); //票據號碼 19 String fk_name = Utility.trimNull(request.getParameter("fk_name")); //付款單位 20 String fk_bank_name = Utility.trimNull(request.getParameter("fk_bank_name")); //付款銀行名稱 21 String fk_bank_acct = Utility.trimNull(request.getParameter("fk_bank_acct")); //付款銀行賬號 22 String sk_name = Utility.trimNull(request.getParameter("sk_name")); //收款單位 23 String sk_bank_name = Utility.trimNull(request.getParameter("sk_bank_name")); //收款銀行名稱 24 String sk_bank_acct = Utility.trimNull(request.getParameter("sk_bank_acct")); //收款銀行賬號 25 BigDecimal fk_money = Utility.parseDecimal(Utility.trimNull(request.getParameter("fk_money")).replaceAll(",",""),new BigDecimal(0)); //金額 26 String fk_summary = Utility.trimNull(request.getParameter("fk_summary")); //備注 27 Integer fk_date = Utility.parseInt(request.getParameter("fk_date"),new Integer(Utility.getCurrentDate())); //要求付款日期 28 29 local.setProblem_id(problem_id); 30 //local.setProduct_id(product_id); 31 local.setProduct_id(productId); 32 local.setDepart_id(depart_id); 33 local.setFk_busi_id(fk_busi_id); 34 local.setFk_type(fk_type); 35 local.setFk_source(fk_source); 36 local.setFk_info(fk_info); 37 local.setFk_name(fk_name); 38 local.setFk_bank_name(fk_bank_name); 39 local.setFk_bank_acct(fk_bank_acct); 40 local.setSk_name(sk_name); 41 local.setSk_bank_name(sk_bank_name); 42 local.setSk_bank_acct(sk_bank_acct); 43 local.setFk_money(fk_money); 44 local.setFk_summary(fk_summary); 45 local.setFk_date(fk_date); 46 local.setInput_man(input_operatorCode); 47 local.addFinacialcardInfoGuotou(); 48 out.clear(); 49 response.getWriter().write("1"); 50 }catch(Exception e){ 51 out.clear(); 52 response.getWriter().write(e.getMessage()); 53 } 54 55 %>
這時候我接受到的數據會是中文亂碼,不管傳輸方式是get,還是post都會中文亂碼
解決方案:
我們可以在傳輸時對數據重新編碼,然后在接受數據時重新解碼。其實亂碼的問題就是編碼格式沖突,導致解碼的密鑰對之前格式解析錯誤,導致亂碼。在傳輸時,在需要傳輸中文數據前面加一個encodeURI()編碼,例如:encodeURI(j$("#fk_info").val());在接受需要中文數據的前面加一個java.net.URLDecoder.decode(value, "UTF-8"),例如
String fk_bank_name = Utility.trimNull(request.getParameter("fk_bank_name"));
String trans = java.net.URLDecoder.decode(fk_bank_name, "UTF-8");
具體修改后的全部代碼如下:
修復后ajax傳輸的代碼:
1 function saveForm(){ 2 if(document.theformadd.onsubmit()){ 3 disableAllBtn(true); 4 j$.ajax({ 5 type:"get", 6 url:"add_form_do.jsp", 7 data:{ 8 problem_id : j$("#problem_id").val(), 9 product_id : "<%=product_id%>", 10 productId : j$("#productId").val(), 11 depart_id : j$("#depart_id").val(), 12 fk_busi_id : j$("#fk_busi_id").val(), 13 fk_type : j$("#fk_type").val(), 14 fk_source : j$("#fk_source").val(), 15 fk_info : encodeURI(j$("#fk_info").val()), 16 fk_name : encodeURI(j$("#fk_name").val()), 17 fk_bank_name : encodeURI(j$("#fk_bank_name").val()), 18 fk_bank_acct : encodeURI(j$("#fk_bank_acct").val()), 19 sk_name : encodeURI(j$("#sk_name").val()), 20 sk_bank_name : encodeURI(j$("#sk_bank_name").val()), 21 sk_bank_acct : encodeURI(j$("#sk_bank_acct").val()), 22 fk_money : j$("#fk_money").val(), 23 fk_summary : encodeURI(j$("#fk_summary").val()), 24 fk_date : j$("#fk_date").val(), 25 input_man : "<%=input_operatorCode%>" 26 }, 27 success:function(ret){ 28 if(ret == 1) { 29 sl_alert("保存成功!"); 30 }else{ 31 sl_alert(ret); 32 33 } 34 35 window.returnValue=true; 36 window.close(); 37 38 39 } 40 }); 41 } 42 }
修復后add_form_do.jsp中獲取數據:
1 <%@ page contentType="text/html; charset=GBK" import="java.math.*,com.enfo.intrust.intrust.vo.*,java.io.*, com.enfo.intrust.web.*,java.util.*,com.enfo.intrust.dao.*,com.enfo.intrust.intrust.*,com.enfo.intrust.tools.*,com.enfo.intrust.project.*" %> 2 <script type="text/javascript" src="<%=request.getContextPath()%>/ext2.0/ext-base.js"></script> 3 <script type="text/javascript" src="<%=request.getContextPath()%>/ext2.0/ext-all.js"></script> 4 <%@ include file="/includes/operator.inc" %> 5 <% 6 try{ 7 product_id = Utility.parseInt(Utility.trimNull(request.getParameter("product_id")),product_id); 8 9 UnpostwarrantLocal local = EJBFactory.getUnpostwarrant(); 10 11 Integer problem_id = Utility.parseInt(request.getParameter("problem_id"),new Integer(0)); 12 13 Integer depart_id = Utility.parseInt(request.getParameter("depart_id"),new Integer(0)); //部門 14 Integer productId = Utility.parseInt(Utility.trimNull(request.getParameter("productId")),product_id); 15 String fk_busi_id = Utility.trimNull(request.getParameter("fk_busi_id")); //字典1206 費用 16 String fk_type = Utility.trimNull(request.getParameter("fk_type")); //付款方式 2103 17 String fk_source = Utility.trimNull(request.getParameter("fk_source")); //付款依據 2104 18 String fk_info = Utility.trimNull(request.getParameter("fk_info")); //票據號碼 19 String fk_name = Utility.trimNull(request.getParameter("fk_name")); //付款單位 20 String fk_bank_name = Utility.trimNull(request.getParameter("fk_bank_name")); //付款銀行名稱 21 String fk_bank_acct = Utility.trimNull(request.getParameter("fk_bank_acct")); //付款銀行賬號 22 String sk_name = Utility.trimNull(request.getParameter("sk_name")); //收款單位 23 String sk_bank_name = Utility.trimNull(request.getParameter("sk_bank_name")); //收款銀行名稱 24 String sk_bank_acct = Utility.trimNull(request.getParameter("sk_bank_acct")); //收款銀行賬號 25 BigDecimal fk_money = Utility.parseDecimal(Utility.trimNull(request.getParameter("fk_money")).replaceAll(",",""),new BigDecimal(0)); //金額 26 String fk_summary = Utility.trimNull(request.getParameter("fk_summary")); //備注 27 Integer fk_date = Utility.parseInt(request.getParameter("fk_date"),new Integer(Utility.getCurrentDate())); //要求付款日期 28 29 local.setProblem_id(problem_id); 30 //local.setProduct_id(product_id); 31 local.setProduct_id(productId); 32 local.setDepart_id(depart_id); 33 local.setFk_busi_id(fk_busi_id); 34 local.setFk_type(fk_type); 35 local.setFk_source(fk_source); 36 local.setFk_info(java.net.URLDecoder.decode(fk_info, "UTF-8")); 37 local.setFk_name(java.net.URLDecoder.decode(fk_name, "UTF-8")); 38 local.setFk_bank_name(java.net.URLDecoder.decode(fk_bank_name, "UTF-8")); 39 local.setFk_bank_acct(java.net.URLDecoder.decode(fk_bank_acct, "UTF-8")); 40 local.setSk_name(java.net.URLDecoder.decode(sk_name, "UTF-8")); 41 local.setSk_bank_name(java.net.URLDecoder.decode(sk_bank_name, "UTF-8")); 42 local.setSk_bank_acct(java.net.URLDecoder.decode(sk_bank_acct, "UTF-8")); 43 local.setFk_money(fk_money); 44 local.setFk_summary(java.net.URLDecoder.decode(fk_summary, "UTF-8")); 45 local.setFk_date(fk_date); 46 local.setInput_man(input_operatorCode); 47 local.addFinacialcardInfoGuotou(); 48 out.clear(); 49 response.getWriter().write("1"); 50 }catch(Exception e){ 51 out.clear(); 52 response.getWriter().write(e.getMessage()); 53 } 54 55 %>
注意事項:
如果是接受數據不是jsp頁面,而是Java類的時候,只需要URLDecoder.decode(value, "UTF-8");來解碼,然后導入相應的包。還有傳輸時可能需要兩次編碼encodeURI(encodeURI(j$("#fk_info").val())),具體原因是我們通過request.getParameter()來獲取數據時就會進行一次解碼操作,解碼時不變。