Manejando Beans

Expresiones EL

A lo largo de este capítulo haremos referencia a las expresiones EL, que permiten acceder a distintas propiedades de los “Beans” en tiempo de ejecución. Es recomendable repasar lo que comentamos en el artículo sobre SpEL, ya que se puede aplicar a lo que veremos aquí.

El uso de expresiones EL nos permitirá modificar el comportamiento de los componentes en tiempo de ejecución. Por ejemplo, una operación típica que podríamos realizar es la siguiente:

Donde “esPersonaFisica” devuelve un valor booleano.

Por otro lado existen valores a los que se puede acceder de manera implícita a través de expresiones EL, como son: “application”, “cookie”, “facesContext”, “param”, “request”, “session”, etc. Por ejemplo, para acceder a un parámetro del request, podríamos hacer “#{param[‘num’]}” o simplemente “#{param.num}”, o del mismo modo expresiones anidadas como “#{param[cookie.usuario]}”.

Recordar, que como ya vimos en la introducción a jsf, también se pueden invocar a métodos del Managed Bean, como en el siguiente ejemplo, en el que se invoca a un método que envía un correo electrónico:

Si estamos ejecutando la aplicación en un contenedor EE 6 (de no ser así no funcionaría), podríamos pasar argumentos al Managed Bean, por ejemplo, para pasar los parámetros del request “p” y “q” a la función de nuestro bean, podríamos hacer lo siguiente:

Por temas de seguridad, no es recomendable pasar valores sin comprobar directamente a los métodos, pero nos vale a modo de ejemplo.

Manipulando los Beans

Como vimos anteriormente, los beans manejados son POJOs que se declaran de alguna manera en el “runtime” de Jsf. En el ejemplo de aplicación que vimos en la introducción a Jsf, utilizamos el bean manejado “BeanMensaje”, vamos a ver un ejemplo similar:

Como se puede ver, está anotado con “@ManagedBean” y tiene el alcance (scope) de sesión. El alcance puede ser el siguiente:

  • @NoneScoped → Se instancia por demanda de algún otro managed bean
  • @RequestScoped → Está disponible en el mismo http request
  • @ViewScoped → Sólo disponible en la vista
  • @SessionScoped → Disponible en una sesión http de usuario
  • @ApplicationScoped → Disponible en el ciclo de vida de la aplicación, para todos los usuarios
  • @CustomScoped → Un ejemplo de esto es #{facesContext.attributes}, que es el ámbito recomendado.

Se ha asignado un valor por defecto con la anotación:

@ManagedProperty(value=”No todo código”).

El nombre del bean define como se puede hacer referencia a él, con expresiones EL. Si no se indica ningún nombre mediante el uso del atributo name, será el nombre de la clase comenzando en minúscula. En el ejemplo anterior, haríamos referencia al bean con el nombre “beanMensaje”. Si quisiéramos asignarle otro nombre, lo indicaríamos de este modo:

@ManagedBean(name=”nuevoNombreAUtilizar”)

Alternativamente, se pueden definir los beans manejados, de manera equivalente, en el archivo “faces-config.xml” de este modo:

En general por cada anotación Jsf 2.0, existe su equivalente en Xml para su uso en “faces-config.xml”. Se recomienda usar anotaciones, ya que es más fácil de mantener. De cualquier manera, cuando editamos el fichero faces-config.xml en Eclipse, podemos ver los elementos que se utilizan en la declaración de un bean manejado (pulsando Ctrl+Espacio):

Configurando un managed bean en Eclipse

Configurando un managed bean en Eclipse

Si nos fijamos, en la etiqueta “managed-property” hemos indicado el valor por defecto de una propiedad de tipo String. También se pueden inicializar elementos mediante el uso de “list-entries” o “map-entries“, por ejemplo:

En este ejemplo, se indica con “value-class” que estamos usando una lista de tipo “java.lang.Long”, ya que por defecto, las listas son de tipo String. Como se puede ver en el ejemplo, se hace referencia a los valores de una lista de otro managed bean “masNumeros”, que se habrá definido previamente. De este modo, se pueden obtener los valores de otros managed beans mediante el uso de expresiones EL. Una cosa que hay que tener en cuenta, es que solo se puede hacer referencia a otros managed beans que se hayan definido con scope “none” o con un ámbito mayor o igual que el bean que hace la referencia.

Un ejemplo para el caso de los map, con claves de tipo entero, podría ser:

Como vimos en la introducción a Jsf, para hacer referencia a un atributo del bean en la vista, utilizaríamos expresiones EL, por ejemplo, si queremos sacar en la vista, el valor del atributo mensaje, podríamos hacer:

El mensaje es: “#{beanMensaje.mensaje}”

Del mismo modo, si utilizamos un componentes UI que acepten un valor de entrada, y que implementen EditableValueHolder, como por ejemplo “h:inputtext“, se actualizará el bean manejado a través de los métodos setter, en general, cuando se haga submit del formulario.

También se pueden utilizar expresiones para configurar propiedades que estén accesibles vía EL. Por ejemplo, podemos recuperar propiedades del request y asociárselas a un managed bean:

Tambíen se puede hacer esto con anotaciones:

De este modo, podemos añadir el valor en un campo:

Que se recuperaría como hemos dicho del request, por ejemplo:

http://… /pagina.xhtml?num=2324

Acceder por código a los Managed beans

Para recuperar por código un valor del managed bean, podemos ejecutar lo siguiente:

Si lo que queremos es acceder al bean para cambiar alguna propiedad, o lo que sea, podemos hacer lo siguiente:

Una vez que tenemos la referencia al objeto, lo podremos manipular como queramos. También se puede acceder al contexto de aplicación este modo:

Aquí terminamos con este artículo. Si te ha gustado puedes dejar un comentario. En el próximo artículo veremos las distintas formas de definir flujos de navegación

2 comentarios:

  1. Muy buen tutorial , pero te falto en la penultima ventana de codigo la instanciacion del contexto (FacesContext context = FacesContext.getCurrentInstance();) ya que lo estas utilizando al momento de instanciar ELContext contextoEL = context.getELContext();.

    Muy buen aporte este tutorial

  2. Excelente tutorial

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *