2011-05-07 62 views
9

我使用jsp和servlet構建web應用程序,我從jsp發送ajax請求並且我想從servlet返回兩個json對象。我試圖執行以下操作,但代碼無效。如何使用一個ajax請求從java servlet返回多個json對象

// jQuery中我寫了這個代碼

 var id = $(this).attr('id'); 

     var paramenters = {"param":id}; 

     $.getJSON("MyServlet", paramenters, function (data1,data2){ 

      $("h3#name").text(data1["name"]); 

      $("span#level").text(data1["level"]); 

      $("span#college").text(data2["college"]); 

      $("span#department").text(data2["department"]); 

     }); 

//在servlet我寫了這個代碼

String json1 = new Gson().toJson(object1); 

    String json2 = new Gson().toJson(object2); 

    response.setContentType("application/json"); 

    response.setCharacterEncoding("utf-8"); 

    response.getWriter().write(json1); 

    response.getWriter().write(json2); 

有人可以幫我嗎?

回答

19

你應該做的是這樣的:

服務器端:

String json1 = new Gson().toJson(object1); 
String json2 = new Gson().toJson(object2); 
response.setContentType("application/json"); 
response.setCharacterEncoding("utf-8"); 
String bothJson = "["+json1+","+json2+"]"; //Put both objects in an array of 2 elements 
response.getWriter().write(bothJson); 

客戶端:

$.getJSON("MyServlet", paramenters, function (data){ 
    var data1=data[0], data2=data[1]; //We get both data1 and data2 from the array 
    $("h3#name").text(data1["name"]); 
    $("span#level").text(data1["level"]); 
    $("span#college").text(data2["college"]); 
    $("span#department").text(data2["department"]); 
}); 

希望這有助於。乾杯

+0

非常感謝你 – sahar 2011-05-07 20:25:19

2

總結他們在JSON陣列:

[ {..}, {..}, {..}] 

,或者在另一個對象將它們包裝:

{ "result1":{..}, "result2":{..} } 
1

你可以返回一個JSON陣列兩個對象作爲數組的元素。有一個具有像這樣的結構你的servlet返回JSON:

[{"name": "object1"}, {"name": "object2"}] 

那麼你的JavaScript代碼可以是這樣的:

$.getJSON("MyServlet", paramenters, function (data){ 
     var data1 = data[0]; 
     var data2 = data[1]; 

     $("h3#name").text(data1["name"]); 

     $("span#level").text(data1["level"]); 

     $("span#college").text(data2["college"]); 

     $("span#department").text(data2["department"]); 

    }); 
+0

thaaaaaaaaaak你,, – sahar 2011-05-07 20:25:00

1

你將需要把兩成一個單一的JSON像這樣

response.getWriter().write("["); 
response.getWriter().write(json1); 
response.getWriter().write(","); 
response.getWriter().write(json2); 
response.getWriter().write("]"); 

字符串這使他們在一個JSON數組

你也可以p UT斯達康他們在一個JSON對象

response.getWriter().write("{\"object1\":"); 
response.getWriter().write(json1); 
response.getWriter().write(",\"object2\":"); 
response.getWriter().write(json2); 
response.getWriter().write("}"); 
0

@埃德加的答案適合我。但我認爲我們應該避免自己組成陣列,所以我建議使用一個列表。該代碼將是這樣的:

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
    ... 
    resp.setContentType("application/json"); 
    resp.setCharacterEncoding("utf-8"); 
    ArrayList<Object> obj_arr = new ArrayList<Object>(); 
    obj_arr.add(obj1); 
    obj_arr.add(obj2); 
    Gson gson = new Gson(); 
    String tmp = gson.toJson(obj_arr); 
    resp.getWriter().write(tmp); 
} 

而在前端,爲我們得到的數據,我們可以使用data[0]以檢索obj1和以檢索obj2。該代碼將是這樣的(我使用AJAX這裏):

$('#facts_form').submit(function (e) { 
    e.preventDefault(); 
    var data = new FormData(this); 
    var url = 'import'; 
    $.ajax({ 
     url: url, 
     type: "POST", 
     data: data, 
     processData: false, 
     contentType: false, 
     async: false, 
     cache: false, 
     success: function (data) {     
      for (var i = 1; i < data.length; i++){ 
       //do whatever 
      } 
     }, 
     error: function (xhr, status, error) { 
      alert(status + "\n" + error); 
     } 
    }); 
}); 
相關問題