Trabalhando com coleções usando JSP e JSTL
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.
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" %>