Spring Boot 技术探索

Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can "just run".

16、Spring Boot中thymeleaf模板的使用

平台环境:

名称

版本号

Mac OS X

10.14.5

JDK

1.8.0_201

Apache Maven

3.6.0

IntelliJ IDEA

2019.1 (Ultimate Edition)

Spring Boot

2.1.6.RELEASE

 

  Thymeleaf是一个用于web和独立环境的现代服务器端Java模板引擎,荣获Spring Boot官方推荐。所谓的模板引擎其就是让信息展示界面与业务逻辑代码分离的一种开发思想的实现技术,这样可以大大提高开发效率。而Thymeleaf模板引擎又是采用了优雅、自然的模板——HTML,它可以直接在浏览器中直接显示,也可以用做静态原型,且为团队开发带来了更强的协作能力。

 

一、入门Demo

1、pom.xml增加依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

 

2、application.properties配置文件中关闭Thymeleaf缓存

# Thymeleaf缓存
spring.thymeleaf.cache=false

  关闭缓存可以让修改过的Thymeleaf模板直接生效,否则每次修改后都要重启服务才能看到改变。但是在生产环境下应该启用缓存,这样可以节省服务器资源。

 

3、创建Thymeleaf模板

src/main/resources/templates/index.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <span style="font-size: larger" th:text="${welcomeText}">这里显示欢迎文字</span>
</body>
</html>

 

4、创建一个Controller,使用模板来展示信息。

package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class IndexController
{
    @RequestMapping("/")
    public String toIndex(ModelMap map)
    {
        map.addAttribute("welcomeText", "Welcome To CodeLabX!");

        return "index";
    }
}

 

5、启用项目,访问http://127.0.0.1:8080/

显示:

Welcome To CodeLabX!

 

二、内联

  上面的Demo中每个需要输出信息的地方都要用到th:text标签,内联的目的就是为了简化这种写法。同时,内联也可以用来在javascript代码中输出信息。

1、新建测试页面inline.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script th:inline="javascript">
        function showAlert(name)
        {
            alert("你好:" + name + " " + [[${welcomeText}]]);
        }
    </script>
    <style th:inline="css">
        .[[${classname}]]
        {
            text-align: [[${align}]];
        }
    </style>
</head>
<body>
    <h1>JavaScript内联</h1>
    <input type="button" value="JavaScript内联" onclick="showAlert('LiLei')" />
    <br />
    <br />
    <div th:inline="text">
        <h1>文本内联</h1>
        <ul>
            <li>[[${textInline1}]]</li>
            <li>[[${textInline2}]]</li>
            <li>[[${textInline3}]]</li>
        </ul>
    </div>
    <br />
    <br />
    <div th:inline="none">
        <h1>禁用内联</h1>
        [[${welcomeText}]]
    </div>
    <br />
    <br />
    <div>
        <h1>CSS内联</h1>
        <span class="spanTextClass" style="display: block; background-color: darkgrey;">测试文字</span>
    </div>
</body>
</html>

 

2、IndexController新增代码

package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class IndexController
{
    @RequestMapping("/")
    public String toIndex(ModelMap map)
    {
        map.addAttribute("welcomeText", "Welcome To CodeLabX!");

        return "index";
    }

    @RequestMapping("/inline")
    public String toInline(ModelMap map)
    {
        map.addAttribute("welcomeText", "Welcome To CodeLabX!");

        map.addAttribute("textInline1", "文本内联1");
        map.addAttribute("textInline2", "文本内联2");
        map.addAttribute("textInline3", "文本内联3");

        map.addAttribute("classname", "spanTextClass");
        map.addAttribute("align", "center");
        return "inline";
    }

    @RequestMapping("/basic")
    public String toBasic(ModelMap map)
    {
        return "basic";
    }
}

 

3、测试可以看到:

  • JavaScript内联可以在JavaScript语句中拼接上Controller输出的ModelMap信息。
  • 文本内联通过在父标签中编写一次th:inline=“text",子标签中就可以自由输出信息。
  • 禁用内联可以源码输出含有[[]]字符的信息,例如二维数组[[11,12],[21,22],[31,32]]

 

