Вызывать прямые методы или методы с аргументами / переменными / параметрами в EL
Как я могу в JSF 2.0 вызывать прямые методы или методы с аргументами / переменными / параметрами в EL?
Например, получение размера списка в EL:
<h:outputText value="#{bean.list.size()}" />
Или вызов метода действия с аргументами:
<h:commandButton value="edit" action="#{bean.edit(item)}" />
Кажется, это не работает в моей среде. Это не похоже на круглые скобки.
javax.el.ELException: Ошибка синтаксического анализа: # {bean.list.size ()}
com.sun.el.parser.ParseException: найдено "("
2 ответа
В стандартном EL до EL 2.2 из Java EE 6 нельзя напрямую вызывать такие методы, как #{bean.method()}
ни вызывать методы с такими аргументами, как #{bean.method(arg1, arg2)
,
Если обновление до EL 2.2 / Java EE 6-совместимого контейнера (Tomcat 7, Glassfish 3, JBoss AS 6 и т. Д.) Не является вариантом, и вы в настоящее время используете EL 2.1 / Java EE 5 (Tomcat 6, Glassfish 2, JBoss AS) 4 и т. Д.), Тогда вам лучше всего установить JBoss EL. JBoss EL - реализация, совместимая с EL 2.1, которая поддерживает те же функции, что и EL 2.2. Установка JBoss EL - это вопрос установки jboss-el.jar
в /WEB-INF/lib
и добавив следующее к web.xml
, предполагая, что вы используете Мохарру:
<context-param>
<param-name>com.sun.faces.expressionFactory</param-name>
<param-value>org.jboss.el.ExpressionFactoryImpl</param-value>
</context-param>
Или, когда вы используете MyFaces:
<context-param>
<param-name>org.apache.myfaces.EXPRESSION_FACTORY</param-name>
<param-value>org.jboss.el.ExpressionFactoryImpl</param-value>
</context-param>
Альтернативой для вашего конкретного случая является использование JSTL fn:length
:
<h:outputText value="#{fn:length(bean.list)}" />
Другой альтернативой является добавление геттера к бину, который возвращает List#size()
или в некоторых конкретных случаях пользовательская функция EL.
Обратите внимание, что вызов методов с аргументами в EL не является специфической особенностью JSF 2.0. Это особенность EL 2.2. EL 2.2 является частью Java EE 6, частью которой также является JSF 2.0. Так что это похоже на особенность JSF 2.0, но это не так. JSF 2.0 обратно совместим с Servlet 2.5 / EL 2.1, в котором отсутствует эта функция. С другой стороны, JSF 1.x полностью совместим с Servlet 3.0 / EL 2.2, поэтому можно также использовать эту функцию в JSF 1.x, также используя JBoss EL в Servlet 2.5 / EL 2.1.
Ответ BalusC правильный, однако, когда вы используете maven, вы должны исключить транзитивную зависимость el-api 1.0, например:
<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>