Diferencia entre revisiones de «Eventos De JSR 286»
(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".
Contenido
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
- Inter Portlet Communication
- JSR 286 - Java Portlet Specification V2.0
- Portlet Con JSF
- JSF Portlet Bridge