2.1 杂货店网站
为了更好地解释在使用Thymeleaf处理模版时涉及的概念,本教程将会使用一个演示应用。你可以从项目的网站上下载⏬。
这个应用是一个虚构的杂货店的网站。它将会提供我们许多场景,来展示Thymeleaf的诸多特性。
首先,我们需要为应用准备一套简单的模型实体:通过创建订单
卖给顾客
的产品
。我们也会管理与那些产品
有关的评论
。
我们的应用也会🈶️一个非常简单的服务层,由包含如下方法的服务
对象组成:
public class ProductService {
...
public List<Product> findAll() {
return ProductRepository.getInstance().findAll();
}
public Product findById(Integer id) {
return ProductRepository.getInstance().findById(id);
}
}
在网络层,我们的应用将会🈶️一个过滤器。它会依据请求的URL,分配执行启用Thymeleaf的命令:
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
对象处理模版。
最后,它看起来就像这样:
但是,先让我们看看那个模版引擎是怎么被初始化的。