Java SpringMVC:如何在单控制器方法中返回多个JSON以及其他属性?

Java SpringMVC:如何在单控制器方法中返回多个JSON以及其他属性?,java,json,spring,spring-mvc,marshalling,Java,Json,Spring,Spring Mvc,Marshalling,我正在使用Spring3.2和SpringMVC。Jackson库包含在我的设置中 我有一个页面,在初始加载时,需要为Dojo下拉框填充两个数据源(数据源是JSON格式的字符串)和两个文本框。我假设可以在返回之前将这些字符串作为四个字符串添加到模型中 我找到了很多示例,其中带有@ResponseBody注释的方法的控制器在响应AJAX请求时返回一个JSON,但我找不到任何关于如何处理上述情况的示例(这不是对AJAX请求的响应,包括多个JSON以及简单字符串) 是我返回四个字符串(两个包含JSON

我正在使用Spring3.2和SpringMVC。Jackson库包含在我的设置中

我有一个页面,在初始加载时,需要为Dojo下拉框填充两个数据源(数据源是JSON格式的字符串)和两个文本框。我假设可以在返回之前将这些字符串作为四个字符串添加到模型中

我找到了很多示例,其中带有@ResponseBody注释的方法的控制器在响应AJAX请求时返回一个JSON,但我找不到任何关于如何处理上述情况的示例(这不是对AJAX请求的响应,包括多个JSON以及简单字符串)

  • 是我返回四个字符串(两个包含JSON,和 两个(包含文本框内容)在模型声音中

  • 如果以上(1)的答案是肯定的:如何拉入两个列表 对象作为JSON存储到方法中,并将它们存储在字符串中

  • AJAX是客户端,springmvc是服务器。它们是不同的进程,通常在不同的机器上运行

    浏览器中的文档可以向服务器发出任意数量的(AJAX)HTTP请求

    因此,如果要使用AJAX加载下拉小部件,请向服务器发出请求以获取数据

    如果要使用AJAX加载另一个下拉小部件,请向服务器发出另一个请求

    或者,为了减少请求数量,您可以

    a) 在第一个响应中将数据作为常规HTML加载,而不要使用AJAX

    b) 在不同的控制器操作中组合响应,如:

    {
      dropDown1Data:[...],
      dropDown2Data:[...],
      textBox1Data:[...], ...
    }
    

    在您的问题中,您提到了初始加载时的。您不需要在初始加载时向页面发送json。JSON用于AJAX请求

    要在初始加载时填充控件,只需将对象放入模型并在页面上引用它们

    比如说,

    List blam1 = new ArrayList();
    ... populate blam1 ...
    Model.addAttribute("blam1", blam1);
    
    然后在页面上(本例中为JSP)

    找到了解决方案
    我找到了问题第二部分(#2)的答案。它源于Jackson的
    ObjectMapper
    的基本用法,即将
    列表
    对象序列化为包含JSON符号的
    字符串


    @RequestMapping()
    受保护的字符串初始化页(模型){
    List states=stateService.getStates();
    List towns=townService.getTowns();
    ObjectMapper objMapper=新的ObjectMapper();
    String statesJson=objMapper.writeValueAsString(states);//尝试|为清晰起见,已删除catch
    字符串townsJson=objMapper.writeValueAsString(towns);
    addAttribute(“statesJson”,statesJson);
    model.addAttribute(“townsJson”,townsJson);
    返回“stateTownQueryPage”;
    }
    


    尽管如此,我还是承认另一种方法,即构建能够在第一次将页面作为AJAX调用使用时创建的JSON的具体化(就像您在第一次提供页面之后依赖于用户输入的JSON一样)到使用
    @ResponseBody
    注释的控制器方法。这种方法也有其优点。

    要获得多个输入,请使用以下方法:

    @RequestMapping(value = "/....", method = RequestMethod.POST, produces = "application/json")
    @ResponseBody
    public ResponseEntity<RestResponse> functionName(@RequestBody Model model){
        //TODO : Your task
        return response;
    } 
    
    @RequestMapping(value=“/…”,method=RequestMethod.POST,products=“application/json”)
    @应答器
    公共响应属性函数名(@RequestBody Model){
    //TODO:你的任务
    返回响应;
    } 
    
    此语句:需要填充两个JSON,没有意义。这些是文本字段、输入还是其他内容?对短语进行了修订,使其更具描述性。我是说两个JSON格式的数据源字符串。。。由Dojo在前端用于填充两个下拉框。根据进一步的研究对问题进行了修订。问题在于如何在两个对象上执行@ResponseBody所做的等效操作(技术上是MappingJackson2HttpMessageConverter的ObjectMapper),并将它们作为字符串存储在模型中。
    @RequestMapping()
    protected String initPage(Model model) {
    
        List<StateDropDownEntry> states = stateService.getStates();
        List<TownDropDownEntry> towns = townService.getTowns();
    
        ObjectMapper objMapper = new ObjectMapper();
        String statesJson = objMapper.writeValueAsString(states); // try|catch removed for clarity
        String townsJson = objMapper.writeValueAsString(towns);  
    
        model.addAttribute("statesJson",statesJson);
        model.addAttribute("townsJson",townsJson);
    
        return "stateTownQueryPage";
    }
    
    @RequestMapping(value = "/....", method = RequestMethod.POST, produces = "application/json")
    @ResponseBody
    public ResponseEntity<RestResponse> functionName(@RequestBody Model model){
        //TODO : Your task
        return response;
    }