2008-10-15 5 views
109

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

#{MyBean.somelist.length} 

не работает.

+7

Связанный: [Как отобразить значение List # size() в JSF EL?] (http://stackoverflow.com/questions/7120526/how-to-display-value-of-listsize-in-jsf-el) – BalusC 2011-08-23 15:25:18

+0

@GBa вы можете использовать # {MyBean.somelist .size()}, чтобы отобразить размер списка. – Umair 2014-08-06 05:45:59

+0

Вы также можете использовать c: forEach для перебора по списку и в цикле тело присваивать значение count переменной, например: . Полезно особенно, когда вы все равно перебираете список. – 2015-01-06 13:18:09

ответ

153

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

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

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

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

fn, вероятно, путь, к сожалению, он доступен только в версиях JSTL, превышающих 1,1. – 2010-01-27 13:36:13

+2

Или, как я уже сказал, в Facelets – billjamesdev 2010-01-27 15:12:22

+25

Использование fn: length работало для меня с голым JSP (без JSF, Facelets, ультра устарелый проект, который слегка обновляется до того, как его постепенно прекращают). Правильный taglib для использования: `<% @ taglib uri =" http://java.sun.com/jsp/jstl/functions "prefix =" fn "%>` – 2010-02-17 20:01:19

47

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

#{MyBean.somelist.size()} 

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

0

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

14

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


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

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

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

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

Во-вторых, если вы хотите избежать Java-код на ваших страницах JSP, вы можете реализовать простой класс-оболочку, которая содержит список и обеспечивает доступ к свойству размера списка с помощью метода getter, совместимого с 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
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%> 

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

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

Пример: Table Size = 5

-4

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

# {Bean.list.size()}

-2

После 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>