Frage

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

#{MyBean.somelist.length}

funktioniert nicht.

War es hilfreich?

Lösung

Ja, da einige Genie im Ausschuss Erstellung Java API entschieden, dass, obwohl bestimmte Klassen haben size() Mitglieder oder length Attribute, werden sie nicht getSize() oder getLength() implementieren, 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.

One: fügen Sie eine Funktion, um Ihre Bean, die die Länge zurückgibt:

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

In your JSF page:
#{MyBean.somelistLength}

Zwei: Wenn Sie mit Facelets (! Oh, Gott, warum Sie nicht Facelets verwenden), können Sie den fn-Namespace hinzufügen und die Länge Funktion

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

Andere Tipps

Du meinst, size () oder nicht?

#{MyBean.somelist.size()}

Arbeiten für mich (mit JBoss Seam, die die Jboss EL Erweiterungen hat)

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


diesem Artikel etwas ausführlichere Informationen, darunter Eine andere mögliche Lösung;

  

Das Problem ist, dass wir versuchen, die Liste der Größe Methode aufzurufen (das eine gültige LinkedList Methode ist), aber es ist keine Java Beans-konforme Getter-Methode, so der Ausdruck list.size-1 kann nicht bewertet werden.

     

Es gibt zwei Möglichkeiten, dieses Dilemma zu lösen. Erstens können Sie die RT-Core-Bibliothek verwenden, wie folgt aus:

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

Zweitens, wenn Sie Java-Code in Ihre JSP-Seiten vermeiden möchten, können Sie eine einfache Wrapper-Klasse implementieren, die eine Liste enthält und bietet Zugriff auf die Eigenschaft Größe der Liste mit einem Java Beans-konforme Getter-Methode. Das Bean ist in aufgelistet 2,25 Eintrag.

Das Problem mit c_rt Methode ist, dass Sie die Variable aus Anforderung manuell erhalten müssen, weil sie es sonst nicht erkennt. An diesem Punkt, den Sie in einer Menge Code setzen für das, was sollte in der Funktionalität eingebaut werden. Dies ist ein GIANT Fehler in der EL.

ich am Ende der „Wrapper“ Methode verwendet, hier ist die Klasse für sie;

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 Möglichkeit, dass noch niemand erwähnt hat, ist die Liste Größe in das Modell zu setzen (vorausgesetzt, Sie verwenden MVC) als separates Attribut. Also in Ihrem Modell würden Sie „someList“ und dann „someListSize“. Das mag einfachste Weg, 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 zeigt es die Tischgröße

Beispiel: Table Size = 5

Sie können schließlich die EL-Sprache erweitern, indem die Verwendung von EL Functor , die es Ihnen erlaubt, zu rufen alle Java-beans Methoden, auch mit den Parametern ...

Nach 7 Jahren ... die facelets Lösung noch funktioniert gut für mich als JSF Benutzer

umfassen den Namensraum als xmlns:fn="http://java.sun.com/jsp/jstl/functions"

und verwenden Sie den EL als #{fn:length(myBean.someList)} zum Beispiel, wenn in JSF mit ui: Fragment unter Beispiel funktioniert

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

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

# {Bean.list.size ()}

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top