最近做項目要用到將多個字符串通過jq的ajax傳遞給后台的功能,剛開始是想將字符串以某個分隔符的形式拼接起來再進行傳遞,如:
$.ajax{ url:"xxxx", data:{ array: "Jason,Sean,Danny" } }
然后后台獲取參數后再分隔,這種做法有很不好,如果你需要的參數里面包含分隔符,那么通過分隔后獲取到的數據便跟你想要的有出入了,此時最好的做法就是將其放入到一個數組里面再傳遞。即可將上述代碼改為:
$.ajax{ url:"xxxx", data:{ array: ["Jason","Sean","Danny"] } }
如果單純寫成這樣,在java后台是無法取到參數的,因為jQuery需要調用jQuery.param序列化參數,
jQuery.param( obj, traditional )
默認的話,traditional為false,即jquery會深度序列化參數對象,以適應如PHP和Ruby on Rails框架, 但servelt api無法處理,我們可以通過設置traditional 為true阻止深度序列化,然后序列化結果如下:
array: ["Jason", "Sean", "Danny"] => array=Jason&array=Sean&array=Danny
這樣,我們就可以在后台通過request.getParameterValues()來獲取參數的值數組了。
那么,在后台如果想把數組傳遞給jq該怎么做呢?
方法有很多,其中比較好用的方法就是借助json來傳遞。
想要用json來傳遞,在ajax里面要設置返回的dataType類型為:
$.ajax{ url:"xxxx", dataType: "json", data:{ array: ["Jason","Sean","Danny"] } }
Java中要用到JSON必須導入以下這幾個jar包:commons-beanutils-1.8.0.jar,commons-collections-3.2.jar,commons-configuration-1.8.jar,commons-lang-2.6.jar,commons-logging-1.1.1.jar,ezmorph-1.0.6.jar和json-lib-2.4.jar。
后台可以先將數組的元素放到列表里面,在通過JSONArray的fromObject()方法轉換為JSON數組:
String[] data = req.getParameterValues("array"); ArrayList<String> list = new ArrayList<String>(); for (int i = 0; i < data.length; i++) { list.add(data[i]); System.out.println(data[i]); } //將list裝換為Json數組(JSONArray) JSONArray arry = JSONArray.fromObject(list);
在數據傳輸過程中,json是以文本,即字符串的形式傳遞的,而JS操作的是JSON對象,所以還要設置
resp.setHeader("Cache-Control", "no-cache");
resp.setContentType("text/json; charset=utf-8");
最后在通過respone的getWriter()方法將其傳給客戶端。
示例:
jsp部分:
<table> <tr> <td><input type="text" name="data" value="Jason" /></td> </tr> <tr> <td><input type="text" name="data" value="Sean" /></td> </tr> <tr> <td> <input type="text" name="data" value="Danny" /> <input type="button" value="OK" onclick="arrayData();" /> </td> </tr> </table>
js部分:
function arrayData(){ var array = $("input[name='data']"); var dataArray = new Array(); array.each(function(){ dataArray.push($(this).val()); }); //alert(dataArray); $.ajax({ type: "GET", url: "JsonServelet", dataType: "json", traditional: true, data: { array: dataArray }, success: function(data){ for ( var i = 0; i < data.length; i++) { alert(data[i]); } } }); }
Java部分:
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("UTF-8"); String[] data = req.getParameterValues("array"); ArrayList<String> list = new ArrayList<String>(); for (int i = 0; i < data.length; i++) { list.add(data[i]); System.out.println(data[i]); } //將list裝換為Json數組(JSONArray) String json = JSONArray.fromObject(list).toString(); resp.setHeader("Cache-Control", "no-cache"); resp.setContentType("text/json; charset=utf-8"); resp.getWriter().print(json); resp.getWriter().flush(); }
部分參考:http://my.oschina.net/i33/blog/119506