Como obteria o comprimento de um ArrayList
usando uma expressão JSF EL?
#{MyBean.somelist.length}
não funciona.
Como obteria o comprimento de um ArrayList
usando uma expressão JSF EL?
#{MyBean.somelist.length}
não funciona.
Respostas:
Sim, uma vez que algum gênio no comitê de criação da API Java decidiu que, embora certas classes tenham size()
membros ou length
atributos, eles não irão implementar getSize()
ou getLength()
que JSF e a maioria dos outros padrões exigem, você não pode fazer o que deseja.
Existem algumas maneiras de fazer isso.
Um: adicione uma função ao seu Bean que retorne o comprimento:
Na aula MyBean: public int getSomelistLength () {return this.somelist.length; } Em sua página JSF: # {MyBean.somelistLength}
Dois: se você estiver usando Facelets (ah, meu Deus, por que não está usando Facelets!), Você pode adicionar o namespace fn e usar a função de comprimento
Na 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"
Você quer dizer tamanho () não é?
#{MyBean.somelist.size()}
funciona para mim (usando JBoss Seam que tem as extensões Jboss EL)
#{MyBean.somelist.size}
(sem o parêntese no final).
Nota: Esta solução é melhor para versões mais antigas do JSTL. Para versões superiores a 1.1, recomendo usar fn:length(MyBean.somelist)
conforme sugerido por Bill James .
Este artigo contém algumas informações mais detalhadas, incluindo outra solução possível;
O problema é que estamos tentando invocar o método de tamanho da lista (que é um método LinkedList válido), mas não é um método getter compatível com JavaBeans, portanto, a expressão list.size-1 não pode ser avaliada.
Existem duas maneiras de resolver esse dilema. Primeiro, você pode usar a biblioteca RT Core, assim:
<c_rt:out value='<%= list[list.size()-1] %>'/>
Em segundo lugar, se quiser evitar o código Java em suas páginas JSP, você pode implementar uma classe de wrapper simples que contém uma lista e fornece acesso à propriedade size da lista com um método getter compatível com JavaBeans. Esse bean está listado na Listagem 2.25.
O problema com o método c_rt é que você precisa obter a variável do pedido manualmente, porque ele não a reconhece de outra forma. Neste ponto, você está inserindo uma grande quantidade de código para o que deve ser integrado à funcionalidade. Esta é uma falha GIGANTE no EL.
Acabei usando o método "wrapper", aqui está a aula para isso;
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 mencionou ainda é colocar o tamanho da lista no modelo (presumindo que você esteja usando MVC) como um atributo separado. Portanto, em seu modelo, você teria "someList" e "someListSize". Essa pode ser a maneira mais simples de resolver esse problema.
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<h:outputText value="Table Size = #{fn:length(SystemBean.list)}"/>
Na tela mostra o tamanho da mesa
Exemplo: Table Size = 5
Você pode eventualmente estender a linguagem EL usando o EL Functor , que permitirá que você chame quaisquer métodos de Java beans, mesmo com parâmetros ...
Após 7 anos ... a solução facelets ainda funciona bem para mim como um usuário jsf
inclua o namespace como
xmlns:fn="http://java.sun.com/jsp/jstl/functions"
e usar o EL como
#{fn:length(myBean.someList)}
por exemplo se usar em jsf ui: o fragmento abaixo do exemplo funciona bem
<ui:fragment rendered="#{fn:length(myBean.someList) gt 0}">
<!-- Do something here-->
</ui:fragment>
Você pode obter o comprimento usando o seguinte EL:
# {Bean.list.size ()}