Introdução ao uso do Thymeleaf na primavera

Introdução ao uso do Thymeleaf na primavera

1. Introdução

Thymeleaf é um mecanismo de modelo Java para processar e criar HTML, XML, JavaScript, CSS e texto.

Neste artigo, discutiremoshow to use Thymeleaf with Spring junto com alguns casos de uso básicos na camada de visualização de um aplicativo Spring MVC.

A biblioteca é extremamente extensível e sua capacidade de modelagem natural garante que os modelos possam ser prototipados sem um back-end - o que torna o desenvolvimento muito rápido quando comparado com outros mecanismos de modelos populares, como JSP.

2. Integrando Thymeleaf com Spring

Primeiro, vamos ver as configurações necessárias para integrar-se ao Spring. A bibliotecathymeleaf-spring é necessária para a integração.

Adicione as seguintes dependências ao seu arquivo Maven POM:


    org.thymeleaf
    thymeleaf
    3.0.9.RELEASE


    org.thymeleaf
    thymeleaf-spring4
    3.0.9.RELEASE

Observe que, para um projeto Spring 4, a bibliotecathymeleaf-spring4 deve ser usada em vez dethymeleaf-spring5.

A classeSpringTemplateEngine executa todas as etapas de configuração. Você pode configurar esta classe como um bean no arquivo de configuração Java:

@Bean
@Description("Thymeleaf Template Resolver")
public ServletContextTemplateResolver templateResolver() {
    ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver();
    templateResolver.setPrefix("/WEB-INF/views/");
    templateResolver.setSuffix(".html");
    templateResolver.setTemplateMode("HTML5");

    return templateResolver;
}

@Bean
@Description("Thymeleaf Template Engine")
public SpringTemplateEngine templateEngine() {
    SpringTemplateEngine templateEngine = new SpringTemplateEngine();
    templateEngine.setTemplateResolver(templateResolver());
    templateEngine.setTemplateEngineMessageSource(messageSource());
    return templateEngine;
}

As propriedades do beantemplateResolverprefixesuffix indicam a localização das páginas de visualização no diretóriowebapp e sua extensão de nome de arquivo, respectivamente.

A interfaceViewResolver no Spring MVC mapeia os nomes de visualização retornados por um controlador para objetos de visualização reais. ThymeleafViewResolver implementa a interfaceViewResolver e é usado para determinar quais visualizações do Thymeleaf renderizar, dado um nome de visualização.

A etapa final na integração é adicionarThymeleafViewResolver como um bean:

@Bean
@Description("Thymeleaf View Resolver")
public ThymeleafViewResolver viewResolver() {
    ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
    viewResolver.setTemplateEngine(templateEngine());
    viewResolver.setOrder(1);
    return viewResolver;
}

3. Exibindo valores da fonte da mensagem (arquivos de propriedade)

O atributo de tagth:text=”#{key}” pode ser usado para exibir valores de arquivos de propriedades. Para que isso funcione, o arquivo de propriedades deve ser configurado como beanmessageSource:

@Bean
@Description("Spring Message Resolver")
public ResourceBundleMessageSource messageSource() {
    ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
    messageSource.setBasename("messages");
    return messageSource;
}

Aqui está o código HTML do Thymeleaf para exibir o valor associado à chavewelcome.message:

4. Exibindo Atributos do Modelo

4.1. Atributos Simples

O atributo de tagth:text=”${attributename}” pode ser usado para exibir o valor dos atributos do modelo. Vamos adicionar um atributo de modelo com o nomeserverTime na classe do controlador:

model.addAttribute("serverTime", dateFormat.format(new Date()));

O código HTML para exibir o valor do atributoserverTime:

Current time is 

4.2. Atributos de coleção

Se o atributo model for uma coleção de objetos, o atributo tagth:each pode ser usado para iterar sobre ele. Vamos definir uma classe de modeloStudent com dois campos,id ename:

public class Student implements Serializable {
    private Integer id;
    private String name;
    // standard getters and setters
}

Agora vamos adicionar uma lista de alunos como atributo de modelo na classe controller:

List students = new ArrayList();
// logic to build student data
model.addAttribute("students", students);

Por fim, podemos usar o código do modelo Thymeleaf para percorrer a lista de alunos e exibir todos os valores de campo:


    
        
        
    

5. Avaliação Condicional

