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.