Вызывать прямые методы или методы с аргументами / переменными / параметрами в EL - PullRequest
24 голосов
/ 19 июля 2010

Как в 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 ]

54 голосов
/ 19 июля 2010

В стандартном 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, предполагая, что вы используете Mojarra:

<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>

Альтернативой для вашего конкретного случая является использование fn:length JSTL:

<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.

1 голос
/ 06 февраля 2015

Ответ 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>
...