Spring MVC Thymeleaf 3.0: новые возможности

1. Вступление

Thymeleaf - это шаблонизатор Java для обработки и создания HTML, XML, JavaScript, CSS и простого текста. Чтобы познакомиться с Thymeleaf и Spring, взгляните на ссылку:/thymeleaf-in-spring-mvc[это описание].

В этой статье мы обсудим новые возможности Thymeleaf 3.0 в Spring MVC с приложением Thymeleaf. Версия 3 поставляется с новыми функциями и множеством улучшений. Чтобы быть более конкретным, мы рассмотрим темы естественной обработки и встраивания в Javascript.

Thymeleaf 3.0 включает три новых режима текстовых шаблонов: TEXT , JAVASCRIPT и CSS - которые предназначены для использования для обработки простых, JavaScript и CSS шаблонов соответственно.

2. Зависимости Maven

Во-первых, давайте посмотрим конфигурации, необходимые для интеграции Thymeleaf с Spring; Библиотека thymeleaf-spring требуется в наших зависимостях:

<dependency>
    <groupId>org.thymeleaf</groupId>
    <artifactId>thymeleaf</artifactId>
    <version>3.0.9.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.thymeleaf</groupId>
    <artifactId>thymeleaf-spring4</artifactId>
    <version>3.0.9.RELEASE</version>
</dependency>

Обратите внимание, что для проекта Spring 4 библиотека thymeleaf-spring4 должна использоваться вместо thymeleaf-spring5 . Последнюю версию зависимостей можно найти Вот .

3. Конфигурация Java Thymeleaf

Во-первых, нам нужно настроить новый движок шаблонов, просмотр и преобразователи шаблонов. Для этого нам нужно обновить класс конфигурации Java, созданный

Для этого нам нужно обновить класс конфигурации Java, созданную ссылку:/thymeleaf-in-spring-mvc[здесь]. В дополнение к новым типам распознавателей, наши шаблоны реализуют интерфейс Spring ApplicationContextAware :

@Configuration
@EnableWebMvc
@ComponentScan({ "com.baeldung.thymeleaf" })
public class WebMVCConfig implements WebMvcConfigurer, ApplicationContextAware {

    private ApplicationContext applicationContext;

   //Java setter

    @Bean
    public ViewResolver htmlViewResolver() {
        ThymeleafViewResolver resolver = new ThymeleafViewResolver();
        resolver.setTemplateEngine(templateEngine(htmlTemplateResolver()));
        resolver.setContentType("text/html");
        resolver.setCharacterEncoding("UTF-8");
        resolver.setViewNames(ArrayUtil.array("** .html"));
        return resolver;
    }

    @Bean
    public ViewResolver javascriptViewResolver() {
        ThymeleafViewResolver resolver = new ThymeleafViewResolver();
        resolver.setTemplateEngine(templateEngine(javascriptTemplateResolver()));
        resolver.setContentType("application/javascript");
        resolver.setCharacterEncoding("UTF-8");
        resolver.setViewNames(ArrayUtil.array("** .js"));
        return resolver;
    }

    @Bean
    public ViewResolver plainViewResolver() {
        ThymeleafViewResolver resolver = new ThymeleafViewResolver();
        resolver.setTemplateEngine(templateEngine(plainTemplateResolver()));
        resolver.setContentType("text/plain");
        resolver.setCharacterEncoding("UTF-8");
        resolver.setViewNames(ArrayUtil.array("** .txt"));
        return resolver;
    }
}

Как мы можем заметить выше, мы создали три разных средства разрешения представления - одно для представлений HTML, одно для файлов Javascript и одно для файлов с простым текстом.

Thymeleaf будет различать их, проверяя расширения имени файла - .html , .js и .txt соответственно.

Мы также создали статический класс ArrayUtil , чтобы использовать метод array () , который создает необходимый массив String[] ​​с именами представлений.

В следующей части этого класса нам нужно настроить шаблонизатор:

private <span class="pl-smi x x-first x-last">ISpringTemplateEngine</span> templateEngine(ITemplateResolver templateResolver) {
    SpringTemplateEngine engine = new SpringTemplateEngine();
    engine.setTemplateResolver(templateResolver);
    return engine;
}

Наконец, нам нужно создать три отдельных преобразователя шаблона:

private ITemplateResolver htmlTemplateResolver() {
    SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
    resolver.setApplicationContext(applicationContext);
    resolver.setPrefix("/WEB-INF/views/");
    resolver.setCacheable(false);
    resolver.setTemplateMode(TemplateMode.HTML);
    return resolver;
}

private ITemplateResolver javascriptTemplateResolver() {
    SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
    resolver.setApplicationContext(applicationContext);
    resolver.setPrefix("/WEB-INF/js/");
    resolver.setCacheable(false);
    resolver.setTemplateMode(TemplateMode.JAVASCRIPT);
    return resolver;
}

