Spring控制器返回视图和JSON数据同时

7

我正在尝试将页面请求映射到同时返回视图和JSON对象的操作。为此,我使用了Jackson JSON提供程序。

这是我的控制器方法:

@RequestMapping(method = RequestMethod.GET, value = "/reports")
public String getFiles(Model model) {
    //
    //build array list
    //
    return files;
}

这会返回我的视图(WEB-INF/jsp/reports.jsp),但是没有Jackson构建的JSON对象,所以我需要在方法上注释@ResponseBody,它将自动将JSON对象写入HTTP响应,并返回files ArrayList...

@RequestMapping(method = RequestMethod.GET, value = "/reports")
@ResponseBody
public ArrayList<String> getFiles(Model model) {
    //
    ///build array list
    //
    return files;
}

JSON对象确实被返回了,但是在一个新的视图/空白的HTML文档中。是否可能同时返回JSON对象并重定向到“reports.jsp”?


2
这没有意义。一个请求等于一个响应。你可以将JSON存储在某个属性中,并在JSP中检索该属性的值,或者您可以发送两个请求,一个用于呈现JSP,另一个用于获取JSON。 - Sotirios Delimanolis
我想要做的是,在我进入"reports.jsp"页面时建立一个JSON对象。 - Clay Banks
2个回答

5

我猜第一个例子中你实际上返回的是"reports"而不是files。如果你想要返回视图,就不能同时返回响应体 - 你只能返回一件事情。

所以你可以将它分成两个请求,或者将JSON放入模型中,在JSP中检索它,例如:

Java:

ObjectMapper mapper = new ObjectMapper();
model.addAttribute("json", mapper.writeValueAsString(files));

JSP:

<script>
   var files=${json};
</script>

谢谢@Cupawn,这回答了我的问题。我还没有深入研究ObectMapper API,但您知道它是否可以为JSON对象中的每个值定义一个默认的“键”吗?(例如,["label" : "value 1", "label" : "value 2"]) - Clay Banks
2
["label" : "value 1", "label" : "value 2"] 不是有效的 JSON - 你不能有两个同名的属性。也许你想要 [ {"label","value1"}, {"label","value2"} ]... 你应该发布一个新问题,附上你期望的输入和输出。 - CupawnTae
没错,这就是我的意思,我会追踪这个问题。再次感谢! - Clay Banks
糟糕,我在上面的评论中应该是 [ {"label":"value1"}, {"label":"value2"} ] - CupawnTae

2

你可以自己创建 JSON 对象并添加到模型中(在这种情况下返回视图),或者返回视图,然后在页面加载后调用另一个返回 AJAX 对象的函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接