Communication entre portlets
Bonjour,
Je suis débutante dans le developpement de portlets sous LifeRay 4.3.2 et j'aimerais parvenir à faire communiquer 2 portlets entre elles.
J'aimerais par exemple que le texte saisi dans un champ texte de la 1ère portlet s'affiche dans la seconde.
Après de nombreuses recherche, j'ai constaté qu'il était sans doute possible d'utiliser les tags renderURL et actionURL. Cela dit, je ne trouve pas de toturial et je ne parviens pas à mettre en place cette communication.
Quelqu'un pourrait-il m'aider ?
Merci.
Communication inter-portlets
Bonjour,
Je ne connais pas liferay mais je sais qu'un portail respectant la norme
JSR286 permet de faire ce genre de communications via des évènements.
Reste à savoir si liferay implémente ce genre de mécanisme au sein de son
portlet container. Si tel est le cas, la méthode décrite ci-dessous devrait fonctionner, peut être avec une légère adaptation des tags du fichier
portlet.xml.
La méthode décrite ci-dessous peut paraître lourde mais elle permet de passer
des objets java d'une portlet à une autre.
Le principe est le suivant pour communiquer de la portlet A vers la portlet B:
1) Définir une classe permettant de transporter l'information:
C'est un exemple on peut mettre ici ce que l'on veut.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| import java.lang.String;
import java.io.Serializable;
import java.util.*;
public class MyEvent implements Serializable {
private ArrayList<String> addresses = new ArrayList<String>();
public void addAddr(String addr) {
if (addresses == null)
{
addresses = new ArrayList<String>();
}
addresses.add(addr);
}
public String getAddr(int i) {
if (i >= addresses.size()) return null;
else return addresses.get(i);
}
static final long serialVersionUID = 1; |
2) Dans le processAction() de la portlet A, on génère l'évènement:
Code:
1 2
| MyEvent addr = new MyEvent();
addr.addAddr("voila mon texte"); |
3) Définir comme variable membre de la classe B:
4) Gérer la réception de l'évènement dans la portlet B:
Code:
1 2 3 4 5
| public void processEvent(EventRequest req, EventResponse resp)
throws PortletException, IOException {
System.out.println("Evenement reçu !!!!!!!!!!!!!");
_event = (MyEvent) req.getEvent().getValue();
} |
Ce qui est caché ici, c'est le rôle du PortletContainer: c'est lui qui sait quelle portlet peut recevoir un type d'évènement donné (ici B peut recevoir MyEvent), et c'est lui qui redirige l'évènement de la portlet A vers la portlet B.
Pour cela il faut l'aider à en savoir plus:
5) Dans le fichier de config portlet.xml, ajouter les blocs suivants:
a) Juste avant le tag </portlet-app>:
Code:
1 2 3 4
| <event-definition>
<name>MyEvent</name>
<value-type>chezmoi.MyEvent</value-type>
</event-definition> |
b) Sur la portlet A:
Code:
<supported-processing-event>MyEvent</supported-processing-event>
c) Sur la portlet B:
Code:
<supported-processing-event>MyEvent</supported-processing-event>
Ca marche je l'ai testé avec exoPortletContainer et exoWebOS.
Attention les licences ne sont pas les mêmes entre liferay et exo...:cry:
Remplissage des pages JSP
Bonjour,
Dans les pages JSP on met la partie IHM de la portlet.
Ce peut donc être un mix de plusieurs technos: JSP, HTML, JAVASCRIPT, ...
le tout agrémenté par les taglibs.
L'idée est de générer une IHM qui contient suffisamment d'informations (eventuellement cachées) pour recontacter le serveur, de préférence de manière asynchrone: via de l'AJAX.
ServeResource permet de demander une ressource et pas la page HTML complète au serveur.
Exemple: http://www.liferay.com/web/guest/com...message/937530
Et google: liferay serveresource AJAX inurl:pdf
le premier lien est un document PDF qui évangelise liferay mais néanmoins fournit certaines informations intéressantes.