¿Cómo obtendría la longitud de una ArrayList
expresión JSF EL?
#{MyBean.somelist.length}
No funciona.
¿Cómo obtendría la longitud de una ArrayList
expresión JSF EL?
#{MyBean.somelist.length}
No funciona.
Respuestas:
Sí, ya que algún genio del comité de creación de la API de Java decidió que, aunque ciertas clases tienen size()
miembros o length
atributos, no se implementarán getSize()
o getLength()
que JSF y la mayoría de los otros estándares requieren, no puede hacer lo que quiere.
Hay un par de formas de hacer esto.
Uno: agregue una función a su Bean que devuelva la longitud:
En clase MyBean: public int getSomelistLength () {return this.somelist.length; } En su página JSF: # {MyBean.somelistLength}
Dos: si está usando Facelets (¡Oh, Dios, por qué no está usando Facelets!), Puede agregar el espacio de nombres fn y usar la función de longitud
En la página 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"
¿Te refieres al tamaño () no?
#{MyBean.somelist.size()}
funciona para mí (usando JBoss Seam que tiene las extensiones Jboss EL)
#{MyBean.somelist.size}
(sin el paréntesis al final).
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, incluida otra posible solución;
El problema es que estamos tratando de invocar el método de tamaño de la lista (que es un método válido de LinkedList), pero no es un método getter compatible con JavaBeans, por lo que la expresión list.size-1 no se puede evaluar.
Hay dos formas de abordar este dilema. Primero, puede 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 getter compatible con JavaBeans. Ese bean está listado en el Listado 2.25.
El problema con el método c_rt es que necesita obtener la variable de la solicitud manualmente, porque de lo contrario no la reconoce. En este punto, está ingresando mucho código para lo que debería integrarse en la funcionalidad. Este es un defecto GIGANTE en EL.
Terminé usando el método "envoltorio", aquí está la clase para ello;
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 el tamaño de su lista en el modelo (asumiendo que está usando MVC) como un atributo separado. Entonces, en su modelo tendría "someList" y luego "someListSize". Esa puede ser la forma más sencilla 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 pantalla muestra el tamaño de la mesa
Ejemplo: Table Size = 5
Eventualmente, puede extender el lenguaje EL utilizando EL Functor , que le permitirá llamar a cualquier método de beans de Java, incluso con parámetros ...
Después de 7 años ... la solución de facelets todavía funciona bien para mí como usuario de jsf
incluir el espacio de nombres como
xmlns:fn="http://java.sun.com/jsp/jstl/functions"
y use el EL como,
#{fn:length(myBean.someList)}
por ejemplo, si lo usa en jsf ui: el fragmento debajo del ejemplo funciona bien
<ui:fragment rendered="#{fn:length(myBean.someList) gt 0}">
<!-- Do something here-->
</ui:fragment>
Puede obtener la longitud utilizando el siguiente EL:
# {Bean.list.size ()}