5.1. if eunless

O atributoth:if=”${condition}” é usado para exibir uma seção da visualização se a condição for atendida. O atributoth:unless=”${condition}” é usado para exibir uma seção da visualização se a condição não for atendida.

Adicione um campogender ao modeloStudent:

public class Student implements Serializable {
    private Integer id;
    private String name;
    private Character gender;

    // standard getters and setters
}

Suponha que este campo tenha dois valores possíveis (M ou F) para indicar o sexo do aluno. Se desejarmos exibir as palavras "Masculino" ou "Feminino" em vez do caractere único, poderíamos fazer isso usando o seguinte código Thymeleaf:


    
    

5.2. switch ecase

Os atributosth:switcheth:case são usados ​​para exibir o conteúdo condicionalmente usando a estrutura da instrução switch.

O código anterior pode ser reescrito usando os atributosth:switcheth:case:


    
    

6. Manipulação de entrada do usuário

A entrada do formulário pode ser tratada usando os atributosth:action=”@{url}”eth:object=”${object}”. Oth:action é usado para fornecer o URL de ação do formulário eth:object é usado para especificar um objeto ao qual os dados do formulário enviado serão associados. Os campos individuais são mapeados usando o atributoth:field=”*{name}”, em quename é a propriedade correspondente do objeto.

Para a classeStudent, podemos criar um formulário de entrada:

No código acima,/saveStudent é o URL de ação do formulário estudent é o objeto que contém os dados do formulário enviados.

A classeStudentController lida com o envio do formulário:

@Controller
public class StudentController {
    @RequestMapping(value = "/saveStudent", method = RequestMethod.POST)
    public String saveStudent(@ModelAttribute Student student, BindingResult errors, Model model) {
        // logic to process input data
    }
}

No código acima, a anotação@RequestMapping mapeia o método do controlador com a URL fornecida no formulário. O método anotadosaveStudent() executa o processamento necessário para o formulário enviado. A anotação@ModelAttribute vincula os campos do formulário ao objetostudent.

7. Exibindo Erros de Validação

A função#fields.hasErrors() pode ser usada para verificar se um campo tem algum erro de validação. A função#fields.errors() pode ser usada para exibir erros para um campo específico. O nome do campo é o parâmetro de entrada para essas duas funções.

Código HTML para iterar e exibir os erros para cada um dos campos no formulário:

Em vez do nome do campo, as funções acima aceitam o caractere curinga* ou a constanteall para indicar todos os campos. O atributoth:each é usado para iterar os vários erros que podem estar presentes para cada um dos campos.

O código HTML anterior foi reescrito usando o caractere curinga*:

ou usando a constanteall:

Da mesma forma, erros globais no Spring podem ser exibidos usando a constanteglobal.

O código HTML para exibir erros globais:

O atributoth:errors também pode ser usado para exibir mensagens de erro. O código anterior para exibir erros no formulário pode ser reescrito usando o atributoth:errors:

8. Usando conversões

A sintaxe de colchete duplo\{\{}} é usada para formatar dados para exibição. Isso faz uso doformatters configurado para aquele tipo de campo no beanconversionService do arquivo de contexto.

O campo de nome na classeStudent é formatado:


    

O código acima usa a classeNameFormatter, configurada substituindo o métodoaddFormatters() da interfaceWebMvcConfigurer. Para este propósito, nossa classe@Configuration substitui a classeWebMvcConfigurerAdapter:

@Configuration
public class WebMVCConfig extends WebMvcConfigurerAdapter {
    // ...
    @Override
    @Description("Custom Conversion Service")
    public void addFormatters(FormatterRegistry registry) {
        registry.addFormatter(new NameFormatter());
    }
}

A classeNameFormatter implementa a interface SpringFormatter.

O utilitário#conversions também pode ser usado para converter objetos para exibição. A sintaxe da função de utilidade é#conversions.convert(Object, Class), ondeObject é convertido para o tipoClass.

Para exibir o campostudent objetopercentage com a parte fracionária removida:


    

9. Conclusão

Neste tutorial, vimos como integrar e usar o Thymeleaf em um aplicativo Spring MVC.

Também vimos exemplos de como exibir campos, aceitar entradas, exibir erros de validação e converter dados para exibição. Uma versão funcional do código mostrado neste artigo está disponível ema GitHub repository.