Учебное Пособие По Thymeleaf: Глава 2. Виртуальный Продуктовый Магазин Good Thymes

Оглавление



2 Хороший виртуальный продуктовый магазин Тимес

Исходный код примеров, показанных в этой и будущих главах руководства, можно найти в репозитории Good Thymes Virtual Grocery GitHub. https://github.com/thymeleaf/thymeleafexamples-gtvg .



2.1 Сайт продуктового магазина

Чтобы лучше объяснить концепции обработки шаблонов с помощью Thymeleaf, в этом руководстве будет использоваться демонстрационное приложение, которое вы можете загрузить с веб-сайта проекта.

Это приложение представляет собой веб-сайт воображаемого виртуального продуктового магазина и предоставит нам множество сценариев для демонстрации многих функций Thymeleaf. Для начала нам нужен простой набор объектов модели для нашего приложения: продукты, которые продаются клиентам через заказы.

Мы также будем управлять комментариями к продукту:

Учебное пособие по Thymeleaf: Глава 2. Виртуальный продуктовый магазин Good Thymes

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

  
  
  
  
  
  
  
  
  
  
  
   

public class ProductService { .

public List<Product> findAll() { return ProductRepository.getInstance().

findAll(); } public Product findById(Integer id) { return ProductRepository.getInstance().

findById(id); } }

На веб-уровне наше приложение будет иметь фильтр, который делегирует выполнение команд с поддержкой Thymeleaf в зависимости от URL-адреса запроса:

private boolean process(HttpServletRequest request, HttpServletResponse response) throws ServletException { try { // This prevents triggering engine executions for resource URLs if (request.getRequestURI().

startsWith("/css") || request.getRequestURI().

startsWith("/images") || request.getRequestURI().

startsWith("/favicon")) { return false; } /* * Query controller/URL mapping and obtain the controller * that will process the request. If no controller is available, * return false and let other filters/servlets process the request. */ IGTVGController controller = this.application.resolveControllerForRequest(request); if (controller == null) { return false; } /* * Obtain the TemplateEngine instance. */ ITemplateEngine templateEngine = this.application.getTemplateEngine(); /* * Write the response headers */ response.setContentType("text/html;charset=UTF-8"); response.setHeader("Pragma", "no-cache"); response.setHeader("Cache-Control", "no-cache"); response.setDateHeader("Expires", 0); /* * Execute the controller and process view template, * writing the results to the response writer. */ controller.process( request, response, this.servletContext, templateEngine); return true; } catch (Exception e) { try { response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); } catch (final IOException ignored) { // Just ignore this } throw new ServletException(e); } }

Интерфейс нашего контроллера IGTVGController:

public interface IGTVGController { public void process( HttpServletRequest request, HttpServletResponse response, ServletContext servletContext, ITemplateEngine templateEngine); }

Остаётся только реализовать интерфейс IGTVGController, который запрашивает данные из сервисов и обрабатывает шаблоны с помощью объекта ITemplateEngine. В конечном итоге это будет выглядеть так:

Учебное пособие по Thymeleaf: Глава 2. Виртуальный продуктовый магазин Good Thymes



2.2 Создание и настройка механизма шаблонов

Методprocess(…) в нашем фильтре содержит следующую строку:

ITemplateEngine templateEngine = this.application.getTemplateEngine();

Это означает, что класс GTVGApplication отвечает за создание и настройку одного из наиболее важных объектов в приложении Thymeleaf: экземпляра TemplateEngine (реализация интерфейса ITemplateEngine).

Наш объект org.thymeleaf.TemplateEngine инициализируется:

public class GTVGApplication { .

private final TemplateEngine templateEngine; .

public GTVGApplication(final ServletContext servletContext) { super(); ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver(servletContext); // HTML is the default mode, but we set it anyway for better understanding of code templateResolver.setTemplateMode(TemplateMode.HTML); // This will convert "home" to "/WEB-INF/templates/home.html" templateResolver.setPrefix("/WEB-INF/templates/"); templateResolver.setSuffix(".

html"); // Template cache TTL=1h. If not set, entries would be cached until expelled by LRU templateResolver.setCacheTTLMs(Long.valueOf(3600000L)); // Cache is set to true by default. Set to false if you want templates to // be automatically updated when modified. templateResolver.setCacheable(true); this.templateEngine = new TemplateEngine(); this.templateEngine.setTemplateResolver(templateResolver); .

} }

Существует множество способов настройки объекта TemplateEngine, но на данный момент этих нескольких строк кода достаточно, чтобы проинформировать нас о необходимых шагах.

Преобразователь шаблонов Начнем с преобразователя шаблонов:

ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver(servletContext);

Резолверы шаблонов — это объекты, которые реализуют интерфейс API Thymeleaf под названием org.thymeleaf.templateresolver.ITemplateResolver:

public interface ITemplateResolver { .

/* * Templates are resolved by their name (or content) and also (optionally) their * owner template in case we are trying to resolve a fragment for another template. * Will return null if template cannot be handled by this template resolver. */ public TemplateResolution resolveTemplate( final IEngineConfiguration configuration, final String ownerTemplate, final String template, final Map<String, Object> templateResolutionAttributes); }

Эти объекты отвечают за определение способа доступа к шаблонам, и в этом приложении GTVG org.thymeleaf.templateresolver.ServletContextTemplateResolver означает, что мы собираемся получать файлы шаблонов в качестве ресурсов из контекста сервлета: на уровне приложения javax.servlet.ServletContext , который существует в каждом веб-приложении Java и разрешает ресурсы из корня веб-приложения.

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

Во-первых, режим шаблона:

templateResolver.setTemplateMode(TemplateMode.HTML);

HTML — это режим шаблонов по умолчанию для ServletContextTemplateResolver, но рекомендуется все равно установить его, чтобы в наших документах по коду было четко указано, что происходит.

templateResolver.setPrefix("/WEB-INF/templates/"); templateResolver.setSuffix(".

html");

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

При использовании этой конфигурации имя шаблона «продукт/список» будет соответствовать:

servletContext.getResourceAsStream("/WEB-INF/templates/product/list.html");

При желании количество времени, в течение которого анализируемый шаблон может находиться в кеше, можно настроить в преобразователе шаблонов с помощью свойства кэшаTTLMs:

templateResolver.setCacheTTLMs(3600000L);

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

Поведение и размеры кэша могут определяться пользователем путем реализации интерфейса ICacheManager или путем изменения объекта StandardCacheManager для управления кэшем по умолчанию.

О преобразователях шаблонов можно сказать еще много, но давайте вернемся к созданию нашего объекта Template Engine. Шаблонизатор Объекты Template Engine — это реализация интерфейса org.thymeleaf.ITemplateEngine. Одна из этих реализаций предлагается ядром Thymeleaf: org.thymeleaf.TemplateEngine, и мы создаем ее экземпляр:

templateEngine = new TemplateEngine(); templateEngine.setTemplateResolver(templateResolver);

Просто, не так ли? Все, что нам нужно, это создать экземпляр и установить для него преобразователи шаблонов.

Резолверы шаблонов — единственный обязательный параметр, требуемый TemplateEngine, хотя есть много других, которые будут рассмотрены позже (резольверы сообщений, размеры кэша и т. д.).

На данный момент это все, что нам нужно.

Наш модуль шаблона готов, и мы можем приступить к созданию страниц с помощью Thymeleaf. Продолжение.

Глава 3: Использование текста Теги: #java #Thymeleaf #java

Вместе с данным постом часто просматривают: