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

时间:2013-11-26 17:20:31

标签: java json spring spring-mvc marshalling

我正在使用Spring 3.2和Spring MVC。杰克逊图书馆包含在我的设置中。

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

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

  1. 我的方法是返回四个字符串(两个包含JSON,和 在模型声音中包含文本框内容的两个?

  2. 如果上述(1)的答案为是:如何拉入两个列表     将对象作为JSON对象放入方法并将它们存储在Strings中?

4 个答案:

答案 0 :(得分:0)

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

浏览器中的文档可以根据需要向服务器发送尽可能多的(AJAX)HTTP请求。

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

如果您想使用AJAX加载另一个下拉窗口小部件,请向您的服务器发送另一个请求。

或者,为了最大限度地减少请求数量,您可以

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

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

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

答案 1 :(得分:0)

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

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

例如,

List blam1 = new ArrayList();
... populate blam1 ...
Model.addAttribute("blam1", blam1);

然后在页面上(本例中的JSP)

<c:foreach items="blam1" var="current>
Current: ${current}<br/>
</c:foreach>

答案 2 :(得分:0)

找到解决方案

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


@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";
}

虽然,我确实承认构建那些能够在第一次提供页面时能够创建的JSON的实现的替代方法作为AJAX调用(就像那些依赖于JSON的那些JSON一样)在服务页面的初始时间之后的用户输入上)到使用@ResponseBody注释的控制器方法。这种方法也有其优点。

答案 3 :(得分:0)

要获得多个输入,请使用此选项:

@RequestMapping(value = "/....", method = RequestMethod.POST, produces = "application/json")
@ResponseBody
public ResponseEntity<RestResponse> functionName(@RequestBody Model model){
    //TODO : Your task
    return response;
}