Как вернуть несколько объектов JSON из сервлета Java, используя один запрос AJAX - PullRequest
10 голосов
/ 07 мая 2011

Я создаю веб-приложение, используя jsp и servlet, отправляю ajax-запрос из jsp и хочу вернуть два объекта 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"]);

        });

// в сервлете я написал этот код

    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);

Может ли кто-нибудь мне помочь ???

Ответы [ 5 ]

20 голосов
/ 08 мая 2011

Вы должны сделать это так:

На стороне сервера:

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"]);
});

Надеюсь, это поможет.Приветствия

2 голосов
/ 07 мая 2011

Оберните их в массив JSON:

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

или, заверните их в другой объект:

{ "result1":{..}, "result2":{..} }
1 голос
/ 08 мая 2011

вам нужно будет поместить оба в одну строку json, например,

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

это поместит их в массив json

вы также можете поместить их в объект json

response.getWriter().write("{\"object1\":");
response.getWriter().write(json1);
response.getWriter().write(",\"object2\":");
response.getWriter().write(json2);
response.getWriter().write("}");
1 голос
/ 08 мая 2011

Вы можете вернуть массив JSON с обоими объектами в качестве элементов массива. Пусть ваш сервлет вернет 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 голосов
/ 22 марта 2017

@ Ответ Эдгара работает для меня.Но я думаю, что мы должны избегать формирования массива самостоятельно, поэтому я предлагаю использовать список.Коды будут выглядеть примерно так:

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 и data[1] для получения 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);
        }
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...