viernes, 24 de octubre de 2014

Crear un Viewlink

Descripción: En este artículo veremos cómo se crea un ViewLink en ADF 11g.
Esta descripción es muy similar a ADF 10g, por lo que puede utilizarse como guía.

Nota: En este ejemplo vamos a  crear un viewlink que nos permita enlazar la entidad Departmentos y Empleados, para más adelante, al selecionar un departamento, se muestre automáticamente los empleados.

El viewLink es un Business Component (BC), por lo que iremos al proyecto Model, y con el menú contextual seleciconamos "New View Link".

new view link en el menu contextual del Model
selección New View Link desde Model

Una vez seleccionada esta opción del menú contextual, se nos presentará un asistente que nos llevará paso a paso a la creación del viewLink. 
En este paso, pondremos el nombre del viewLink. Recomiendo que en el sufijo del nombre se indique que este objeto es un viewLink. La razón, es que visualmente sabemos el tipo de componente del que se trata sin tener que mirar sus propiedades.




A continuación nos muestra la relación entre entidades. Seleccionamos en este caso las asociaciones (Associations) que están en nuestro proyecto, y que ya une las entidades que queremos relacionar.
Al seleccionar tanto en el Source (fuente) como en el Destination (destino), completaremos la operación pulsando el botón "Add".


seleccion source y destination en la relacion
selección de origen y destino de la relación

A continuación nos consulta si queremos crear los accesors tanto para la fuente como el destino. Dependiendo de lo que vayamos a necesitar, podemos marcarlo o dejarlo por defecto. 


crear accesors para source y destination
crear accesors para source y destination

El apartado Source Query, viene a reflejar la query que se esconde detrás del viewLink.
Aunque el viewLink, nos pueda dar la sensación de que no tenemos que preocuparnos por la consulta o consultas que se gestionan por debajo, esto no tiene que ser exactamente así.
En el caso de consultas "pesadas" o entre entidades que tienen una gran cantidad de registros, sería recomendable echarle un vistazo a esto. 

editar consulta fuente
editar consulta fuente

A continuación nos indica si queremos incluir el ViewLink dentro de un Application Module. Esto puede ser útil, aunque personalmente suelo añadir la relación editando el Application Module. 

incluir en Application Module
incluir en Application Module

Pantalla Summary o Resumen, en este paso, vemos un resumen de lo que hemos ido configurando en cada uno de los pasos vistos anteriormente. Tras pulsar "Finish" terminamos el proceso de creación del ViewLink.

vista resumen del viewlink
vista resumen del viewlink

Si queremos incluir el viewlink, o mejor dicho, la relación entre entidades en el Application Module, deberemos ir al Data Model (editar Application Module).
Podemos ver en la parte izquierda la relación entre las entidades (Entity) Departamento y Empleados a través del Viewlink.


incluir viewlink en el Application Module


Solo tendremos que seleccionar y pasar la relación a la parte derecha para que ésta ya esté disponible para su uso. 

Nota: Cada vez que incluimos algo en el Application Module, hay que tener ojo con que nos añade un número al final del nombre. Puedes mantenerlo, o quitarlo (si no existe otro objeto con el mismo nombre en el mismo Application Module).





Puedes seguir el blog por Blogger Twitter

martes, 23 de septiembre de 2014

Crear un Application Module en 11g

Descripción: En este artículo veremos cómo crear un Application Module en Oracle ADF 11g.

Nota: Si estás trabajando en Oracle ADF 10g, puedes leer el artículo .

Para crear un Application Module debemos ir al apartado Model de nuestra aplicación (Model Project),  e indicar con el menú contextual que queremos crear un Application Module.

menú contextual en el Model
menú contextual en el Model




Al hacer esto se abrirá un asistente que nos guiará paso a paso en la creación del application Module.

vista asistente creación application module
vista asistente creación application module



En este primer paso le indicaremos el nombre.
Se recomienda que el fichero tenga como parte del nombre el sufijo AppModule. Esto nos ayudará a distintinguirlo de otros ficheros en el acaso de que queramos modificarlo desde un lugar distinto al JDeveloper.
Además, ayuda a situar rápidamente el nombre que utilicemos en el futuro.

asignar nombre Application Module
asignar nombre Application Module


En el siguiente paso nos consulta sobre el Data Model. Es decir, qué views (y otros elementos, como viewlinks) va a contener.
Al hacer la selección debemos tener en cuenta de que el asistente nos va a poner un número al final del nombre de la view o del viewlink.
En algunos casos es posible quitar los números para que se utilice le nombre del componente sin más, pero en otros casos, en los cuales podamos querer más de una instancia de la view en nuestro Appmodule, no nos quedará más remedio que recurrir a los números (o añadirle algo que distinta uno de otro).
Importante: Es muy típico, confundirse cuando te colocan el número y no te has dado cuenta. Doy fe.

vista asistente incluyendo viewobjects

vista asistente corrección del nombre del viewobject


Selección de Application Modules. Se puede incluir dentro de un Application Module, otros Application Modules.
Eso se escapa un poco de este post, aunque en internet hay algunos ejemplos de usos, y que pueden explicar para qué sirve esta práctica.

inclusion otros application module
inclusión de otros Application Module


Creación de ficheros Java para gestionar operaciones del Application Module.
En ocasiones puede que nos haga falta incluir operaciones en ciertos momentos (comprobación de conexión con la base de datos, que los datos estén correctos antes de insertar, etc).
Para eso ADF nos ofrece la posibilidad de crear un fichero que nos permite incluir estas funcionalidades.

creacion clases java
creación de clases Java

Vista resumen. En esta vista veremos el resultado del proceso de creación de nuestro Application Module, las views incluidas, los ficheros que hemos creado, etc.

vista resumen application module
vsita resumen

Artículos relacionados:
- Crear un Application Module (appmodule) en 10g
- Crear un ViewObject en 11g
- Crear una Entity en 11g

miércoles, 17 de septiembre de 2014

Obtener un valor de la tabla en un bean 11g

Descripción: En este artículo veremos cómo obtener un valor de una fila (row) de una tabla (aftable) a través de un bean. Tomaremos el valor de un atributo (attribute) y lo mostraremos en pantalla.

Nota: Puedes Descargar el ejemplo para que puedas hacer pruebas.

En este ejemplo veremos cómo mostrar un valor de una fila seleccionada en un aftable.

En primer lugar tenemos que haber creado la tabla en nuestra página.
En el ejemplo arrastraremos una view a la página de diseño (design) y se cree la tabla que muestre los datos.

vista diseño aftable
vista diseño aftable



Podemos mirar en la Page Data Binding Definition (lo que en 10g se llamaba Página de definición), cómo es la estructura de datos que se carga en la página y que contiene la tabla.

vista Page data binding definition
vista page Data Binding Definition
vista codigo Page Data Binding Definition
vista código de Page Data Binding Definition


 
Nota: La utilidad de esta información es que si en algún momento no sabemos cómo se llaman los atributos (campos) de una tabla, podamos ir a consultarlo.
Esto a veces es necesario cuando los datos no se muestran correctamente, y pueden tener como origen, en que no se ha incluido los atributos necesarios.



Tomar el valor del Page Data Binding Definition en un bean


El siguiente código devuelve el valor que se encuentra en un binding.

método para recoger un valor del binding

Vamos a explicar el código parte por parte:


        BindingContext bindingContext = BindingContext.getCurrent();
        BindingContainer bindings = bindingContext.getCurrentBindingsEntry();



En esta parte del código estamos haciendo referencia al binding vigente en este momento.
Es decir, de la página actual que se esté mostrando.
Si este código se utiliza en otras páginas será el page data definition correspondiente.


DCIteratorBinding iteratorBinding = (DCIteratorBinding) bindings.get("DepartmentsViewIterator");


Se recoge con esta instrucción el iterator que se encuentra en el binding. Este iteratorBinding, corresponde con el iterator que vimos en la página de definición.
Se recoge este iteratorBinding pues es el que gobierna el aftable, y el que nos va a indicar qué dato se encuentra seleccionado en ese momento.


        if (iteratorBinding != null)
        {
            Row currentRow = iteratorBinding.getCurrentRow();
            if (currentRow != null)
            {
                resultado = (String) currentRow.getAttribute("DepartmentName");   
            }
        }

