referencia que programacion por pasar parametros objetos metodos metodo funciones como argumentos jsf methods arguments parameter-passing el

jsf - que - pasar objetos como parametros en c#



Invoque métodos directos o métodos con argumentos/variables/parámetros en EL (2)

¿Cómo puedo en JSF 2.0 invocar métodos directos o métodos con argumentos / variables / parámetros en EL?

Por ejemplo, obtener el tamaño de la lista en EL:

<h:outputText value="#{bean.list.size()}" />

O invocar un método de acción con argumentos:

<h:commandButton value="edit" action="#{bean.edit(item)}" />

Esto no parece funcionar en mi entorno. No parece que le gusten los paréntesis.

javax.el.ELException: Análisis de errores: # {bean.list.size ()}
com.sun.el.parser.ParseException: Encountered "("


En EL estándar antes de EL 2.2 de Java EE 6 no se puede invocar directamente métodos como
#{bean.method()} ni invocar métodos con argumentos como #{bean.method(arg1, arg2) .

Si actualizar a un contenedor compatible con EL 2.2 / Java EE 6 (Tomcat 7, Glassfish 3, JBoss AS 6, etc.) no es una opción y usted está utilizando actualmente EL 2.1 / Java EE 5 (Tomcat 6, Glassfish 2, JBoss AS 4, etc.), entonces su mejor opción es instalar JBoss EL . JBoss EL es una implementación que cumple con EL 2.1 que admite las mismas funciones que EL 2.2. Instalar JBoss EL es una cuestión de poner jboss-el.jar en /WEB-INF/lib y agregar lo siguiente al web.xml , suponiendo que está usando Mojarra:

<context-param> <param-name>com.sun.faces.expressionFactory</param-name> <param-value>org.jboss.el.ExpressionFactoryImpl</param-value> </context-param>

O bien, cuando estás usando MyFaces:

<context-param> <param-name>org.apache.myfaces.EXPRESSION_FACTORY</param-name> <param-value>org.jboss.el.ExpressionFactoryImpl</param-value> </context-param>

Una alternativa para su caso particular es usar fn:length de JSTL fn:length :

<h:outputText value="#{fn:length(bean.list)}" />

Otra alternativa es agregar un getter al bean que devuelve List#size() o en algunos casos específicos una función EL personalizada .

Tenga en cuenta que invocar métodos con argumentos en EL no es una característica específica de JSF 2.0. Es una característica específica EL 2.2. EL 2.2 es parte de Java EE 6, del cual JSF 2.0 también forma parte. Parece una característica específica de JSF 2.0, pero no lo es. JSF 2.0 es retrocompatible con Servlet 2.5 / EL 2.1 que carece de esta característica. Por otro lado, JSF 1.x es compatible con Servlet 3.0 / EL 2.2, por lo que también sería posible utilizar esta función en JSF 1.x y también con JBoss EL en Servlet 2.5 / EL 2.1.


La respuesta de BalusC es correcta, sin embargo, cuando usas maven, debes excluir la dependencia transitiva de el-api 1.0 de esta manera:

<dependency> <groupId>org.jboss.seam</groupId> <artifactId>jboss-el</artifactId> <version>2.0.0.GA</version> <!-- exclude el-api 1.0 transitive dependency --> <exclusions> <exclusion> <groupId>javax.el</groupId> <artifactId>el-api</artifactId> </exclusion> </exclusions> </dependency>