细品 Spring Boot+Thymeleaf,还有这么多好玩的细节!

@

*
1. Thymeleaf 简介
2. 整合 Spring Boot
+ 2.1 基本用法
+ 2.2 手动渲染
3. Thymeleaf 细节
+ 3.1 标准表达式语法
* 3.1.1 简单表达式
* 3.1.2 字面量
* 3.1.3 文本运算
* 3.1.4 算术运算
* 3.1.5 布尔运算
* 3.1.6 比较和相等
* 3.1.7 条件运算符
* 3.1.8 内置对象
* ctx:上下文对象。
* vars: 上下文变量。
* locale:上下文区域设置。
* request:(仅在 Web 上下文中)HttpServletRequest 对象。
* response:(仅在 Web 上下文中)HttpServletResponse 对象。
* session:(仅在 Web 上下文中)HttpSession 对象。
* servletContext:(仅在 Web 上下文中)ServletContext 对象。
* execInfo:有关正在处理的模板的信息。
* messages:在变量表达式中获取外部化消息的方法,与使用#{…}语法获得的方式相同。
* uris:转义URL / URI部分的方法
* conversions:执行配置的转换服务(如果有)的方法。
* dates:java.util.Date对象的方法:格式化,组件提取等
* calendars:类似于#dates但是java.util.Calendar对象。
* numbers:用于格式化数字对象的方法。
* strings:String对象的方法:contains,startsWith,prepending / appending等
* objects:一般对象的方法。
* bools:布尔评估的方法。
* arrays:数组方法。
* lists:列表的方法。
* sets:集合的方法。
* maps:地图方法。
* aggregates:在数组或集合上创建聚合的方法。
* ids:处理可能重复的id属性的方法(例如,作为迭代的结果)。

+ 3.2 设置属性值
+ 3.3 遍历
+ 3.4 分支语句
+ 3.5 本地变量
+ 3.6 内联
4. 小结

虽然现在流行前后端分离,但是后端模版在一些关键地方还是非常有用的,例如邮件模版、代码模版等。当然也不排除一些古老的项目后端依然使用动态模版。

Thymeleaf 简洁漂亮、容易理解,并且完美支持 HTML5,可以直接打开静态页面,同时不新增标签,只需增强属性,这样也降低了学习成本。

因此松哥今天花点时间和大家仔细分享一下 Thymeleaf。

1. Thymeleaf 简介

Thymeleaf 是新一代 Java 模板引擎,它类似于 Velocity、FreeMarker 等传统 Java 模板引擎,但是与传统 Java 模板引擎不同的是,Thymeleaf 支持 HTML 原型。

它既可以让前端工程师在浏览器中直接打开查看样式,也可以让后端工程师结合真实数据查看显示效果,同时,SpringBoot 提供了 Thymeleaf 自动化配置解决方案,因此在 SpringBoot 中使用 Thymeleaf 非常方便。

事实上, Thymeleaf 除了展示基本的 HTML ,进行页面渲染之外,也可以作为一个 HTML 片段进行渲染,例如我们在做邮件发送时,可以使用 Thymeleaf 作为邮件发送模板。

另外,由于 Thymeleaf 模板后缀为 .html,可以直接被浏览器打开,因此,预览时非常方便。

2. 整合 Spring Boot

2.1 基本用法

Spring Boot 中整合 Thymeleaf 非常容易,只需要创建项目时添加 Thymeleaf 即可:

细品 Spring Boot+Thymeleaf,还有这么多好玩的细节!

创建完成后,pom.xml 依赖如下:


    org.springframework.boot
    spring-boot-starter-thymeleaf

    org.springframework.boot
    spring-boot-starter-web

当然,Thymeleaf 不仅仅能在 Spring Boot 中使用,也可以使用在其他地方,只不过 Spring Boot 针对 Thymeleaf 提供了一整套的自动化配置方案,这一套配置类的属性在 org.springframework.boot.autoconfigure.thymeleaf.ThymeleafProperties 中,部分源码如下:

@ConfigurationProperties(prefix = "spring.thymeleaf")
public class ThymeleafProperties {
        private static final Charset DEFAULT_ENCODING = StandardCharsets.UTF_8;
        public static final String DEFAULT_PREFIX = "classpath:/templates/";
        public static final String DEFAULT_SUFFIX = ".html";
        private boolean checkTemplate = true;
        private boolean checkTemplateLocation = true;
        private String prefix = DEFAULT_PREFIX;
        private String suffix = DEFAULT_SUFFIX;
        private String mode = "HTML";
        private Charset encoding = DEFAULT_ENCODING;
        private boolean cache = true;
        //...

}
  1. 首先通过 @ConfigurationProperties 注解,将 application.properties 前缀为 spring.thymeleaf 的配置和这个类中的属性绑定。
  2. 前三个 static 变量定义了默认的编码格式、视图解析器的前缀、后缀等。
  3. 从前三行配置中,可以看出来, Thymeleaf 模板的默认位置在 resources/templates 目录下,默认的后缀是 html
  4. 这些配置,如果开发者不自己提供,则使用 默认的,如果自己提供,则在 application.properties 中以 spring.thymeleaf 开始相关的配置。

而我们刚刚提到的,Spring Boot 为 Thymeleaf 提供的自动化配置类,则是 org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration ,部分源码如下:

@Configuration
@EnableConfigurationProperties(ThymeleafProperties.class)
@ConditionalOnClass({ TemplateMode.class, SpringTemplateEngine.class })
@AutoConfigureAfter({ WebMvcAutoConfiguration.class, WebFluxAutoConfiguration.class })
public class ThymeleafAutoConfiguration {
}

可以看到,在这个自动化配置类中,首先导入 ThymeleafProperties ,然后 @ConditionalOnClass 注解表示当当前系统中存在 TemplateModeSpringTemplateEngine 类时,当前的自动化配置类才会生效,即只要项目中引入了 Thymeleaf 相关的依赖,这个配置就会生效。

这些默认的配置我们几乎不需要做任何更改就可以直接使用了。如果开发者有特殊需求,则可以在 application.properties 中配置以 spring.thymeleaf 开头的属性即可。

接下来我们就可以创建 Controller 了,实际上引入 Thymeleaf 依赖之后,我们可以不做任何配置。新建的 IndexController 如下:

@Controller
public class IndexController {
    @GetMapping("/index")
    public String index(Model model) {
        List users = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            User u = new User();
            u.setId((long) i);
            u.setName("javaboy:" + i);
            u.setAddress("深圳:" + i);
            users.add(u);
        }
        model.addAttribute("users", users);
        return "index";
    }
}
public class User {
    private Long id;
    private String name;
    private String address;
    //省略 getter/setter
}

IndexController 中返回逻辑视图名+数据,逻辑视图名为 index ,意思我们需要在 resources/templates 目录下提供一个名为 index.htmlThymeleaf 模板文件。

  • 创建 Thymeleaf

    Title

        编号
        用户名
        地址

Thymeleaf 中,通过 th:each 指令来遍历一个集合,数据的展示通过 th:text 指令来实现,

注意 index.html 最上面引入 thymeleaf 名称空间(最新版并无强制要求)。

配置完成后,就可以启动项目了,访问 /index 接口,就能看到集合中的数据了:

细品 Spring Boot+Thymeleaf,还有这么多好玩的细节!

2.2 手动渲染

前面我们说的是返回一个 Thymeleaf 模板,我们也可以手动渲染 Thymeleaf 模板,这个一般在邮件发送时候有用,例如我在 resources/templates 目录下新建一个邮件模板,如下:


    Title

hello 欢迎 加入 XXX 集团,您的入职信息如下:

        职位

        薪水

这一个 HTML 模板中,有几个变量,我们要将这个 HTML 模板渲染成一个 String 字符串,再把这个字符串通过邮件发送出去,那么如何手动渲染呢?

@Autowired
TemplateEngine templateEngine;
@Test
public void test1() throws MessagingException {
    Context context = new Context();
    context.setVariable("username", "javaboy");
    context.setVariable("position", "Java工程师");
    context.setVariable("salary", 99999);
    String mail = templateEngine.process("mail", context);
    //省略邮件发送
}
  1. 渲染时,我们需要首先注入一个 TemplateEngine 对象,这个对象就是在 Thymeleaf 的自动化配置类中配置的(即当我们引入 Thymeleaf 的依赖之后,这个实例就有了)。
  2. 然后构造一个 Context 对象用来存放变量。
  3. 调用 process 方法进行渲染,该方法的返回值就是渲染后的 HTML 字符串,然后我们将这个字符串发送出去。

3. Thymeleaf 细节

前面两个案例让小伙伴们大致上理解了在 Spring Boot 中要如何使用 Thymeleaf,接下来,松哥将详细介绍 Thymeleaf 本身的一些具体用法。

3.1 标准表达式语法

