Servlet、SpringMVC、SpringBoot整合Thymeleaf汇总

news2024/9/20 20:45:06

介绍

模板引擎,与JSP、JSTL类似。

好处是:直接写在HTML文件中,服务器可以解析,浏览器也可以解析,实现了动静分离,并未破坏html结构,即使无网络、不通过后端渲染也能在浏览器成功打开,大大方便界面的测试和修改。

而且JSP页面要先转换为class字节码,然后交给JVM执行,当应用中页面多了之后,就会导致内存中存放大量页面相关的资源,容易导致内存溢出。

Thymeleaf是SpringBoot推荐的模板引擎,Thymeleaf不仅能处理HTML文件,还能处理XML、CSS、Txt等文本文件,但是基本都是用在Web开发中用来解析HTML页面。

在传统JavaWeb中使用

即在传统的Servlet开发中,如何使用Thymleaf模板技术。

在普通的Servlet项目中配置Thymleaf,本质就是在Servlet中调用模板引擎的方法
个人理解的流程图

image-20230416091259760
步骤:

  1. 项目中引入依赖(注意:3.0和3.1版本是有区别的)
<dependency>
    <groupId>org.thymeleaf</groupId>
    <artifactId>thymeleaf</artifactId>
    <version>3.0.0.RELEASE</version>
</dependency>
  1. 配置视图解析器和模板引擎
package com.liumingkai.web;

import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.WebContext;
import org.thymeleaf.templatemode.TemplateMode;
import org.thymeleaf.templateresolver.ServletContextTemplateResolver;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author 刘明凯
 * @version 0.0.1
 * @date 2023年4月16日 08:26
 */

public class ViewBaseServlet extends HttpServlet {
    private TemplateEngine engine = null;

    @Override
    public void init() throws ServletException {
        // 1. 创建模板解析器
        ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver(this.getServletContext());
        // 2. 设置模板模式,默认为HTML
        templateResolver.setTemplateMode(TemplateMode.HTML);
        // 3. 设置逻辑视图的前后缀
        templateResolver.setPrefix("/templates/");
        templateResolver.setSuffix(".html");
        // 4. 关闭缓存
        templateResolver.setCacheable(false);
        // 5. 设置编码格式
        templateResolver.setCharacterEncoding("utf-8");
        // 6. 实例化模板引擎
        this.engine = new TemplateEngine();
        // 7. 设置模板引擎的视图解析器
        engine.setTemplateResolver(templateResolver);
    }

    protected void process(String templateName, HttpServletRequest request, HttpServletResponse response) throws IOException {
        response.setContentType("text/html;charset=UTF-8");
        response.setCharacterEncoding("utf-8");
        // 创建Thymeleaf的上下文对象,此对象用来存储数据
        WebContext webContext = new WebContext(request, response, this.getServletContext());
        // 交给模板引擎解析处理
        this.engine.process(templateName, webContext, response.getWriter());
    }
}
  1. 普通的Servlet在处理完后,调用模板引擎来进行处理
@WebServlet(value = "/")
public class IndexServlet extends ViewBaseServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setAttribute("msg", "Hello!Thymeleaf");
        super.process("index", req, resp);
    }
}

这是我们的HTML页面,需要在此文件的<html>标签中指定命名空间为http://www.thymeleaf.org

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1 th:text="${msg}">这是默认的HTML文本</h1>
</body>
</html>

