【问题标题】:how to return multiple json objects from java servlet using one ajax request如何使用一个ajax请求从java servlet返回多个json对象
【发布时间】:2011-08-20 21:16:02
【问题描述】:

我正在使用 jsp 和 servlet 构建 Web 应用程序,我从 jsp 发送 ajax 请求,我想从 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);

谁能帮帮我???

【问题讨论】:

    标签: java jquery json servlets


    【解决方案1】:

    你应该这样做:

    服务器端:

    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】:

      将它们包装在 JSON 数组中:

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

      或者,将它们包装在另一个对象中:

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

      【讨论】:

        【解决方案3】:

        您可以返回一个 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"]);
        
            });
        

        【讨论】:

          【解决方案4】:

          您将需要像这样将两者都放入一个 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("}");
          

          【讨论】:

            【解决方案5】:

            @Edgar 的回答对我有用。但我认为我们应该避免自己形成数组,所以我建议使用列表。代码将是这样的:

            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]来检索obj1data[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);
                    }
                });
            });
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-02-11
              • 2011-01-01
              • 1970-01-01
              • 2018-01-30
              • 2015-07-22
              • 2018-01-07
              • 2016-07-27
              • 2015-02-02
              相关资源
              最近更新 更多