Pregunta

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

#{MyBean.somelist.length}

no funciona.

¿Fue útil?

Solución

Sí, dado que algunos genios en el comité de creación de la API de Java decidieron que, a pesar de que ciertas clases tienen miembros tamaño () o longitud , no implementarán < código> 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 maneras 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ás usando Facelets (¡Oh, Dios, por qué no estás usando Facelets!), puedes agregar el espacio de nombres fn y usar la función de longitud

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

Otros consejos

Te refieres a tamaño (), ¿verdad?

#{MyBean.somelist.size()}

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

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 lista (que es un método LinkedList válido), pero no es un método de obtención compatible con JavaBeans, por lo que la expresión list.size-1 no puede evaluarse.

     

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

<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 envoltura simple que contenga una lista y proporcione acceso a la propiedad de tamaño de la lista con un método de obtención compatible con JavaBeans. Ese frijol 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, ya que no reconoce de otra manera. En este punto, usted está ingresando una gran cantidad de código para lo que se debe incorporar en la funcionalidad. Este es un defecto GIGANTE en el EL.

Terminé usando la envoltura " " " método, 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 aún es colocar el tamaño de su lista en el modelo (suponiendo que está usando MVC) como un atributo separado. Así que en tu modelo tendrías " 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 la pantalla muestra el tamaño de la tabla

Ejemplo: Tamaño de tabla = 5

Eventualmente, puede extender el lenguaje EL utilizando el EL Functor EL , que le permitirá llamar Cualquier método de Java Beans, incluso con parámetros ...

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

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

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

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

Puedes obtener la longitud utilizando el siguiente EL:

#{Bean.list.size()}

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top