private ITemplateResolver plainTemplateResolver() {
    SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
    resolver.setApplicationContext(applicationContext);
    resolver.setPrefix("/WEB-INF/txt/");
    resolver.setCacheable(false);
    resolver.setTemplateMode(TemplateMode.TEXT);
    return resolver;
}

Обратите внимание, что для тестирования лучше использовать не кэшированные шаблоны, поэтому рекомендуется использовать метод setCacheable (false) .

Шаблоны Javascript будут храниться в папке /WEB-INF/js/ , текстовые файлы - в папке /WEB-INF/txt/ , и, наконец, путь к файлам HTML будет /WEB-INF/html .

4. Конфигурация Spring Controller

Чтобы протестировать нашу новую конфигурацию, мы создали следующий контроллер Spring:

@Controller
public class InliningController {

    @RequestMapping(value = "/html", method = RequestMethod.GET)
    public String getExampleHTML(Model model) {
        model.addAttribute("title", "Baeldung");
        model.addAttribute("description", "<strong>Thymeleaf</strong> tutorial");
        return "inliningExample.html";
    }

    @RequestMapping(value = "/js", method = RequestMethod.GET)
    public String getExampleJS(Model model) {
        model.addAttribute("students", StudentUtils.buildStudents());
        return "studentCheck.js";
    }

    @RequestMapping(value = "/plain", method = RequestMethod.GET)
    public String getExamplePlain(Model model) {
        model.addAttribute("username", SecurityContextHolder.getContext()
          .getAuthentication().getName());
        model.addAttribute("students", StudentUtils.buildStudents());
        return "studentsList.txt";
    }
}

В примере файла HTML мы покажем, как использовать новую функцию встраивания, с экранированием тегов HTML и без него.

Для примера JS мы сгенерируем запрос AJAX, который загрузит файл js с информацией об учениках. Обратите внимание, что мы используем простой метод buildStudents () внутри класса StudentUtils , по этой ссылке:/thymeleaf-in-spring-mvc[article].

Наконец, в примере с открытым текстом мы покажем информацию об ученике в виде текстового файла. Типичный пример использования режима простого текстового шаблона может быть использован для отправки простого текстового электронного письма.

В качестве дополнительной функции мы будем использовать SecurityContextHolder , чтобы получить зарегистрированное имя пользователя.

5. HTML/JS/TEXT примеры файлов

Последняя часть этого урока - создание файлов трех разных типов и тестирование использования новых функций Thymeleaf. Начнем с HTML-файла:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Inlining example</title>
</head>
<body>
    <p>Title of tutorial:[[${title}]]</p>
    <p>Description:[(${description})]</p>
</body>
</html>

В этом файле мы используем два разных подхода. Чтобы отобразить заголовок, мы используем экранированный синтаксис, который удалит все теги HTML, что приведет к отображению только текста. В случае описания мы используем неэкранированный синтаксис для хранения тегов HTML. Конечный результат будет выглядеть так:

<p>Title of tutorial: Baeldung</p>
<p>Description: <strong>Thymeleaf</strong> tutorial</p>

что, конечно, будет проанализировано нашим браузером, отображая слово Thymeleaf жирным шрифтом

Далее мы приступаем к тестированию возможностей шаблона js:

var count =[[${students.size()}]];
alert("Number of students in group: " + count);

Атрибуты в режиме шаблона JAVASCRIPT будут отключены с помощью JavaScript.

Это приведет к созданию js alert. Мы загружаем это предупреждение, используя jQuery AJAX, в файле listStudents.html:

<script>
    $(document).ready(function() {
        $.ajax({
            url : "/spring-thymeleaf/js",
            });
        });
</script>

Последняя, ​​но не самая важная функция, которую мы хотим протестировать, - это генерация простого текстового файла. Мы создали файл StudentsList.txt со следующим содержимым:

Dear[(${username})],

This is the list of our students:[# th:each="s : ${students}"]   -[(${s.name})]. ID:[(${s.id})][/]Thanks,
The Baeldung University

Обратите внимание, что, как и в режимах шаблонов разметки, стандартные диалекты включают только один обрабатываемый элемент ( [# …​]) и набор обрабатываемых атрибутов ( th: текст, th: utext, th: if, th: uns , th: each и т. д.). Результатом будет текстовый файл, который мы можем использовать, например, в электронном письме, как это было упомянуто в конце Раздела 3.

  • Как тестировать? ** Мы предлагаем сначала поиграть с браузером, а затем проверить существующий тест JUnit.

6. Заключение

В этой статье мы обсудили новые функции, реализованные в платформе Thymeleaf, с упором на версию 3.0.

Полная реализация этого руководства может быть найдена в the проект GitHub - это проект на основе Eclipse, который легко протестировать в любом современном Интернет браузер.

Наконец, если вы планируете перенести проект из Версии 2 в эту последнюю версию, ознакомьтесь с here руководством по миграции . И обратите внимание, что ваши существующие шаблоны Thymeleaf почти на 100% совместимы с Thymeleaf 3.0, поэтому вам придется всего лишь внести несколько изменений в вашу конфигурацию.