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


117

Wie würde ich die Länge ArrayListeines JSF-EL-Ausdrucks ermitteln?

#{MyBean.somelist.length}

funktioniert nicht.



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

Sie können auch c: forEach verwenden, um die Liste zu durchlaufen und im Schleifenkörper den Zählwert einer Variablen zuzuweisen, z. B.: <C: set var = "nr_of_items" value = "$ {varStatus.count}" />. Nützlich, besonders wenn Sie die Liste trotzdem durchlaufen.
David Balažic

Antworten:


166

Ja, da einige Genies im Java API-Erstellungskomitee entschieden haben, dass bestimmte Klassen zwar size()Mitglieder oder lengthAttribute haben, diese jedoch nicht implementiert werden getSize()oder getLength()was JSF und die meisten anderen Standards erfordern, können Sie nicht tun, was Sie wollen.

Es gibt verschiedene Möglichkeiten, dies zu tun.

Erstens: 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

In der JSF-Seite:
# {fn: length (MyBean.somelist)}

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

27
Die Verwendung von fn: length hat bei mir mit Bare JSP funktioniert (kein JSF, Facelets; Ultra Legacy-Projekt wird vor dem Auslaufen leicht aktualisiert). Die richtige Taglib zu verwenden:<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
Christopher Parker

57
Für Leute, die wie ich hier landen, noch 2 Jahre später, können Sie Ihrem Facelet den folgenden Namespace hinzufügen: xmlns:fn="http://java.sun.com/jsp/jstl/functions"
Damien MIRAS

59

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

#{MyBean.somelist.size()}

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


Vielleicht unterstützen die neueren Spezifikationen der EL die Größenmethode? Kann jemand dies bestätigen oder leugnen?
James McMahon

2
@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 dies JEE6)
McDowell

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

Danke dir. Es hat auch bei mir funktioniert. +1. Aber bis JEE 6 weitgehend unterstützt wird, bleibe ich wahrscheinlich bei der "Standard" -JSTL-Funktion.
Hosam Aly

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

14

Hinweis: Diese Lösung ist besser für ältere Versionen von JSTL. Für Versionen größer als 1.1 empfehle ich die Verwendung 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 Größenmethode der Liste aufzurufen (eine gültige LinkedList-Methode), aber keine JavaBeans-kompatible Getter-Methode, 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 folgendermaßen 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 Eigenschaft size der Liste bietet. Diese Bean ist in Listing 2.25 aufgeführt.

Das Problem mit der Methode c_rt besteht darin, dass Sie die Variable manuell von der Anforderung abrufen müssen, da sie sonst nicht erkannt wird. Zu diesem Zeitpunkt geben Sie viel Code für die Funktionen ein, die integriert 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, Ihre Listengröße als separates Attribut in das Modell einzufügen (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.



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


Ja, das finde ich am einfachsten. Ich verwende websphere6 mit JSP (Legacy-System). habe dieselbe Tablib verwendet und dann das 'Dollarzeichen' im Gegensatz zu 'Hash' verwendet, da Hash nicht funktioniert hat. dh: {fn: Länge (SystemBean.list)}
JackDev


-1

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

Fügen Sie den Namespace als ein xmlns:fn="http://java.sun.com/jsp/jstl/functions"

und verwenden Sie die EL wie #{fn:length(myBean.someList)}zum Beispiel, wenn die Verwendung in jsf ui: Fragment unter Beispiel gut funktioniert

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

-5

Sie können die Länge mit der folgenden EL erhalten:

# {Bean.list.size ()}


1
Dies ist im Wesentlichen die gleiche Antwort wie bei Damo .
Artjom B.

6
Als @ArtjomB. Es ist im Allgemeinen nicht gut, hier zu posten, was der gleichen Antwort entspricht wie jemand anderes, der bereits gepostet hat. In diesem Fall vor fast sechs Jahren .
Andrew Barber
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.