Foros de discusión

Dialogo fra portlet

thumbnail
Alina Fabiani, modificado hace 14 años.

Dialogo fra portlet

New Member Mensajes: 5 Fecha de incorporación: 24/02/10 Mensajes recientes
Sono nuova all'esperienza liferay, e stavo cercando qualche esempio di sviluppo in cui effettuo un dialogo tra portlet, qualcuno mi può aiutare ....gliene sarò riconoscente in eterno ;-D
Simone Puviani, modificado hace 14 años.

RE: Dialogo fra portlet

New Member Mensajes: 3 Fecha de incorporación: 6/03/10 Mensajes recientes
Ciao,
Devo dire che se sei nuova di liferay, questo non è proprio uno degli argomenti più semplici da cui partire.
Comunque, per fare comunicare 2 o più portlet ci sono diversi metodi. I 2 che ti consiglio di usare sono o usare Ajax, oppure usare l'ipc. Per quanto riguarda la parte Ajax, non ho mai provato quindi non ti so dire cosa fare esattamente, mentre per quanto riguarda l'ipc puoi guardare la portlet di esempio della sun IPC SUN.
Il sistema funziona con uno scambio di messaggi.

Aggiungi nel file portlet.xml della portlet che manda il messaggio
        
        <portlet>
                ...........
		<supported-publishing-event xmlns:x="http://NAMESPACE/events">
			<qname>x:NOME_EVENTO</qname>
		</supported-publishing-event>
	</portlet>
	<event-definition xmlns:x="http://NAMESPACE/events">
		<qname>x:NOME_EVENTO</qname>
		<value-type>TIPO_DATO_CHE_VUOI_PASSARE</value-type>
	</event-definition>

Mentre nella portlet che riceve il messaggio

        <portlet>
                ...........
             	<supported-processing-event xmlns:x="http://NAMESPACE/events">
			<qname>x:NOME_EVENTO</qname>
		</supported-processing-event>
	</portlet>
	<event-definition xmlns:x="http://NAMESPACE/events">
		<qname>x:NOME_EVENTO</qname>
		<value-type>TIPO_DATO_CHE_VUOI_PASSARE</value-type>
	</event-definition>


Ovviamente se vuoi che 2 portlet ricevano il messaggio duplichi il codice nelle portlet
per quanto riguarda il namespace io metto l'indirizzo del sito, il nome serve per riconoscere il messaggio, il tipo che vuoi passare, è un qualsiasi dato java scritto con tutto il namespace. Se vuoi passare una stringa devi scrivere java.lang.String. Io ho provato e con i dati primitivi e le classi base funziona tutto senza problemi. Quando passi oggetti che contengono delle liste o cose più complesse non funziona molto bene. Per ovviare a questo problema se ne hai bisogno, puoi passarti una stringa formattata in un modo particolare.

Nel codice della portlet che invia:

import javax.xml.namespace.QName;
...
private static QName _QName = new QName("http://NAMESPACE/events", "NOME_EVENTO");
...

Generalmente si vuole fare partire il messaggio quando si commette una determinata azione, per cui nel metodo processAction aggiungi quando vuoi mandare il messaggio

response.setEvent(_QName, DATO CHE VUOI PASSARE);


Nel codice della portlet che riceve:

import javax.xml.namespace.QName;
...
private static QName _QName = new QName("http://NAMESPACE/events", "NOME_EVENTO");
...

Per far ricevere il messaggio devi fare l'override di processEvent:


    @Override
    public void processEvent(EventRequest request, EventResponse response) throws PortletException, IOException
    {
        super.processEvent(request, response);
        Event l_Event = request.getEvent();
        if(l_Event.getQName().equals(_QName))
        {
            String l_EventValue = (String)l_Event.getValue();
// Ho ricevuto il messaggio. In l_EventValue ho i dati che mi ha passato l'altra portlet. Posso fare qualcosa a questo punto
        }
    }


Fatto questo hai finito.
Questo procedimento funziona unicamente se le due portlet sono nella medesima pagina.
Il consiglio che ti do se vuoi usare questo metodo, è di passare sempre e soltanto delle classi che sono standard di java, e non usare delle classi che ti sei creata tu. Il motivo è che la classe che vuoi passare deve essere riconosciuta da entrambe le portlet. Al che, qualcuno potrebbe dire che non ci sono problemi, basta mettere il codice in entrambe le portlet. Sarebbe bello, ma purtroppo quando liferay (o chi per lui) va a caricare le classi, essendo in due portlet diverse, le riconosce come classi diverse, e quindi non funziona. Per ovviare a questo problema bisognerebbe mettere la classe con il dato da passare all'interno della cartella lib condivisa, del server web (tomcat\lib ad esempio). Per fare si che liferay si accorga della nuova libreria bisogna riavviarlo, e solitamente non è molto funzionale.
Se comunque vuoi passare delle classi sviluppate da te, ricordati che devono implementare l'interfaccia Serializable.

Dovrebbe essere tutto.
Ciao
thumbnail
Alina Fabiani, modificado hace 14 años.

RE: Dialogo fra portlet

New Member Mensajes: 5 Fecha de incorporación: 24/02/10 Mensajes recientes
Grazie ...tantissimo provo immediatamente e ti faccio sapere. ;-)
thumbnail
Luca Preziati, modificado hace 14 años.

RE: Dialogo fra portlet

Regular Member Mensajes: 120 Fecha de incorporación: 9/02/09 Mensajes recientes
Puoi utilizzare in liferay il sistema di friendlyUrl, che ti permette di invocare una portlet, passando dei parametri che poi saranno letti nella inizializzazione della portlet.
thumbnail
Nicola De Venuto, modificado hace 14 años.

RE: Dialogo fra portlet

Junior Member Mensajes: 75 Fecha de incorporación: 12/12/07 Mensajes recientes
Ciao,

I metodi esposti dai colleghi sono i piu' avanzati ed efficienti.

Aggiungo che volendo si puo' usare la Session o anche il database.
In pratia scrivi il messaggio su sessio o database, poi lanci un redirect in modo che altre porte leggano, ma essendo migliori le altre strade prima prova quelle.

Nicola De Venuto
http://www.x-gate.it
CTO