Ответ 1
Как я упоминал в комментарии, это можно решить, обновив реализацию EL (т.е. заменив jasper-el.jar на el-impl-2.2.jar)
С JSF 2 вы сможете это сделать:
<h:commandButton action="#{myBean.myAction(myParameter)}"/>
который затем вызовет метод действия, передав в параметре (предположим, что это целое число):
@ManagedBean
@SessionScoped
public class MyBean {
...
public String myAction(Integer myParameter) {
// do something
return null;
}
...
}
Это прекрасно работает на Glassfish v3. Однако не на Tomcat вы получаете ELException, уведомляющее ошибку синтаксического анализа
Caused by: javax.el.ELException: Error Parsing: ...
Теперь существует документированный способ сделать эту работу, используя EL 2.2 и реализацию Glassfish, заменив банку el-api
в каталоге Tomcat lib, однако я все равно получаю ту же ошибку, что и без везения. Tomcat действительно начинает расстраивать меня! JSF2 должен быть проще!
Фрагменты Maven POM:
<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>
Дополнительная информация.
Здесь часть трассировки стека, кажется, все еще использует реализацию Apache EL, а не ту, которую я сбросил в lib. Я полностью удалил существующий el-api.jar
, который пришел с Tomcat, есть ли el-impl.jar
Я должен удалить что-то слишком, что может быть чем-то переоценено?
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
Как я упоминал в комментарии, это можно решить, обновив реализацию EL (т.е. заменив jasper-el.jar на el-impl-2.2.jar)
Как уже упоминалось в других ответах, вам нужно добавить el-api-2.2.jar в папку lib сервера Tomcat и файл el-impl-2.2.jar в папку WEB-INF/lib.
В других ответах упоминается удаление яшмы или создание пользовательских реализаций ExpressionFactoryImpl. Это может сработать, но вам не нужно это делать.
Вам просто нужно переопределить реализацию выражения factory, используя org.apache.myfaces.EXPRESSION_FACTORY на MyFaces или com.sun.faces.expressionFactory на 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>
Замена el-api.jar и el-impl.jar с помощью el-api-2.2.jar и el-impl-2.2.jar решает проблему.
Также вам нужно добавить в свой контекст .xml параметр контекста
<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>
Вы можете использовать JBoss EL.
Это реализация языка выражений 2.1. Но у него есть расширения, позволяющие использовать параметры метода в вашем примере:
<h:commandButton action="#{myBean.myAction(myParameter)}"/>
Преимущество состоит в том, что вам нужно только изменить свой каталог webapp, а не Tomcat lib.
Инструкция
lib/jboss-el.jar
WEB-INF/lib/jboss-el.jar
В вашем web.xml
установите:
<context-param>
<param-name>com.sun.faces.expressionFactory</param-name>
<param-value>org.jboss.el.ExpressionFactoryImpl</param-value>
</context-param>
См. также Вызвать прямые методы или методы с параметрами в EL.