原理解析、疑问思考

  1. 在创建模板解析器时,需要传入一个Context上下文对象,以便在应用程序范围内寻找物理文件,并从Web应用的根目录解析资源

    如果不设置Context应用上下文对象,则会找不到物理视图文件

    底层代码

    servletContext.getResourceAsStream("/template/index.html");
    
  2. 配置模板引擎,创建模板引擎,并将模板解析器配置进去。

    因为一个应用可能有多种解析器,所以要将模板解析器作为模板引擎的属性配置进去。

  3. 在调用模板引擎的处理方法时,需要传入的参数是这些:

    engine.process(String template, IContext context, Writer writer)
    
    • String template是视图的逻辑名称
    • IContext context是Thymeleaf的上下文对象,封装了需要渲染的数据
    • Writer writer是一个字符流
  4. 关于Thymeleaf的上下文对象,是一个IContext接口,用来保存Thymeleaf的数据,将响应数据保存在Thymeleaf的上下文对象中,以便后续渲染视图时用。

    IContext接口的其中一个实现类是WebContext,创建WebContext实例时,需要传入request、response、ServletContext这三个对象,为什么偏偏是这三个对象呢?

    因为一次请求可以分为四个域,用来存放响应数据:

    • page域,基本不用
    • request域,一次请求响应的范围内
    • session域,一次会话范围内
    • application域,整个应用程序范围内

    拿到了request、response、ServletContext这三个对象,就可以将以上四个域的所有数据,并且因为有response对象,保证响应能成功进行。

在SSM中使用

在SpringMVC中如何来配置Thymeleaf

了解了Thymeleaf在Servlet中的原理和配置,那么在SpringMVC中就会更容易理解和配置。

首先导入依赖,导入Spring与Thymeleaf的整合依赖,会自动引入Thymeleaf的依赖。

<dependency>
    <groupId>org.thymeleaf</groupId>
    <artifactId>thymeleaf-spring5</artifactId>
    <version>3.0.10.RELEASE</version>
</dependency>
  1. 注册要用到的Bean
package com.liumingkai.controller;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.DispatcherServlet;
import org.thymeleaf.spring5.SpringTemplateEngine;
import org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver;
import org.thymeleaf.spring5.view.ThymeleafViewResolver;
import org.thymeleaf.templatemode.TemplateMode;

/**
 * Thymeleaf配置类
 *
 * @author 刘明凯
 * @version 0.0.1
 * @date 2023年4月16日 10:20
 */
@Configuration
public class ThymeleafConfig {

    /**
     * 配置模板解析器
     *
     * @return
     */
    @Bean
    public SpringResourceTemplateResolver getSpringResourceTemplateResolver() {
        SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
        templateResolver.setPrefix("/template/");
        templateResolver.setSuffix(".html");
        templateResolver.setCharacterEncoding("utf-8");
        templateResolver.setCacheable(false);
        templateResolver.setTemplateMode(TemplateMode.HTML);
        return templateResolver;
    }

    /**
     * 注册 模板引擎
     *
     * @return
     */
    @Bean
    public SpringTemplateEngine getSpringTemplateEngine(SpringResourceTemplateResolver templateResolver) {
        SpringTemplateEngine templateEngine = new SpringTemplateEngine();
        templateEngine.setTemplateResolver(templateResolver);
        return templateEngine;
    }

    /**
     * 注册 视图解析器,替换掉SpringMVC默认的视图解析器
     *
     * @return
     */
    @Bean
    public ThymeleafViewResolver geThymeleafViewResolver(SpringTemplateEngine templateEngine) {
        ThymeleafViewResolver thymeleafViewResolver = new ThymeleafViewResolver();
        thymeleafViewResolver.setTemplateEngine(templateEngine);
        thymeleafViewResolver.setCharacterEncoding("utf-8");
        return thymeleafViewResolver;
    }
}

ps:使用了Thymleaf后,就不要使用SpringMVC自带的视图解析器了。

在SpringBoot中使用

在SpringBoot中使用Thymeleaf更简单,毕竟这个是SpringBoot大力支持的一个模板引擎

  1. 导入起步依赖
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-thymeleaf -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
    <version>3.0.0</version>
</dependency>
  1. 配置Thymeleaf参数,在SpringBoot的application.yml中
spring:
  thymeleaf:
    mode: HTML
    prefix: /templates/
    suffix: .html
    cache: false

然后就可以了。

异常解决

如果在整合的过程中,报错,找不到模板位置,

在pom.xml加入以下代码试试

<!--在build中配置resources,来防止我们资源导出失败的问题-->
<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
                <include>**/*.html</include>
            </includes>
            <filtering>true</filtering>
        </resource>
        
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
                <include>**/*.html</include>
            </includes>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>

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

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

