Archives

mars 2009
L Ma Me J V S D
« fév   avr »
 1
2345678
9101112131415
16171819202122
23242526272829
3031  

L’éphéméride Java

Le détail sur notre page éphéméride

Contributeurs

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.

  • http://dev-coffeebean.blogspot.com/ Loic

    Article très intéressant merci, j’ai fait un peu de liferay et l’intégration d’ajax était moins élégante que ça.
    Je fais un lien sur mon blog :)

  • pariviere

    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.

  • Anonyme

    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?

  • pariviere

    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 :

     

  • http://dev-coffeebean.blogspot.com/ Loic

    Article très intéressant merci, j’ai fait un peu de liferay et l’intégration d’ajax était moins élégante que ça.
    Je fais un lien sur mon blog :)

  • pariviere

    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.

  • Anonyme

    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?

  • pariviere

    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 @ResourceMapping ou la méthode FrameworkPortlet#serveResource(ResourceRequest, ResourceResponse)  qui doivent être utilisé pour implémenter le même mécanisme
     

     

blog comments powered by Disqus