Diferencia entre revisiones de «Eventos De JSR 286»

De Dos Ideas.
Saltar a: navegación, buscar
 
(No se muestran 5 ediciones intermedias de 3 usuarios)
Línea 1: Línea 1:
 +
[[Category:Portlet]]
 
La versión 2.0 de la especificación de Portlets ([[JSR 286]]) define dos mecanismos para la Intercomunicación Entre Portlets. Uno de ellos es a través de la publicación y suscripción de eventos.
 
La versión 2.0 de la especificación de Portlets ([[JSR 286]]) define dos mecanismos para la Intercomunicación Entre Portlets. Uno de ellos es a través de la publicación y suscripción de eventos.
  
Línea 6: Línea 7:
  
 
Los portles recibirán los eventos durante la fase de "Process Events" pudiendo publicar nuevos eventos. Terminada la fase de "Process Events" no se permite publicar nuevos eventos y comienza la fase de "Render".
 
Los portles recibirán los eventos durante la fase de "Process Events" pudiendo publicar nuevos eventos. Terminada la fase de "Process Events" no se permite publicar nuevos eventos y comienza la fase de "Render".
 
 
  
 
=== Configuración de eventos ===
 
=== Configuración de eventos ===
 
 
Todo lo relativo a los eventos debe configurarse en el archivo portlet.xml. Aqui se definirán tres cosas:
 
Todo lo relativo a los eventos debe configurarse en el archivo portlet.xml. Aqui se definirán tres cosas:
 
* Los eventos
 
* Los eventos
 
* Los eventos que un portlet puede publicar
 
* Los eventos que un portlet puede publicar
 
* Los eventos que un portlet va a recibir
 
* Los eventos que un portlet va a recibir
 
  
 
==== Eventos ====
 
==== Eventos ====
Línea 22: Línea 19:
 
<portlet-app>
 
<portlet-app>
  
     ....
+
     ...
  
 
     <portlet>
 
     <portlet>
         ....
+
         ...
 
     </portlet>
 
     </portlet>
  
     ....
+
     ...
  
 
     <event-definition>
 
     <event-definition>
Línea 38: Línea 35:
 
     </event-definition>
 
     </event-definition>
  
     ....
+
     ...
  
 
<portlet-app>
 
<portlet-app>
 
</code>
 
</code>
  
o de un nombre y un namespace:
+
o de un namespace y un nombre:
 
<code xml>
 
<code xml>
 +
<portlet-app>
 +
 +
    ...
 +
 +
    <portlet>
 +
        ...
 +
    </portlet>
 +
 +
    ...
 +
 
     <event-definition>
 
     <event-definition>
 
         <qname>foo:eventoX</qname>
 
         <qname>foo:eventoX</qname>
 
     </event-definition>
 
     </event-definition>
 +
 
     <event-definition>
 
     <event-definition>
 
         <qname>foo:eventoY</qname>
 
         <qname>foo:eventoY</qname>
 
     </event-definition>
 
     </event-definition>
 +
 +
    ...
 +
 +
</code>
 +
 +
==== Declaración de publicación de eventos ====
 +
Para publicar eventos la sección que define a cada portlet debe especificar que eventos puede publicar dicho portlet.
 +
 +
<code xml>
 +
<portlet-app>
 +
 +
    ...
 +
 +
    <portlet>
 +
        ...
 +
        <supported-publishing-event>
 +
            <name>eventoX</name>
 +
        </supported-publishing-event>
 +
        ...
 +
    </portlet>
 +
 +
    ...
 +
 +
</portlet-app>
 
</code>
 
</code>
  
 +
==== Suscripción a Eventos ====
  
==== Publicación de eventos ====
+
Para recibir la sección que define al portlet debe especificar a que eventos se va a suscribir dicho portlet.
 +
 
 +
<code xml>
 +
 
 +
<portlet-app>
 +
 
 +
    ...
 +
 
 +
    <portlet>
 +
        ...
 +
        <supported-processing-event>
 +
            <name>eventoX</name>
 +
        </supported-processing-event>
 +
        ...
 +
    </portlet>
 +
 
 +
    ...
 +
 
 +
</portlet-app>
 +
</code>
 +
 
 +
=== Publicación de eventos ===
 +
 
 +
==== desde un Portlet ====
 +
Para publicar un evento desde un portlet se utiliza el método setEvent de la clase ActionResposne o de la clase EventResponse. Instancias de estas clases se consiguen como parámetro del método processAction o processEvent.
 +
 
 +
Este método recibe dos parámetros, un String como identificación del evento y un Serializable como carga o payload del evento.
 +
 
 +
<code java>
 +
public class FooBarPortlet extends GenericPortlet {
 +
    ...
 +
    @ProcessAction(name = "unSubmit")
 +
    public void procesarUnSubmit(ActionRequest request, ActionResponse response) {
 +
        ...
 +
        response.setEvent("eventoX", payload);
 +
        ...
 +
    }
 +
    ...
 +
}
 +
</code>
 +
 
 +
==== con JSF desde un backing bean ====
 +
Para publicar un evento desde un backing bean de JSF es necesario conseguir primero el objeto ActionResponse correspondiente:
 +
 
 +
<code java>
 +
public class FooBarBackingBean {
 +
    ...
 +
    public void unaAccionDeJsf() {
 +
        ExternalContext externalContext =  
 +
            FacesContext.getCurrentInstance().getExternalContext();
 +
        ActionResponse response = (
 +
            ActionResponse) externalContext.getResponse();
 +
        response.setEvent("eventoX", payload);
 +
    }
 +
    ...
 +
}
 +
</code>
 +
 
 +
=== Procesamiento de eventos ===
 +
 
 +
==== desde un Portlet ====
 +
Para procesar eventos desde un portlet se puede sobreescribir el método processEvents():
 +
 
 +
<code java>
 +
public class FooPortlet extends GenericPortlet {
 +
    ...
 +
    public void processEvents(EventRequest request, EventResponse response) {
 +
        ...
 +
        Event event = request.getEvent();
 +
        if (event.getName().equals(....)) {
 +
            ...
 +
        }
 +
        ...
 +
    }
 +
    ...
 +
</code>
 +
 
 +
o lo que es preferible, utilizar las anotaciones @ProcessEvent sobre métodos que procesen el evento especificado:
 +
 
 +
<code java>
 +
public class FooPortlet extends GenericPortlet {
 +
    ...
 +
    @ProcessEvent(name = "eventoX")
 +
    public void procesarEventoX(EventRequest request, EventResponse response) {
 +
      ...
 +
    }
 +
    ...
 +
}
 +
</code>
 +
 
 +
 
 +
==== con JSF desde un backing bean ====
 +
Para procesar eventos desde un portlet con JSF es necesario extender de la clase provista por el JSF Portlet Bridge y reemplazarla en la configuración.
 +
Los métodos se procesan de la misma forma que desde un portlet común con la diferencia que se obtiene el backing bean y se le delega el procesamiento:
 +
 
 +
<code>
 +
public class FooPortlet extends FacesPortlet {
 +
    ...
 +
    @ProcessEvent(name = "eventoX")
 +
    public void procesarEventoX(EventRequest request, EventResponse response) {
 +
      obtenerBackingBean().procesarEventoX();
 +
    }
 +
    ...
 +
    public FooBean obtenerBackingBean() {
 +
        PortletSession session = request.getPortletSession();
 +
        return (FooBean) session.getAttribute("fooBean");
 +
    }
 +
    ...
 +
}
 +
</code>
  
 
== Ver también ==
 
== Ver también ==

Revisión actual del 18:23 26 ago 2009

La versión 2.0 de la especificación de Portlets (JSR 286) define dos mecanismos para la Intercomunicación Entre Portlets. Uno de ellos es a través de la publicación y suscripción de eventos.

Para implementar este mecanismo se agrega una nueva fase entra las ya existentes de "Process Action" y "Render" llamada "Process Events".

Los portlets podrán publicar eventos durante las fases de "Process Action" y "Process Events" y el portal será el encargado de recibir los eventos publicados y redistribuirlos a los portles suscriptos.

Los portles recibirán los eventos durante la fase de "Process Events" pudiendo publicar nuevos eventos. Terminada la fase de "Process Events" no se permite publicar nuevos eventos y comienza la fase de "Render".

Configuración de eventos

Todo lo relativo a los eventos debe configurarse en el archivo portlet.xml. Aqui se definirán tres cosas:

