Comment obtenir la longueur d'une liste dans le langage d'expression JSF?

Comment obtenir la longueur d'un ArrayList en utilisant une expression EL JSF?

#{MyBean.somelist.length}

ne fonctionne pas.

113
demandé sur Beryllium 2008-10-15 23:52:50

7 réponses

Oui, depuis qu'un certain génie dans le Comité de création de L'API Java a décidé que, même si certaines classes ont des attributs size() membres ou length , ils ne vont pas mettre en œuvre getSize() ou getLength() que JSF et la plupart des autres normes exigent, vous ne pouvez pas faire ce que vous voulez.

il y a plusieurs façons de le faire.

One: ajouter une fonction à votre haricot qui retourne la longueur:

In class MyBean:
public int getSomelistLength() { return this.somelist.length; }

In your JSF page:
#{MyBean.somelistLength}

deux: si vous êtes (Oh, mon Dieu, pourquoi tu n'utilises pas des Facelets!), vous pouvez ajouter l'espace de noms fn et utiliser la fonction length

In JSF page:
#{ fn:length(MyBean.somelist) }
158
répondu billjamesdev 2013-12-11 20:23:46

tu veux dire taille () n'est-ce pas?

#{MyBean.somelist.size()}

fonctionne pour moi (à l'aide de JBoss Seam qui a Jboss EL extensions)

54
répondu Damo 2008-10-18 10:28:08

Note: cette solution est meilleure pour les anciennes versions de JSTL. Pour les versions plus grandes que 1.1 je recommande d'utiliser fn:length(MyBean.somelist) comme suggéré par Bill James .


cet article a quelques informations plus détaillées, y compris une autre solution possible;

le problème est que nous essayons d'invoquer la méthode de taille de la liste (qui est une méthode LinkedList VALIDE), mais ce n'est pas une méthode getter compatible JavaBeans, donc la liste des expressions.taille-1 ne peut pas être évalué.

Il y a deux façons de résoudre ce dilemme. Tout d'abord, vous pouvez utiliser la bibliothèque RT Core, comme ceci:

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

deuxièmement, si vous voulez éviter le code Java dans vos pages JSP, vous pouvez implémenter une classe wrapper simple qui contient une liste et permet d'accéder à la taille de la liste propriété avec une méthode getter compatible JavaBeans. Ce haricot est inscrit sur la liste 2.25.

le problème avec la méthode c_rt est que vous devez obtenir la variable de la requête manuellement, parce qu'elle ne la reconnaît pas autrement. À ce stade, vous mettez dans beaucoup de code pour ce qui devrait être construit dans la fonctionnalité. C'est un géant défaut dans le EL.

j'ai fini par utiliser la méthode "wrapper", voici la classe pour it;

public class CollectionWrapper {

    Collection collection;

    public CollectionWrapper(Collection collection) {
        this.collection = collection;
    }

    public Collection getCollection() {
        return collection;
    }

    public int getSize() {
        return collection.size();
    }
}

une troisième option que personne n'a encore mentionnée est de mettre la taille de votre liste dans le modèle (en supposant que vous utilisez MVC) comme attribut séparé. Ainsi, dans votre modèle, vous auriez "someList" et "someListSize". Qui peut être la façon la plus simple de résoudre ce problème.

14
répondu James McMahon 2017-05-23 11:46:55
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>

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

à l'écran il affiche la taille de la Table

exemple: Table Size = 5

6
répondu pudaykiran 2013-06-04 07:33:04

vous pouvez éventuellement étendre le langage EL en utilisant le El Functor , qui vous permettra d'appeler toutes les méthodes Java beans, même avec des paramètres...

0
répondu romaintaz 2008-10-17 13:06:32

après 7 ans... la solution de facelets fonctionne encore très bien pour moi en tant qu'utilisateur jsf

incluez le namespace comme xmlns:fn="http://java.sun.com/jsp/jstl/functions"

et utiliser le EL comme #{fn:length(myBean.someList)} par exemple si on utilise dans JSF ui: fragment ci-dessous l'exemple fonctionne bien

<ui:fragment rendered="#{fn:length(myBean.someList) gt 0}">
    <!-- Do something here-->
</ui:fragment>
-2
répondu Arry 2017-03-29 02:20:37

vous pouvez obtenir la longueur en utilisant le EL suivant:

#{Bean.liste.taille ()}

-4
répondu Soujanya 2014-07-29 19:39:32