2010-07-19 10 views
20

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

Por ejemplo, para obtener el tamaño de la lista de 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 trabajar en mi entorno. No parece que le gusten los paréntesis.

javax.el.ELException: Error de análisis: # {bean.list.size()}
com.sun.el.parser.ParseException: Encontró "("

+0

duplicado? http: // stackoverflow.com/questions/206161/ –

Respuesta

51

En EL norma antes de EL 2.2 from 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 la actualización a una/Java EE 6 recipiente compatible EL 2,2 (Tomcat 7, Glassfish 3, JBoss AS 6, etc) es no una opción y actualmente está utilizando 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. Instalación de JBoss EL es una cuestión de poner la jboss-el.jar en /WEB-INF/lib y añadiendo lo siguiente a la web.xml, asumiendo 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, cuando se está utilizando 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 utilizar de fn:length JSTL:

<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 a custom EL function.


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. Por lo tanto, se parece a 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.

+0

¿Es útil para el método value de 'ui: repeate' con la solicitud ajax? Consulte: http://stackoverflow.com/questions/12884049/does-not-uirepeat-work-when-ajax-request – CycDemo

0

Respuesta de Arend muy buena, excepto la parte acerca de ingresar context-param para Mojarra: agregar eso a web.xml realmente lo rompe en JBoss 7. Trate de usar JBoss EL sin ingresar nada en web.xml. respuesta

0

de BalusC es correcto, sin embargo, cuando se utiliza experto, debe excluir el-API 1.0 dependencia transitiva como esto:

<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> 
Cuestiones relacionadas