web-dev-qa-db-fra.com

Invoquer des méthodes directes ou des méthodes avec arguments/variables/paramètres dans EL

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é "("

23
DD.

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.

53
BalusC

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>
1
Hrotkó Gábor