JSR 286 et AJAX

 Si la JSR 286 a ouvert la voie à l’introduction des mécanismes AJAX au sein des portlets via les ResourceURL, il existe finalement assez peu d’exemples disponibles à ce sujet sur le Web.

Cela s’explique essentiellement par la facilité de mise en oeuvre de cette solution. Preuve en est, ce petit exemple, vraiment pas bien méchant, qui mets à jour une date, après un appel serveur. Bien entendu, il est interdit de recharger entièrement la page du portail. Le développement est effectué à partir du template de portlet fournit par le Liferay Plugin SDK 5.2.2.

On commence par la partie la plus facile, l’implémentation de GenericPortlet :

 
@Override
public void serveResource(ResourceRequest request, ResourceResponse response)
   throws PortletException, IOException {
   Date date = new Date();
   request.setAttribute("now", date);

   include(viewJSP, request, response);
}

@Override
public void doView(RenderRequest renderRequest, RenderResponse renderResponse)
   throws IOException, PortletException {

   renderRequest.setAttribute("now", "No yet set");
   include(viewJSP, renderRequest, renderResponse);
}

L’implémentation reste donc simplifiée à l’extrême :

  • la phase render – méthode doView  -, ajoute un attribut now dont la valeur est un message.
  • la phase resource – méthode serverResource  -, initialise ce même attribut à la date courante du serveur.

Ici, Quick & Dirty de rigueur, je demande le parsing complet de la ma JSP au niveau des 2 phases. C’est JQuery qui s’occupera d’injecter tout ce contenu dynamquement au niveau de l’arbre DOM de notre vue.

Il ne reste plus que notre fichier JSP, référencée par la variable viewJSP au niveau du code précédent. Ici également, rien d’exceptionnel…

<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %>

<portlet:defineObjects />

<div id="toBeUpdate">
   <p>Click on refresh to update the date via AJAX</p>
   <portlet:resourceURL var="resourceUrl"></portlet:resourceURL>
   Date = ${now} | <button onclick="refresh()">Refresh</a>
</div>

<script language="JavaScript">
   function refresh() {
   var url = '${resourceUrl}';
   jQuery('#toBeUpdate').load(url);
   return false;
}
</script language>

JQuery mettra à jour le contenu lors du click utilisateur.

Avant Après

Avant click

Après click

 

Ensuite? Vous pouvez fermer votre navigateur et reprendre une activité normale.

Tweet about this on TwitterShare on FacebookGoogle+Share on LinkedIn

4 réflexions au sujet de « JSR 286 et AJAX »

    1. Avant la JSR 286, Liferay proposait un mécanisme similaire via l'utilisation du mode EXCLUSIVE de portlets. C'est un mode spécifique à Liferay qui, d'un point de vue fonctionnel, est quasi identique à la phase serveResouce de la JSR 286. Et coder au dessus de ce mode spécifique, c'était s'assurer finalement une transition en douceur.

      1. Bonjour,

        J'ai essayé de suivre votre exemple mais je n'ai jamais utilisé GenericPortlet. A quoi correspond la méthode include? Peut-on utiliser un ModelAndView comme lorsqu'on étends un AbstractController?

        1. La méthode include permet de rendre la page JSP qui nous concerne.

          ModelAndView c'est du Spring MVC et à ce titre la manière de faire de l'AJAX est essentiellement dépendente des possibilités du framework. D'ailleurs à ce titre :

          Spring MVC 2 : on doit obligatoirement passer par le mode exclusive de Liferay

          Spring MVC 3 : supporte directement la JSR 286. Dans le cas particulier de l'article, c'est l'annotation <a target="_blank" href="http://static.springsource.org/spring/docs/3.0.x/javadoc-api/index.html?org/springframework/web/portlet/bind/annotation/ResourceMapping.html">@ResourceMapping ou la méthode <a target="_blank" href="http://static.springsource.org/spring/docs/3.0.x/javadoc-api/index.html?org/springframework/web/portlet/FrameworkPortlet.html">FrameworkPortlet#serveResource(ResourceRequest, ResourceResponse)  qui doivent être utilisé pour implémenter le même mécanisme

           

           

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *


*