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.
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:
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:
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>:
1 2 3 4
| <event-definition>
<name>MyEvent</name>
<value-type>chezmoi.MyEvent</value-type>
</event-definition> |
b) Sur la portlet A:
<supported-processing-event>MyEvent</supported-processing-event>
c) Sur la portlet B:
<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...
Partager