servlet+thymeleaf改良版
一、maven坐标
<dependency><groupId>org.thymeleaf</groupId><artifactId>thymeleaf</artifactId><version>3.0.12.RELEASE</version> <!-- 使用适当的Thymeleaf版本 --></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version> <!-- 使用适当的Servlet API版本 --><scope>provided</scope></dependency>
二、web.xml配置
<!DOCTYPE web-app PUBLIC"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd" ><web-app><display-name>Archetype Created Web Application</display-name><!-- 在servletContext中配置上下文参数 --><context-param><param-name>view-prefix</param-name><param-value>/WEB-INF/templates/</param-value></context-param><context-param><param-name>view-suffix</param-name><param-value>.html</param-value></context-param></web-app>
三、监听器
说明:使用监听器方式和继承baseServlet整合thymeleaf引擎区别如下
两种方法都可以用于配置和初始化Thymeleaf模板引擎,但它们在实现方式和适用场景上有一些区别:
- Servlet方式(ViewBaseServlet):
- 这种方式是通过继承
HttpServlet
并在Servlet的init()
方法中初始化Thymeleaf模板引擎。在每个Servlet的init()
方法中,都会创建一个独立的Thymeleaf模板引擎实例。- 这种方式适用于情况,其中不同的Servlet可能需要不同的模板解析器配置,例如,不同的Servlet可能有不同的前缀、后缀、缓存设置等。
- 每个Servlet都有自己的模板引擎实例,这可能会导致内存占用增加,因为每个实例都需要一定的内存。如果有多个Servlet需要使用Thymeleaf,而它们的配置相似,可以使用监听器方式来避免创建多个实例。
- 监听器方式(ThymeleafListener):
- 这种方式通过实现
ServletContextListener
接口,在应用程序启动时(contextInitialized
方法)初始化了一个单一的Thymeleaf模板引擎实例,并将其存储在ServletContext
中。这意味着整个应用程序共享一个模板引擎实例。- 这种方式适用于情况,其中不同的Servlet或组件需要共享相同的Thymeleaf模板引擎配置。这可以减少内存占用,因为只有一个模板引擎实例。
- 如果不同的组件需要不同的配置,可以在监听器中根据需要创建多个模板解析器和模板引擎实例,并将它们存储在
ServletContext
中,以便在整个应用程序中共享。总之,选择哪种方式取决于你的具体需求。如果不同的Servlet需要不同的配置,那么Servlet方式可能更合适。如果多个组件需要共享相同的配置或共享一个模板引擎实例,那么监听器方式更适合。
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.WebContext;
import org.thymeleaf.templatemode.TemplateMode;
import org.thymeleaf.templateresolver.ServletContextTemplateResolver;import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;@WebListener
public class ThymeleafListener implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent sce) {// 获取ServletContext对象ServletContext servletContext = sce.getServletContext();// 从web.xml中读取配置参数String templatePrefix = servletContext.getInitParameter("template-prefix");String templateSuffix = servletContext.getInitParameter("template-suffix");// 创建Thymeleaf模板解析器ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver(servletContext);// 设置模板解析器的前缀、后缀、编码方式和模板模式templateResolver.setPrefix(templatePrefix);templateResolver.setSuffix(templateSuffix);templateResolver.setCharacterEncoding("utf-8");templateResolver.setTemplateMode(TemplateMode.HTML);// 创建Thymeleaf模板引擎TemplateEngine templateEngine = new TemplateEngine();templateEngine.setTemplateResolver(templateResolver);// 将模板引擎存储在ServletContext中,以便其他组件可以共享servletContext.setAttribute("templateEngine", templateEngine);}@Overridepublic void contextDestroyed(ServletContextEvent sce) {// 在应用程序销毁时执行一些清理操作}
}
四、demoServlet
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.WebContext;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/hello")
public class HelloWorldServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 获取ServletContext中的Thymeleaf模板引擎TemplateEngine templateEngine = (TemplateEngine) getServletContext().getAttribute("templateEngine");// 创建WebContext对象,传入request和response对象WebContext webContext = new WebContext(req, resp, getServletContext(), req.getLocale());// 添加数据到上下文,用于在模板中渲染webContext.setVariable("message", "Hello, Thymeleaf!");// 渲染模板并将结果写入响应templateEngine.process("hello-template", webContext, resp.getWriter());}
}
五、html页面
<!DOCTYPE html>
<html>
<head><title>Hello Page</title>
</head>
<body><h1>Welcome to Thymeleaf Example</h1><!-- 使用Thymeleaf表达式展示变量值 --><p>Message: ${message}</p>
</body>
</html>