Come si ottiene la lunghezza di un elenco nel linguaggio delle espressioni JSF?
Domanda
Come posso ottenere la lunghezza di un ArrayList
usando un'espressione EL JSF?
#{MyBean.somelist.length}
non funziona.
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 ()}