2012-01-07 7 views
5

Eventuali duplicati:
Access the size of a collection in JSP/JSTL/ELPerché ArrayList non ha getSize() invece di size()?

che sto facendo grande uso di ArrayList in alcune pagine JSP. Vorrei accedere a un ArrayList in questo modo:

${myArrayList.size} 

Ma dal momento che gli oggetti devono essere conformi al livello JavaBean, dove myArrayList.getMyPropertyName() è ${myArrayList.myPropertyName} in JSP/JSTL, la funzione myArrayList.size() non è accessibile.

C'è un'altra classe che dovrei usare?

Aggiornamento:

È un po 'difficile da accettare che una caratteristica come ottenere la dimensione del vostro ArrayList in JSP viene lasciato fuori solo per più puliti uno liners, ma sembra che ci possono essere altri motivi i progettisti hanno scelto .size() invece di .getSize()

Immagino che questo non sia un problema se si ha supporto per la sintassi ${fn:length(myArrayList)} o ${myArrayList.getSize()}.

+2

Perché è così che l'hanno scritto. Usa fn: lunghezza come da [qui] (http://stackoverflow.com/questions/3579548/access-the-size-of-a-collection-in-jsp-jstl-el) (e molti altri). –

risposta

11

Il titolo dice tutto: perché non ArrayList ha getSize () invece di size()?

come spiegato in "Java Collections API Design FAQ":

Perché non si usa "i nomi di fagioli-style" per la coerenza?

Mentre i nomi delle nuove collezioni metodi non aderiscono alle i "fagioli convenzioni di denominazione", crediamo che essi sono ragionevole, coerente e appropriato per il loro scopo. È necessario ricordare che le convenzioni di denominazione dei bean non si applicano al JDK nel suo complesso; l'AWT ha adottato queste convenzioni, ma quella decisione è stata alquanto controversa. Sospettiamo che le API delle raccolte vengano utilizzate in modo piuttosto pervasivo, spesso con le chiamate a più metodi su una singola riga di codice, quindi è importante che i nomi siano brevi. Si consideri, ad esempio, i metodi Iterator . Attualmente, un loop su una raccolta è simile al seguente:

 for (Iterator i = c.iterator(); i.hasNext();) 
     System.out.println(i.next()); 
Tutto si adatta perfettamente su una riga, anche se il nome della raccolta è un'espressione lunga. Se abbiamo chiamato i metodi "getIterator", "hasNextElement" e "getNextElement", questo non sarebbe più il caso .Pertanto, abbiamo adottato lo stile JDK "tradizionale" piuttosto che lo stile Bean.

+1

Quindi, nessuna speranza che size() venga deprecata a favore di getSize() allora. – Matthew

+3

@Matthew Non sarà certamente * sostituito * con getSize(), ma in entrambi i casi, sospetto che la cronologia del tuo progetto non reggerebbe il tempo necessario per una modifica JDK. –

+1

@Matthew: No. Anche se improvvisamente tutti dovessero essere d'accordo sul fatto che 'getSize()' fosse un nome * a priori * superiore, ciò non sostituirà mai il mantra "un API è per sempre". Non varrebbe mai la pena di aggiungere 'getSize()' all'interfaccia 'java.util.List' (poiché ciò spezzerebbe tutte le classi di implementazione esistenti), e senza quella modifica, non varrebbe mai la pena di aggiungere' getSize () 'a' java.util.ArrayList' (dato che sarebbe utilizzabile solo su liste di array rappresentate da espressioni aventi il ​​tipo esatto 'ArrayList'). – ruakh

5

Si utilizza la funzione JSTL fn:length (vedere docs).

In primo luogo, dichiarare il namespace fn nella parte superiore della JSP:

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

e poi:

${fn:length(myArrayList)} 
+0

Vorrei poterlo usare. Sto lavorando con una versione precedente di Tomcat che non è compatibile. – Matthew

+1

@ Matthew: Perché no? Hai detto che stavi usando JSP EL (ad esempio '$ {myArrayList.size}'), quindi perché non funziona JSTL? – skaffman

+0

@Matthew Quindi riassembla in un tag personalizzato o esponi la lunghezza dal back-end. –

1

L'ultima versione di EL supporta chiamate di metodi ${collection.size()}

Le altre due risposte che danno maggiori dettagli

  • il collezioni API non è conforme alle JavaBeans spec apposta. Si noti che la dimensione non è necessariamente una proprietà. Alcune implementazioni lo calcolano in modo dinamico. Lo stesso vale per altri metodi - non sono proprietà semplici, e farli sembrare come getter sarebbe inappropriato.
  • prima di EL 2.2 è possibile utilizzare ${fn:length(collection)}

Tra l'altro, in una JSP non si dovrebbe normalmente necessario l'size() di una collezione - basta eseguire iterazioni esso. Se devi eseguire alcuni calcoli, pensa di farlo nel servlet/controller. Certo, sono d'accordo, è valido utilizzarlo a volte nello stesso jsp.