Primero se pregunta si el itertorBinding es null.
Es importante esto porque puede que el valor que contiene la variable iteratorBinding lo sea.
Algunas de las causas por las que puede ser null:
- Que se haya escrito mal el nombre del iterator.

- Que en el momento en que se llama al iterator, éste no exista.



Es muy típico encontrarse con un nullPointerException por estas causas, por lo que se recomienda hacer siempre esta comprobación.

Una vez comprobado esto con el if , lo que se hace es obtener la fila actual. 
Para ello recurrimos al método getCurrentRow().

Otra vez, volvemos s hacer la consulta de si el valor obtenido con el getCurrentRow() es null o no.
Puede ser que no hubiera ningún elemento seleccionado.


 resultado = (String) currentRow.getAttribute("DepartmentName");   

Con esta estructura, tomamos el valor (attribute), de la fila (row) actual y que hemos guardado en currentRow.

Con esto ya tendremos en el bean el valor, y podemos utilizarlo como queramos.
En este ejemplo, lo que se hizo fue mostrar en pantalla dicho valor, y para ello, se creó un método get, con el fin de poner el valor dentro de un outputText.





Al ejecutar el ejemplo, se nos muestra la tabla con los distintos campos (attributes), y al seleccionar una fila, y luego, pulsar el botón "Actualizar", aparece al lado de éste el nombre del Departamento seleccionado.

Puedes descargar el ejemplo en este enlace: Descargar Ejemplo obtener Valor tabla
La página del ejemplo es vistaDepartamentos.jspx.

Artículos relacionados:
- Crear una tabla de Datos con aftable en 11g

viernes, 12 de septiembre de 2014

Encuesta: ¿Qué versión de Oracle ADF usas?

Se ha puesto una encuesta en la página para que nos puedas indicar qué version o versiones de ADF Utilizas.

Puedes verla en la parte superior derecha.

Nos servirá para conocer un poco el uso de cada versión, y también a la hora de decidir sobre futuros contenidos.

Resultado de la encuesta:
Oracle ADF 10g : 2
Oracle ADF 11g : 11 votos
Oracle ADF 12c : 9 votos


¡Muchas gracias por participar!


jueves, 4 de septiembre de 2014

Crear una tabla de datos con AFTable en 11g

Descripción: En este artículo veremos cómo crear un listado de datos, con el componente aftable a partir de un View Existente, en 11g.

Nota: Existe otro artículo titulado "Añadir un listado" que realiza la misma operación en 10g.

La diferencia a la hora de realizar ambas operaciones en ambas versiones apenas es apreciable. Si lo sabes hacer para una versión, lo sabes hacer en en la otra.

Para poder crear una tabla de datos o un listado de datos con un afTable, de forma gráfica, es necesario haber creado antes la view, así como incluir dicha view en un Application Module.
Importante: Si no se ha incluido el ViewObject en un Application Module, no podremos realizar esto.

Si vamos al Model obsevamos que ya hemos creado la el ViewObject.
En caso de no haberlo creado puede verse el proceso en el artículo Crear un ViewObject en 11g.

vista en el model del viewobject
vista en el Model del viewobject


Para poder crear el listado de datos con un aftable, debemos ir al Data Controls (antiguo Data Control Palette en 10g), y buscar dentro del Appmodule la view que queremos utilizar.

vista viewobject en data controls
vista del viewObject en Data Controls

Seleccionamos el viewObject del cual queremos tener el listado / tabla, y lo arrastramos a la página donde queremos insertarlo (vista de diseño jspx o jsff).

Al soltar el elemento ahí, se nos muestra un menú contextual en el cual se nos pregunta sobre la forma en que queremos utilizar el componente que hemos arrastrado.

menu opciones para utilizar el viewobject
menú contextual con opciones de cómo utilizar el viewobject


Una vez seleccionado para este ejemplo el ADF Table, se nos abre una ventana en la cual:
-  Podemos decidir qué columnas del viewObject queremos mostrar,
-  el orden de dichos campos dentro de un registro o fila
-  si permitiremos seleccionar filas (una o varias a la vez)
- Si se va permitir filtrar los resultados
- Si se va a permitir ordenar por valores de los campos

opciones del aftable a crear
opciones del aftable

Al terminar este paso, podremos guardar lo que hemos hecho y ejecutar la págian para ver el resultado.

vista aftable en funcionamiento
aftable en funcionamiento




Puedes amplicar más información 
- Creating ADF Databounds tables (documentación oficial) 

Artículos relacionados en este blog: 
- Crear un ViewObject en 11g
- Crear una Entity en 11g
- Añadir una tabla (listado) (ADF 10g)
- Mostrar todos los elementos de una tabla (aftable)
- Mostrar un número diferente de elementos de una tabla (aftable)
- Colores alternados para una tabla aftable (banding)

domingo, 31 de agosto de 2014

Crear un ViewObject en 11g

Descripción: En este artículo veremos cómo crear un viewobject en Oracle ADF 11g.
Nota: Si quieres ver cómo se crea en 10g lo puedes ver el articulo Cómo crear un Viewobject en 10g

Para crear un ViewObject (y casi cualquier elemento del Model), se selecciona el elemento Model en Application Navigator, y con el menú contextual seleccionamos New ViewObject.

crear new viewobject menu contextual model
creando con el menú contextual

Al hacerlo se abre un asistente que nos permite ir paso a paso a crear el viewObject.
En este primer paso se solicita el Nombre que va a tener el viewObject, y también indicamos el Data Source (fuente de datos), de donde va a tomar los datos.

En este ejemplo que estamos viendo, vamos a seleccionar Entity.
Es decir, que tomará los datos de una Entity que hayamos definido anteriormente.

Nota Importante:
Si no se selecciona Entity, no podremos aprovechar la posibilidad de actualizar los valores en la base de datos a través de alguno de los objetos gráficos y del binding que nos ofrece ADF.
Es decir, no podremos añadir registros o modificar los valores en base de datos a través de los componentes. Con lo que perderíamos gran parte de la potencia que nos ofrece este framework y tendríamos que ir a hacerlo en base de datos a través de código en un bean.



poner nombre viewobject
poner nombre del ViewObject

En el siguiente paso, seleccionamos la Entity que queremos que se incluya en nuestra view.
Puede ser más de una, aunque sólo una podrá ser actualizada en operaciones de insert o update.


seleccion entity para viewObject
selección entity para el viewObject

Selección de los atributos del viewObject.



Configuración de los atributos. Es parecido en muchos aspectos a la página de configuración de atributos cuando se crea una Entity.


configuracion de atributos de viewobject
configuración de atributos

Consulta de la Viewobject. Este componente se guía principalmente de una consulta sql que indicará qué registros y qué campos (atributos), se quieren mostrar.
En este espacio, podremos incluir en la cláusula where las condiciones que querramos añadir, así como ordenar (order by) por un campo concreto.


consulta sql del viewobject
Consulta SQL del viewObject

Bind variables, variables de enlace, para incluir parámetros en las consultas.
Nota: En el artículo Creación de formulario: variables bind en la consulta, podrás encontrar más información sobre su funcionamiento.

bind variables
bind variables en la consulta

Generación de ficheros java asociados al nuevo objeto que estamos creando.
No es obligatoria esta generación de ficheros, a menos que queramos incluir código en situaciones muy específicas.

creacion ficheros java
creación ficheros java asociados


Inclusión en el Appmodule. Un ViewObject si queremos aprovechar todo su potencial, se asocia a un AppModule, que gestionará la conexión con la base de datos.
Si el Appmodule no está creado, y no lo tenemos claro, lo podemos asignar más adelante. 

asignar appmodule
asignar a un Appmodule

Resumen final de creación del viewobject, los atributos, las entidades incluidas y otros elementos vistos durante el proceso.

resumen viewobject
resumen del viewobject

El nuevo objeto en el Model.


martes, 26 de agosto de 2014

Crear una Entity en 11g

Descripción: En este artículo veremos cómo crear una entity en 11g.
Esta entity (entidad) se va a basar en una tabla en base de datos por lo que dicha tabla va a existir.
En nuestro ejemplo utilizaremos una tabla del schema HR.

Nota: Hay otro articulo en este Blog que explica cómo crear una entity en 10g.

Para Crear una entity, se selecciona el proyecto Model en nuestro proyecto, y en el menú contextual seleccionamos crear un Entity Object.

Al hacer esto se nos mostrará un asistente que paso a paso nos ayudará a crear la Entity.





Indicamos el Campo nombre (Name), y seleccionamos la fuente de datos (data source).
En este ejemplo vamos a utilizar el esquema HR que tenemos en la base de datos.

Junto a la indicación de la base de datos, también debemos seleccionar la tabla cuyos damos tomaremos para nuestra Entity. Seleccionamos "Departments".





El siguiente paso corresponde a los Atributos (Attributes), y vamos a seleccionar aquellos atributos que queremos que nuestra Entity contenga. En el caso de que no queramos tener alguno, disponemos de la opción "Remove".



Atribute Settings (configuración de atributos).
En este paso podremos configurar ciertas característica de cada atributo:
Indicar si es clave primaria o no (primary key), si es un campo obligatorio (mandatory), si se realizarán consultas sobre él (queryable), etc.

Estudiar todos estos atributos requiere más de un artículo, y recomiendo que se observe con calma.
Normalmente, a menos que queramos un comportamiento específico, comprobaremos que casi todos estos atributos están más o menos de acuerdo con lo que necesitamos.

Aún así, se puede echar un vistazo y comprobar que todo está como esperamos.





A continuación se nos consulta si queremos crear ficheros específicos Java. En estos ficheros se puede añadir código en operaciones concretas de la Entity.



En el siguiente paso, se nos consulta sobre el crear una View que contenga la Entity. Esta operación la podremos hacer más adelante.





Resumen final del objeto:



Podremos observar la nueva Entity Departments en nuestro proyecto.




Artículos Relacionados: 
- Crear una Entity (en 10g)

sábado, 16 de agosto de 2014

Acceder a otro bean desde un bean

Descripción: En este articulo veremos cómo acceder a otro bean, y ejecutar un método o tomar el valor de una variable. Veremos los objetos getSessionMap y getRequestMap.

En primer lugar tenemos que tener en cuenta qué tipo de bean es el que queremos acceder, si es un bean de tipo session o de tipo request.
Dependiendo de cual sea, se utilizara el objeto getSessionMap (beans de tipo sesión) o getRequestMap (beans de tipo request).

Para acceder a un valor en un bean de sesión (session bean): 

Object objeto = context.getExternalContext().getSessionMap().get("nombreDelBean");
nombreDelBean objetoBean = null;
if (objeto != null)
{
     objetoBean = (nombreDelBean) objeto;
}

A partir de aquí, podemos llamar a cualquier método público del objetoBean o acceder a cualquier variable.
Esta es otra de las razones por las que es preferible crear accesors en las propiedades del bean, para no permitir el acceso directo si no es a través de una función.

Hay que tener en cuenta de que un bean de sesión no estará activo hasta que no haya sido llamado con anterioridad. Es decir, si intentamos obtener el bean que queremos obtener, si no ha sido llamado antes, no aparecerá dentro del objeto getSessionMap() o en el caso de devolvernos un valor, obtendremos un null.
Por eso se realiza la comprobación más adelante, para evitar estas situaciones.

Para acceder a un valor que se encuentra en un bean de request (request bean)

objeto = FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get("nombreDelBean");
nombreDelBean objetoBean = null;
if (objeto != null)
{
     objetoBean = (nombreDelBean) objeto;
}

En objetoBean, dejamos una instancia del bean de tipo request que existe en la aplicación.


Artículos relacionados:
-
-
-


Pasar un valor del binding al bean

Descripción: En este artículo veremos cómo pasar un valor del binding hacia el bean.

Este tipo de operaciones se suelen utilizar para recoger un valor que se encuentra en el binding, por ejemplo un campo cuyo atribute value esté asignado al binding, así como otros componentes. Habitualmente, este valor se suele encontrar en el binding como atributeValue.

Para ello hacemos lo siguiente:

FacesContext fc = FacesContext.getCurrentInstance();
ValueBinding expr;
expr = fc.getApplication().createValueBinding("#{bindings.NombreCampo.inputValue}");
if (expr != null)
        variable =  expr.getValue(fc);


Como podemos observar la estructura es muy similar a la vista en el artículo pasar un valor del bean al binding.

Debemos tener en cuenta el tipo de la variable donde vamos a guardar el valor que estamos recogiendo. No nos va a llegar con el mismo tipo con el que está definido en el viewObject, sino que muy probablemente tendremos que hacer un cast para convertir al tipo de datos que nos interesa. 

En el caso de que no se recoja el valor del binding, habría que comprobar que hemos escrito correctamente la variable, o bien si el valor se encuentra definido como AtributeValue o con otra estructura que permita recoger el valor.

Artículos relacionados:
- Acceder a otro bean desde un bean
- Pasar valores de un bean a un binding
- Pasar un valor de un bean al procesScope

Pasar valores de un bean a un binding

Descripción: En este artículo veremos cómo pasar un valor de un bean al binding en oracle ADF 10g. 

Es bastante común encontrarse que no todo puede conseguirse con un formulario y un commit, sino que es necesario hacer operaciones en un bean antes de guardarlo.

Para pasar ese resultado de nuestras operaciones al binding, para que pueda luego ser guardado con el commit del Application Module haremos lo siguiente:

FacesContext fc = FacesContext.getCurrentInstance();
ValueBinding expr;
expr = fc.getApplication().createValueBinding("#{bindings.NombreCampo.inputValue}");
if (expr != null)
        expr.setValue(fc, valor);

La condición expr != null, viene de que podemos encontrarnos con que el valor no esté definido, o que en el momento de consultarse el bean, el binding de la página actual todavía no existe.
Esto ocurre cuando estamo llamando desde un método del bean, en un momento en el cual todavía no se ha terminado de construir la página.

Errores comunes

También debemos tener en cuenta que el nombreCampo donde queremos poner el valor en el binding, debe existir en la página de definición de la página que estamos trabajando en ese momento. Normalmente, será un elemento de tipo atributeValue, aunque puede haber otros tipos.

Puede darse el caso de que estemos reutilizando un método en un bean, que ha sido escrito pensando en una página, y ahora la estemos utilizando en otra que no contiene el mismo campo en el binding. Esto puede hacer que expr = null.

Artículos relacionados:
-
-

Pasar un valor de un bean al procesScope

Descripción: En este artículo veremos cómo pasar un valor desde un bean al processScope.
Nota: Este artículo es para Oracle ADF 10g.

El principal uso del processScope es el de poder pasar valores entre páginas.
Esta función también puede ser realizada por un bean de sesión (session bean) .

Si queremos pasar un valor a un processScope debemos seguir la siguiente estructura:

AdfFacesContext.getCurrentInstance().getProcessScope().put("Variable", valor);

En el momento de pasar el valor, hay que tener en cuenta el tipo de dato que es compatible con esta operación.

Artículos relacionados:
- Recoger el valor de un processScope en un bean
- Pasar un valor desde la pagina de diseño al ProcessScope con setActionListener
- Introducción al ProcessScope

miércoles, 13 de agosto de 2014

Recoger el valor de un processScope en un bean

Descripción: En este artículo vamos a ver cómo un valor que se encuentra en un processScope lo recoge un bean. 
Nota: Este artículo está orientado a ADF 10g.

Para recoger un valor que está en processScope, debemos tener en cuenta de que se trata de un objeto que es propio del ADF, es decir, no es algo que hemos aportado a través de una variable o de una función en nuestro código.

Utilizaremos una construcción como la siguiente:

AdfFacesContext.getCurrentInstance().getProcessScope().get("valorGuardado")

AdfFacesContext.getCurrentInstance().getProcessScope() nos lleva a tener el objeto processScope para que podamos manejarlo.

Como podemos observar por los nombres, son variables que contienen el contexto de la sesión.

En cuanto tenemos este objeto, podemos acceder a un valor concreto, dentro de ese "array asociativo". Nos basta con hacer un get con el nombre del valor que queremos recuperar para obtenerlo.

Dependiendo del tipo de variable donde vayamos a recoger el valor es posible que haya que realizar alguna conversión (operador cast).

Hay otras funciones que pueden ser de interés:
AdfFacesContext.getCurrentInstance().getProcessScope().size()
Obtiene el número de valores que hay en ese momento en el processScope.

AdfFacesContext.getCurrentInstance().getProcessScope().clear()
Borra todos los valores guardados

Consejo:
Cuando recogemos un valor guardado en un processScope, puede que tenga un valor nulo.
Recomendaría una comprobación de que dicho valor se encuentra, antes de operar con él. Es más, cada vez que se vaya a recoger un valor de un processScope habría incluir dicha comprobación.
La razón es que hay que estar muy seguro de que eso no pueda ocurrir durante la ejecución de la aplicación.



Artículos relacionados:
- Pasar un valor desde la página de diseño al processScope con setActionListener

lunes, 11 de agosto de 2014

Pasar un valor desde la pagina de diseño al ProcessScope con setActionListener

Descripción: En este artículo vamos a explicar cómo pasar un valor desde la página de diseño o vista de diseño al processScope. Para ello utilizaremos el componente setActionListener.
Nota: Este artículo está escrito para Oracle ADF 10g. La filosofía es similar para 11g, y más adelante veremos un artículo.

Para explicar este mecanismo vamos a utilizar un ejemplo en el que al pulsar un botón (commandButton) se pasará un valor al processScope, y se mostrará este valor en pantalla.

Colocamos en la página el commandButton con el que trabajaremos y le pondremos una etiqueta.
Vamos a ponerle como etiqueta: Asignar 3.

A continuación añadimos un componente setActionListener desde la paleta de componentes, como hijo del commandButton.

vista estructura de la pagina
vista estructura



se arrastra el componente desde el Component Palette
se arrastra el componente desde el Component Palette



Al arrastrarlo sobre el commandButton en la pestaña de Estructura, veremos que se nos abre una ventana de diálogo con el título "Insert SetActionListener".

datos necesarios para el setActionListener





Nos solicita dos valores:
From: Que sirve para indicar el valor de origen. Por ejemplo, si el valor proviene de una variable en un bean, de un processScope, de un valor que está en el binding, etc. También se puede colocar valores literales, por ejemplo, valores enteros, strings, etc.

To: El destino donde se guardará dicho valor. Puede ser una variable en un bean, el processScope, binding, etc. Aquí no podemos utilizar literales.

En la parte derecha tenemos unos botones con el título "Bind...", que nos abre un cuadro en el cual podemos buscar el elemento que queremos utilizar.






Buscamos el componente processScope, que estará en JSF Managed Beans / processScope.
Si no queremos buscarlo siempre podemos escribirlo directamente

#{processScope}

Hemos dicho que el processScope se puede ver como un array asociativo.
Si queremos crear una variable en el processScope basta con utilizarla directamente.
En nuestro ejemplo
#{processScope.valorGuardado}

asistente expresión del lenguaje
asistente expresión del lenguaje





Vamos a asignar un 3 al campo From, y luego en el To a la variabla valorGuardado dentro del processScope.


setActionListener campos from y to
setActionListener campos from y to


Vamos a crear otro botón que asigne un 4, y lo llamaremos Asignar 4.
Y a este botón le añadiremos un setActionListener que pasará el valor 4, a #{processScope.valorGuardado}

Con lo que cada vez que pulsemos un botón, estaremos pasando un valor.

Para este botón, he añadido el setActionListener, pulsando el botón derecho en el componente, e indicando en el menú contextual lo que queremos añadir. Tal como aparece en la siguiente imagen.

Añadiendo setActionListener desde el menú contextual
Añadiendo setActionListener desde el menú contextual






Finalmente para que podamos ver el valor que tiene actualmente processScope.valorGuardado, añadiremos un outputText que se actualizará cuando se refresque la página.
Nota: Este refresco ocurrirá porque el commandButton suele tener este efecto a menos que pongamos un partialSubmit.

Mostraremos el valor del processScope, simplemente escribiendo en el atributo value #{processScope.valorGuardado}


vista resultado
vista resultado

vista resultado
vista resultado




Conclusión:
Como hemos visto, el processScope es un mecanismo sencillo para guardar valores que queramos utilizar en otras páginas, sin tener que recurrir a un bean. De hecho en este ejemplo, no hemos tenido que utilizar código para poder guardar el valor o mostrarlo.