lunes, 28 de abril de 2014

Crear un bean en 11g

Resumen: En los artículos anteriores hemos visto cómo crear un bean en 10g, así como ver dónde se encuentra la información del bean en la aplicación (faces-config.xml).

En 11g, algunas cosas varían un poco. La filosofía es la misma, un bean no es tan solo una clase, o mejor dicho una clase Java no significa que sea un bean.

Vamos a mostrar con pasos similares al artículo anterior cómo crearlo.

Supongamos que queramos crear un bean que guardará un valor que queremos mostrar en pantalla.
Para ello, colocamos en nuestra vista de Design (diseño), un outputText, que contendrá dicho valor.

vista general jdeveloper
vista JDeveloper




Lo arrastramos desde el Component Palette hasta su lugar en la página.
Si tenemos problemas para ponerlo, podemos ayudarnos de la vista Structure, y arrastrar el componente al lugar que va a estar dentro de la página.

incluir OutputText a la pagina
incluir OutputText a la página

 

 Una vez ahí, seleccionamos el outputText, y en el atribute Value vamos a indicar que el valor que va a mostrar se encuentra en un bean. Para ello elegimos dentro de las posibles fuentes que nos ofrece el atributo "Value" Expression Builder.

expression builder
expression builder


Seleccionamos ADF Managed Bean, y como podemos ver, hay un botón que dice Create Managed Bean
.
Lo pulsamos y se abre la siguiente ventana.


create managed bean



En Bean name y Class Name, ponemos el mismo nombre.
En Package, por defecto nos aparece view, sin embargo, para separar en un package distinto y poner ahí todos los beans, se pone en su lugar "bean".

Al hacer esto, se nos muestra otra vez el Expression Builder
, para que elijamos la fuente.

expression builder nuevo bean
expression builder con el nuevo bean

Como vemos, aparece nuestro bean, y también dentro de la carpeta requestScope. Si miramos el momento de la creación del bean, tenía por defecto que era de tipo request.

Lo cerramos, para centrarnos en cómo ha quedado el proyecto al añadir el bean.
El código de este bean es el siguiente:

codigo bean
código del nuevo bean

A diferencia de post anterior, no hemos creado accessors (metodos get y set). Éstos se irán añadiendo a medida que incluyamos propiedades.

Otro lugar importante para observar es dónde se guarda la información sobre el nuevo bean.
Recordemos que en 10g, se guardaba en el fichero faces-config.xml.
En 11g, esta información se guarda en el fichero adfc-config.xml

Si te ha gustado este artículo, puedes seguir el blog por Blogger o Twitter




jueves, 17 de abril de 2014

Crear Bean 2/2

Resumen: En este artículo vamos a crear un bean, de forma correcta.
En el anterior artículo (), se creó una clase de Java, que no resultó ser un bean.
Ahora veremos los pasos para crear un bean aprovechando los asistentes que nos pone JDeveloper.

Nota: Este artículo está orientado a 10g. Si quieres ver una versión para 11g, puedes verlo en el siguiente artículo: Crear un bean en 11g.

Un bean, como habíamos dicho anteriormente, se puede utilizar para poner un valor en un componente. Así que en nuestro ejemplo haremos lo siguiente:
Desde Components Palette, arrastramos un OutputText, y una vez ahí, en el Property Inspector, seleccionamos el atributo "Bind", y ahí, el botón con los puntos suspensivos "...".

property inspector bind
vista general JDeveloper


bean binding




En Managed Bean, nos dice que no hay ninguno.
Nota: En el post anterior habíamos creado uno, y el asistente no reconoce que exista. Este es otro síntoma de que algo no se ha hecho bien.

Pulsemos "New", para crear el nuevo Bean.
seleccion request bean
selección tipo de bean



Ponemos el nombre del bean, que habíamos creado antes, para que ahora lo tome en cuenta. ejemploBean.

En Scope, se nos pregunta el ámbito que va a tener el bean. Más adelante veremos lo que significa esto, por ahora seleccionaremos request.

En el class Browser, seleccionamos beans/ejemploBean, para seleccionar la clase Java que habíamos creado anteriormente.

class browser
navegador de clases (class browser)





Una vez creado, nos vuelve al cuadro para seleccionar el property.

binding bean property
bean property



Pulsamos "New", y le damos el nombre de tituloPagina.

Una vez hecho esto tenemos lo siguiente:

bean source
Fuente Bean (source)

Podemos observar los métodos que se han creado. setTituloPagina y getTituloPagina. Esto es lo que se llaman accesors, y que sirven para poner y tomar el valor de una variable.

En este caso, nuestra variable es de tipo CoreOutputText. Este tipo corresponde al del OutputText que hemos puesto en la página. Es decir, que no estamos tratando con una String al que ponerle un título. Sino que estamos trando con el componente ADF. Es decir, que podremos cambiar el valor (value) pero también podemos cambiar el estilo, si es visible o no, con todos sus métodos, y las propiedades que podemos ver en el Property Inspector.

Por esto, un bean es muy potente, pero también es muy manual, porque tendremos que hacerlo todo nosotros.


Si vamos luego al faces-config, podemos ver cómo su contenido ha cambiado:

bean faces-config
vista faces-config.xml




Ahora aparece el bean, correctamente y podemos estar seguro de que puede ser utilizado en nuestra aplicación como tal.

Nota: En muchos errores en los que se crea un bean, y éste no es accesible, o no se encuentra, lo que hemos hecho, de mirar en el faces-config, ayuda a saber dónde está la causa. Por ejemplo, no se creó correctamente, o el nombre es distinto al que ponemos (las mayúsculas/minúsculas suelen ser la causa), etc.
Con lo que hemos hecho, sabemos un poco más de cómo funcionan las cosas por dentro.


Si te ha gustado este artículo, puedes seguir el blog por Blogger o Twitter  


lunes, 14 de abril de 2014

Crear Bean 1/2

Resumen: En este post vamos a crear un Bean. Seguiremos en primer lugar unos pasos para crear una clase Java (Java Class), y luego veremos que esta no es la manera más idónea.
Para ir al método correcto se puede acceder al artículo
Nota: Gran parte de lo que se muestra es válido tanto para 10g como para 11g. Más adelante se hará un ejemplo en 11g porque hay algunas diferencias, especialmente en el faces-config.

Un bean, es una clase Java que nos permite incluir operaciones de muchos tipos. En un Bean podemos hacer muchas de las cosas que hemos visto con objetos y funciones, que nos ofrece ADF de forma visual, de forma manual. Por eso es recomendable dejar en el bean sólo aquellas funciones que no se pueden hacer por los otros medios (por errores y por tiempo).

Forma NO recomendable (pero que hay que conocer)

Tal como hemos visto con las entidades y otros objetos del Model, se podría pensar en crear el bean de la misma manera en la pestaña de Applications Navigator.


create new java class
crear nueva Java Class




gallery seleccion Java Class
seleccion java Class


datos clase nueva
create Java Class



Ponemos el nombre (name) de la clase, en este caso: ejemploBean.
El Package, aparecía views, pero vamos a crear el package "beans", para que no se nos quede todo junto.
Lo demás lo dejamos igual.

Nota: No se marca " Generate Main Method" para crear un bean.


vista nueva clase
vista nueva clase




El JDeveloper nos muestra el nuevo bean creado en la pestaña Applications Navigator, dentro del package Beans.
En el bloque central tenemos el código que nos ha generado.

Los beans, aparte de crearse deben aparecer referenciados en la aplicación para su uso.
En 10g, aparecen dentro del fichero faces-config.xml.
Nota: en 11g, aparecen en otro fichero, ya lo veremos en otro post.

Vayamos a ver el fichero faces-config:


faces-config.xml
faces-config.xml (solo 10g)


contenido faces-config.xml
contenido faces-config.xml (solo 10g)

Como podemos comprobar, el fichero ejemploBean, no aparece en el fichero faces-config.xml.


La razón es que una clase Java NO tiene por qué ser un bean. Es decir, que en nuestro proyecto podemos tener clases Java que realizan funciones, pero que no participarán de la misma manera que puede ser un bean.
Por ejemplo, las funciones bean, pueden ser llamadas desde páginas jspx, o los valores tomados desde una página de definición, que como hemos visto, es gran parte del potencial del ADF.
La existencia de clases Java que no actúen como bean, tienen sentido por ejemplo en funciones muy especializadas: algoritmos de codificación, crear PDF's, funciones gráficas, etc. Son funciones que podrán ser llamadas desde un bean, pero no desde un jspx por ejemplo.

En el veremos más sobre la creación de beans.

Artículos relacionados
-
-
-


Puedes estar al tanto de las novedades en twitter @ADFSalvaje. o siguiendo este blog, o teniéndolo en el Navegador en tus Favoritos (Ctrl+D).

miércoles, 9 de abril de 2014

Operadores de Expression Language

Resumen: En este post veremos un ejemplo en el que algunos operadores (expression language operators) no podremos utilizarlos pues produce errores. Veremos las alternativas que existen, y un cuadro resumen de operadores que se utilizan.

