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

StackOverflow https://stackoverflow.com/questions/206161

  •  03-07-2019
  •  | 
  •  

Вопрос

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

#{MyBean.somelist.length}

не работает.

Это было полезно?

Решение

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

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

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

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

Другие советы

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

#{MyBean.somelist.size()}

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

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


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

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

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

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

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

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

В итоге я использовал метод «обертки», вот класс для него;

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, используя EL-функтор, что позволит вам вызывать любые методы Java-компонентов, даже с параметрами...

Спустя 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>

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top