2 Хороший виртуальный продуктовый магазин Тимес
Исходный код примеров, показанных в этой и будущих главах руководства, можно найти в репозитории Good Thymes Virtual Grocery GitHub. https://github.com/thymeleaf/thymeleafexamples-gtvg .
2.1 Сайт продуктового магазина
Чтобы лучше объяснить концепции обработки шаблонов с помощью Thymeleaf, в этом руководстве будет использоваться демонстрационное приложение, которое вы можете загрузить с веб-сайта проекта.Это приложение представляет собой веб-сайт воображаемого виртуального продуктового магазина и предоставит нам множество сценариев для демонстрации многих функций Thymeleaf. Для начала нам нужен простой набор объектов модели для нашего приложения: продукты, которые продаются клиентам через заказы.
Мы также будем управлять комментариями к продукту:
Наше приложение также будет иметь очень простой уровень обслуживания, состоящий из объектов Service, содержащих такие методы, как:
На веб-уровне наше приложение будет иметь фильтр, который делегирует выполнение команд с поддержкой Thymeleaf в зависимости от URL-адреса запроса:public class ProductService { .
public List<Product> findAll() { return ProductRepository.getInstance().
findAll(); } public Product findById(Integer id) { return ProductRepository.getInstance().
findById(id); } }
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. В конечном итоге это будет выглядеть так:
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
-
Ягуар
19 Oct, 24 -
8 Основных Веб-Приложений Для Разработчиков
19 Oct, 24 -
Несколько Советов Успешному Человеку
19 Oct, 24 -
Удалить Кнопку «Пуск»
19 Oct, 24