Iteração no Thymeleaf

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.