Wie erhalten Sie die Länge einer Liste in der JSF-Ausdruckssprache?

Lesezeit: 5 Minuten

Benutzer-Avatar
GBa

Wie bekomme ich die Länge von an ArrayList Verwenden Sie einen JSF-EL-Ausdruck?

#{MyBean.somelist.length}

funktioniert nicht.

  • Verwandte: Wie zeigt man den Wert von List#size() in JSF EL an?

    – BalusC

    23. August 2011 um 15:25 Uhr

  • @GBa Sie können #{MyBean.somelist.size()} verwenden, um die Größe der Liste anzuzeigen.

    – Umair

    6. August 2014 um 5:45 Uhr

  • Sie könnten auch c:forEach verwenden, um die Liste zu durchlaufen und im Schleifenkörper den Zählwert einer Variablen zuweisen, wie: . Nützlich, besonders wenn Sie die Liste sowieso durchlaufen.

    – David Balažic

    6. Januar 2015 um 13:18 Uhr

Benutzer-Avatar
billjamesdev

Ja, da einige Genies im Java-API-Erstellungskomitee dies entschieden haben, obwohl bestimmte Klassen dies getan haben size() Mitglieder bzw length Attribute, sie werden nicht implementiert 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.

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

In class MyBean:
public int getSomelistLength() { return this.somelist.length; }

In your JSF page:
#{MyBean.somelistLength}

Zweitens: Wenn Sie Facelets verwenden (Oh Gott, warum verwenden Sie Facelets nicht!), können Sie den fn-Namespace hinzufügen und die length-Funktion verwenden

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

  • fn ist wahrscheinlich der richtige Weg, leider ist es nur in JSTL-Versionen größer als 1.1 verfügbar.

    – James McMahon

    27. Januar 2010 um 13:36 Uhr

  • Die Verwendung von fn:length funktionierte für mich mit nacktem JSP (kein JSF, Facelets; Ultra-Legacy-Projekt, das vor dem Auslaufen leicht aktualisiert wird). Die richtige zu verwendende Taglib: <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>

    – Christoph Parker

    17. Februar 2010 um 20:01 Uhr

  • Für Leute, die hier wie ich landen, immer noch 2 Jahre später, sollten Sie in Betracht ziehen, dass Sie Ihrem Facelet den folgenden Namensraum hinzufügen: xmlns:fn="http://java.sun.com/jsp/jstl/functions"

    – Damien MIRAS

    15. Juli 2011 um 8:47 Uhr


Benutzer-Avatar
Damo

Du meinst size() oder?

#{MyBean.somelist.size()}

funktioniert für mich (mit JBoss Seam, das die Jboss EL-Erweiterungen hat)

  • Vielleicht unterstützen die neueren Spezifikationen der EL die Größenmethode? Kann das jemand bestätigen oder dementieren?

    – James McMahon

    1. September 2009 um 11:29 Uhr

  • @nemo – dies wird in einer JSR245-Wartungsversion behandelt: blogs.sun.com/kchung/entry/jsr_245_mr_part_i (In Bezug auf die JEE-Spezifikationen ist das JEE6)

    – McDowell

    1. September 2009 um 11:46 Uhr

  • @McDowell, danke für die Info, ich bin wirklich überrascht, dass sie so lange gebraucht haben, um das Problem zu beheben.

    – James McMahon

    1. September 2009 um 12:11 Uhr

  • Vielen Dank. Bei mir hat es auch funktioniert. +1. Aber bis JEE 6 weitgehend unterstützt wird, werde ich wahrscheinlich bei der “eher standardmäßigen” JSTL-Funktion bleiben.

    – Hosam Ali

    2. September 2009 um 5:08 Uhr

  • Übrigens funktioniert es wahrscheinlich in JBoss, um nur zu sagen #{MyBean.somelist.size} (ohne die Klammer am Ende).

    – Hosam Ali

    8. September 2009 um 10:04 Uhr

Benutzer-Avatar
James McMahon

Notiz: 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 hat einige detailliertere Informationen, einschließlich einer anderen möglichen Lösung;

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

Es gibt zwei Möglichkeiten, diesem Dilemma zu begegnen. 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 Größeneigenschaft der Liste bietet. Diese Bean ist in Listing 2.25 aufgeführt.

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

Am Ende habe ich die Methode “wrapper” 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, Ihre Listengröße als separates Attribut in das Modell aufzunehmen (vorausgesetzt, Sie verwenden MVC). In Ihrem Modell hätten Sie also “someList” und dann “someListSize”. Dies ist möglicherweise der einfachste Weg, um dieses Problem zu lösen.

  • auch stackoverflow.com/questions/1332169/…

    – baybora.oren

    9. Januar 2012 um 22:09 Uhr

Benutzer-Avatar
UdayKiran Pulipati

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

Benutzer-Avatar
Arry

Nach 7 Jahren … funktioniert die Facelets-Lösung für mich als jsf-Benutzer immer noch einwandfrei

schließen Sie den Namensraum als ein
xmlns:fn="http://java.sun.com/jsp/jstl/functions"

und benutze die EL als
#{fn:length(myBean.someList)} zum Beispiel, wenn die Verwendung in jsf ui:fragment unten Beispiel funktioniert gut

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

Benutzer-Avatar
Romain Linsolas

Sie können die EL-Sprache schließlich erweitern, indem Sie die verwenden EL-Funktormit dem Sie beliebige Java-Beans-Methoden aufrufen können, sogar mit Parametern …

Benutzer-Avatar
Soujanya

Die Länge erhalten Sie mit folgendem EL:

#{Bean.list.size()}

  • Dies ist im Wesentlichen die gleiche Antwort wie die von Damo.

    – Artjom B.

    29. Juli 2014 um 19:47 Uhr

  • Als @ArtjomB. schlägt vor, dass es hier im Allgemeinen nicht gut ist, etwas zu posten, das auf die gleiche Antwort hinausläuft wie jemand anderes, der bereits gepostet hat. In diesem Fall fast vor sechs Jahren.

    – Andreas Friseur

    29. Juli 2014 um 19:52 Uhr

1321580cookie-checkWie erhalten Sie die Länge einer Liste in der JSF-Ausdruckssprache?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy