Question

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

#{MyBean.somelist.length}

ne fonctionne pas.

Était-ce utile?

La solution

Oui, étant donné que certains membres du comité de création d'API Java ont décidé que, même si certaines classes possèdent des membres size () ou des attributs length , elles ne mettront pas en œuvre < code> getSize () ou getLength () requis par JSF et la plupart des autres normes, 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 noms fn et utiliser la fonction length

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

Autres conseils

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

#{MyBean.somelist.size()}

fonctionne pour moi (en utilisant JBoss Seam qui a les extensions Jboss EL)

Remarque: cette solution convient mieux aux anciennes versions de JSTL. Pour les versions supérieures à 1.1, je recommande l'utilisation de fn: length (MyBean.somelist) comme suggéré par Bill James .

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

  

Le problème est que nous essayons d'appeler la méthode size de la liste (qui est une méthode LinkedList valide), mais il ne s'agit pas d'une méthode getter compatible JavaBeans. Par conséquent, l'expression list.size-1 ne peut pas être évaluée.

     

Il existe deux manières 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 souhaitez éviter le code Java dans vos pages JSP, vous pouvez implémenter une simple classe wrapper contenant une liste et fournissant un accès à la propriété de taille de la liste avec une méthode getter compatible JavaBeans. Ce haricot est répertorié dans le Listing 2.25.

Le problème avec la méthode c_rt est que vous devez extraire manuellement la variable de request, 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. C’est une faille GIANT dans le EL.

J'ai fini par utiliser le "wrapper". méthode, 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 consiste à définir la taille de votre liste dans le modèle (en supposant que vous utilisiez MVC) en tant qu’attribut séparé. Ainsi, dans votre modèle, vous auriez " someList " puis "someListSize". C'est peut-être le moyen le plus simple de résoudre ce problème.

<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>

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

Il affiche la taille de la table à l’écran

Exemple: Taille de la table = 5

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 ...

Après 7 ans ... la solution facelets fonctionne toujours bien pour moi en tant qu'utilisateur jsf

inclure l'espace de nom en tant que xmlns: fn = " http: //java.sun.com/jsp/jstl/functions"

et utilisez l'EL comme # {fn: length (myBean.someList)} par exemple, si vous utilisez jsf ui: fragment ci-dessous, l'exemple fonctionne correctement

<ui:fragment rendered="#{fn:length(myBean.someList) gt 0}">
    <!-- Do something here-->
</ui:fragment>

Vous pouvez obtenir la longueur à l'aide de l'EL suivant:

# {Bean.list.size ()}

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top