Archive for mayo 2009

EL - Expression Language en ADF Faces

0

EL es un lenguaje de scripting que hace parte de la especificación de JSF con el objetivo de facilitar simplificar el acceso a los componentes de una página sin necesidad de utilizar código Java. Siendo ADF Faces un framework basdo en JSF vamos a ver en este articulo como podemos utilizar EL dentro de nuestras aplicaciones basadas en JSF.

Al ser EL un lenguaje tipo script, no requiere de compilación por lo que toda expresión es evaluada en runtime. El desarrollador puede interactuar con los atributos, metodos y propiedades de los ADF Faces Rich Components a través de expresiones. Así mismo en ADF todos los mapeos (bindigs) que se hacen al ADFm son implementados con EL.

Veamos algunos ejemplos de expresiones:

Si tenemos un inputText podemos invocar el setter de una variable apellido que esta dentro de un managed bean llamado cliente a través de EL

  1: <af:inputText id="apellido“ required="true" value="#{cliente.apellido}"/>


Ahora si queremos obtener el apellido y asignarlo a un outputText invocamos el getter



1: <af:outputText id="apellido“ value="#{cliente.apellido}"/>



Por otro lado podríamos realizar operaciones aritméticas y/o evaluar condiciones para determinar cierto comportamiento:



  1: <af:outputText value="#{backing_client.salario > 0? backing_client.salario*.12:0}"/>


JDeveloper cuenta con un Expression Builder a través del cual podemos armar expresiones de forma declarativa. El expression builder se lanza en el momento que queramos definir alguna propiedad de un componente diferente de los valores por defecto tales como true o false. Dentro del editor de codigo podemos armar expresiones con el asistente digitando #{ al definir el valor de una propiedad de un componente.



Veamos algunos ejemplos prácticos de expresiones que nos pueden ser útiles cuando trabajemos con los ADF Faces componentes:



<!--acceder al valor de los bindings de la pagina-->
<af:inputText id="text1" value="#{bindings.nombre.inputValue}/>
 
<!--Renderizar un componente basado en una codicion-->
<af:inputText id="text1" value="#{bindings.nombre.inputValue} rendered="#{binding.salario.inputValue > 0"/>
<!--variables que se definan en los scopes-->
<af:inputText id="text1" value="#{pageFlowScope.nombre}/>
<af:inputText id="text1" value="#{sessionScope.nombre}/>
<!--Este expresion evalua igual que las anteriores-->
<af:outputText value="#{requestScope['nombre']}"/>
  
<!--Acceder al contexto de seguridad via EL-->
<af:inputText id="text1" value="#{bindings.nombre.inputValue} rendered="#{securityContext.userInRole['fod-admin']}"/>
<!--Realizar alguna operacion aritmetica basado en una condicion-->
<af:outputText value="#{backing_client.salario > 0? backing_client.salario*.12:0}"/>
<!--Acceder al mapa de propiedades de un atributo del ADFm-->
#{bindings.empTable.labels}


Una de las carácteristicas especiales que descubrí recientemente es que a través de las expresiones se van a acceder a los métodos que estén definidos para el objecto. Un ejemplo de ello es el siguiente:



Quiero hacer una operación aritmética con 2 valores, uno viene desde la interfaz de usuario final digamos a traves de una variable en la sesión. El segundo valor viene de un atributo numérico que tengo en un ViewObject. El problema es que cuando hago la operación el numero que viene del ViewObject es de tipo oracle.jbo.domain.Number por lo cual si el valor que viene de la interfaz es de tipo java.lang.int o similar. La expresion no va a evaluar y va a causar un error de casting.



Ahora como a través de EL yo puedo acceder a los metodos de objecto Number para que mi expresion evalue correctamente hago



#{sessionScope.valor1 + bindings.valor2.inputValue.value}


Lo cual invoca el metodo getValue del objeto y este retorna un java.lang.double.



Para mayor información sobre EL pueden ir a los siguientes enlaces



1- API de Java para FMW: http://download.oracle.com/docs/cd/E12839_01/apirefs.1111/e10758/toc.htm



2- Unified Expression Language: http://docs.huihoo.com/java/ee/javaeetutorial5/doc/JSPIntro7.html#wp101877



Si alguno tiene más urls que quisiera compartir, lo puede hacer a través de los comentarios.


Post navigation