• 【干货】【全网最全】【全网最详细】 javaWeb关于Thymeleaf+SpringBoot 的学习教程,看这一篇就够了。


    大家好,我是DX3906

    第一部分:介绍

    1. Thymeleaf 简介

                1.什么是Thymeleaf

    Thymeleaf是一个用于Java和Java EE平台的服务器端模板引擎,它可以用来在服务端生成HTML、XML、JavaScript、CSS甚至纯文本的输出。Thymeleaf适用于需要快速开发和维护Web应用的场合,特别是当项目需要与Spring框架结合使用时。它提供了一种声明式的方式来构建用户界面,使得开发者可以专注于业务逻辑,而不必过多地关注HTML的生成细节。

                  2.Thymeleaf的主要特点
    1. 自然模板:Thymeleaf的模板看起来像正常的HTML,这使得前端开发者能够更容易地理解和使用模板。

    2. HTML5友好:Thymeleaf支持HTML5,可以很好地与现代的Web技术集成。

    3. 属性驱动Thymeleaf使用属性来表达逻辑,这使得模板更加清晰和易于维护。

    4. 模块化:Thymeleaf的模块化设计允许开发者只使用所需的部分,从而减少应用的体积。

    5. 国际化:Thymeleaf支持国际化,可以轻松地将应用本地化到不同的语言。

    6. 表达式语言:Thymeleaf使用自己的表达式语言(Thymeleaf Expression Language,简称EL),类似于JSP的表达式语言,但更加强大和灵活。

    7. 集成Spring:Thymeleaf与Spring框架紧密集成,提供了对Spring MVC的全面支持。

    8. 条件逻辑和迭代:Thymeleaf允许在模板中使用条件逻辑和迭代,这使得模板可以动态地根据数据变化。

    9. 片段和继承:Thymeleaf支持片段(fragments)和继承(inheritance),这使得模板的复用和组织更加高效。

    10. 内联JavaScript和CSS:Thymeleaf允许在模板中直接编写JavaScript和CSS代码,这增加了模板的灵活性。

               3.为什么选择Thymeleaf

             Thymeleaf 是一种现代的服务器端Java模板引擎,它在Web和独立环境中都有应用。它具有一些独特的特性,与其他模板引擎相比,有其优势和劣势。以下是Thymeleaf与其他几个常见模板引擎的比较:

    1. 与JSP比较

      • JSP是Java EE规范的一部分,与Servlet紧密集成,通常用于传统的Java Web应用。而Thymeleaf不依赖于Servlet API,因此可以在多种环境中使用,包括非Web环境39。
      • Thymeleaf的模板可以作为静态页面在浏览器中预览,而JSP需要服务器端处理8。
    2. 与FreeMarker比较

      • FreeMarker提供了强大的宏和模板继承功能,适合复杂的模板处理。Thymeleaf则更侧重于与Spring框架的集成,提供方言和表达式,易于与Spring MVC配合使用67。
      • Thymeleaf的性能可能不如FreeMarker,特别是在渲染大量数据时2。
    3. 与Velocity比较

      • Velocity也是一个流行的Java模板引擎,以其简单和灵活的语法而闻名。Thymeleaf提供了类似于Velocity的自然模板语法,但更加注重与现代Web标准如HTML5的兼容性5。
    4. 与Enjoy比较

      • Enjoy是一个较新的模板引擎,可能在某些方面具有优势,比如性能或特定的功能集。但Thymeleaf由于其广泛的社区支持和成熟的生态系统,可能在实际开发中更为流行和稳定1。

    Thymeleaf的主要优势在于其自然模板的概念,即模板在没有数据的情况下也可以作为静态HTML页面展示,这使得前端开发者可以更容易地进行页面设计和原型开发。同时,Thymeleaf与Spring框架的紧密集成,为使用Spring MVC的开发者提供了便利。然而,性能可能是Thymeleaf相对于其他一些模板引擎的劣势,特别是在高并发场景下。在选择模板引擎时,开发者应根据项目需求、团队熟悉度以及特定场景的性能要求来做出决定。

              4.环境搭建

    JDK安装和Maven/Gradle配置,大家可以自行查阅资料。

            在使用Thymeleaf开发Web应用时,创建一个清晰和合理的目录结构是非常重要的。一个良好的目录结构可以帮助你更好地组织代码,提高项目的可维护性。以下是一个基于Maven构建的Web应用的推荐目录结构示例:

    1. src/
    2. ├── main/
    3. │ ├── java/ # Java源代码
    4. │ │ └── com.example # 你的公司或项目的域名
    5. │ │ └── myapp # 应用或模块名
    6. │ │ ├── controller/ # Spring MVC 控制器
    7. │ │ ├── model/ # 实体类
    8. │ │ ├── repository/ # 数据访问层(Repository)
    9. │ │ ├── service/ # 服务层
    10. │ │ └── MainApplication.java # Spring Boot 主类
    11. │ ├── resources/ # 资源文件
    12. │ │ ├── application.properties # Spring Boot 配置文件
    13. │ │ ├── static/ # 静态资源(如:CSS, JavaScript, 图片等)
    14. │ │ └── templates/ # Thymeleaf 模板文件
    15. │ └── webapp/ # 可选,用于存放特定的Web资源
    16. └── test/
    17. └── java/ # 测试代码
    18. └── com.example
    19. └── myapp
    20. └── ...

    解释:

    • src/main/java/:存放Java源代码。
    • src/main/resources/:存放配置文件和资源文件。
      • application.properties:Spring Boot的配置文件,用于配置数据库连接、服务器端口等。
    • src/main/static/:存放静态资源,如CSS、JavaScript文件和图片等。
    • src/main/templates/:存放Thymeleaf模板文件。这些通常是HTML文件,包含Thymeleaf的表达式和属性。
    • src/test/java/:存放测试代码。

    Thymeleaf模板文件:

    src/main/templates/目录中,你可以按照功能或页面来组织Thymeleaf模板文件。例如:

    1. src/main/templates/
    2. ├── layout/
    3. │ ├── fragments/
    4. │ │ ├── header.html
    5. │ │ ├── footer.html
    6. │ │ └── ...
    7. │ ├── main.html
    8. │ └── ...
    9. ├── index.html
    10. ├── about.html
    11. └── ...
    • layout/:存放页面布局相关的模板,如页眉、页脚和主布局模板。
    • fragments/:存放可复用的模板片段,如导航栏、按钮等。

    注意事项:

    • 确保Thymeleaf模板文件的命名遵循小写字母和短横线连接的规则,如index.htmlabout.html等。
    • 在Spring Boot应用中,src/main/resources/templates/目录下的Thymeleaf模板将自动被Thymeleaf模板引擎扫描和渲染。

    这个目录结构是一个推荐的基础结构,你可以根据项目的具体需求进行调整和扩展。

    第二部分:基础语法

            Thymeleaf的表达式语言(Thymeleaf Expression Language,简称EL)是一种类似于Java的表达式语言,用于在Thymeleaf模板中执行计算、方法调用、访问变量等操作。以下是Thymeleaf表达式语言的一些主要特点和用法:

    1. 变量表达式:用于访问上下文中的变量。

      <p th:text="${greeting}">Hello, World!</p>
    2. 选择变量表达式:用于选择变量表达式的结果。

      <p th:text="${user.name}">User Name</p>
    3. 消息表达式:用于国际化和本地化。

      <p th:text="#{greeting}">Hello, World!</p>
    4. 链接表达式:用于生成URL。

      <a th:href="@{/users/{id}(id=${user.id})}">User Profile</a>
    5. 条件表达式:用于条件判断。

      <p th:if="${user.isAdmin()}">Admin User</p>
    6. 迭代表达式:用于遍历集合或数组。

      <ul> <li th:each="item : ${items}" th:text="${item}">Item</li> </ul>
    7. 文本表达式:用于文本操作,如字符串连接。

      <p th:text="${user.name} + ' ' + ${user.surname}">User Full Name</p>
    8. 内联表达式:用于在HTML属性中使用Thymeleaf表达式。

      <img th:src="@{/images/{imageName}(imageName=${image.name})}" alt="Image">
    9. 片段表达式:用于包含其他模板片段。

      <div th:replace="fragments/header :: header">Header Content</div>
    10. 格式化表达式:用于格式化日期、数字等。

      <p th:text="${#dates.format(user.birthday, 'dd/MM/yyyy')}">Birthday</p>
    11. 算术表达式:用于执行算术运算。

      <p th:text="${price * 1.2}">Price After Tax</p>
    12. 逻辑表达式:用于逻辑运算。

      <p th:if="${user.isLoggedIn and user.isAdmin()}">Admin User Logged In</p>
    13. 三元表达式:用于条件选择。

      <p th:text="${user.isLoggedIn} ? #{welcome.logged.in} : #{welcome.logged.out}">Welcome Message</p>
    14. 内置基本对象:Thymeleaf提供了一些内置的基本对象,如#ctx(上下文对象)、#vars(所有变量的集合)等。

    第三部分:高级特性

    1.内联(Inline)模式

    Thymeleaf的内联模式特别适用于在JavaScript和CSS中嵌入动态内容

             内联JavaScript:

    在这个例子中,th:inline="javascript"指示Thymeleaf将内联的脚本视为JavaScript代码,并在适当的地方替换表达式。

            内联CSS:

    在这个例子中,th:inline="css"指示Thymeleaf将内联的样式视为CSS代码,并替换其中的表达式。

    使用内联模式时,请注意以下几点:

    • 使用内联模式可以提高模板的灵活性,但过度使用可能会使模板难以维护。
    • 内联表达式通常用于动态生成少量代码,而不是大量脚本或样式。
    • 内联JavaScript和CSS代码应该小心使用,以避免潜在的安全问题,如XSS攻击。
    2.条件属性

            Thymeleaf的高级特性之一是条件属性,它允许你根据特定条件动态地添加或删除HTML属性。这使得模板能够根据运行时的数据来调整其行为,而无需编写额外的JavaScript代码。

           条件属性的基本语法

    条件属性使用th:attr前缀与标准的HTML属性一起使用。以下是一些示例:

            动态添加属性

    "text" th:attr="placeholder=${user.isNew() ? 'Enter your name' : ''}" />

             在这个例子中,如果user.isNew()方法返回true,则placeholder属性将被添加到input元素上,并设置为"Enter your name"。如果返回false,则不会添加placeholder属性。

             动态删除属性

            动态删除属性通常意味着根据条件不添加某个属性。由于HTML属性默认存在(除非明确删除),Thymeleaf的条件属性可以用来模拟删除属性的效果。例如:

             如果user.canSubmit()返回true,则disabled属性不会被添加到button元素上(相当于删除了该属性),允许按钮被点击。如果返回false,则disabled属性会被添加,禁用按钮。

            使用条件属性的高级用法

             内联表达式

             Thymeleaf的条件属性可以与内联表达式结合使用,实现更复杂的逻辑:

    1. th:src="@{/images/{imageName}(imageName=${image.getImageUrl()})}"
    2. th:attr="alt=${image.hasAltText() ? ('Alt text: ' + image.getAltText()) : ''}">

            如果image.hasAltText()返回true,则alt属性将被添加,并设置为image.getAltText()返回的值。如果返回false,则不会添加alt属性。

            条件添加CSS类

           条件属性也可以用来动态添加CSS类:

    th:attr="class=${user.isAdmin() ? 'admin-class' : 'user-class'}">User Content

            如果user.isAdmin()返回true,则div元素将被赋予admin-class类;如果返回false,则赋予user-class类。

    注意事项

    • 条件属性可以显著提高模板的灵活性,但过度使用可能会使模板难以理解和维护。
    • 确保条件逻辑尽可能简单,避免在模板中嵌入复杂的业务逻辑。
    • 条件属性与Thymeleaf的其他特性(如迭代、选择变量表达式等)结合使用时,可以创建非常强大和灵活的模板。
    3.片段包含

           Thymeleaf的片段包含(Fragments Inclusion)是一种强大的功能,它允许你将页面的可重用部分(如页眉、页脚、导航栏等)定义为独立的片段,并在多个页面中包含这些片段。这样做可以提高代码的复用性,减少重复代码,并使模板更加清晰和易于维护。

    片段包含的基本语法

           在Thymeleaf中,你可以使用th:includeth:replaceth:fragment属性来定义和包含片段。

    定义片段

    首先,你需要定义一个片段。这通常是一个HTML片段,你可以使用th:fragment属性来标记它:

    1. <header th:fragment="header">
    2. <nav>
    3. <ul>
    4. <li><a href="/">Homea>li>
    5. <li><a href="/about">Abouta>li>
    6. ul>
    7. nav>
    8. header>

    在这个例子中,header是片段的名称,它将被用来在其他页面中引用这个页眉。

    包含片段

    一旦定义了片段,你可以使用th:includeth:replace来在其他页面中包含它。

    • 使用th:include:这个属性会包含并渲染片段的内容,但不会替换包含它的元素。

      1. <body>
      2. <div th:include="fragments/header :: header">div>
      3. body>

      在这个例子中,:: header指定了要包含的片段名称。

    • 使用th:replace:这个属性会用片段的内容替换包含它的元素。

      1. <div th:replace="fragments/header :: header">div>

      使用th:replace时,整个

      元素将被页眉的内容替换。

    高级用法

    • 传递参数:你可以向片段传递参数,以便根据需要动态调整片段的内容。

      1. <header th:fragment="header(title)">
      2. <h1 th:text="${title}">Default Titleh1>
      3. header>

      然后,你可以在包含片段时传递参数:、

      1. <div th:include="fragments/header :: header('Welcome Page')">div>

    • 使用片段的片段:片段也可以包含其他片段,这有助于创建更模块化的模板。

    • 条件包含:你可以使用Thymeleaf的条件表达式来决定是否包含某个片段。

    th:include="fragments/header" th:if="${showHeader}">

    在这个例子中,只有当showHeadertrue时,页眉片段才会被包含。

    注意事项

    • 片段应该放在src/main/resources/templates/fragments/目录下,以便Thymeleaf可以正确地识别和包含它们。
    • 使用片段时,确保片段的名称唯一,以避免命名冲突。
    • 片段包含可以大大提高模板的可维护性和可读性,但过度使用或不当使用可能会导致模板结构混乱。
    4.命名空间支持

            Thymeleaf的命名空间支持是一个高级特性,它允许你在Thymeleaf模板中使用XML命名空间来组织和区分不同的元素。这个特性在处理XML文档或者在需要将Thymeleaf与其它技术(如XML Schema、XSLT、自定义组件等)结合使用时特别有用。

    基本用法

    在Thymeleaf中,你可以通过th:namespace属性来声明一个命名空间。这个属性通常用于标签上,以定义整个文档的默认命名空间。

    1. xmlns:th="http://www.thymeleaf.org">
    2. <head>
    3. <title>Example Pagetitle>
    4. head>
    5. <body>
    6. <div th:text="|Hello, World!|">Default textdiv>
    7. body>

    条件属性的命名空间

    在某些情况下,你可能需要在条件属性中使用命名空间。比如,你想要在某个属性存在时添加命名空间前缀:

    1. "text"
    2. th:attr="placeholder=${user.isNew() ? ('xmlns:th', 'placeholder', 'Enter your name') : ''}">

    在这个例子中,如果user.isNew()返回true,则placeholder属性将被添加,并且th命名空间将被应用到该属性上。

    片段包含和命名空间

    当你在包含片段时,需要注意命名空间的作用域。如果片段定义在具有特定命名空间的文档中,那么在包含该片段时,该命名空间也应该被正确地声明和使用。

    1. <header xmlns:th="http://www.thymeleaf.org" th:fragment="header">
    2. header>

    内联JavaScript和CSS中的命名空间

    在内联的JavaScript或CSS中使用Thymeleaf表达式时,也可以利用命名空间来区分Thymeleaf的表达式和其他JavaScript或CSS代码。

          在这个例子中,CDATA部分允许你在