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


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

#{MyBean.somelist.length}

не работает.

7 113

7 ответов:

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

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

One: добавьте функцию к своему Бобу, которая возвращает длину:

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

In your JSF page:
#{MyBean.somelistLength}

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

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

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

#{MyBean.somelist.size()}

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

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


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

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

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

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

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

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

Я в конечном итоге с помощью метода "обертка", вот класс для него;

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". Это может быть самый простой способ решить эту проблему.

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

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

на экране отображается размер стола

пример: Table Size = 5

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

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

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

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

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

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

#{Bean.список.размер()}