JSP-EL para Collection.contains(), é possivel?

10 respostas
rbroz85

Bom dia amigos...

estou procurando uma solução para exbição de um botao.
em uma Collection de inteiros por exemplo... gostaria de exibir o botao caso ja exista algum numero passado para a coleçao.

seria algo assim:

if(usuario.getIntegerCollection().contains(numero))
           // mostrar botao
porem gostaria isso em EL, é possivel ? eu vi a mesma duvida de um cara na net:

---

I've been searching for a JSP-EL equivalent for Collection.contains( )
API. My searches on google and other groups turned no results - I was
wondering if someone out here has a solution. Basically I have a
collection of Integers (ArrayList) in an HTTP request, accessible to a
JSP. I need to add a condition against the presence of an integer in
this list. Looking for something like

<c:if test="${listOfIntegers.contains(${number})}">
<!-- display an extra icon -->
</c:if>

---

no caso do cara acima, é possivel ?
tem como eu colocar isso no rendered da tag jsf ?

obrigado a todos

10 Respostas

andre.santos

Olá.

No JSF é ainda mais fácil, só vc usar ‘empty’, segue exemplo:

&lt;%--Só exibe o botão se a Collection não for vazia--%&gt;

&lt;h:commandButton ... rendered="#{!empty (listOfIntegers)}" /&gt;

Espero q ajude!

[]'s

rbroz85

ahh entao brow… nesse caso… vc esta testando se a lista esta fazia ou nao

eu gostaria… de testar se um objeto existe na lista pra eu exibir meu botao… sacou ?

mas obrigado pela atençao

andre.santos

Até onde sei, não existe uma função para verificar se existe um determinado objeto em uma Collection, creio q vc precisará implementar um método no seu Managedbean para fazer a verificação.

Alguém me corrija se eu estiver falando besteira.

[]'s

gomesrod
O jeito mais simples é esse:
// Botão
rendered="#{myManagedBean.listContainsNumber}"

// Managed Bean
public boolean getListContainsNumber() {
    // Verifica se existe e retorna true or false
}
Mas ele tem uma limitação: O número que você quer procurar tem que ser conhecido dentro do método isNumberExist(), pois não é possível passar parâmetro ao ler uma propriedade de um Bean. Se o conjunto de números for limitado e conhecido, você pode criar vários métodos:
button rendered="#{myManagedBean.listContais1}"
button rendered="#{myManagedBean.listContais2}"
button rendered="#{myManagedBean.listContais50}"
Se não for, bem-vindo ao clube dos que tiveram que apelar para gambiarras porque não é possível passar parâmetros em uma expressão do Jsf.
B

Também estou com o mesmo problema… alguém sabe como resolver?

Possuo uma Collection em um Managed Bean de escopo session. Para saber se aparecerá um link dentro da linha de uma tabela, preciso saber se o id daquela linha contém nesta Collection.

:x

Foxlol

Veja se isso funciona:

<c:if test="${listOfIntegers[number] != null}">  
   <!-- display an extra icon -->  
</c:if>
B

Fou fazer uns testes aí posto se deu certo ou não…

Mas valeu pela resposta ;p

B

Me corriga se eu estiver errado, mas o number que está entre chaves será o índice da lista?? Ou será um elemento desta?

Eu fiz uns testes aqui… mas continuou não funcionando… se ajudar, estou utilizando ADF Faces 11g. No Expression Builder do JDeveloper 11g ele possibilita a utilização do método contains, porém pesquisando não encontrei nada a respeito e tentei de tudo quanto é jeito fazer isto funcionar.

:roll:

Foxlol

Hmm eh verdade, do jeito que passei o number seria um índice, desculpe.

Uma possível abordagem seria utilizar um Map ao invés de List.

Map<Integer, Boolean> mapOfIntegers = new HashMap<Integer, Boolean>();

Aí daria para fazer assim:

<c:if test="${mapOfIntegers[number]}">  
   <!-- display an extra icon -->  
</c:if>

Vc poderia definir que um Integer (o botão no caso) está ativo setando true para o valor do map:

mapOfIntegers.put(1, true);

Para desativar o valor:

mapOfIntegers.put(1, false);

O que ainda possibilita utilizar alguma expressão lógica com base nos dados da aplicação para definir se o botão está ativo ou não, tipo:

mapOfIntegers.put(1, verificarCampoXPreenchido());

E por aí vai…

B

Olha...

na minha tabela, eu exibo 3 informações:
#{node.idPessoa}
#{node.nmPessoa}
#{node.idadePessoa}

eu tenho um link, que deverá aparecer somente se o id da pessoa estiver em uma relação recuperada do banco de dados e armazenada no atributo de um managed bean de sessão.

public class MyMBean {

    private Map<Integer, Boolean> mapPessoas;

    public void setMapPessoas(Map<Integer, Boolean> mapPessoas) {
        this.mapPessoas = mapPessoas;
    }

    public Map<Integer, Boolean> getMapPessoas() {
        return mapPessoas;
    }
}

Quando busco a relação de ids de pessoas do banco de dados, adiciono cada id juntamente com com o valor Boolean.TRUE no mapPessoas(assim como você demonstrou).

Então, na propriedade rendered do link(que está na tabela), eu tentei colocar assim:
#{MyMBean.mapPessoas[node.idPessoa]}
também já tentei assim
#{MyMBean.mapPessoas[node.idPessoa] != null}

E nada. Já verifiquei os dados do Map e estão todos ok. Não entendo o pq de não funcionar :(

Criado 11 de setembro de 2009
Ultima resposta 11 de dez. de 2009
Respostas 10
Participantes 5