servlet+thymeleaf改良版

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

  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方式可能更合适。如果多个组件需要共享相同的配置或共享一个模板引擎实例,那么监听器方式更适合。

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>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/240728.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网游逆向分析与插件开发-游戏反调试功能的实现-项目需求与需求拆解

上一个专栏结束位置&#xff1a;网游逆向分析与插件开发-代码保护壳的优化-修改随机基址为固定基址-CSDN博客 上一个专栏是做了一个壳有了一定的保护&#xff0c;但是保护还是不够&#xff0c;最大的保护是根上把问题解决了&#xff0c;就是我不允许你对我进行调试&#xff0c…

drawio绘制组织架构图和树形图

drawio绘制组织架构图和树形图 drawio是一款强大的图表绘制软件&#xff0c;支持在线云端版本以及windows, macOS, linux安装版。 如果想在线直接使用&#xff0c;则直接输入网址draw.io或者使用drawon(桌案), drawon.cn内部完整的集成了drawio的所有功能&#xff0c;并实现了云…

【一起学Rust | 框架篇 | Tauri2.0框架】Tauri2.0环境搭建与项目创建

文章目录 前言一、搭建 Tauri 2.0 开发环境二、创建 Tauri 2.0 项目1.创建项目2.安装依赖4. 编译运行 三、设置开发环境四、项目结构 前言 Tauri在Rust圈内成名已久&#xff0c;凭借Rust的可靠性&#xff0c;使用系统原生的Webview构建更小的App 以及开发人员可以灵活的使用各…

IDEA 中 Tomcat 日志乱码

1、服务器输出乱码 修改 File -> settings -> Editor -> General ->Console 中&#xff0c;utf-8改为GBK&#xff0c;反之改成utf-8 2、Tomcat Localhost Log 或者 Tomcat Catalina Log乱码 进入Tomcat 中的conf文件中的logging.properties 哪个有问题改哪个&…

虚拟机的下载、安装(模拟出服务器)

下载 vmware workstation&#xff08;收费的虚拟机&#xff09; 下载vbox 网址&#xff1a;Oracle VM VirtualBox&#xff08;免费的虚拟机&#xff09; 以下选择一个下载即可&#xff0c;建议下载vbox&#xff0c;因为是免费的。安装的时候默认下一步即可&#xff08;路径最好…

【数据安全】Java AES加密和解密

自我介绍 做一个简单介绍&#xff0c;酒架年近48 &#xff0c;有20多年IT工作经历&#xff0c;目前在一家500强做企业架构&#xff0e;因为工作需要&#xff0c;另外也因为兴趣涉猎比较广&#xff0c;为了自己学习建立了三个博客&#xff0c;分别是【全球IT瞭望】&#xff0c;【…

Kubernetes 架构原则和对象设计

什么是 Kubernetes Kubernetes 是谷歌开源的容器集群管理系统 • 基于容器的应用部署、维护和滚动升级&#xff1b; • 负载均衡和服务发现&#xff1b; • 跨机器和跨地区的集群调度&#xff1b; • 自动伸缩&#xff1b; • 无状态服务和有状态服务&#xff1b; • 插件机制…

fba海派和传统海运的区别,亚马逊 FBA货物包装技巧—站斧浏览器

fba海派和传统海运的区别 1、美国FBA海派是什么&#xff1f; 美国FBA海派即将商品通过海洋运输的方式运送到美国亚马逊FBA仓库的服务。这种方式主要适用于大批量或大件商品&#xff0c;因为相比其他物流方式&#xff0c;海派具备成本低和运载量大的优势。 2、传统海运是什么…

编译opencv和opencv_contrib

1 下载源码 下载opencv源码https://github.com/opencv/opencv 下载opencv源码https://github.com/opencv/opencv_contrib 2 开始编译 构建需要下载ffmpeg的包&#xff0c;cmake构建时会自动下载&#xff0c;但是比较满&#xff0c;这里可以从下面链接直接下载 https://downloa…

ECMAScript基础入门:从语法到应用

