Как мне получить длину ArrayList
выражения JSF EL?
#{MyBean.somelist.length}
не работает.
Как мне получить длину ArrayList
выражения JSF EL?
#{MyBean.somelist.length}
не работает.
Ответы:
Да, поскольку какой-то гений в комитете по созданию Java API решил, что, даже если у определенных классов есть size()
члены или length
атрибуты, они не будут реализовывать getSize()
то, getLength()
что требуется JSF и большинству других стандартов, вы не можете делать то, что хотите.
Есть несколько способов сделать это.
Первый: добавьте к вашему Bean функцию, которая возвращает длину:
В классе MyBean: public int getSomelistLength () {вернуть this.somelist.length; } На странице JSF: # {MyBean.somelistLength}
Два: если вы используете Facelets (о, Боже, почему вы не используете Facelets!), Вы можете добавить пространство имен fn и использовать функцию length
На странице JSF: # {fn: length (MyBean.somelist)}
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
xmlns:fn="http://java.sun.com/jsp/jstl/functions"
Вы имеете в виду размер (), не так ли?
#{MyBean.somelist.size()}
работает для меня (с использованием JBoss Seam, у которого есть расширения Jboss EL)
#{MyBean.somelist.size}
(без скобок в конце).
Примечание. Это решение лучше подходит для более старых версий 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 заключается в том, что вам нужно получить переменную из запроса вручную, потому что иначе он ее не распознает. На этом этапе вы вводите много кода для того, что должно быть встроено в функциональность. Это ГИГАНСКИЙ недостаток в 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 с помощью EL Functor , который позволит вам вызывать любые методы Java beans, даже с параметрами ...
Через 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:
# {Bean.list.size ()}