@GBa vous pouvez utiliser # {MyBean.somelist.size ()} pour afficher la taille de la liste.
Umair
Vous pouvez également utiliser c: forEach pour faire une boucle sur la liste et, dans le corps de la boucle, affecter la valeur de comptage à une variable, comme: <c: set var = "nr_of_items" value = "$ {varStatus.count}" />. Utile surtout lorsque vous parcourez la liste de toute façon.
David Balažic
Réponses:
166
Oui, car un génie du comité de création de l'API Java a décidé que, même si certaines classes ont des size()membres ou des lengthattributs, elles ne seront pas implémentées getSize()ou getLength()que JSF et la plupart des autres standards exigent, vous ne pouvez pas faire ce que vous voulez.
Il y a plusieurs façons de procéder.
Un: ajoutez une fonction à votre Bean qui renvoie la longueur:
En classe MyBean:
public int getSomelistLength () {retourne 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)}
fn est probablement la voie à suivre, malheureusement, il n'est disponible que dans les versions JSTL supérieures à 1.1.
James McMahon
27
Utilisation de fn: la longueur a fonctionné pour moi avec JSP nu (pas de JSF, Facelets; projet ultra hérité étant légèrement mis à jour avant d'être éliminé). Le taglib approprié à utiliser:<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
Christopher Parker
57
Pour les gens qui débarquent ici comme moi, encore 2 ans plus tard, considérez que vous pouvez ajouter l'espace de noms suivant à votre facelet: xmlns:fn="http://java.sun.com/jsp/jstl/functions"
Damien MIRAS
60
Vous voulez dire la taille () n'est-ce pas?
#{MyBean.somelist.size()}
fonctionne pour moi (en utilisant JBoss Seam qui a les extensions Jboss EL)
@McDowell, Merci pour l'info, je suis vraiment surpris qu'il leur ait fallu autant de temps pour résoudre le problème.
James McMahon
Je vous remercie. Il a travaillé pour moi aussi. +1. Mais jusqu'à ce que JEE 6 soit largement supporté, je m'en tiendrai probablement à la fonction JSTL "plus standard".
Hosam Aly
BTW, cela fonctionne probablement dans JBoss pour simplement dire #{MyBean.somelist.size}(sans les parenthèses à la fin).
Hosam Aly
14
Remarque: 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'appeler la méthode de taille de la liste (qui est une méthode LinkedList valide), mais ce n'est pas une méthode de lecture compatible JavaBeans, donc l'expression list.size-1 ne peut pas être évaluée.
Il existe 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 souhaitez éviter le code Java dans vos pages JSP, vous pouvez implémenter une classe wrapper simple qui contient une liste et donne accès à la propriété size de la liste avec une méthode de lecture compatible JavaBeans. Ce bean est répertorié dans l'extrait 2.25.
Le problème avec la méthode c_rt est que vous devez récupérer la variable de request manuellement, car elle ne la reconnaît pas autrement. À ce stade, vous insérez beaucoup de code pour ce qui devrait être intégré aux fonctionnalités. C'est un défaut GÉANT dans le EL.
J'ai fini par utiliser la méthode "wrapper", voici la classe pour cela;
Une troisième option que personne n'a encore mentionnée consiste à placer la taille de votre liste dans le modèle (en supposant que vous utilisez MVC) comme attribut distinct. 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.
Oui, je trouve que c'est la façon la plus simple de le faire. J'utilise websphere6 avec JSP (système hérité). utilisé le même tablib et ensuite utiliser le «signe dollar» par opposition à «hachage» car le hachage ne fonctionnait pas. ie: {fn: length (SystemBean.list)}
JackDev
0
Vous pouvez éventuellement étendre le langage EL en utilisant le Functor EL , qui vous permettra d'appeler toutes les méthodes Java beans, même avec des paramètres ...
C'est essentiellement la même réponse que celle de Damo .
Artjom B.
6
Comme @ArtjomB. suggère, il n'est généralement pas bon de publier ici ce qui équivaut à la même réponse que quelqu'un d'autre déjà posté. Dans ce cas, il y a presque six ans .
Réponses:
Oui, car un génie du comité de création de l'API Java a décidé que, même si certaines classes ont des
size()
membres ou deslength
attributs, elles ne seront pas implémentéesgetSize()
ougetLength()
que JSF et la plupart des autres standards exigent, vous ne pouvez pas faire ce que vous voulez.Il y a plusieurs façons de procéder.
Un: ajoutez une fonction à votre Bean qui renvoie la longueur:
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
la source
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
xmlns:fn="http://java.sun.com/jsp/jstl/functions"
Vous voulez dire la taille () n'est-ce pas?
fonctionne pour moi (en utilisant JBoss Seam qui a les extensions Jboss EL)
la source
#{MyBean.somelist.size}
(sans les parenthèses à la fin).Remarque: 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 avec la méthode c_rt est que vous devez récupérer la variable de request manuellement, car elle ne la reconnaît pas autrement. À ce stade, vous insérez beaucoup de code pour ce qui devrait être intégré aux fonctionnalités. C'est un défaut GÉANT dans le EL.
J'ai fini par utiliser la méthode "wrapper", voici la classe pour cela;
Une troisième option que personne n'a encore mentionnée consiste à placer la taille de votre liste dans le modèle (en supposant que vous utilisez MVC) comme attribut distinct. 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.
la source
À l'écran, il affiche la taille de la table
Exemple:
Table Size = 5
la source
Vous pouvez éventuellement étendre le langage EL en utilisant le Functor EL , qui vous permettra d'appeler toutes les méthodes Java beans, même avec des paramètres ...
la source
Après 7 ans ... la solution facelets fonctionne toujours très bien pour moi en tant qu'utilisateur jsf
inclure l'espace de noms comme
xmlns:fn="http://java.sun.com/jsp/jstl/functions"
et utilisez le EL comme
#{fn:length(myBean.someList)}
par exemple si vous utilisez dans jsf ui: l'exemple ci-dessous fonctionne bienla source
Vous pouvez obtenir la longueur en utilisant le EL suivant:
# {Bean.list.size ()}
la source