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 da Escola de Programação: Matricula-se na escola de Programação. Junte-se a uma comunidade de mais de 500 mil estudantes. Na Alura você tem acesso a todos os cursos em uma única assinatura; tem novos lançamentos a cada semana; desafios práticos. Clique e saiba mais!

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