Как вы получаете длину списка на языке выражений JSF?

Как мне получить длину ArrayList с использованием выражения JSF EL?

#{MyBean.somelist.length}

не работает.

Ответы

Ответ 1

Да, поскольку какой-то гений в комитете по разработке Java API решил, что хотя определенные классы имеют атрибуты size() или length, они не будут реализовывать getSize() или getLength(), какие JSF и большинство других стандартов требуют, вы не можете делать то, что хотите.

Есть несколько способов сделать это.

Один: добавьте функцию в свой Bean, который возвращает длину:

In class MyBean:
public int getSomelistLength() { return this.somelist.length; }

In your JSF page:
#{MyBean.somelistLength}

Два: если вы используете Facelets (о, Боже, почему вы не используете Facelets!), вы можете добавить пространство имен fn и использовать функцию длины

In JSF page:
#{ fn:length(MyBean.somelist) }

Ответ 2

Вы имеете в виду размер(), не так ли?

#{MyBean.somelist.size()}

работает для меня (используя JBoss Seam, у которого есть расширения Jboss EL)

Ответ 3

Примечание.. Это решение лучше для более старых версий JSTL. Для версий, превышающих 1,1, я рекомендую использовать fn:length(MyBean.somelist), как было предложено Bill James.


В этой статье содержится более подробная информация, включая другое возможное решение;

Проблема заключается в том, что мы пытаемся вызвать метод размера списка (который является допустимым методом LinkedList), но это не совместимый с JavaBeans метод getter, поэтому выражение list.size-1 не может быть оценено.

Есть два пути решения этой дилеммы. Во-первых, вы можете использовать библиотеку RT Core, например:

<c_rt:out value='<%= list[list.size()-1] %>'/>

Во-вторых, если вы хотите избежать Java-кода на своих страницах JSP, вы можете реализовать простой класс-оболочку, содержащий список, и предоставляет доступ к свойству размера списка с помощью метода getter, совместимого с JavaBeans. Этот bean приведен в листинге 2.25.

Проблема с методом c_rt заключается в том, что вам нужно получить переменную из запроса вручную, потому что она не распознает ее иначе. На этом этапе вы вводите много кода для того, что должно быть построено в функциональности. Это недостаток GIANT в EL.

В итоге я использовал метод "wrapper", вот для него класс:

public class CollectionWrapper {

    Collection collection;

    public CollectionWrapper(Collection collection) {
        this.collection = collection;
    }

    public Collection getCollection() {
        return collection;
    }

    public int getSize() {
        return collection.size();
    }
}

Третий вариант, о котором никто еще не упомянул, заключается в том, чтобы поместить ваш размер списка в модель (при условии, что вы используете MVC) в качестве отдельного атрибута. Поэтому в вашей модели у вас будет "someList", а затем "someListSize". Это может быть самым простым способом решения этой проблемы.

Ответ 4

<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>

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

На экране отображается размер таблицы

Пример: Table Size = 5

Ответ 5

В конечном итоге вы можете расширить язык EL, используя EL Functor, который позволит вам вызывать любые Java beans методы, даже с параметрами...

Ответ 6

Через 7 лет... решение facelets по-прежнему отлично работает для меня как пользователя jsf

включить пространство имен как xmlns:fn="http://java.sun.com/jsp/jstl/functions"

и используйте EL как #{fn:length(myBean.someList)} например, если использование в jsf ui: фрагмент ниже примера работает отлично

<ui:fragment rendered="#{fn:length(myBean.someList) gt 0}">
    <!-- Do something here-->
</ui:fragment>

Ответ 7

Вы можете получить длину, используя следующий EL:

# { Bean.list.size()}