2017-08-11 3 views
0

Je dois retourner une chaîne sur la méthode de succès. Voici mon code AJAX dans la page jsp.Comment retourner un objet en réponse en utilisant ajax dans le portlet liferay?

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

Et voici mon gestionnaire sur le côté backend.

@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(); 
    } 

Et en résultat, il me montre une chaîne vide dans le message d'alerte. Comment faire avec?

MISE À JOUR j'ai changé la méthode de contrôleur pour

@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(); 
} 

Et url à mon jsp est

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

Et maintenant, il me donne une exception

org.springframework. web.portlet.NoHandlerFoundException: Aucun gestionnaire trouvé pour demande de portlet: mode 'vue', la phase 'RESOURCE_PHASE', Paramètres de la carte [ 'search' -> array [ ''], 'page' -> array [ '0']]

classe contrôleur pleine

@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

Le problème avec votre code est que vous appelez 'actionURL' en utilisant AJAX, ce qui est un motif valable. –

+0

Modifiez votre 'portlet: actionURL' en' portlet: resourceURL' et '@ ActionMapping' en' @ ResourceMapping'. –

+0

Copie possible de [répondre à la requête http avec l'objet json dans le portlet] (https://stackoverflow.com/questions/17592144/respond-to-http-request-with-json-object-in-portlet) –

Répondre

2

Ce qui suit est/sont le problème (s) avec votre code mis à jour:

i. Vous n'avez pas spécifié l'attribut id (avec la valeur requise) sur portlet:resourceURL selon votre portlet:actionURL. Changez-le pour:

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

ii. La signature du procédé de mappage de la classe d'action ne soit pas identique à la valeur d'attribut id de portlet:resourceURL sur l'interface utilisateur, modifier à:

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

iii. Supprimez l'autre méthode serveResource de la classe d'action, comme pour le type de portlet Générique (par défaut) uniquement.

Référence: Liferay Spring Portlet Tutorial

+0

merci. Ça m'a aidé. Ce liferay me rend fou –

+0

@SergShapoval, De rien, codage heureux! –