Come posso ottenere la lunghezza di ArrayList
un'espressione JSF EL?
#{MyBean.somelist.length}
non funziona.
Come posso ottenere la lunghezza di ArrayList
un'espressione JSF EL?
#{MyBean.somelist.length}
non funziona.
Risposte:
Sì, poiché un genio nel comitato di creazione dell'API Java ha deciso che, anche se alcune classi hanno size()
membri o length
attributi, non verranno implementate getSize()
o getLength()
che JSF e la maggior parte degli altri standard richiedono, non puoi fare quello che vuoi.
Ci sono un paio di modi per farlo.
Uno: aggiungi una funzione al tuo Bean che restituisca la lunghezza:
In classe MyBean: public int getSomelistLength () {return this.somelist.length; } Nella tua pagina JSF: # {} 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
Nella pagina JSF: # {fn: length (MyBean.somelist)}
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
xmlns:fn="http://java.sun.com/jsp/jstl/functions"
Intendi taglia () non è vero?
#{MyBean.somelist.size()}
funziona per me (usando JBoss Seam che ha le estensioni Jboss EL)
#{MyBean.somelist.size}
(senza parentesi alla fine).
Nota: questa soluzione è migliore per le versioni precedenti di JSTL. Per le versioni successive alla 1.1 vi consiglio di utilizzare fn:length(MyBean.somelist)
come suggerito da Bill James .
Questo articolo contiene alcune informazioni più dettagliate, inclusa un'altra possibile soluzione;
Il problema è che stiamo cercando di invocare il metodo size dell'elenco (che è un metodo LinkedList valido), ma non è un metodo getter conforme a JavaBeans, quindi l'espressione list.size-1 non può essere valutata.
Ci sono 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é altrimenti non la riconosce. A questo punto stai inserendo molto codice per ciò che dovrebbe essere integrato nella funzionalità. Questo è un difetto GIGANTE nell'EL.
Ho finito per usare il metodo "wrapper", 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 è inserire la dimensione dell'elenco nel modello (supponendo che tu stia utilizzando MVC) come attributo separato. Quindi nel tuo modello avresti "someList" e poi "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 mostra le dimensioni della tabella
Esempio: Table Size = 5
Puoi eventualmente estendere il linguaggio EL utilizzando EL Functor , che ti consentirà di chiamare qualsiasi metodo Java bean, anche con parametri ...
Dopo 7 anni ... la soluzione facelets funziona ancora bene per me come utente jsf
includere lo spazio dei nomi come
xmlns:fn="http://java.sun.com/jsp/jstl/functions"
e usa EL come
#{fn:length(myBean.someList)}
per esempio se usando in jsf ui: il frammento sotto l'esempio funziona bene
<ui:fragment rendered="#{fn:length(myBean.someList) gt 0}">
<!-- Do something here-->
</ui:fragment>
È possibile ottenere la lunghezza utilizzando il seguente EL:
# {Bean.list.size ()}