Как получить длину списка на языке выражений JSF?
Вопрос
Как мне получить длину 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:
#{Бин.список.размер()}