Pergunta

Como eu poderia obter o comprimento de um ArrayList usando uma expressão JSF EL?

#{MyBean.somelist.length}

não funciona.

Foi útil?

Solução

Sim, desde que algum gênio na comissão de criação API Java decidiu que, apesar de certas classes tem membros size() ou atributos length, eles não vão implementar getSize() ou getLength() que JSF ea maioria dos outros padrões exigem, você não pode fazer o que você quer.

Há algumas maneiras de fazer isso.

Um: adicionar uma função ao seu feijão que retorna o comprimento:

In class MyBean:
public int getSomelistLength() { return this.somelist.length; }

In your JSF page:
#{MyBean.somelistLength}

Dois: Se você estiver usando Facelets (! Oh, Deus, por que você não está usando Facelets), você pode adicionar o namespace fn e usar a função de duração

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

Outras dicas

Você tamanho médio () não é?

#{MyBean.somelist.size()}

funciona para mim (usando JBoss Seam que tem as extensões Jboss EL)

Nota: Esta solução é melhor para versões mais antigas do JSTL. Para as versões maior que 1,1 Eu recomendo usar fn:length(MyBean.somelist) como sugerido por Bill James .


Este artigo tem alguma informação mais detalhada, incluindo outra solução possível;

O problema é que estamos a tentar chamar o método tamanho da lista (que é um método LinkedList válido), mas não é um método getter JavaBeans-compliant, então a expressão list.size-1 não pode ser avaliada.

Há duas maneiras para resolver este dilema. Primeiro, você pode usar a biblioteca RT Core, como este:

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

Em segundo lugar, se você quiser evitar o código Java em suas páginas JSP, você pode implementar uma classe de invólucro simples que contém uma lista e fornece acesso a propriedade de tamanho da lista com um método getter JavaBeans conformes. Que o feijão está listada na Listagem 2.25.

O problema com o método c_rt é que você precisa para obter a variável de pedido manualmente, porque não reconhecê-lo de outra forma. Neste ponto, você está colocando em um monte de código para o que deve ser construído em termos de funcionalidade. Este é um GIGANTE falha no EL.

Acabei usando o método "wrapper", aqui é a classe para ele;

public class CollectionWrapper {

    Collection collection;

    public CollectionWrapper(Collection collection) {
        this.collection = collection;
    }

    public Collection getCollection() {
        return collection;
    }

    public int getSize() {
        return collection.size();
    }
}

Uma terceira opção que ninguém tenha mencionado ainda é colocar o seu tamanho da lista para o modelo (supondo que você está usando MVC) como um atributo separado. Assim, no seu modelo que você teria "someList" e depois "someListSize". Isso pode ser a maneira mais simples de resolver esta questão.

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

<h:outputText value="Table Size = #{fn:length(SystemBean.list)}"/>

Na tela que exibe o tamanho da tabela

Exemplo: Table Size = 5

Depois de 7 anos ... a solução facelets ainda funciona bem para mim como um usuário jsf

incluir o namespace como xmlns:fn="http://java.sun.com/jsp/jstl/functions"

e usar o SR como #{fn:length(myBean.someList)} por exemplo, se usando em ui jsf: Fragmento abaixo exemplo funciona bem

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

Você pode obter o comprimento usando a seguinte EL:

# {Bean.list.size ()}

scroll top