servlet+thymeleaf改良版

servlet+thymeleaf改良版

一、maven坐标

xml 复制代码
 <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配置

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模板引擎,但它们在实现方式和适用场景上有一些区别:

  1. Servlet方式(ViewBaseServlet):
    • 这种方式是通过继承HttpServlet并在Servlet的init()方法中初始化Thymeleaf模板引擎。在每个Servlet的init()方法中,都会创建一个独立的Thymeleaf模板引擎实例。
    • 这种方式适用于情况,其中不同的Servlet可能需要不同的模板解析器配置,例如,不同的Servlet可能有不同的前缀、后缀、缓存设置等。
    • 每个Servlet都有自己的模板引擎实例,这可能会导致内存占用增加,因为每个实例都需要一定的内存。如果有多个Servlet需要使用Thymeleaf,而它们的配置相似,可以使用监听器方式来避免创建多个实例。
  2. 监听器方式(ThymeleafListener):
    • 这种方式通过实现ServletContextListener接口,在应用程序启动时(contextInitialized方法)初始化了一个单一的Thymeleaf模板引擎实例,并将其存储在ServletContext中。这意味着整个应用程序共享一个模板引擎实例。
    • 这种方式适用于情况,其中不同的Servlet或组件需要共享相同的Thymeleaf模板引擎配置。这可以减少内存占用,因为只有一个模板引擎实例。
    • 如果不同的组件需要不同的配置,可以在监听器中根据需要创建多个模板解析器和模板引擎实例,并将它们存储在ServletContext中,以便在整个应用程序中共享。

总之,选择哪种方式取决于你的具体需求。如果不同的Servlet需要不同的配置,那么Servlet方式可能更合适。如果多个组件需要共享相同的配置或共享一个模板引擎实例,那么监听器方式更适合。

Java 复制代码
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 {
    @Override
    public 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);
    }

    @Override
    public 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 {
    @Override
    protected 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页面

html 复制代码
<!DOCTYPE html>
<html>
<head>
    <title>Hello Page</title>
</head>
<body>
    <h1>Welcome to Thymeleaf Example</h1>
    
    <!-- 使用Thymeleaf表达式展示变量值 -->
    <p>Message: ${message}</p>
</body>
</html>
相关推荐
武子康19 小时前
大数据-237 离线数仓 - Hive 广告业务实战:ODS→DWD 事件解析、广告明细与转化分析落地
大数据·后端·apache hive
大大大大晴天21 小时前
Flink生产问题排障-Kryo serializer scala extensions are not available
大数据·flink
武子康3 天前
大数据-236 离线数仓 - 会员指标验证、DataX 导出与广告业务 ODS/DWD/ADS 全流程
大数据·后端·apache hive
武子康4 天前
大数据-235 离线数仓 - 实战:Flume+HDFS+Hive 搭建 ODS/DWD/DWS/ADS 会员分析链路
大数据·后端·apache hive
DianSan_ERP4 天前
电商API接口全链路监控:构建坚不可摧的线上运维防线
大数据·运维·网络·人工智能·git·servlet
够快云库5 天前
能源行业非结构化数据治理实战:从数据沼泽到智能资产
大数据·人工智能·机器学习·企业文件安全
AI周红伟5 天前
周红伟:智能体全栈构建实操:OpenClaw部署+Agent Skills+Seedance+RAG从入门到实战
大数据·人工智能·大模型·智能体
B站计算机毕业设计超人5 天前
计算机毕业设计Django+Vue.js高考推荐系统 高考可视化 大数据毕业设计(源码+LW文档+PPT+详细讲解)
大数据·vue.js·hadoop·django·毕业设计·课程设计·推荐算法
计算机程序猿学长5 天前
大数据毕业设计-基于django的音乐网站数据分析管理系统的设计与实现(源码+LW+部署文档+全bao+远程调试+代码讲解等)
大数据·django·课程设计
B站计算机毕业设计超人5 天前
计算机毕业设计Django+Vue.js音乐推荐系统 音乐可视化 大数据毕业设计 (源码+文档+PPT+讲解)
大数据·vue.js·hadoop·python·spark·django·课程设计