相关文章

kettle——数据清洗(数据表-->文本文件)

实验步骤&#xff1a; 1.数据表&#xff08;图片加分析&#xff0c;创建表的过程和对应的字段及记录&#xff09; ①选择数据库 ②创建表结构 ③插入数据 2.kettle连接模块&#xff08;图片加分析,每个模块实现的功能&#xff09; ①新建“转换”文件,”文件”——>“新建…

JAVA开发运维(Jenkins中踩的坑)

最近尝试通过Jenkins来自动化部署项目&#xff0c;没想到还踩了很多坑。Jenkins部署的基本原理&#xff1a; 通过Jenkins服务器拉取gitlab上的代码进行打包&#xff0c;推送到目标服务器上&#xff0c;并运行启动脚本。 那么Jenkins就要解决三个问题。 1.连接上目标服务器 …

电子行业应如何实施数字工厂管理系统

随着信息技术的快速发展&#xff0c;电子制造企业也正在逐步做好数字化转型&#xff0c;而数字工厂管理系统便是数字化管理中的一个重要系统。数字工厂系统可以帮助电子企业实现生产过程的自动化、智能化和可视化&#xff0c;提高生产效率&#xff0c;降低生产成本&#xff0c;…

2023香港国际创科展开幕,欧科云链受邀参展

4月12日&#xff0c;由香港特区政府、香港贸易发展局主办的首届香港国际创科展&#xff08;InnoEX&#xff09;在香港会展中心开幕&#xff0c;欧科云链&#xff08;01499.HK)作为全球领先的Web3科技企业受邀参展。香港国际创科展现场图 此次创科展上&#xff0c;欧科云链向公众…

【RocketMQ】负载均衡源码分析

RocketMQ在集群模式下&#xff0c;同一个消费组内&#xff0c;一个消息队列同一时间只能分配给组内的某一个消费者&#xff0c;也就是一条消息只能被组内的一个消费者进行消费&#xff0c;为了合理的对消息队列进行分配&#xff0c;于是就有了负载均衡。 接下来以集群模式下的消…

智优ERP的升级版智优E3_ERP,可以自定义列,和自定义打印公司logo

新版的智优E3_ERP系统&#xff0c;新增了许多供自定义的列。 系统能够解决的企业管理问题&#xff1a; 一、日常的出入库管理、收付款管理、往来对账、移动加权平均成本核算、以及相关数据的查询分析&#xff1b; 二、订单的跟单管理&#xff08;包括销售跟单、采购跟单、生产…

ElasticSearch常用查询操作

ES查询 一般我们使用ES最多的就是查询&#xff0c;今天就讲一下ES的查询。这里我是建了一个person的索引。 "person" : {"aliases" : { },"mappings" : {"properties" : {"address" : {"type" : "text"…

[LeetCode周赛复盘] 第 102 场双周赛20230415

[LeetCode周赛复盘] 第 102 场双周赛20230415 一、本周周赛总结二、 6333. 查询网格图中每一列的宽度1. 题目描述2. 思路分析3. 代码实现三、6334. 一个数组所有前缀的分数1. 题目描述2. 思路分析3. 代码实现四、6335. 二叉树的堂兄弟节点 II1. 题目描述2. 思路分析3. 代码实现…

English Learning - L2 第 15 次小组纠音 助动词弱读和重音节奏 2023.4.15 周六

English Learning - L2 第 15 次小组纠音 助动词弱读和重音节奏 2023.4.15 周六共性问题have has /hv/ /hz/ 弱读成 /həv/ /həz/fine left /faɪn/ /left/late changed train /leɪt/ /ʧeɪnʤd/ /treɪn/ 中的 eɪmoment problem time /ˈməʊmənt/ /ˈprɒbləm/ /taɪm…

4.10~4.11学习总结

ER图的学习&#xff1a; 学习了ER图相关知识&#xff0c;并绘制了项目大概的ER图 详细笔记博客&#xff1a;http://t.csdn.cn/YOJxq MySQL的学习&#xff1a; 函数 学习了字符串函数&#xff0c;数值函数&#xff0c;日期函数&#xff0c;流程函数。 约束 作用于表中字段的规则…