三、基本对象

Thymeleaf除了可以输出Controller的ModelMap信息之外,还可以输出一些基本对象。

  • #ctx:上下文对象
  • #vars:上下文变量
  • #locale:区域对象
  • #request:(仅 Web 环境可用)HttpServletRequest 对象
  • #response:(仅 Web 环境可用)HttpServletResponse 对象
  • #session:(仅 Web 环境可用)HttpSession 对象
  • #servletContext:(仅 Web 环境可用)ServletContext 对象

 

Demo:

新建basic.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>基本对象</h1>
    <span th:text="${#request.getAttribute('requestInfo')}"></span>
    <br />
    <span th:text="${session.SiteName}"></span>
    <br />
    <span th:text="${#locale.country}"></span>
    <br />
    <br />
    <h1>简化写法</h1>
    <span th:text="${requestInfo}"></span>
</body>
</html>

 

controller增加测试代码:

package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import java.util.Date;

@Controller
public class IndexController
{
    @RequestMapping("/basic")
    public String toBasic(HttpServletRequest request)
    {
        request.setAttribute("requestInfo", "request 信息");
        request.getSession().setAttribute("SiteName", "CodeLabX");

        return "basic";
    }
}

 

1、ctx对象继承org.thymeleaf.context.IContext或者org.thymeleaf.context.IWebContext,取决于当前环境是不是web环境。

    如果程序集成了spring,那么将会是org.thymeleaf.spring[3|4].context.SpringWebContext   

    #org.thymeleaf.context.IContext
    ${#ctx.locale}
    ${#ctx.variables}
    #org.thymeleaf.context.IWebContext
    ${#ctx.applicationAttributes}
    ${#ctx.httpServletRequest}
    ${#ctx.httpServletResponse}
    ${#ctx.httpSession}
    ${#ctx.requestAttributes}
    ${#ctx.requestParameters}
    ${#ctx.servletContext}
    ${#ctx.sessionAttributes}

 

2、vars可以访问VariablesMap所有上下文中的变量

    #org.thymeleaf.context.VariablesMap
    ${#vars.get('foo')}
    ${#vars.containsKey('foo')}
    ${#vars.size()}

 

四、web环境对象

1、#httpServletRequest :javax.servlet.http.HttpServletRequest对象实例

    ${#httpServletRequest.getAttribute('foo')}
    ${#httpServletRequest.getParameter('foo')}
    ${#httpServletRequest.getContextPath()}
    ${#httpServletRequest.getRequestName()}

 

2.#httpSession(需要在contoller/action(HttpSession session)前提下使用)

    ${#httpSession.getAttribute('foo')}
    ${#httpSession.id}
    ${#httpSession.lastAccessedTime}

 

五、spring环境对象

    #themes : 提供和“ spring:theme JSP tag.”同样的功能。
    ${#themes.code('foo')}

 

六、web环境中访问request/session等属性

1、param :获取请求的参数.

    ${param.foo} // Retrieves a String[] with the values of request parameter 'foo'
    ${param.size()}
    ${param.isEmpty()}
    ${param.containsKey('foo')}

 

2、session:访问session属性

    ${session.foo} // Retrieves the session atttribute 'foo'
    ${session.size()}
    ${session.isEmpty()}
    ${session.containsKey('foo')}

 

3、application:获取应用程序/ servlet上下文属性

    ${application.foo} // Retrieves the ServletContext atttribute 'foo'
    ${application.size()}
    ${application.isEmpty()}
    ${application.containsKey('foo')}

 

七、直接访问spring注册对象

 <div th:text="${@authService.getUserName()}">

 

八、内嵌变量

Thymeleaf提供了一些常用的变量,,可以通过 # 直接访问。

  • execInfo: information about the template being processed.
  • messages: methods for obtaining externalized messages inside variables expressions, in the same way as they would be obtained using #{…} syntax.
  • uris: methods for escaping parts of URLs/URIs
  • conversions: methods for executing the configured conversion service (if any).
  • dates:java.util.Date 的功能方法类
  • calendars:类似 #dates,面向 java.util.Calendar
  • numbers:格式化数字的功能方法类
  • strings:字符串对象的功能类,contains、startWiths、prepending/appending 等
  • objects:对 objects 的功能类操作
  • bools:对布尔值求值的功能方法
  • arrays:对数组的功能类方法
  • lists:对 lists 的功能类方法
  • sets:set 的实用方法
  • maps:map 的实用方法
  • aggregates: methods for creating aggregates on arrays or collections.
  • #ids: methods for dealing with id attributes that might be repeated (for example, as a result of an iteration).

工具对象的使用方式见:https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html#appendix-b-expression-utility-objects, 以下仅仅举几个例子。

${#dates.format(date, 'dd/MMM/yyyy HH:mm')}
${#dates.arrayFormat(datesArray, 'dd/MMM/yyyy HH:mm')}
${#dates.listFormat(datesList, 'dd/MMM/yyyy HH:mm')}
${#dates.setFormat(datesSet, 'dd/MMM/yyyy HH:mm')}
${#dates.createNow()}
${#dates.createToday()} //time set to 00:00

${#strings.isEmpty(name)}  //Check whether a String is empty (or null)
${#strings.arrayIsEmpty(nameArr)}
${#strings.listIsEmpty(nameList)}
${#strings.setIsEmpty(nameSet)} 

${#strings.startsWith(name,'Don')}                  // also array*, list* and set*
${#strings.endsWith(name,endingFragment)}           // also array*, list* and set*

${#strings.length(str)}
${#strings.equals(str)}
${#strings.equalsIgnoreCase(str)}
${#strings.concat(str)}
${#strings.concatReplaceNulls(str)}

 

Demo:

新建utility.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>内嵌变量</h1>

    <span>格式化时间</span>
    <p th:text="${#dates.format(date, 'yyyy-MM-dd HH:mm:ss')}"></p>
    <br />

    <span>创建当前时间 精确到天</span>
    <p th:text="${#dates.createToday()}"></p>
    <br />

    <span>创建当前时间 精确到秒</span>
    <p th:text="${#dates.createNow()}"></p>
    <br />

    <span>判断是否为空</span>
    <p th:text="${#strings.isEmpty(userName)}"></p>
    <br />

    <span>判断 list 中每个元素是否为空</span>
    <p th:text="${#strings.listIsEmpty(users)}"></p>
    <br />

    <span>输出字符串长度</span>
    <p th:text="${#strings.length(userName)}"></p>
    <br />

    <span>拼接字符串</span>
    <p th:text="${#strings.concat(userName,userName,userName)}"></p>
    <br />

    <span>创建自定长度的字符串</span>
    <p th:text="${#strings.randomAlphanumeric(count)}"></p>
    <br />

</body>
</html>

 

controller增加测试代码:

package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Controller
public class IndexController
{
    @RequestMapping("/utility")
    public String utility(ModelMap map)
    {
        List<String> users = new ArrayList<>();
        users.add("111");
        users.add(null);
        users.add("333");

        map.addAttribute("userName", "CodeLabX");
        map.addAttribute("users", users);
        map.addAttribute("count", 12);
        map.addAttribute("date", new Date());
        return "utility";
    }
}

 

九、表达式

  • 变量表达式:${...}
  • 选择或星号表达式:*{...}
  • 文字国际化表达式:#{...}
  • URL表达式:@{...}
  • 片段表达式:~{...}

 

1、变量表达式

<span th:text="${welcomeText}">这里显示欢迎文字</span>

 

2、选择(星号)表达式

<div th:object="${book}”>
    <span th:text="*{title}"></span>
</div>

使用th:object定义一个book object,然后在之后*{title}来输出book的的title属性。

 

3、文字国际化表达式

文字国际化表达式可以根据当前设置的网站语言自动加载对应的语言文字。

 

Demo:

在resources资源目录下新建i18n文件夹,在文件夹内新建3个资源文件。

language.properties

siteInfo.siteName = 代码研究室(默认配置文件)

 

language_zh_CN.properties

siteInfo.siteName = 代码研究室(中文配置文件)

 

language_en_US.properties

siteInfo.siteName = CodeLabX(英文配置文件)

 

在application.properties中添加

spring.messages.basename=i18n/language

这个配置的意思是多国语言的资源文件在resources资源目录下的i18n目录下,文件名叫language。

 

新建文件i18n.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>i18n</h1>
    <p th:text="#{siteInfo.siteName}"></p>
</body>
</html>

 

controller增加测试代码:

package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Controller
public class IndexController
{
    @RequestMapping("/i18n")
    public String toI18n()
    {
        return "i18n";
    }
}

 

浏览器访问http://127.0.0.1:8080/i18n

显示

代码研究室(中文配置文件)

虽然显示成功了, 但是目前还无法切换语言。

 

切换语言代码:

自定义MyLocaleResolver类,实现LocaleResolver接口。

package com.example.demo.config;


import org.springframework.util.StringUtils;
import org.springframework.web.servlet.LocaleResolver;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Locale;

public class MyLocaleResolver implements LocaleResolver
{
    @Override
    public Locale resolveLocale(HttpServletRequest request)
    {
        String l = request.getParameter("l");
        Locale locale = Locale.getDefault();
        if (!StringUtils.isEmpty(l))
        {
            String[] split = l.split("_");
            locale = new Locale(split[0], split[1]);
        }
        return locale;
    }

    @Override
    public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale)
    {

    }
}

 

在配置类中,定义Bean。

package com.example.demo.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.LocaleResolver;

@Configuration
public class MyConfig
{
    @Bean
    public LocaleResolver localeResolver()
    {
        return new MyLocaleResolver();
    }
}

 

浏览器访问http://127.0.0.1:8080/i18n?l=en_US

显示

CodeLabX(英文配置文件)

浏览器访问http://127.0.0.1:8080/i18n?l=zh_CN

显示

代码研究室(中文配置文件)

 

4、URL表达式

在thymeleaf页面中通过URL表达式进行URL的动态参数拼接。如果是多个参数,只需要在()内逗号隔开。

例如:
使用<a th:href="@{/item/products(id=${productID},color=${colorID})}" target="_blank">产品详细页1</a>
可以得到<a href="/item/products?id=996&color=724" target="_blank">产品详细页1</a>

 

同样也可以使用拼接字符串的方式:

例如:
使用<a th:href="@{'/item/products?id=' + ${productID} + '&color=' + ${colorID}}" target="_blank">产品详细页2</a>
可以得到<a href="/item/products?id=996&color=724" target="_blank">产品详细页2</a>

 

5、片段表达式

片段表达式可以轻松的重复利用前端代码块。简单的说就是找出页面中重复出现的部分,通过引入的方式组合出新的页面。

因此Thymeleaf实现这种设计的过程也分两步:

  • 定义公共部分(通过使用th:fragment或者layout:fragment)
  • 引入公共部分(例如使用th:replace或者th:insert或者layout:fragment)

Demo:

pom.xml引入依赖

<dependency>
    <groupId>nz.net.ultraq.thymeleaf</groupId>
    <artifactId>thymeleaf-layout-dialect</artifactId>
</dependency>

templates/layout目录下新建页面(定义公共部分):

top.html

<div th:fragment="top">
    <span>公共顶部</span>
</div>

left.html

<div th:fragment="left">

    <span>公共左侧</span>

</div>

footer.html

<div th:fragment="footer">

    <span>公共底部</span>

</div>

当然每个页面也可以补充上完整的html、head、body等标签元素。

templates/目录下新建页面(引入公共部分):

layout.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Layout</title>
</head>
<body>
    <div th:replace="layout/top :: top"></div>
    <div th:replace="layout/left :: left"></div>
    <div>内容</div>
    <div th:replace="layout/footer :: footer"></div>
</body>
</html>

在controller中加入测试代码:

@RequestMapping("/layout")
public String toLayout()
{
    return "layout";
}

启动项目,访问http://127.0.0.1:8080/layout

显示:

公共顶部
公共左侧
内容
公共底部

查看页面源文件可以看到:

<html lang="en"><head>
    <meta charset="UTF-8">
    <title>Layout</title>
</head>
<body>
    <div>
    <span>公共顶部</span>
</div>
    <div>
    <span>公共左侧</span>
</div>
    <div>内容</div>
    <div>
    <span>公共底部</span>
</div>
</body></html>

但是这样每次使用都要引入3个公共部分,仍然不够简洁。因此这里就要用到layout:fragment标签了。

修改layout.html页面:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org" xmlns:layout="http://www.ultraq.net.nz/web/thymeleaf/layout">
<head>
    <meta charset="UTF-8">
    <title>Layout</title>
</head>
<body>
    <div th:replace="layout/top :: top"></div>
    <div th:replace="layout/left :: left"></div>
    <div layout:fragment="content">内容</div>
    <div th:replace="layout/footer :: footer"></div>
</body>
</html>

  使用layout:fragment同样也是表示定义一个公共部分。但是与th:fragment不同的是layout:fragment定义的公共部分是标明自身要被替换掉的部分,与th:fragment的作用恰好相反。从而,此时的layout.html页面转变成了一个公共页面。

 

举个例子来说明如何使用layout.html页面。

templates/目录下新建页面book.html

<!DOCTYPE html>
<html lang="en" xmlns:layout="http://www.ultraq.net.nz/web/thymeleaf/layout" layout:decorate="~{layout}">
<head>
    <meta charset="UTF-8">
    <title>Book</title>
</head>
<body>
    <div layout:fragment="content">
        <span>Book列表</span>
    </div>
</body>
</html>
  • layout:decorate="~{layout}”表示使用layout.html页面的内容布局。
  • layout:fragment="content”表示此标签内的内容将用来替换layout.html页面中的layout:fragment="content”标签定义的部分。

 

在controller中加入测试代码:

@RequestMapping("/book")
public String toBook()
{
    return "book";
}

启动项目,访问http://127.0.0.1:8080/book

显示:

公共顶部
公共左侧
Book列表
公共底部

 

  这里还有一个问题,book.html和layout.html页面都定义了<title>,最后运行时浏览器显示的title是Book。说明layout:fragment布局不仅仅是把当前页面的layout:fragment="content”的内容用来替换layout.html页面中的layout:fragment="content”标签定义的部分。layout:fragment布局还会把当前页面中定义的元素按照就近原则,优先显示。

  按照以上假想,如果删掉book.html的<title>Book</title>,在运行项目,浏览器title应该会显示Layout。

  经过测试确实如此。

 

十、表达式支持的语法

字面(Literals)

  • 文本文字(Text literals):'one text', 'Another one!',…
  • 数字文本(Number literals):0, 34, 3.0, 12.3,…
  • 布尔文本(Boolean literals):true, false
  • 空(Null literal):null
  • 文字标记(Literal tokens):one, sometext, main,…

 

文本操作(Text operations)

  • 字符串连接(String concatenation):+
  • 文本替换(Literal substitutions):|The name is ${name}|

 

算术运算(Arithmetic operations)

  • 二元运算符(Binary operators):+, -, *, /, %
  • 减号(单目运算符)Minus sign(unary operator):-

 

布尔操作(Boolean operations)

  • 二元运算符(Binary operators):and, or
  • 布尔否定(一元运算符)Boolean negation (unary operator):!, not

 

比较和等价(Comparisons and equality)

  • 比较(Comparators):>, <, >=, <= (gt, lt, ge, le)
  • 等值运算符(Equality operators):==, != (eq, ne)

 

条件运算符(Conditional operators)

  • If-then:(if) ? (then)
  • If-then-else:(if) ? (then) : (else)
  • Default: (value) ?:(defaultvalue)

 

十一、常用 th 标签

关键字

功能介绍

案例

th:id 

替换 id 

<input th:id="'xxx' + ${collect.id}"/>

th:text 

文本替换 

<p th:text="${collect.description}">description</p>

th:utext 

支持 html 的文本替换 

<p th:utext="${htmlcontent}">conten</p>

th:object 

替换对象 

<div th:object="${session.user}">

th:value 

属性赋值 

<input th:value="${user.name}" />

th:with 

变量赋值运算 

<div th:with="isEven=${prodStat.count}%2==0"></div>

th:style 

设置样式 

th:style="'display:' + @{(${sitrue} ? 'none' : 'inline-block')} + ''"

th:onclick 

点击事件 

th:onclick="'getCollect()'"

th:each 

属性赋值 

tr th:each="user,userStat:${users}">

th:if 

判断条件 

<a th:if="${userId == collect.userId}" >

th:unless 

和 th:if 判断相反 

<a th:href="@{/login}" th:unless=${session.user != null}>Login</a>

th:href 

链接地址 

<a th:href="@{/login}" th:unless=${session.user != null}>Login</a> />

th:switch 

多路选择 配合 th:case 使用 

<div th:switch="${user.role}">

th:case 

th:switch 的一个分支 

<p th:case="'admin'">User is an administrator</p>

th:fragment 

布局标签,定义一个代码片段,方便其他地方引用 

<div th:fragment="alert">

th:include 

布局标签,替换内容到引入的文件 

<head th:include="layout :: htmlhead" th:with="title='xx'"></head> />

th:replace 

布局标签,替换整个标签到引入的文件 

<div th:replace="fragments/header :: title"></div>

th:selected 

selected 选择框 选中 

th:selected="(${xxx.id} == ${configObj.dd})"

th:src 

图片类地址引入 

<img class="img-responsive" alt="App Logo" th:src="@{/img/logo.png}" />

th:inline 

定义 js 脚本可以使用变量 

<script type="text/javascript" th:inline="javascript">

th:action 

表单提交的地址 

<form action="subscribe.html" th:action="@{/subscribe}">

th:remove 

删除某个属性 

<tr th:remove="all">

1.all:删除包含标签和所有的子节点;

2.body:不包含标记删除,但删除其所有的子节点;

3.tag:包含标记的删除,但不删除它的子节点;

4.all-but-first:删除所有包含标签的子节点,除了第一个。

5.none:什么也不做。这个值是有用的动态评估 

th:attr 

设置标签属性,多个属性可以用逗号分隔 

比如 th:attr="src=@{/image/aa.jpg},title=#{logo}",此标签不太优雅,一般用的比较少 

 

十二、Thymeleaf的参数配置

# THYMELEAF (ThymeleafAutoConfiguration)
#开启模板缓存(默认值:true)
spring.thymeleaf.cache=true 
#检查模板是否存在,然后再呈现
spring.thymeleaf.check-template=true 
#检查模板位置是否正确(默认值:true)
spring.thymeleaf.check-template-location=true
#Content-Type的值(默认值:text/html)
spring.thymeleaf.content-type=text/html
#开启MVC Thymeleaf视图解析(默认值:true)
spring.thymeleaf.enabled=true
#模板编码
spring.thymeleaf.encoding=UTF-8
#要被排除在解析之外的视图名称列表,用逗号分隔
spring.thymeleaf.excluded-view-names=
#要运用于模板之上的模板模式。另见StandardTemplate-ModeHandlers(默认值:HTML5)
spring.thymeleaf.mode=HTML5
#在构建URL时添加到视图名称前的前缀(默认值:classpath:/templates/)
spring.thymeleaf.prefix=classpath:/templates/
#在构建URL时添加到视图名称后的后缀(默认值:.html)
spring.thymeleaf.suffix=.html
#Thymeleaf 模板解析器在解析器链中的顺序,默认情况下,它排第一位,顺序从1开始,只有在定义了额外的 TemplateResolver Bean 时才需要设置这个属性。
spring.thymeleaf.template-resolver-order=
#可解析的视图名称列表,用逗号分隔
spring.thymeleaf.view-names=

  具体可以配置的参数可以查看 org.springframework.boot.autoconfigure.thymeleaf.ThymeleafProperties这个类的源码,上面的配置实际上就是注入到该类中的属性值。

 

参考文档:

https://www.jianshu.com/p/b750b8643a43

 

Bootstrap Thumbnail Second
MySQL

MySQL is the world's most popular open source database.

GO

Bootstrap Thumbnail Third
算法基础

本书介绍了什么是计算机算法,如何描述它们,以及如何来评估它们。

GO