3.1.1 简单表达式

${...}

直接使用 th:xx = "${}" 获取对象属性。这个在前面的案例中已经演示过了,不再赘述。

*{...}

可以像 ${...} 一样使用,也可以通过 th:object 获取对象,然后使用 th:xx = "*{}" 获取对象属性,这种简写风格极为清爽,推荐大家在实际项目中使用。


    用户名

    地址

#{...}

通常的国际化属性: #{...} 用于获取国际化语言翻译值。

在 resources 目录下新建两个文件:messages.properties 和 messages_zh_CN.properties,内容如下:

messages.properties:

message = javaboy

messages_zh_CN.properties:

message = 江南一点雨

然后在 thymeleaf 中引用 message,系统会根据浏览器的语言环境显示不同的值:

@{...}

  • *引用绝对 URL:

等价于:


  • *上下文相关的 URL:

首先在 application.properties 中配置 Spring Boot 的上下文,以便于测试:

server.servlet.context-path=/myapp

引用路径:


等价于:


  • *相对 URL:

这个相对是指相对于服务器的 URL,例如如下引用:


等价于:


应用程序的上下文 /myapp 将被忽略。

  • *协议相对 URL:

等价于:


  • *带参数的 URL:

等价于:


~{...}

片段表达式是 Thymeleaf 的特色之一,细粒度可以达到标签级别,这是 JSP 无法做到的。片段表达式拥有三种语法:

  • ~{ viewName }:表示引入完整页面
  • ~{ viewName ::selector}:表示在指定页面寻找片段,其中 selector 可为片段名、jquery选择器等
  • ~{ ::selector}: 表示在当前页寻找

举个简单例子。

在 resources/templates 目录下新建 my_fragment.html 文件,内容如下:

www.javaboy
www.itboyhub.com

这里有两个 div,通过 th:fragment 来定义片段,两个 div 分别具有不同的名字。

然后在另外一个页面中引用该片段:


    用户名

    地址

通过 th:replace 来引用片段。第一个表示引用完整的 my_fragment.html 页面;第二个表示引用 my_fragment.html 中的名为 javaboy_link 的片段;第三个表示引用当前页面名为 aaa 的片段,也就是上面那个 table。

3.1.2 字面量

这些是一些可以直接写在表达式中的字符,主要有如下几种:

  • 文本字面量: ‘one text’, ‘Another one!’,…

  • 数字字面量: 0, 34, 3.0, 12.3,…

  • 布尔字面量: true, false

  • Null字面量: null
  • 字面量标记:one, sometext, main,…

案例:


如果文本是英文,并且不包含空格、逗号等字符,可以不用加单引号。

3.1.3 文本运算

文本可以使用 + 进行拼接。


如果字符串中包含变量,也可以使用另一种简单的方式,叫做字面量置换,用 | 代替 '...' + '...',如下:


3.1.4 算术运算

算术运算有: +, -, *, /%

th:with 定义了一个局部变量 age,在其所在的 div 中可以使用该局部变量。

3.1.5 布尔运算

  • 二元运算符:and, or
  • 布尔非(一元运算符):!, not

案例:

3.1.6 比较和相等

表达式里的值可以使用 >, <, >=<=< code> &#x7B26;&#x53F7;&#x6BD4;&#x8F83;&#x3002;<code>==</code> &#x548C; <code>!=</code> &#x8FD0;&#x7B97;&#x7B26;&#x7528;&#x4E8E;&#x68C0;&#x67E5;&#x76F8;&#x7B49;&#xFF08;&#x6216;&#x8005;&#x4E0D;&#x76F8;&#x7B49;&#xFF09;&#x3002;&#x6CE8;&#x610F; <code>XML</code>&#x89C4;&#x5B9A; <code><</code> &#x548C; <code>></code> &#x6807;&#x7B7E;&#x4E0D;&#x80FD;&#x7528;&#x4E8E;&#x5C5E;&#x6027;&#x503C;&#xFF0C;&#x6240;&#x4EE5;&#x5E94;&#x5F53;&#x628A;&#x5B83;&#x4EEC;&#x8F6C;&#x4E49;&#x4E3A; <code><</code> &#x548C; <code>></code>&#x3002;<!--=<-->

如果不想转义,也可以使用别名:gt (>);lt (

Original: https://www.cnblogs.com/lenve/p/14153422.html
Author: 江南一点雨
Title: 细品 Spring Boot+Thymeleaf,还有这么多好玩的细节!

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/542082/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球