Comment puis-je dans JSF 2.0 appeler des méthodes directes ou des méthodes avec arguments/variables/paramètres dans EL?
Par exemple, obtenir la taille de la liste dans EL:
<h:outputText value="#{bean.list.size()}" />
Ou appeler une méthode d'action avec des arguments:
<h:commandButton value="edit" action="#{bean.edit(item)}" />
Cela ne semble pas fonctionner dans mon environnement. Il ne semble pas aimer les parenthèses.
javax.el.ELException: Erreur lors de l'analyse syntaxique: # {bean.list.size ()}
com.Sun.el.parser.ParseException: Rencontré "("
En version standard EL antérieure à EL 2.2 de Java EE 6 , vous ne pouvez pas invoquer directement des méthodes telles que#{bean.method()}
ni invoquer des méthodes avec des arguments tels que #{bean.method(arg1, arg2)
.
Si la mise à niveau vers un conteneur compatible EL 2.2/Java EE 6 (Tomcat 7, Glassfish 3, JBoss AS 6, etc.) n’est pas une option et que vous utilisez actuellement EL 2.1/Java EE 5 (Tomcat 6, Glassfish 2, JBoss AS) 4, etc), le mieux est d’installer JBoss EL . JBoss EL est une implémentation conforme à EL 2.1 qui prend en charge les mêmes fonctionnalités que EL 2.2. Installer JBoss EL consiste à mettre le jboss-el.jar
dans /WEB-INF/lib
et à ajouter ce qui suit au web.xml
, en supposant que vous utilisez Mojarra:
<context-param>
<param-name>com.Sun.faces.expressionFactory</param-name>
<param-value>org.jboss.el.ExpressionFactoryImpl</param-value>
</context-param>
Ou, lorsque vous utilisez MyFaces:
<context-param>
<param-name>org.Apache.myfaces.EXPRESSION_FACTORY</param-name>
<param-value>org.jboss.el.ExpressionFactoryImpl</param-value>
</context-param>
Une alternative pour votre cas particulier consiste à utiliser le code JSTL fn:length
:
<h:outputText value="#{fn:length(bean.list)}" />
Une autre alternative consiste à ajouter un getter au bean qui renvoie List#size()
ou, dans certains cas spécifiques, une fonction EL personnalisée .
Veuillez donc noter que l'appel de méthodes avec des arguments dans EL n'est pas une fonctionnalité spécifique à JSF 2.0. C'est une fonctionnalité spécifique à EL 2.2. EL 2.2 fait partie de Java EE 6, dont JSF 2.0 fait également partie. Donc, il ressemble une fonctionnalité spécifique à JSF 2.0, mais ce n’est pas le cas. JSF 2.0 est rétrocompatible avec Servlet 2.5/EL 2.1, qui manque de cette fonctionnalité. Par contre, JSF 1.x est compatible à l’avenir avec Servlet 3.0/EL 2.2. Il serait donc également possible d’utiliser cette fonction dans JSF 1.x, en utilisant également JBoss EL sur Servlet 2.5/EL 2.1.
La réponse de BalusC est correcte, cependant, lorsque vous utilisez maven, vous devez exclure la dépendance transitive d'el-api 1.0 comme ceci:
<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>