Java AJAX JSON数据检索(Portlet+;Liferay+;JSON+;Spring)

Java AJAX JSON数据检索(Portlet+;Liferay+;JSON+;Spring),java,ajax,spring,liferay,portlet,Java,Ajax,Spring,Liferay,Portlet,我想做的是,只需将数据发布到服务器,并使用JSON和AJAX从服务器获取数据。 我正在将遗留的非AJAX项目转换为AJAX。这是一个liferay portlet spring ibatis jquery项目。表单提交成功,我无法从服务器检索JSON格式的数据。我曾经 学习jackson for JSON的示例。这很容易,甚至不需要我去想JSON。 我只是在构建路径中复制粘贴两个jar文件,并将@ResponseBy注释到我的方法中。但响应仍然是完整的html页面。为什么? 这里是JSP代码

我想做的是,只需将数据发布到服务器,并使用JSON和AJAX从服务器获取数据。 我正在将遗留的非AJAX项目转换为AJAX。这是一个liferay portlet spring ibatis jquery项目。表单提交成功,我无法从服务器检索JSON格式的数据。我曾经 学习jackson for JSON的示例。这很容易,甚至不需要我去想JSON。 我只是在构建路径中复制粘贴两个jar文件,并将@ResponseBy注释到我的方法中。但响应仍然是完整的html页面。为什么?

这里是JSP代码

   <portlet:actionURL var="formAction">
        <portlet:param name="action" value="submit"/>
    </portlet:actionURL>


    <c:set var="formPortletNamespace">form<portlet:namespace/></c:set>

    <form:form method="post" action="${formAction}" commandName="uiState" id="${formPortletNamespace}" cssClass="travelInsurancePortletForm jqCustomStyle" autocomplete="off">
        <% /* Selected action as a parameter */ %>
        <input type="hidden" name="portletAction" id="portletAction"/>

        <form:hidden path="quote.quotingWebApp" />

首先,
操作
阶段不会产生任何输出。它总是进入
渲染
阶段。所以这个代码无论如何都不起作用

第二,从Spring的
4.1
it
@ResponseBody
开始,Portlet还没有。它正在
4.2
中规划,但可能也不在那里

因此,您需要使用
@RenderMapping
@ResourceMapping
(仅限JSR-286/Portlet 2.0)

最自然的方法是使用
@ResourceMapping
。代码如下所示:

@ResourceMapping("myAction")
public void myAction(
        PortletSession session,
        ResourceResponse response,
        @RequestParam(value="endDate", required=false) Date endDate,
        @ModelAttribute("uiState") UiState requestUiState,
        BindingResult errors,
        ModelMap mm) throws Exception {

    UiState uiState = new UiState ();

    //TODO extra logic

    //explicitly set JSON as response type
    response.setContentType("application/json");

    //write JSON into output
    response.getWriter().write(serializeJSON(uiState));
}
其中,
json
是您选择的实用方法

示例实现如下(基于序列化程序):

注意:您需要在JSP上使用此代码段:



我不确定UiState是什么,但它可能会以默认的“text/html”内容类型进行响应。您需要在
myAction
方法中将响应类型声明为“application/json”。谢谢。我可以使用从spring控制器加载json数据。
@Controller
@RequestMapping("VIEW")
public class MyController{

    @ActionMapping(params="portletAction=myAction")
    public @ResponseBody UiState myAction( 
            PortletSession session, 
            ActionResponse response, 
            @RequestParam(value="endDate", required=false) Date endDate,
            @ModelAttribute("uiState") UiState requestUiState,
            BindingResult errors,
            ModelMap mm) throws Exception {

    UiState uiState=new UiState ();
        return uiState;

}
@ResourceMapping("myAction")
public void myAction(
        PortletSession session,
        ResourceResponse response,
        @RequestParam(value="endDate", required=false) Date endDate,
        @ModelAttribute("uiState") UiState requestUiState,
        BindingResult errors,
        ModelMap mm) throws Exception {

    UiState uiState = new UiState ();

    //TODO extra logic

    //explicitly set JSON as response type
    response.setContentType("application/json");

    //write JSON into output
    response.getWriter().write(serializeJSON(uiState));
}
public static String serializeJSON(Object o) throws IOException {
    return new ObjectMapper().writeValueAsString(o);
}
<portlet:resourceURL var="formAction" id="myAction"/>