Como você obter o comprimento de uma lista na linguagem de expressão JSF?
Pergunta
Como eu poderia obter o comprimento de um ArrayList
usando uma expressão JSF EL?
#{MyBean.somelist.length}
não funciona.
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
Você pode, eventualmente, estender a linguagem EL usando a EL Functor, o que permitirá que você chamada qualquer feijão métodos Java, mesmo com parâmetros ...
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 ()}