Ir al contenido principal

JSF 2.0: Managed Beans (IV)

JSF proporciona un Expression Language (EL) que nos permite acceder a las propiedades de nuestros beans. En post anteriores ya hemos visto algún ejemplo, pero en este post vamos a entrar en profundidad en este lenguaje.

¿Cómo podemos acceder a las propiedades de un bean?
Podemos utilizar diferentes maneras de acceso, todas ellas equivalentes:
a.b       // #{userBean.name}
a["b"]    // #{userBean["name"]}
a['b']    // #{userBean['name']}

Podemos utilizar operadores aritméticos, relacionales, lógicos, ternarios o comprobar si el valor es empty.
<h:outputText rendered="#{userBean.profile=='VIP'}" value="Bono regalo de #{bono.base*7} Euros"/>
<h:commandButton value="Aceptar" action="#{userBean.createUser}"/>

¿Se pueden invocar métodos con parámetros?
Desde JSF 2.0 sí, pero métodos que no estén sobrecargados. Ej. #{bean.metodo("a")}

¿Cómo se accede a un bean desde Java?
Podemos acceder de diferentes maneras. Veámoslo programáticamente con unos ejemplos:
FacesContext ctx = FacesContext.getCurrentInstance();
ELContext ec = ctx.getELContext( );
Application app = ec.getApplication( );
String name = (String) app.evaluateValueExpressionGet(ctx,"#{userBean.name}",String.class);

ExpressionFactory ef = app.getExpressionFactory( );
ValueExpression ve =.ef.createValueExpression(ec,"#{userBean.name}",String.class);
name = (String) ve.getValue(ec);
ve.setValue(ec, "Serena");

ValueExpression ve = ef.createValueExpression(ec,"#{userBean}",UserBean.class);
UserBean ub = (UserBean) ve.getValue(ec);
ub.setName("Serena");

¿Qué son los objetos implícitos?
Son unos objetos que ya vienen predefinidos: applicationScope, cc, component, cookie, facesContext, flash, header, headerValues, initParam, param, paramValues, requestScope, resource, sessionScope, view, viewScope.

Ej. header['User-Agent'] es el valor del parámetro User-Agent de la petición HTTP.

¿Cómo se resuelven las expresiones?
Si nuestra expresión no contiene un objeto implícito, se busca si el bean está en el scope request, view, session o application, en este orden, ya que todos los beans instanciados se almacenan aquí. Si no se encuentran en estos scopes, entonces se instancia el bean. Veamos esto mejor con un ejemplo:
<managed-bean>
   <managed-bean-name>userBean</managed-bean-name>
   <managed-bean-class>com.examples.UserBean</managed-bean-class>
   <managed-bean-scope>session</managed-bean-scope>
</managed-bean>

La primera vez que se accede a #{userBean.name}, como no es un objeto implícito, se le busca entre los distintos scopes. Como la primera vez todavía no se encuentra en ninguno, se busca el managed bean que tenga el nombre userBean y se llama al constructor por defecto de su clase correspondiente (com.examples.UserBean). Después, se asocia al scope session (<managed-bean-scope>session</managed-bean-scope>). Así, la próxima vez que se acceda a este bean, sí estará en el scope session.

Comentarios

Publicar un comentario

Entradas populares de este blog

Leer un fichero properties con java.util.Properties

Los ficheros .properties son simples ficheros de texto que se suelen utilizar para guardar parámetros de configuración, en forma de pares clave-valor. Ejemplo de fichero: configuration.properties #User parameters user.name=Ana user.language=spanish Si estamos usando Java, podemos utilizar la clase java.util.Properties para leer los parámetros de este fichero: private static final String USER_NAME = "user.name"; private static final String USER_LANGUAGE = "user.language"; public void showProperties() throws Exception { Properties p = new Properties(); InputStream is = App.class.getResourceAsStream("/configuration.properties"); p.load(is); is.close(); String userName = p.getProperty(USER_NAME); String userCountry = p.getProperty(USER_LANGUAGE); System.out.println("userName: "+userName); System.out.println("userLanguage: "+userCountry); } Después de ejecutar este método, obtendríamos la siguiente salida: ...

JSF 2.0: Managed Beans (III)

Anteriormente ya hemos visto que cuando se declara un bean, tenemos que darle un scope: application, session, view, request, none. Un scope es un mapeo entre nombres y objetos que se almacena durante un determinado periodo de tiempo. En este post vamos a explicar cada uno de ellos. Si declaramos el bean desde el fichero faces-config.xml, indicamos el scope en <managed-bean-scope> y si queremos hacerlo con anotaciones, utilizaremos @{Application,Session,View,Request,None}Scoped Application Con este scope, se guarda la información durante toda la vida de la aplicación web, independientemente de todas las peticiones y sesiones que se realicen. Este bean se instancia con la primera petición a la aplicación y desaparece cuando la aplicación web se elimina del servidor. Si queremos que el bean se instancie antes de que se muestre la primera página de la aplicación, usamos la propiedad eager a true. @ManagedBean(eager=true) ó <managed-bean eager="true"> Session...

JSF 2.0: Message bundles

Los message bundles son ficheros .properties que guardan mensajes del tipo clave=valor. Si centralizamos todos los mensajes de nuestra aplicación en estos ficheros, es más fácil poder localizarlos si queremos realizar algún cambio y también nos ayuda para la internacionalización de la aplicación. Ejemplo: messages.properties (en src/java/com/examples) con dos mensajes name=Tu nombre: age=Tu edad: ¿Cómo los declaramos? 1) En cada página JSF donde lo necesitemos <f:loadBundle basename="com.examples.messages" var="msgs"/> 2) De manera global en faces-config.xml <application>      <resource-bundle>           <base-name>com.examples.messages</base-name>           <var>msg</var>      </resource-bundle> </application> Esta opción es más eficiente ya que sólo crea el bundle una v...