120 votes

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

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

#{MyBean.somelist.length}

ne fonctionne pas.

172voto

Bill James Points 7554

Oui, depuis qu'un certain génie du comité de création de l'API Java a décidé que, même si certaines classes ont size() membres ou length ils ne mettront pas en œuvre les attributs getSize() o 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.

Un : ajoutez une fonction à votre Bean qui renvoie la longueur :

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

In your JSF page:
#{MyBean.somelistLength}

Deux : Si vous utilisez Facelets (Oh, mon Dieu, pourquoi n'utilisez-vous pas Facelets !), vous pouvez ajouter l'espace de nom fn et utiliser la fonction longueur

In JSF page:
#{ fn:length(MyBean.somelist) }

64voto

Damo Points 7792

Vous voulez dire size(), n'est-ce pas ?

#{MyBean.somelist.size()}

fonctionne pour moi (j'utilise JBoss Seam qui a les extensions Jboss EL).

14voto

James McMahon Points 14356

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


Cet article contient des informations plus détaillées, y compris une autre solution possible ;

Le problème est que nous essayons d'invoquer la méthode size de la liste (qui est une méthode valide de LinkedList), mais ce n'est pas une méthode getter conforme à JavaBeans, donc l'expression list.size-1 ne peut pas être évaluée.

Il existe deux façons de résoudre ce dilemme. Premièrement, vous pouvez utiliser la bibliothèque RT Core, comme ceci :

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

Deuxièmement, si vous voulez éviter d'inclure du code Java dans vos pages JSP, vous pouvez implémenter une simple classe d'enveloppe qui contient une liste et fournit un accès à la propriété size de la liste avec une méthode getter conforme à JavaBeans. Ce bean est présenté dans le Listing 2.25.

Le problème avec la méthode c_rt est que vous devez récupérer la variable de la requête manuellement, car elle ne la reconnaît pas autrement. À ce stade, vous introduisez beaucoup de code pour ce qui devrait être une fonctionnalité intégrée. Il s'agit d'une GIANT défaut de l'EL.

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

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 placer la taille de votre liste dans le modèle (en supposant que vous utilisez MVC) comme un attribut séparé. Ainsi, dans votre modèle, vous auriez "someList" et ensuite "someListSize". C'est peut-être le moyen le plus simple de résoudre ce problème.

7voto

udaykiran pulipati Points 1804
<%@ 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

0voto

romaintaz Points 32120

Vous pouvez éventuellement étendre le langage EL en utilisant la fonction Functeur EL qui vous permettra d'appeler n'importe quelle méthode Java beans, même avec des paramètres...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X