Wie würde ich die Länge ArrayList
eines JSF-EL-Ausdrucks ermitteln?
#{MyBean.somelist.length}
funktioniert nicht.
Wie würde ich die Länge ArrayList
eines JSF-EL-Ausdrucks ermitteln?
#{MyBean.somelist.length}
funktioniert nicht.
Antworten:
Ja, da einige Genies im Java API-Erstellungskomitee entschieden haben, dass bestimmte Klassen zwar size()
Mitglieder oder length
Attribute 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)}
<%@ 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?
#{MyBean.somelist.size()}
funktioniert bei mir (mit JBoss Seam mit den Jboss EL-Erweiterungen)
#{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 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.
<%@ 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
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 ...
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>
Sie können die Länge mit der folgenden EL erhalten:
# {Bean.list.size ()}