wake-up-neo.com

Wie erhält man die Länge einer Liste in der JSF-Ausdruckssprache?

Wie würde ich die Länge eines ArrayList mit einem JSF-EL-Ausdruck erhalten?

#{MyBean.somelist.length}

funktioniert nicht.

116
GBa

Ja, da einige Genies im Java API-Erstellungskomitee) entschieden haben, dass bestimmte Klassen, obwohl sie size() -Mitglieder oder length -Attribute haben, diese nicht implementieren getSize() oder getLength(), die JSF und die meisten anderen Standards erfordern, können Sie nicht tun, was Sie wollen.

Es gibt ein paar Möglichkeiten, dies zu tun.

Eins: Fügen Sie Ihrer Bean eine Funktion hinzu, die die Länge zurückgibt:

 In der Klasse MyBean: 
 Public int getSomelistLength () {return this.somelist.length; } 
 
 Auf Ihrer JSF-Seite: 
 # {MyBean.somelistLength} 

Zweitens: Wenn Sie Facelets verwenden (Oh Gott, warum verwenden Sie keine Facelets!), Können Sie den fn-Namespace hinzufügen und die Längenfunktion verwenden

 Auf der JSF-Seite: 
 # {Fn: length (MyBean.somelist)} 
163
billjamesdev

Du meinst Größe (), nicht wahr?

#{MyBean.somelist.size()}

funktioniert bei mir (mit JBoss Seam mit den JBoss EL-Erweiterungen)

57
Damo

Hinweis: Diese Lösung ist besser für ältere Versionen von JSTL. Für Versionen größer als 1.1 empfehle ich die Verwendung von fn:length(MyBean.somelist), wie von Bill James vorgeschlagen.


Dieser Artikel enthält einige detailliertere Informationen, einschließlich einer anderen möglichen Lösung;

Das Problem ist, dass wir versuchen, die size-Methode der Liste (eine gültige LinkedList-Methode) aufzurufen, diese jedoch keine JavaBeans-kompatible Getter-Methode ist, sodass der Ausdruck list.size-1 nicht ausgewertet werden kann.

Es gibt zwei Möglichkeiten, um dieses Dilemma anzugehen. Zunächst können Sie die RT Core-Bibliothek wie folgt verwenden:

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

Zweitens können Sie, wenn Sie Java Code in Ihren JSP-Seiten vermeiden möchten, eine einfache Wrapper-Klasse implementieren, die eine Liste enthält und mit einer JavaBeans-kompatiblen Getter-Methode Zugriff auf die size-Eigenschaft der Liste bietet. Diese Bohne ist in Listing 2.25 aufgeführt.

Das Problem mit der c_rt-Methode besteht darin, dass Sie die Variable manuell aus der Anforderung abrufen müssen, da sie sonst nicht erkannt wird. An diesem Punkt geben Sie eine Menge Code für die Funktionen ein, die eingebaut werden sollen. Dies ist ein [~ # ~] riesiger [~ # ~] Fehler in der EL.

Am Ende habe ich die "Wrapper" -Methode verwendet. Hier ist die Klasse dafür.

public class CollectionWrapper {

    Collection collection;

    public CollectionWrapper(Collection collection) {
        this.collection = collection;
    }

    public Collection getCollection() {
        return collection;
    }

    public int getSize() {
        return collection.size();
    }
}

Eine dritte Option, die noch niemand erwähnt hat, besteht darin, die Listengröße in das Modell aufzunehmen (vorausgesetzt, Sie verwenden MVC) als separates Attribut. In Ihrem Modell hätten Sie also "someList" und dann "someListSize". Dies ist möglicherweise der einfachste Weg, um dieses Problem zu lösen.

14
James McMahon
<%@ taglib uri="http://Java.Sun.com/jsp/jstl/functions" prefix="fn"%>

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

Auf dem Bildschirm wird die Tabellengröße angezeigt

Beispiel: Table Size = 5

6
pudaykiran

Sie können die EL-Sprache eventuell erweitern, indem Sie EL Functor verwenden, mit dem Sie beliebige Java beans-Methoden aufrufen können, auch mit Parametern ...

0
Romain Linsolas