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


问题内容

在过去的六个小时中,我一直在搜寻Google和stackoverflow以获取该问题的答案。我本来是PHP开发人员,所以请耐心等待-
从PHP控制器返回JSON数组很简单。

我使用的是Spring MVC 3.0,我只想从我的Spring
MVC控制器将JSON对象返回到某些Javascript。似乎目前没有使用Portlet(https://jira.springsource.org/browse/SPR-7344)进行此操作的简便方法。我见过的解决方案建议创建另一个提供JSON响应的DispatcherServlet,但是我还没有找到一个有据可查的示例。如果有人知道完成此操作的好方法(最好带有批注),请务必告知!


问题答案:

我最终找到了一种解决方法,可以从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解析器。