Как узнать длину списка на языке выражений JSF? - PullRequest
116 голосов
/ 15 октября 2008

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

#{MyBean.somelist.length}

не работает.

Ответы [ 7 ]

161 голосов
/ 16 октября 2008

Да, поскольку некоторые гении в комитете по созданию API Java решили, что, хотя некоторые классы имеют 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 и использовать функцию длины

In JSF page:
#{ fn:length(MyBean.somelist) }
57 голосов
/ 16 октября 2008

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

#{MyBean.somelist.size()}

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

14 голосов
/ 01 сентября 2009

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


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

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

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

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

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

Проблема с методом c_rt заключается в том, что вам нужно получить переменную из запроса вручную, потому что иначе она не распознается. На этом этапе вы вкладываете много кода для того, что должно быть встроено в функциональность. Это GIANT недостаток в 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». Это может быть самый простой способ решить эту проблему.

6 голосов
/ 28 февраля 2013
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>

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

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

Пример: Table Size = 5

0 голосов
/ 29 марта 2017

Через 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>
0 голосов
/ 29 июля 2014

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

# {Bean.list.size ()}

0 голосов
/ 17 октября 2008

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

...