改善Instagram客户服务的6个技巧

Instagram仍然是全球前四大社交网络&#xff0c;按用户数量排名。它通过其创新的过滤器、内容创建工具、视频和卷轴选项继续增长并推动流量。这是一个平台&#xff0c;世界顶级名人和有影响力的人可以为全球用户提供有趣和令人印象深刻的内容。 但不仅仅是一个娱乐平台&#xf…

Nestjs实战干货-概况-异常过滤器-Exception filters

异常过滤器 Nest 带有一个内置的异常层&#xff0c;负责处理应用程序中所有未处理的异常。当应用程序代码未处理异常时&#xff0c;该层会捕获该异常&#xff0c;然后自动发送适当的用户友好响应。 开箱即用&#xff0c;此操作由内置的全局异常过滤器执行&#xff0c;该过滤器…

三、Locust任务(task)详解

当一个负载测试开始时&#xff0c;将为每个模拟用户创建一个用户类的实例&#xff0c;他们将在自己的绿色线程中开始运行。当这些用户运行时&#xff0c;他们会选择执行的任务&#xff0c;睡眠一段时间&#xff0c;然后选择一个新的任务&#xff0c;如此循环。 这些任务是正常…

二、Java 并发编程(4)

本章概要 Java 中的锁 乐观锁悲观锁自旋锁synchronizedReentrantLocksynchronized 与 ReentrantLock 对比SemaphoreAtomicInteger可重入锁公平锁和非公平锁读写锁共享锁和独占锁重量级锁和轻量级锁偏向锁分段锁同步锁和死锁如何进行锁优化 2.6 Java 中的锁 Java 中的锁主要…

【C语言进阶:动态内存管理】C/C++中程序内存区域的划分

⚡C/C中程序内存区域的划分 C/C程序内存分配的几个区域&#xff1a; 栈区&#xff08;stack&#xff09;&#xff1a;在执行函数时&#xff0c;函数内局部变量的存储单元都可以在栈上创建&#xff0c;函数执行结 束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指…

day8 互斥锁/读写锁的概念及使用、死锁的避免

目录 互斥锁的概念和使用 线程通信 - 互斥 互斥锁的创建和销毁 互斥锁的创建 互斥锁的销毁 互斥锁的使用 申请锁 释放锁 互斥锁的概念和使用 线程通信 - 互斥 临界资源&#xff1a; 一次只允许一个任务&#xff08;进程、线程&#xff09;访问的共享资源&#xff1b…

Maven-依赖管理

一. 依赖管理 1. maven-依赖管理-依赖配置 依赖&#xff1a;指当前项目运行所需要的jar包。一个项目中可以引入多个依赖&#xff1a; 例如&#xff1a;在当前工程中&#xff0c;我们需要用到logback来记录日志&#xff0c;此时就可以在maven工程的pom.xml文件中&#xff0c…

Python让ChatGPT全自动改写生成文章教程

ChatGPT是一个在自然语言处理领域非常先进的文本生成模型&#xff0c;它能够产生高质量、连贯的文章。它受到了广泛的关注&#xff0c;因为它可以自动生成大量的文本&#xff0c;从而减轻了人工写作的负担。怎么使用chatgpt批量改写文章&#xff1f;最简单的方式就是找到一家接…

I.MX6U开发板使用OTG烧写系统

1.系统烧写 在实际的产品开发中肯定不可能通过网络来运行&#xff0c;否则没网的时候产品岂不 是就歇菜了。因此我们需要将 uboot、linux kernel、.dtb(设备树)和 rootfs 这四个文件烧写到板子 上的 EMMC、NAND 或 QSPI Flash 等其他存储设备上&#xff0c;这样不管有没有网络我…

SpringCloud 使用sentinel

一、添加依赖 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency> 二、配置文件配置地址 spring:cloud:sentinel:transport:dashboard: localhost:8080三…