5

我花了过去六个小时在谷歌和 stackoverflow 上搜索这个问题的答案。我最初是一名 PHP 开发人员,所以请耐心等待 - 从 PHP 控制器返回 JSON 数组是微不足道的。

我正在使用 Spring MVC 3.0,我只是想从我的 Spring MVC 控制器将一个 JSON 对象返回给一些 Javascript。目前似乎没有简单的方法可以使用 portlet (https://jira.springsource.org/browse/SPR-7344) 做到这一点。我见过的解决方案建议创建另一个提供 JSON 响应的 DispatcherServlet,但我还没有找到一个有据可查的例子。如果有人知道实现此目的的好方法(最好带有注释),请告诉!

4

5 回答 5

6

我最终找到了一种从 Spring MVC portlet 控制器返回“JSON”的解决方法。这就是我的做法。

在我的控制器中:

@ResourceMapping("ajaxTest")
public void ajaxHandler(ResourceRequest request, ResourceResponse response)
        throws IOException {
    OutputStream outStream = response.getPortletOutputStream();
    StringBuffer buffer = new StringBuffer();

    Map<String, String> testMap = new HashMap<String, String>();
    testMap.put("foo", "bar");

    String test = new JSONObject(testMap).toString();
    buffer.append(test);

    outStream.write(buffer.toString().getBytes());
}

在“view.jsp”中:

<portlet:resourceURL var="ajaxtest" id="ajaxTest"/>

<script type="text/javascript">
  $.get('<%= ajaxtest %>', function(response) {
    var json = eval('(' + response + ')');
  });
</script>

由于@ResourceMapping注解目前不支持返回JSON,所以我只是使用org.json.JSONObject将我的map转换为JSON对象,然后返回这个对象的toString()。@ResourceMapping 的值应该与 resourceURL 的 id 匹配。使用 eval 将 JSON 字符串转换为 Javascript 会带来安全风险,但我只是将其包含在内,因为它是最简单的示例。如果您担心安全性,请使用 JSON 解析器。

于 2011-04-27T19:02:19.997 回答
3

http://blog.springsource.com/2010/01/25/ajax-simplifications-in-spring-3-0/目前不适用于 portlet。见:https ://jira.springsource.org/browse/SPR-7344

于 2011-12-17T22:35:56.603 回答
2

通过两个简单的修改,我能够使其在 Spring 3.0.5 中工作:

  • 实现自定义 WebArgumentResolver 以从 ResourceRequest 正文中解析 JSON 中的对象
  • 从我的控制器方法返回 MappingJacksonJsonView。

仅在 Spring 3.1 中可用 - 您可能希望在 MappingJacksonJsonView 中使用 setExtractValueFromSingleKeyModel

如果有人感兴趣,我可以发布java代码

于 2011-12-23T13:43:03.157 回答
0

详细说明@alex 答案:

    @ResourceMapping(value = "showJson")
    public ModelAndView showJson(ResourceRequest request) {
    ModelAndView mav = new ModelAndView(new 
                                   MappingJacksonJsonView());
    mav.addObject("key", myBeanToBeSerializedAsJson);
    return mav;
    }
于 2017-07-18T15:56:03.157 回答
-1

从 Spring 3 开始,如果使用 ajax get/post 应用程序类型为 json(即 jQuery 中的 .getJSON 和 .postJSON),控制器将自动转换为 json。此功能在 Spring MVC 的 servlet 和 portlet 变体之间是相同的。

这是一篇解释它的博客文章。

http://blog.springsource.com/2010/01/25/ajax-simplifications-in-spring-3-0/

于 2011-07-18T21:01:46.917 回答