在此之前我以及发布过关于JavaScript基础知识点大家也可以参考 大家有关于JavaScript知识点不知道可以去 &#x1f389;博客主页&#xff1a;阿猫的故乡 &#x1f389;系列专栏&#xff1a;JavaScript专题栏 &#x1f389;ajax专栏&#xff1a;ajax知识点 &#x1f389;欢迎关注…

C++ Qt开发:Charts折线图绘制详解

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍QCharts折线图的常用方法及灵活运用。 折线图…

C++ map和vector向量使用方法

C map用法 C 中 map 提供的是一种键值对容器&#xff0c;里面的数据都是成对出现的,如下图&#xff1a;每一对中的第一个值称之为关键字(key)&#xff0c;每个关键字只能在 map 中出现一次&#xff1b;第二个称之为该关键字的对应值。 map的使用 需要导入头文件 #include …

采用线性插值的方法 在n个坐标点的基础上 准备添加一个坐标点p 根据给出p的横坐标 计算出p的纵坐标 np.interp()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 采用线性插值的方法 在n个坐标点的基础上 准备添加一个坐标点p 根据给出p的横坐标 计算出p的纵坐标 np.interp() [太阳]选择题 下列选项正确的是&#xff1a; import numpy as np x np.arra…

[架构之路-264]:个性特征 - 到底什么才是工程师文化?

目录 前言&#xff1a; 一、三种类型的商业公司与生存法则 &#xff08;1&#xff09;运营或销售驱动型公司 &#xff08;2&#xff09;产品驱动型公司 &#xff08;3&#xff09;技术驱动型公司 二、工程师文化特征解读1 三、工程师文化特征解读2 &#xff08;1&#…

解决Unity物体速度过快无法进行碰撞检测(碰撞检测穿透)

解决Unity物体速度过快无法进行碰撞检测&#xff08;碰撞检测穿透&#xff09; 一、解决碰撞检测穿透方法一Collision Detection碰撞检测总结&#xff1a; 二、解决碰撞检测穿透方法二 一、解决碰撞检测穿透方法一 首先我们知道只要是跟碰撞相关的基本都是离不开刚体 Rigidbod…

八大排序算法@直接插入排序(C语言版本)

目录 直接插入排序概念算法思想代码实现核心算法&#xff1a;直接插入排序的算法实现&#xff1a; 特性总结 直接插入排序 概念 算法思想 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为止&#xff0c;得到一个新…

「C/C++ 01」 深拷贝和浅拷贝

目录 一、概念 1. 浅拷贝 2. 深拷贝 3. 深浅拷贝问题 4. 总结 二、在C的类中实现深拷贝 1. 拷贝构造函数 中实现深拷贝 a. 自己开辟一个新空间&#xff0c;然后将内容拷贝到新空间 b. 借助构造函数来实现深拷贝 2. operator 中实现深拷贝 a. 自己开辟一个新空间&#xff0c;…

One Wire协议应用篇(c语言板)

一.项目简介 利用DS18B20实时检测温度并显示在LCD1602显示屏上&#xff0c;同时可以通过K1,K2,K3,K4设置最高温度和最低温度利用AT24C02可以实现掉电不丢失&#xff0c;最后当检测温度大于或小于最高温时&#xff0c;会在LCD1602显示屏上显示OV:H或OV:L。 二.准备材料 AT89C52、…

ESP32+LVGL笔记(6)-把712k的一二级汉字字库放在SPIRAM

文章目录 1.字库制作2.字库烧录到ESP32-S3的flash2.1 配置好分区文件2.2 汉字库文件烧录到ESP32的flash 3.将字库从 flash 拷贝到 SPIRAM3.1 工程配置中有关 SPIRAM 部分3.2 将汉字库从flash拷贝到SPIRAM的代码3.3 在进入lvgl之前调用函数 copyHZK_from_flash_to_SPIRAM 在前面…

Python入门知识点分享——(八)文件的open方法

学完了Python当中的数据类型&#xff0c;下一步我们来了解如何用Python语言打开文件并添加内容。 目录 file mode buffering encoding errors newline closefd opener 函数 打开文件需要用到open函数&#xff0c;完整的语法格式如下所示&#xff0c;为了演示方便&…