lunes, 9 de julio de 2007

Entender las conversaciones: iniciar una conversación

Los contextos en Seam facillitan al desarrollador controlar (inicialización, finalización recursos implicados) el ciclo de vida de la información(componentes) implicada en la realización de una tarea.
Los contextos tradicionales eran los de aplication, session y request. JBoss-Seam principalmente introduce el contexto de conversation para representar el concepto de task(tarea que realiza el usuario [reserva hotel, edición registro ...]).
Hay que distinguir entre conversation y long running conversation, únicamente la 2ª mantiene el estado entre diferentes peticiones a lo largo de la realización de la tarea (task).

De la misma forma que utilizamos el contexto de session o aplicacion sin tener que crearlo, el contexto de conversation existe sin necesidad de crearlo, lo único que como desarrolladores debe preocuparnos es la inyección en dicho contexto de los componentes que nos interesen. Al anotar un componente como @Conversation y anotar un metodo con la etiqueta @Begin, lo único que estamos haciendo es enviar a dicho contexto el componente y su estado correspondiente.


Es decir: Una conversación NO ES un componente:
@Scope(ScopeType.CONVERSATION)
@Name("carrito")
public class carritoCompra{}

Por ello es fundamental entender la forma en como iniciamos una conversación en Seam.
en el ejemplo de seam-booking se realiza de la siguiente forma:
desde la pagina main.seam llamamos al componente de tipo @Conversation y su metodo hotelBooking.selectHotel(hot) anotado con la etiqueta @Begin, dejando al pages.xml el control de la navegación entre páginas (es decir en caso de estar registrado reenvía al usuario a la pagina hotel.seam)


<page view-id="/main.xhtml"
login-required="true">
<navigation from-action="#{hotelBooking.selectHotel(hot)}">
<redirect view-id="/hotel.xhtml"/>
</navigation>
<navigation from-action="#{bookingList.cancel}">
<redirect/>
</navigation>
</page>







Por otro lado podemos examinar el ejemplo de seam-issues para apreciar que el componente que inicia las conversaciones no tiene porque mantener su estado, que se anota con Stateless (sin estado), siendo los componentes implicados en la conversación y Stateful (con estado) los que mantienen el estado de la conversación:


@Stateless
@Name("projectSelector")
public class ProjectSelectorBean implements ProjectSelector {

@In
private transient Map messages;

@Logger
private Log log;


@In(create=true)
private transient ProjectEditor projectEditor;


@In(create=true)
private transient ProjectFinder projectFinder;

@Begin()
public String select() {
projectEditor.setInstance( projectFinder.getSelection() );
return "editProject";
}
}



@Name("projectEditor")
@Stateful
public class ProjectEditorBean implements ProjectEditor {
...
public void setInstance(Project instance) {
isNew = false;
this.project = instance;
}

...

}


No hay comentarios: