Trabalhando com coleções usando JSP e JSTL

Trabalhando com coleções usando JSP e JSTL
gmoreira
gmoreira

Compartilhe

Em um projeto usando JSP 2 e JSTL como view, tenho um problema extremamente simples, e que deve ser comum a todos: como descobrir o size() de uma Collection. E como posso chamar o contains() dela, ou outro método qualquer, sem ser um getter?

É aí que muitos sentem saudades do Velocity, que permite escrever algo como $colecao.contains(x) e $colecao.size. Usando a expression language em um JSP isso não funciona, pois você só pode invocar getters. $colecao.size iria chamar colecao.getSize(), que obviamente não funciona. No Velocity e outros engines de template (como o freemarker), ele vai tentar arrancar o size de várias maneiras, inclusive fazendo .size() por reflection.

Ele ainda disse que muita gente que fez a especificação da expression language eram desenvolvedores do velocity, mas que esse tipo de recurso eles não colocaram no JSP pois você estaria colocando regras de negócios dentro da sua camada View, quebrando o MVC.

Banner dinâmico azul da Alura, celebrando seu Aniversário com tecnologia e modernidade. À esquerda, em letras grandes, '20% OFF no Aniversário da Alura', seguido por 'Estude na principal escola de tecnologia do país, com um desconto exclusivo, e eleve sua carreira para o próximo nível'. No centro, uma imagem de um computador com tela e monitor. À direita, conectados por uma linha azul suave representando uma trilha, os tópicos: programação, front-end, inteligência artificial, ciência de dados e muito mais. No final da trilha, um botão azul convida a 'Matricular-se'. No canto superior direito, o logo da Alura. Clique aqui para se matricular!

O Paulo costuma criar uma taglib com funçõezinhas estáticas para chamar do jsp, criando um .tld dentro do seu WEB-INF, por exemplo: ```xml <?xml version="1.0" encoding="UTF-8"?> 1.1 http://www.caelum.com.br/taglib contains br.com.caelum.util.TagLibrary boolean contains(java.util.Collection , br.com.caelum.nomedoprojeto.Option)


Aí, você cria uma classe cheia de métodos estáticos (realmente não é elegante!): ```java
 public class TagLibrary { public static boolean contains(Collection options, Option option) { return options == null ? false : options.contains(option); } } 

E acaba usando na página: ```html <%@ taglib uri="http://www.caelum.com.br/taglib" prefix="m" %>

checked ```Já o Sérgio Lopes disse que você poderia colocar esse linha dentro de um scriptlet, desde que ela esteja dentro de um `.tag`. Depois o Paulo e o Sérgio começaram a brigardiscutir sobre as duas opções, e no fundo me parece que nenhum deles gosta muito de nenhuma das duas.Uma outra saída seria ter alguns métodos que fazem esse trabalho nos seus value objects, como por exemplo ter `getTamanhoDaColecao()` . Mas isso nem sempre é possível e começa a gerar uma quantidade de métodos enorme que são totalmente redundantes.Então eu pergunto, o que fazer para resolver esse tipo de problema com JSP e JSTL?

Veja outros artigos sobre Programação