Domanda

Come posso ottenere la lunghezza di un ArrayList usando un'espressione EL JSF?

#{MyBean.somelist.length}

non funziona.

È stato utile?

Soluzione

Sì, dal momento che alcuni membri del comitato di creazione dell'API Java hanno deciso che, anche se alcune classi hanno membri size () o attributi length , non implementeranno < code> getSize () o getLength () richiesti da JSF e dalla maggior parte degli altri standard, non puoi fare quello che vuoi.

Ci sono un paio di modi per farlo.

Uno: aggiungi una funzione al tuo bean che restituisce la lunghezza:

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

In your JSF page:
#{MyBean.somelistLength}

Due: se stai usando Facelets (Oh, Dio, perché non stai usando Facelets!), puoi aggiungere lo spazio dei nomi fn e usare la funzione length

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

Altri suggerimenti

Intendi size (), vero?

#{MyBean.somelist.size()}

funziona per me (usando JBoss Seam che ha le estensioni EL Jboss)

Nota: questa soluzione è migliore per le versioni precedenti di JSTL. Per versioni successive alla 1.1 consiglio di usare fn: length (MyBean.somelist) come suggerito da Bill James .


Questo articolo contiene alcune informazioni più dettagliate, tra cui un'altra possibile soluzione;

  

Il problema è che stiamo provando a invocare il metodo size della lista (che è un metodo LinkedList valido), ma non è un metodo getter conforme a JavaBeans, quindi l'espressione list.size-1 non può essere valutata.

     

Esistono due modi per affrontare questo dilemma. Innanzitutto, puoi utilizzare la libreria RT Core, in questo modo:

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

In secondo luogo, se si desidera evitare il codice Java nelle pagine JSP, è possibile implementare una semplice classe wrapper che contiene un elenco e fornisce l'accesso alla proprietà size dell'elenco con un metodo getter conforme a JavaBeans. Quel bean è elencato nel Listato 2.25.

Il problema con il metodo c_rt è che è necessario ottenere manualmente la variabile dalla richiesta, perché non la riconosce diversamente. A questo punto stai inserendo un sacco di codice per ciò che dovrebbe essere integrato nella funzionalità. Questo è un GIGANTE difetto nell'EL.

Ho finito per usare il "wrapper" metodo, ecco la classe per questo;

public class CollectionWrapper {

    Collection collection;

    public CollectionWrapper(Collection collection) {
        this.collection = collection;
    }

    public Collection getCollection() {
        return collection;
    }

    public int getSize() {
        return collection.size();
    }
}

Una terza opzione che nessuno ha ancora menzionato è quella di inserire le dimensioni della lista nel modello (supponendo che si stia utilizzando MVC) come attributo separato. Quindi nel tuo modello avresti " someList " e quindi " someListSize " ;. Questo potrebbe essere il modo più semplice per risolvere questo problema.

<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>

<h:outputText value="Table Size = #{fn:length(SystemBean.list)}"/>

Sullo schermo visualizza le dimensioni della tabella

Esempio: Table Size = 5

Puoi eventualmente estendere il linguaggio EL usando EL Functor , che ti permetterà di chiamare qualsiasi metodo bean Java, anche con parametri ...

Dopo 7 anni ... la soluzione facelets funziona ancora bene per me come utente jsf

include lo spazio dei nomi come xmlns: fn = " http: //java.sun.com/jsp/jstl/functions"

e usa EL come # {fn: length (myBean.someList)} ad esempio se si utilizza in jsf ui: il frammento sotto l'esempio funziona bene

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

Puoi ottenere la lunghezza usando il seguente EL:

{# Bean.list.size ()}

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top