Puedes descargar el ejemplo en el siguiente enlace:

En el ejemplo anterior, pudimos ver cómo se podía poner una condición con Expression Language, de manera que nos ponia un texto u otro dependiendo de un valor:

#{row.Salary.value > 5000?'Alto':'Bajo'}

Supongamos que queramos que la condición fuera al revés:

#{row.Salary.value < 5000?'Alto':'Bajo'}

error expression language fuente
error código fuente


Este marcado en rojo en el texto, nos indica que hay un error sintáctico, también las marcas en la parte derecha en rojo, nos indica las líneas afectadas.

¿Cuál es la causa de este error?
Pues que el símbolo "<" se utiliza como comienzo de etiqueta en xml, y por lo tanto, el analizador sintáctico detecta que lo que viene a continuación de dicho símbolo no es un nombre de etiqueta (tag).

Para resolverlo se utiliza otro operador equivalente. En este caso es el operador gt (greater than).

Nuestro código quedaría:

#{row.Salary.value gt 5000?'Alto':'Bajo'}

o bien

#{row.Salary.value > 5000?'Alto':'Bajo'}

resultados ejecucion
resultados ejecución

Como nota de referencia incluyo un listado de operadores:
Fuente

  • Arithmetic: +, - (binary), *, / and div, % and mod, - (unary)
  • Logical: and, &&, or, ||, not, !
  • Relational: ==, eq, !=, ne, <, lt, >, gt, <=, ge, >=, le. Comparisons can be made against other values or against Boolean, string, integer, or floating-point literals.
  • Empty: The empty operator is a prefix operation that can be used to determine whether a value is null or empty.
  • Conditional: A ? B : C. Evaluate B or C, depending on the result of the evaluation of A.
Estos operadores se irán viendo con la práctica a medida que se van necesitando. También quería mostrar que puede haber operadores alternativos y es éstos está recogidos en las distintas referencias.

Otros artículos relacionados
-
-
-

Puedes estar al tanto de las novedades en twitter @ADFSalvaje. o siguiendo este blog.
Gracias.

lunes, 7 de abril de 2014

Deshabilitar un componente (disable)

Resumen: En este artículo veremos cómo se deshabilitar un componente en ADF (disable component), a partir del atributo " Disabled", y con el uso de Expresiones del Lenguaje (Expression Language), que vimos en los artículos anteriores ( e ).
Utilizaremos un componente commandButton y su atributo Disabled.

En muchos componentes encontraremos un atributo que se llama " Disabled", y que nos permitirá habilitar o no dicho componente poniendo un "true" o un "false.
A veces, como en la vida, no todo es tan fácil, ni podemos poner "true" o "false" directamente, sino que puede depender de valores de una variable, o de otras operaciones. En este ejemplo veremos un caso de este tipo.

Para ello tomamos podemos seguir el ejemplo que teníamos anteriormente, en el que se mostraba un listado de trabajadores.

vista resultado listado
listado de trabajadores



Si vemos la ultima columna del listado superior (Salario), nos encontramos que tiene un texto que dice "Alto" o "Bajo" dependiendo de si éste es mayor o inferior a 5000.

Vamos a hacer algo similar. Vamos a añadir una columna con un botón ( CommandButton
). Éste se encontrará habilitado si es mayor de 5000 e inferior.

Nos vamos a la pestaña Structure, y seleccionamos la última columna de la tabla.
Con el menú contextual seleccionamos " insert after af:column....", y seleccionamos " column", del conjunto de componentes que nos ofrece.

insertar columna afcolumn
insertar nueva columna ( afcolumn)


Al hacerlo se nos muestra el siguiente cuadro:

asistente insert column
insert column seleccion componente


En el campo UIComponent, aparece por defecto af:outputText (texto), pero seleccionaremos el botón ( af:commandButton).

Nota: Aunque hayamos hecho esto de esta manera, siempre podemos poner un componente dentro de la tabla arrastrando el componente desde Components Palette a la columna que queramos.

Este es el resultado de la inserción:

vista nueva afcolumn
vista con la nueva columna




Observemos que nos ha puesto la columna y el CommandButton
, sin ninguna referencia a otro tipo de dato.

Seleccionemos el commandButton, desde la pestaña de Structure, y vayamos a Property Inspector para poder cambiar el atributo "Disabled".
Observemos que por defecto sólo podemos poner "true" o "false".
Si queremos que se haga una evaluación con respecto un valor, tal como habíamos visto con la etiqueta "Alto" y "Bajo" del ejemplo anterior, hacemos lo siguiente:

Una vez seleccionado el CommandButton, hacemos doble click en el Property Inspector.
Seleccionamos el atributo que queremos modificar.

property inspector commandbutton
commandbutton propery inspector



En la parte superior hay un iconito que recuerda a una base de datos:

bind to data icon
icono Bind to Data


Como vemos, al pasar por encima nos indica que queremos enlazar el valor del campo a un dato (Bind to data).
Si pinchamos en este icono, se nos muestra lo siguiente:

asistente expression language
asistente expresión



Aquí podemos poner la expresión que queramos. Podemos incluso tomar la que hemos utilizado para ejemplo de "Alto" y "Bajo", y ponerle "true" y "false".

asistente expression language
expresion del lenguaje


Ejecutamos la página para ver los resultados:

run application
ejecutamos la aplicación

vista resultados commandButton
vista de resultados con los commandButton


Como podemos observar, las filas que tienen el valor "Alto" tienen el botón habilitado.

Podemos hacer esto con otro tipo de comparaciones. Por ejemplo habilitar el botón para todos aquellos cuyo nombre sea mayor que la letra "C".

cambio de EL Expression Language
cambio de la EL (Expression Language)




resultados con nueva EL Expression Language
resultados con la nueva EL Expression Language

Como podemos observar, las expresiones del lenguaje nos dan cierta flexibilidad a la hora de hacer operaciones en componentes concretos, y que nos libera de tener que escribir una función en un bean que haga esta función.
En ocasiones, no nos podremos librar de esto, por ejemplo, cuando las operaciones son complejas, o cuando los datos vienen de sitios muy distintos, entonces en ese caso el resultado del método del bean se utiliza dentro de la Expresión del Lenguaje.
Esto ya lo veremos más adelante cuando ya veamos los beans.

Puedes descargar el ejemplo en el siguiente enlace:


Puedes estar al tanto de las novedades en twitter . o siguiendo este blog.
Gracias.

miércoles, 2 de abril de 2014

Ejemplo de Expresión del Lenguaje (Expression Language)

Resumen: En este artículo veremos un ejemplo de uso de Expresiones del lenguaje

Tras la breve presentación de las EL ( Expresion Language), vamos a hacer un pequeño ejemplo con la aplicación que utilizamos en este blog.

Puedes pulsar aquí para descargarte la aplicación.

En la página indice.jspx, mostrábamos la lista de trabajadores, así como su salario.
Vamos a añadir una EL, para que muestre un texto dependiendo del salario que reciba.
Más de 5000 pondremos el valor "Alto", y cuando el valor sea menor de este valor, mostrará "Bajo".

Para ello añadimos una EL en la columna de Salario para que muestre el valor.

expresion language en el codigo
comparación a través de EL




Ejecutamos la aplicación (o pulsamos F5, ya que es un cambio realizado en el jspx), y vemos el resultado.

Al hacerlo nos muestra el siguiente mensaje de error:

error javax.faces.el.EvaluationException
mensaje de error



Observemos el mensaje de error:

javax.faces.el.EvaluationException: com.sun.faces.el.impl.ElException: Se ha intentado forzar un valor del tipo "oracle.jbo.domain.Number" para convertirlo en el tipo "java.lang.Long"


Esto nos indica que al hacer la comparación entre el valor de la columna row.Salary y el valor, se da cuenta de que los tipos de datos son distintos.
El tipo oracle.jbo.domain.Number es el de la columna y el java.lang.Long es el del valor con el que estamos comparando (5000).

Esto es algo muy habitual cuando estamos trabajando con Expresiones del Lenguaje, y es que los tipos nos puede ocasionar problemas.
La forma de solucionarlo es hacer lo siguiente:


comparacion expresion lenguaje corregida


El tipo Number tiene un método getValue(), que devuelve el valor de tipo double con el cual podemos comparar con el valor que hemos puesto.

Podemos ver los métodos y propiedades del tipo Number (oracle.jbo.domain.Number) en el siguiente enlace:


Ojo! ¿la función se llama getValue y el valor que llamamos es "value"?
este tipo de funciones get y set, se llaman " accesors", y aunque a nivel de código (java) las llamemos con el nombre getValue(), en la expresión del lenguaje, nos referimos al nombre de la propiedad "value".
Nota: puede que ni exista la propiedad value, con que exista la función getValue correspondiente, es suficiente. Ya veremos esto más adelante.

Tras el cambio, podemos refrescar la página y ver el resultado.

vista resultado comparacion expression language


Como podemos observar en la tabla superior, ya aparece el texto en la última columna y que éste texto depende del valor del campo "Salary".

Otros artículos relacionados
-
-
-