Avec JSF 2, vous devriez pouvoir faire ceci:
<h:commandButton action="#{myBean.myAction(myParameter)}"/>
qui appellera alors la méthode d'action en passant le paramètre (supposons qu'il s'agisse d'un Integer):
@ManagedBean
@SessionScoped
public class MyBean {
...
public String myAction(Integer myParameter) {
// do something
return null;
}
...
}
Cela fonctionne parfaitement sur Glassfish v3. Cependant, pas sur Tomcat, vous recevez une exception ELException notifiant l'erreur d'analyse
Caused by: javax.el.ELException: Error Parsing: ...
Maintenant, il y a une méthode documentée de faire fonctionner cela en utilisant EL 2.2 et l'implémentation de Glassfish en remplaçant le jar el-api
dans le répertoire Tomcat lib, mais j'ai toujours la même erreur sans aucune chance. Tomcat commence vraiment à me frustrer! JSF2 est censé être plus facile!
Maven POM fragments:
<repositories>
<repository>
<id>Sun</id>
<url>http://download.Java.net/maven/2/</url>
</repository>
<repository>
<id>jboss</id>
<url>http://repository.jboss.com/maven2/</url>
</repository>
</repositories>
...
<dependency>
<groupId>javax.el</groupId>
<artifactId>el-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>el-impl</artifactId>
<version>2.2</version>
<scope>provided</scope>
</dependency>
Plus d'informations.
Voici une partie de la trace de la pile, semble-t-il utiliser encore une implémentation Apache EL, et non celle que j'ai importée dans lib. J'ai complètement supprimé le el-api.jar
fourni avec Tomcat. Existe-t-il un el-impl.jar
que je suis censé supprimer, quelque part aussi qui pourrait avoir un impact négatif?
Was expecting one of:
"}" ...
"." ...
"[" ...
">" ...
"gt" ...
"<" ...
"lt" ...
">=" ...
"ge" ...
"<=" ...
"le" ...
"==" ...
"eq" ...
"!=" ...
"ne" ...
"&&" ...
"and" ...
"||" ...
"or" ...
"*" ...
"+" ...
"-" ...
"/" ...
"div" ...
"%" ...
"mod" ...
at org.Apache.el.parser.ELParser.generateParseException(ELParser.Java:2142)
at org.Apache.el.parser.ELParser.jj_consume_token(ELParser.Java:2024)
at org.Apache.el.parser.ELParser.DeferredExpression(ELParser.Java:113)
at org.Apache.el.parser.ELParser.CompositeExpression(ELParser.Java:40)
at org.Apache.el.lang.ExpressionBuilder.createNodeInternal(ExpressionBuilder.Java:93)
... 64 more
Comme je l'ai mentionné dans un commentaire, cela peut être résolu en mettant à niveau l'implémentation EL (c'est-à-dire en remplaçant jasper-el.jar par el-impl-2.2.jar).
Comme indiqué dans d'autres réponses, vous devez ajouter le fichier el-api-2.2.jar au dossier lib de votre serveur Tomcat et le fichier el-impl-2.2.jar à votre dossier WEB-INF/lib.
D'autres réponses mentionnent la suppression de jasper ou la création d'implémentations personnalisées de ExpressionFactoryImpl. Cela pourrait fonctionner, mais vous ne devriez pas avoir besoin de le faire.
Il vous suffit de remplacer l'implémentation de la fabrique d'expression à l'aide de org.Apache.myfaces.EXPRESSION_FACTORY sur MyFaces ou de com.Sun.faces.expressionFactory sur Mojarra.
<context-param>
<param-name>org.Apache.myfaces.EXPRESSION_FACTORY</param-name>
<param-value>com.Sun.el.ExpressionFactoryImpl</param-value>
</context-param>
<context-param>
<param-name>com.Sun.faces.expressionFactory</param-name>
<param-value>com.Sun.el.ExpressionFactoryImpl</param-value>
</context-param>
Vous pouvez utiliser JBoss EL.
C'est une implémentation d'Expression Language 2.1. Mais il a des extensions pour autoriser les paramètres de méthode comme dans votre exemple:
<h:commandButton action="#{myBean.myAction(myParameter)}"/>
L'avantage est qu'il vous suffit de modifier votre application Web et non le répertoire lib de Tomcat.
Instructions
lib/jboss-el.jar
WEB-INF/lib/jboss-el.jar
Dans votre ensemble web.xml
:
<context-param>
<param-name>com.Sun.faces.expressionFactory</param-name>
<param-value>org.jboss.el.ExpressionFactoryImpl</param-value>
</context-param>
Voir aussi Invoquer des méthodes directes ou des méthodes avec des paramètres dans EL .
Remplacer el-api.jar et el-impl.jar par el-api-2.2.jar et el-impl-2.2.jar résolvent le problème.
Aussi, vous devez ajouter dans votre context.xml le paramètre context
<context-param>
<param-name>org.Apache.myfaces.EXPRESSION_FACTORY</param-name>
<param-value>com.Sun.el.ExpressionFactoryImpl</param-value>
</context-param>
<context-param>
<param-name>com.Sun.faces.expressionFactory</param-name>
<param-value>com.Sun.el.ExpressionFactoryImpl</param-value>
</context-param>