Diferencia entre revisiones de «Eventos De JSR 286»

De Dos Ideas.
Saltar a: navegación, buscar
(Página nueva: == Ver también == * Inter Portlet Communication * JSR 286 - Java Portlet Specification V2.0 * Portlet Con JSF * JSF Portlet Bridge)
 
 
(No se muestran 6 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.
 +
 +
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:
 +
<code xml>
 +
<portlet-app>
 +
 +
    ...
 +
 +
    <portlet>
 +
        ...
 +
    </portlet>
 +
 +
    ...
 +
 +
    <event-definition>
 +
        <name>eventoY</name>
 +
    </event-definition>
 +
 +
    <event-definition>
 +
        <name>eventoX</name>
 +
    </event-definition>
 +
 +
    ...
 +
 +
<portlet-app>
 +
</code>
 +
 +
o de un namespace y un nombre:
 +
<code xml>
 +
<portlet-app>
 +
 +
    ...
 +
 +
    <portlet>
 +
        ...
 +
    </portlet>
 +
 +
    ...
 +
 +
    <event-definition>
 +
        <qname>foo:eventoX</qname>
 +
    </event-definition>
 +
 +
    <event-definition>
 +
        <qname>foo:eventoY</qname>
 +
    </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>
 +
 +
==== Suscripción a 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 ==
 
* [[Inter Portlet Communication]]
 
* [[Inter Portlet Communication]]

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