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:
Podemos utilizar operadores aritméticos, relacionales, lógicos, ternarios o comprobar si el valor es empty.
¿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:
¿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:
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.
¿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?
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.
Brillante la explicacion, te lo agradezco .. !
ResponderEliminar