2017-08-11 55 views
0

我需要在成功方法上返回一个字符串。 这是我在jsp页面中的AJAX代码。如何在liferay portlet中使用ajax返回对象?

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

<script type="application/javascript"> 
    var filterDto = { 
     page: 0, 
     tags: {}, 
     search: null 
    }; 
    $.ajax({ 
     type: "POST", 
     url: "<%=filterDocuments%>", 
     data: filterDto, 
     success: function (msg) { 
      alert(msg); 
     } 
    }); 
</script> 

这里是我在后端的处理程序。

@ActionMapping(params = "action=filterDocuments") 
    public void filterDocuments(ActionRequest actionRequest, ActionResponse actionResponse) throws IOException { 
     PrintWriter writer = PortalUtil.getHttpServletResponse(actionResponse).getWriter(); 
     writer.write("text"); 
     writer.flush(); 
     writer.close(); 
    } 

结果它显示了警告消息中的空字符串。 如何处理它?

UPDATE 我改变控制器方法

@ResourceMapping(value = "filterDocuments") 
public void filterDocuments(ActionRequest actionRequest, ActionResponse actionResponse) throws IOException { 
    PrintWriter writer = PortalUtil.getHttpServletResponse(actionResponse).getWriter(); 
    writer.write("text"); 
    writer.flush(); 
    writer.close(); 
} 

和URL在我的JSP是

<portlet:resourceURL var="ajaxResourceURL"/> 

<script type="application/javascript"> 
    var filterDto = { 
     page: 0, 
     tags: {}, 
     search: null 
    }; 
    $.ajax({ 
     type: "POST", 
     url: "<%=ajaxResourceURL%>", 
     data: filterDto, 
     success: function (msg) { 
      alert(msg); 
     } 
    }); 
</script> 

而现在它给了我一个异常

org.springframework。 web.portlet.NoHandlerFoundException:找不到处理程序门户请求:模式 '观看',相位 'RESOURCE_PHASE',参数映射[ '搜索' - >阵列[ ''], '页' - >阵列[ '0']]

全控制器类

@Controller 
@RequestMapping("VIEW") 
@Log4j 
public class SpringMVCController extends MVCPortlet { 




    @RenderMapping 
    public String view(RenderRequest request, RenderResponse response) { 


     String view = PropertiesConfig.getAsString("views", request); 

     return view; 
    } 


    @Override 
    public void serveResource(ResourceRequest resourceRequest, 
           ResourceResponse resourceResponse) 
      throws IOException, PortletException { 
     try { 
      PrintWriter writer = resourceResponse.getWriter(); 
      writer.write("text"); 
      writer.flush(); 
      writer.close(); 
      CaptchaUtil.serveImage(resourceRequest, resourceResponse); 
     } catch (Exception e) { 
      log.error(e.getMessage()); 
     } 
    } 


    @ResourceMapping(value = "action=filterDocuments") 
    public void filterDocuments(ActionRequest actionRequest, ActionResponse actionResponse) throws IOException { 
     PrintWriter writer = PortalUtil.getHttpServletResponse(actionResponse).getWriter(); 
     writer.write("text"); 
     writer.flush(); 
     writer.close(); 
    } 


} 
+0

与您的代码的问题是,你调用'使用AJAX,这不是一个有效的模式actionURL'。 –

+0

将'portlet:actionURL'改为'portlet:resourceURL'和'@ ActionMapping'改为'@ResourceMapping'。 –

+0

[在portlet中使用json对象响应http请求]的可能重复(https://stackoverflow.com/questions/17592144/respond-to-http-request-with-json-object-in-portlet) –

回答

2

与更新的代码/是问题(一个或多个)以下:

我。您尚未根据您的portlet:actionURL指定portlet:resourceURL上的id属性(具有所需的值)。将其更改为:

<portlet:resourceURL id="filterDocuments" var="filterDocuments" /> 

ii。映射方法在行动类签名不一样的UI的portlet:resourceURL id属性的值,将其更改为:

@ResourceMapping("filterDocuments") 
public void filterDocuments(ResourceRequest request, ResourceResponse response) 
throws IOException, SystemException { 
    PrintWriter writer = response.getWriter(); 
    writer.write("text"); 
    writer.flush(); 
    writer.close(); 
} 

III。从操作类中删除另一个serveResource方法,因为这仅适用于通用(默认)Portlet类型。

参考: Liferay Spring Portlet Tutorial

+0

thanx。它有帮助。这liferay让我发疯 –

+0

@SergShapoval,不客气,快乐编码! –