Comment pourrais-je obtenir la longueur d'un ArrayList
en utilisant une expression JSF EL?
#{MyBean.somelist.length}
ne marche pas.
Oui, étant donné que certains membres du comité de création de l'API Java) ont décidé que, même si certaines classes ont les attributs size()
members ou length
, elles ne seront pas implémentées. 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 faire cela.
Un: ajoutez une fonction à votre haricot qui renvoie la longueur:
Dans la classe MyBean: Public int getSomelistLength () {return this.somelist.length; } Dans votre page JSF: # {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
Dans la page JSF: # {Fn: length (MyBean.somelist)}
Tu veux 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 est préférable 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 LinkedList valide), mais qu'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 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 simple classe wrapper contenant une liste et donnant accès à la propriété de taille de la liste avec une méthode getter compatible avec JavaBeans. Ce haricot est listé dans l'extrait 2.25.
Le problème avec la méthode c_rt est que vous devez extraire la variable de request 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. Ceci est un défaut [~ # ~] [~ # ~] dans le 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 consiste à définir la taille de votre liste dans le modèle (en supposant que vous utilisiez MVC) en tant qu'attribut séparé. Donc, 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)}"/>
Sur l'écran, il affiche la taille de la table
Exemple: Table Size = 5
Vous pouvez éventuellement étendre le langage EL en utilisant le EL Functor , qui vous permettra d'appeler n'importe quelle méthode Java de beans, même avec des paramètres ...