2014-11-25 87 views
4

我想要做的是,只需將數據發佈到服務器並使用JSON從服務器獲取數據& AJAX。 我正在將遺留的非AJAX項目轉換爲AJAX。它是liferay portlet spring ibatis jquery項目。表單提交是成功的,我無法像JSON那樣從服務器檢索數據。我使用spring-mvc-jquery-autocomplete-example 示例來學習JSON的傑克遜。這很容易,甚至不需要我去思考JSON。 我只是複製粘貼兩個jar文件在我的構建路徑和註釋@ResponseBody我的方法。但仍然迴應是完整的HTML頁面。爲什麼?AJAX JSON數據檢索(Portlet + Liferay + JSON + Spring)

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" /> 

JS代碼在這裏。代碼提交表單到服務器

function doPortletAction(actionName) { 
    jQuery('form#form<portlet:namespace/> input#portletAction').val(actionName); 

    jQuery('form#form<portlet:namespace/> input#<portlet:namespace/>-posted').val('true'); 
//jQuery('form#form<portlet:namespace/>').submit(); 


jQuery.ajax({ 
    url: jQuery('#form<portlet:namespace/>').attr("action"), 
    type: 'POST', 
    datatype:'json', 
    data: jQuery('#form<portlet:namespace/>').serialize(), 
    success: onAjaxSubmitReturn 
}); 

}

控制器編碼

@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; 

} 
+0

我不是確定UiState是什麼,但它可能以默認的「text/html」內容類型來響應。你需要在你的'myAction'方法中聲明你的響應類型爲「application/json」。 – 2014-11-25 17:10:02

+1

謝謝。我可以通過使用彈簧控制器來加載JSON數據。 – Sanka 2014-12-01 06:31:09

回答

2

首先, Action階段不會產生任何輸出。它總是去Render階段。所以這段代碼無論如何都無法工作。

對於第二個,從4.1開始,doesn't support@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)); 
} 

其中serializeJSON是由您選擇的實用方法。

樣品實現以下(基於Jackson串行):

public static String serializeJSON(Object o) throws IOException { 
    return new ObjectMapper().writeValueAsString(o); 
} 

注意:你需要使用這個片段在你的JSP(S):

<portlet:resourceURL var="formAction" id="myAction"/>