  • Los eventos
  • Los eventos que un portlet puede publicar
  • Los eventos que un portlet va a recibir

Eventos

Los eventos se definen a través de un nombre: <portlet-app>

   ...
   <portlet>
       ...
   </portlet>
   ...
   <event-definition>
       <name>eventoY</name>
   </event-definition>
   <event-definition>
       <name>eventoX</name>
   </event-definition>
   ...

<portlet-app>

o de un namespace y un nombre: <portlet-app>

   ...
   <portlet>
       ...
   </portlet>
   ...
   <event-definition>
       <qname>foo:eventoX</qname>
   </event-definition>
   <event-definition>
       <qname>foo:eventoY</qname>
   </event-definition>
   ...

Declaración de publicación de eventos

Para publicar eventos la sección que define a cada portlet debe especificar que eventos puede publicar dicho portlet.

<portlet-app>

   ...
   <portlet>
       ...
       <supported-publishing-event>
           <name>eventoX</name>
       </supported-publishing-event>
       ...
   </portlet>
   ...

</portlet-app>

Suscripción a Eventos

Para recibir la sección que define al portlet debe especificar a que eventos se va a suscribir dicho portlet.

<portlet-app>

   ...
   <portlet>
       ...
       <supported-processing-event>
           <name>eventoX</name>
       </supported-processing-event>
       ...
   </portlet>
   ...

</portlet-app>

Publicación de eventos

desde un Portlet

Para publicar un evento desde un portlet se utiliza el método setEvent de la clase ActionResposne o de la clase EventResponse. Instancias de estas clases se consiguen como parámetro del método processAction o processEvent.

Este método recibe dos parámetros, un String como identificación del evento y un Serializable como carga o payload del evento.

public class FooBarPortlet extends GenericPortlet {

   ...
   @ProcessAction(name = "unSubmit")
   public void procesarUnSubmit(ActionRequest request, ActionResponse response) {
       ...
       response.setEvent("eventoX", payload);
       ...
   }
   ...

}

con JSF desde un backing bean

Para publicar un evento desde un backing bean de JSF es necesario conseguir primero el objeto ActionResponse correspondiente:

public class FooBarBackingBean {

   ...
   public void unaAccionDeJsf() {
       ExternalContext externalContext = 
           FacesContext.getCurrentInstance().getExternalContext();
       ActionResponse response = (
           ActionResponse) externalContext.getResponse();
       response.setEvent("eventoX", payload);
   }
   ...

}

Procesamiento de eventos

desde un Portlet

Para procesar eventos desde un portlet se puede sobreescribir el método processEvents():

public class FooPortlet extends GenericPortlet {

   ...
   public void processEvents(EventRequest request, EventResponse response) {
       ...
       Event event = request.getEvent();
       if (event.getName().equals(....)) {
           ...
       }
       ...
   }
   ...

o lo que es preferible, utilizar las anotaciones @ProcessEvent sobre métodos que procesen el evento especificado:

public class FooPortlet extends GenericPortlet {

   ...
   @ProcessEvent(name = "eventoX")
   public void procesarEventoX(EventRequest request, EventResponse response) {
      ...
   }
   ...

}


con JSF desde un backing bean

Para procesar eventos desde un portlet con JSF es necesario extender de la clase provista por el JSF Portlet Bridge y reemplazarla en la configuración. Los métodos se procesan de la misma forma que desde un portlet común con la diferencia que se obtiene el backing bean y se le delega el procesamiento:

public class FooPortlet extends FacesPortlet {

   ...
   @ProcessEvent(name = "eventoX")
   public void procesarEventoX(EventRequest request, EventResponse response) {
      obtenerBackingBean().procesarEventoX();
   }
   ...
   public FooBean obtenerBackingBean() {
       PortletSession session = request.getPortletSession();
       return (FooBean) session.getAttribute("fooBean");
   }
   ...

}

Ver también