@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)}
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)
@ 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.
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.
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
0
Sie können die EL-Sprache eventuell mit dem EL Functor erweitern , mit dem Sie alle Java-Beans-Methoden aufrufen können, auch mit Parametern ...
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 .
Antworten:
Ja, da einige Genies im Java API-Erstellungskomitee entschieden haben, dass bestimmte Klassen zwar
size()
Mitglieder oderlength
Attribute haben, diese jedoch nicht implementiert werdengetSize()
odergetLength()
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:
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
quelle
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
xmlns:fn="http://java.sun.com/jsp/jstl/functions"
Du meinst Größe (), nicht wahr?
funktioniert bei mir (mit JBoss Seam mit den Jboss EL-Erweiterungen)
quelle
#{MyBean.somelist.size}
(ohne die Klammer am Ende).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 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.
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.
quelle
Auf dem Bildschirm wird die Tabellengröße angezeigt
Beispiel:
Table Size = 5
quelle
Sie können die EL-Sprache eventuell mit dem EL Functor erweitern , mit dem Sie alle Java-Beans-Methoden aufrufen können, auch mit Parametern ...
quelle
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 funktioniertquelle
Sie können die Länge mit der folgenden EL erhalten:
# {Bean.list.size ()}
quelle