2012-01-07 22 views
5

Duplicar posible:
Access the size of a collection in JSP/JSTL/EL¿Por qué ArrayList no tiene getSize() en lugar de size()?

Estoy haciendo un uso intensivo de ArrayList en algunas páginas JSP. Me gustaría tener acceso a un ArrayList de esta manera:

${myArrayList.size} 

Pero ya que los objetos deben a cumplen el estándar de JavaBean, donde myArrayList.getMyPropertyName() es ${myArrayList.myPropertyName} en JSP/JSTL, la función myArrayList.size() no es accesible.

¿Hay otra clase que debería usar?

Actualización:

Es un poco difícil de aceptar que una característica como obtener el tamaño de su ArrayList en JSP se deja fuera sólo para limpios trazadores de líneas uno, pero parece que no puede haber otras razones, los diseñadores optaron .size() vez de .getSize()

supongo que esto realmente no es un problema si usted tiene soporte para ${fn:length(myArrayList)} o ${myArrayList.getSize()} sintaxis.

+2

Porque así lo escribieron. Use fn: length de acuerdo con [aquí] (http://stackoverflow.com/questions/3579548/access-the-size-of-a-collection-in-jsp-jstl-el) (y muchos otros). –

Respuesta

11

El título lo dice todo: ¿Por qué no tener ArrayList getSize () en lugar de tamaño()?

Como se explica en "Java Collections API Design FAQ":

¿Por qué no se utiliza "nombres de estilo Beans" para mantener la coherencia?

Mientras que los nombres de las nuevas colecciones de métodos no se adhieren a los "Frijoles convenciones de nombres", que creen que son razonable, coherente y adecuada a su propósito. Se debe recordar que las convenciones de nomenclatura de Beans no se aplican al JDK en su conjunto; el AWT sí adoptó estas convenciones, pero la decisión fue un tanto controvertida. Sospechamos que las API de colecciones se usarán de forma generalizada, a menudo con llamadas a múltiples métodos en una sola línea de código, por lo que es importante que los nombres sean cortos. Considere, por ejemplo, los métodos Iterator . Actualmente, un ciclo sobre una colección se ve así:

 for (Iterator i = c.iterator(); i.hasNext();) 
     System.out.println(i.next()); 
Todo se ajusta perfectamente en una línea, incluso si el nombre de la Colección es una expresión larga. Si nombramos los métodos "getIterator", "hasNextElement" y "getNextElement", esto ya no sería el caso .Por lo tanto, adoptamos el estilo JDK "tradicional" en lugar del estilo Beans .

+1

Entonces, no hay esperanzas de que size() se deprecie a favor de getSize(). – Matthew

+3

@Matthew Ciertamente no será * reemplazado * por getSize(), pero de cualquier forma, sospecho que la línea de tiempo de su proyecto no resistiría el tiempo requerido para un cambio de JDK. –

+1

@Matthew: No. Incluso si todos de repente estuvieran de acuerdo en que 'getSize()' era un nombre * a priori * superior, eso nunca reemplazaría al mantra de "una API es para siempre". Nunca valdría la pena agregar 'getSize()' a la interfaz 'java.util.List' (ya que eso rompería todas las clases de implementación existentes), y sin ese cambio, nunca valdría la pena agregar' getSize () 'to' java.util.ArrayList' (ya que solo se puede usar en listas de arreglos representadas por expresiones que tienen el tipo exacto 'ArrayList'). – ruakh

5

Utiliza la función fn:length JSTL (consulte docs).

En primer lugar, declarar el espacio de nombres fn en la parte superior de la página JSP:

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

y luego:

${fn:length(myArrayList)} 
+0

Ojalá pudiera usar esto. Estoy trabajando con una versión anterior de Tomcat que no es compatible. – Matthew

+1

@Matthew: ¿Por qué no? Dijiste que estabas usando JSP EL (por ejemplo '$ {myArrayList.size}'), ¿por qué no funciona JSTL? – skaffman

+0

@Matthew A continuación, envuélvalo en una etiqueta personalizada o exponga la longitud desde la parte posterior. –

1

La versión más reciente de EL soporta llamadas de métodos ${collection.size()}

Las otras dos respuestas que dan más detalles

  • la API de colecciones no se ajusta a los JavaBeans spec a propósito. Tenga en cuenta que el tamaño no es necesariamente una propiedad. Algunas implementaciones lo calculan dinámicamente. Lo mismo ocurre con otros métodos: no son propiedades simples, y hacer que se vean como getters sería inapropiado.
  • antes de EL 2.2 se puede utilizar ${fn:length(collection)}

Por cierto, en un JSP que Normalmente no debería tener el size() de una colección - que acaba de iterar ella. Si tiene que realizar algunos cálculos, piense en hacer eso en el servlet/controlador. Por supuesto, estoy de acuerdo, es válido usar eso a veces en el jsp mismo.

Cuestiones relacionadas