tutorial framework etiquetas español ejemplo java jsp jsf jstl el

java - framework - ¿Cómo se obtiene la longitud de una lista en el lenguaje de expresiones JSF?



jsf tutorial netbeans (7)

¿Quieres decir tamaño () no?

#{MyBean.somelist.size()}

funciona para mí (usando JBoss Seam que tiene las extensiones Jboss EL)

¿Cómo obtendría la longitud de una ArrayList usando una expresión JSF EL?

#{MyBean.somelist.length}

No funciona.


Después de 7 años ... la solución de facelets aún funciona bien para mí como usuario de jsf

incluya el espacio de nombres como xmlns:fn="http://java.sun.com/jsp/jstl/functions"

y use EL como #{fn:length(myBean.someList)} por ejemplo si se usa en jsf ui: el fragmento de abajo funciona bien

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


Eventualmente, puede ampliar el idioma EL utilizando el Funcionador EL , que le permitirá llamar a cualquier método de Java beans, incluso con parámetros ...


Puedes obtener la longitud usando el siguiente EL:

# {Bean.list.size ()}


Sí, dado que algunos genios en el comité de creación de la API Java decidieron que, aunque ciertas clases tienen miembros de size() o atributos de length , no implementarán getSize() o getLength() que JSF y la mayoría de los otros estándares requieren, puede '' haz lo que quieras

Hay un par de formas de hacer esto.

Uno: agrega una función a tu Bean que devuelve la longitud:

In class MyBean: public int getSomelistLength() { return this.somelist.length; } In your JSF page: #{MyBean.somelistLength}

Dos: si está usando Facelets (¡Oh Dios, por qué no usa Facelets!), Puede agregar el espacio de nombres fn y usar la función de longitud

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


Nota: Esta solución es mejor para versiones anteriores de JSTL. Para versiones superiores a 1.1, recomiendo usar fn:length(MyBean.somelist) como lo sugiere Bill James .

Este artículo tiene información más detallada, que incluye otra posible solución;

El problema es que estamos intentando invocar el método de tamaño de la lista (que es un método LinkedList válido), pero no es un método getter compatible con JavaBeans, por lo que no se puede evaluar la expresión list.size-1.

Hay dos formas de abordar este dilema. Primero, puedes usar la biblioteca RT Core, así:

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

En segundo lugar, si desea evitar el código Java en sus páginas JSP, puede implementar una clase contenedora simple que contenga una lista y proporcione acceso a la propiedad de tamaño de la lista con un método captador compatible con JavaBeans. Ese bean se encuentra en el listado 2.25.

El problema con el método c_rt es que necesita obtener la variable de la solicitud de forma manual, ya que de lo contrario no lo reconoce. En este punto, está introduciendo una gran cantidad de código para lo que debería integrarse en la funcionalidad. Este es un defecto GIGANTE en el EL.

Terminé usando el método "envoltorio", aquí está la clase para él;

public class CollectionWrapper { Collection collection; public CollectionWrapper(Collection collection) { this.collection = collection; } public Collection getCollection() { return collection; } public int getSize() { return collection.size(); } }

Una tercera opción que nadie ha mencionado todavía es poner su tamaño de lista en el modelo (suponiendo que esté usando MVC) como un atributo separado. Entonces en tu modelo tendrías "someList" y luego "someListSize". Esa puede ser la forma más simple de resolver este problema.


<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%> <h:outputText value="Table Size = #{fn:length(SystemBean.list)}"/>

En la pantalla, muestra el tamaño de la tabla

Ejemplo: Table Size = 5