如何使用基于Spring MVC注释的portlet控件通过AJAX呈现JSON视图/响应?

时间:2011-04-25 22:46:34

标签: ajax json spring-mvc portlet spring-portlet-mvc

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

我正在使用Spring MVC 3.0,我只想将JSON对象从Spring MVC Controller返回给一些Javascript。目前似乎没有简单的方法来使用portlet(https://jira.springsource.org/browse/SPR-7344)进行此操作。我见过的解决方案建议创建另一个提供JSON响应的DispatcherServlet,但我还没有找到一个记录良好的例子。如果有人知道一个很好的方法来完成这个(最好带注释),请告诉我们!

5 个答案:

答案 0 :(得分: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将我的地图转换为JSON对象,然后返回该对象的toString()。 @ResourceMapping的值应该与resourceURL的id匹配。使用eval将JSON字符串转换为Javascript会带来安全风险,但我只是将其包括在内,因为它是最简单的示例。如果您担心安全性,请使用JSON解析器。

答案 1 :(得分:3)

答案 2 :(得分:2)

我能够通过两个简单的修改使它在Spring 3.0.5中运行:

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

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

如果有人参与,我可以发布java代码

答案 3 :(得分:0)

阐述@alex答案:

    @ResourceMapping(value = "showJson")
    public ModelAndView showJson(ResourceRequest request) {
    ModelAndView mav = new ModelAndView(new 
                                   MappingJacksonJsonView());
    mav.addObject("key", myBeanToBeSerializedAsJson);
    return mav;
    }

答案 4 :(得分:-1)

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

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

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