Versiones comparadas

Clave

  • Se ha añadido esta línea.
  • Se ha eliminado esta línea.
  • El formato se ha cambiado.

...

A modo de resumen, podemos indicar que una conversación es una unidad de trabajo, compuesta por varias páginas y sus clases java asociadas, que tienen sentido bajo un contexto determinado, fuera de ese contexto el contenido cargado en memoria no tiene sentido por lo que es prescindible.

Índice de contenidos

Tabla de contenidos

Tipos de conversaciones

Pese a que hemos estado hablando de las conversaciones como si sólo fuesen de un tipo, realmente nos encontramos con dos tipos básicos:

...

El proceso de creación y destrucción de conversaciones de manera esquemática quedaría como la siguiente figura:

El Modelo de Conversación de Seam

El modelo de conversación de Seam, sigue las siguientes reglas:

...

  • Una conversación abarca pequeñas unidades de interacción de usuario, que se ejecutan en serie o concurrentemente. El anidado nested de conversaciones más pequeño, tiene su propio conjunto aislado de estados de conversación , y además tiene acceso al estado de la conversación saliente.

  • El usuario es capaz de conmutar entre varias conversaciones dentro la misma ventana del navegador. Esta característica se llama gestión del espacio de trabajo (workspace management).

Anidado (Nested) de Conversaciones

El anidado de conversaciones se crea invocando un método anotado con @Begin(nested=true) dentro del ámbito de una conversación existente. El anidado de conversaciones tiene su propio contexto de conversación, pero puede leer valores de otros contextos de conversación externos. Estos contextos son de solo lectura para el anidado de conversación, pero como los objetos se obtienen por referencia, cambios de los propios objetos pueden ser reflejados en el contexto externo.

...

Como se ha dicho anteriormente, si un componente existe en una conversación padre de una conversación actual anidada, la conversación anidada puede utilizar la misma instancia. Ocasionalmente, es útil tener diferentes instancias en cada conversación anidada, pero esto hará que la instancia que existe en la conversación padre sea invisible para sus conversaciones hijas. Se puede lograr este comportamiento, anotando a un componente con @PerNestedConversation.

Iniciar una Conversación con una solicitud GET

JSF no define ninguna acción que se pueda lanzar cuando una pagina es accedida mediante una solicitud no-faces (como por ejemplo, una solicitud HTTP GET). Esto suele ocurrir cuando se utilizan marcadores (bookmark) de pagina o si navegamos mediante un <h:outputlink/>.

...

  • Utilizar la anotación @Begin en el método anotado con @Create

  • Utilizar la anotación @Begin en el método anotado con @Factory

  • Utilizar la anotación @Begin en el método action page en el fichero pages.xml

  • Utilizar el elemento <begin-conversation> en el fichero pages.xml

  • Utilizar #{conversation.begin} en el método action page en el fichero pages.xml

Los Componentes JSF de Seam <s:link> y <s:button>

Los command link de JSF siempre realizan un sumisión mediante JavaScript, que rompe la característica “abrir en una nueva ventana” o “abrir en una nueva pestaña” del navegador web. En JSF plano, se necesita utilizar <h:outputLink> si se necesita esta funcionalidad. Pero tenemos dos limitaciones importantes:

...

Bloque de código
languagexml
themeEclipse
<s:link view="/paginas/varias_tablas/ComentarioList.xhtml"
	rendered="#{comentarioList.previousExists}"
       value="#{messages.left}#{messages.left} First Page"
          id="firstPage">
    <f:param name="firstResult" value="0"/>
</s:link>

Identificadores de Conversación Naturales o Personalizables

Cuando se trabaja con conversaciones que tratan con objetos persistentes, a veces, es deseable utilizar la clave de negocio natural del objeto, en lugar de la estándar, sustituyendo el identificador de la conversación. En estos casos podemos encontrar dos tipos de escenarios diferentes:

...

Bloque de código
languagexml
themeEclipse
<s:link value="Place Bid" action="#{bidAction.placeBid}" conversationName="PlaceBid"/>
...
<s:button value="Place Bid" action="#{bidAction.placeBid}" conversationName="PlaceBid"/>

Finalizar conversación existente e iniciar una nueva, en un mismo enlace

Cuando queremos acceder a una página destruyendo la conversación previa existente y comenzando una nueva nos encontramos con un problema. Como sabemos, si usamos la directiva <begin join=“true”…> en el fichero page.xml para comenzar una conversación de largo recorrido. Por otro lado en la página que redirige a esta nueva anotamos el método clickAndKillLastConversation, que enlaza a la página con un @End o usamos propagation=“end” en el <s:link que enlaza a la página.

...