2010-07-19 15 views
20

Comment puis-je dans JSF 2.0 invoquer des méthodes directes ou des méthodes avec arguments/variables/paramètres dans EL?Appel de méthodes directes ou de 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 invoquer 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 d'analyse: # {bean.list.size()}
com.sun.el.parser.ParseException: Rencontrés "("

+0

en double? http: // stackoverflow.com/questions/206161/ –

Répondre

51

Dans la norme EL avant EL 2.2 from 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 vous passez à un EL 2.2/Java EE 6 conteneur compatible (Tomcat 7, Glassfish 3, JBoss AS 6, etc.) est ne pas une option et vous utilisez actuellement EL 2.1/Java EE 5 (Tomcat 6, Glassfish 2, JBoss AS 4, etc), alors votre meilleur pari est d'installer JBoss EL. JBoss EL est une implémentation compatible EL 2.1 qui supporte les mêmes fonctionnalités que EL 2.2. Installation JBoss EL est une question de mettre la jboss-el.jar en /WEB-INF/lib et en ajoutant ce qui suit à la 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 est d'utiliser fn:length de JSTL:

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

Une autre alternative consiste à ajouter un getter au bean qui renvoie List#size() ou dans certains cas un custom EL function.


Veuillez noter par conséquent que l'appel de méthodes avec des arguments dans EL n'est pas une fonction spécifique à JSF 2.0. C'est une caractéristique 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 caractéristique 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 n'a pas cette fonctionnalité. D'un autre côté, JSF 1.x est compatible avec Servlet 3.0/EL 2.2, donc il serait également possible d'utiliser cette fonctionnalité dans JSF 1.x, en utilisant également JBoss EL sur Servlet 2.5/EL 2.1.

+0

Utilise-t-on la méthode value de 'ui: repeate' avec une requête ajax? Reportez-vous à: http://stackoverflow.com/questions/12884049/does-not-uirepeat-work-when-ajax-request – CycDemo

0

Réponse de Arend très bien, sauf une partie sur la saisie de context-param pour Mojarra: en ajoutant que web.xml le casse réellement sur JBoss 7. Essayez d'utiliser JBoss EL sans entrer quoi que ce soit dans web.xml.

0

La réponse de BalusC est correcte, cependant, lorsque vous utilisez Maven, vous devez exclure el-api 1.0 dépendance transitive 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>