Iteração no Thymeleaf
*1. Visão geral *
Thymeleaf é* um mecanismo de modelo Java versátil para processar documentos XML, XHTML e HTML5 *.
Neste tutorial rápido, veremos como podemos executar a iteração com o Thymeleaf, além de alguns outros recursos fornecidos pela biblioteca.
Para obter mais informações sobre o Thymeleaf, dê uma olhada no link do artigo introdutório:/thymeleaf-in-spring-mvc [aqui].
*2. Dependências do Maven *
Para criar este exemplo, usaremos as bibliotecas Spring Framework junto com as bibliotecas Thymeleaf.
Aqui podemos ver nossas dependências (thymeleaf e https ://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22org.thymeleaf%22%20AND%20a%3A%22thymeleaf-spring4%22 [thymeleaf-spring]):
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf</artifactId>
<version>3.0.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
<version>3.0.9.RELEASE</version>
</dependency>
===* 3. Exemplo de configuração *
Antes de pularmos para a camada de visualização, vamos criar a estrutura MVC para o nosso exemplo.
Começando com o código do snippet da camada do modelo:
public class Student implements Serializable {
private Integer id;
private String name;
//standard contructors, getters, and setters
}
Vamos também fornecer o método do controlador responsável por carregar o modelo e retorná-lo à camada de visualização:
@GetMapping("/listStudents")
public String listStudent(Model model) {
model.addAttribute("students", StudentUtils.buildStudents());
return "listStudents.html";
}
Em nosso exemplo acima, o método buildStudents () simplesmente retorna uma lista de objetos Student que adicionamos ao model.
===* 4. O th: each Attribute *
No Thymeleaf, a iteração é obtida usando o atributo th: each th.
Uma das coisas interessantes sobre esse atributo é que* ele aceita e repete alguns tipos de dados diferentes * , , como:
-
objetos implementando _java.util.Iterable _
-
objetos implementando java.util.Map
-
matrizes *qualquer outro objeto é tratado como se fosse uma lista de valor único contendo um elemento
Agora vamos chamar o th: cada atributo com os dados que configuramos no nosso exemplo acima:
<tr th:each="student: ${students}">
<td th:text="${student.id}"/>
<td th:text="${student.name}"/>
</tr>
O trecho de código mostra o th: each repetindo nossa lista de Students.* O atributo do modelo é acessado usando a anotação $ \ {} *, e cada elemento da lista é passado para o corpo do loop através da variável student .
*5. Variável de status *
O Thymeleaf também* permite um mecanismo útil para acompanhar o processo de iteração por meio da variável de status *.
A variável status fornece as seguintes propriedades:
-
index : o índice de iteração atual, começando com 0 (zero)
-
count : o número de elementos processados até o momento
-
tamanho : o número total de elementos na lista
-
par/ímpar : verifica se o índice de iteração atual é par ou ímpar
-
first : verifica se a iteração atual é a primeira
-
last : verifica se a iteração atual é a última
Vamos ver como a variável status funciona em nosso exemplo:
<tr
th:each="student, iStat : ${students}"
th:style="${iStat.odd}? 'font-weight: bold;'"
th:alt-title="${iStat.even}? 'even' : 'odd'">
<td th:text="${student.id}"/>
<td th:text="${student.name}"/>
</tr>
Aqui, incluímos a propriedade iStat.odd para avaliar a condição e definir um estilo em negrito para a linha atual. O mesmo é feito na próxima avaliação, mas desta vez estamos usando iStat.even para imprimir um valor via atributo HTML alt/title.
Caso omitamos a criação explícita da variável status (apresentada como iStat em nosso exemplo), poderíamos chamar nossa variável status simplesmente usando o studentStat , , que é a agregação da variável student com o sufixo Stat.
6. Conclusão
Neste artigo, exploramos um dos muitos recursos fornecidos pela biblioteca Thymeleaf.
Apresentamos a iteração no Thymeleaf usando o atributo th: each, juntamente com suas propriedades prontas para uso.
Uma versão funcional do código mostrado neste artigo está disponível em nosso GitHub repository.