Trabalhando com coleções usando JSP e JSTL
![Trabalhando com coleções usando JSP e JSTL](https://www.alura.com.br/artigos/assets/code/trabalhando-com-colecoes-usando-jsp-e-jstl.1722045633.png)
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!](assets/alura-matricula-maior-escola-tecnologia-brasil-mais-500-mil-estudantes/matricula-escola-programacao-alura-saiba-mais-versao-mobile.png)
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"?>
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" %>