java language - Comment obtenez-vous la longueur d'une liste dans le langage d'expression JSF?





jsp openclassroom (7)


<%@ 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

Comment aurais-je la longueur d'un ArrayList utilisant une expression JSF EL?

#{MyBean.somelist.length}

ne marche pas.




Oui, car un certain génie du comité de création de l'API Java a décidé que même si certaines classes ont des membres length ou des attributs de length , elles getSize() pas getSize() ou getLength() que JSF et la plupart des autres standards exigent. Je fais ce que tu veux.

Il y a plusieurs façons de le faire.

Un: ajouter 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, Dieu, pourquoi n'utilisez-vous pas Facelets!), Vous pouvez ajouter l'espace de noms fn et utiliser la fonction de longueur

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



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

#{MyBean.somelist.size()}

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




Vous pouvez obtenir la longueur en utilisant le EL suivant:

# {Bean.list.size ()}




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




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 ce n'est pas une méthode getter compatible JavaBeans, donc l'expression list.size-1 ne peut pas être évaluée.

Il y a deux façons de résoudre ce dilemme. 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 donne accès à la propriété size de la liste avec une méthode getter compatible JavaBeans. Ce bean est listé dans Listing 2.25.

Le problème avec la méthode c_rt est que vous devez obtenir la variable manuellement, car elle ne la reconnaît pas autrement. À ce stade, vous mettez beaucoup de code pour ce qui devrait être intégré dans la fonctionnalité. C'est un défaut GIANT 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é est de mettre votre taille de liste dans le modèle (en supposant que vous utilisez MVC) en tant qu'attribut séparé. Donc, 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.




Utiliser Blah.valueOf(string) est préférable mais vous pouvez aussi utiliser Enum.valueOf(Blah.class, string) .





java jsp jsf jstl el