资讯专栏INFORMATION COLUMN

Spring Boot 2.0 整合 Thymeleaf 模块引擎

CoreDump / 3067人阅读

摘要:如果还在使用以前的版本,想要使用非严格的,需要做以下配置在中引入依赖在中配置更多属性配置请参考中模块的属性介绍。这样的话很好的做到了前后端分离。

本文首发于:https://y0ngb1n.github.io/a/5...
开发环境

  org.springframework.boot
  spring-boot-starter-parent
  2.1.0.RELEASE



  1.8
引入依赖

主要增加 spring-boot-starter-thymeleaf 依赖:

spring-boot-starter-thymeleaf:自动装配 Thymeleaf 模板引擎


  ...

  
  
    org.springframework.boot
    spring-boot-starter-thymeleaf
  
  
  
  ...
配置 Thymeleaf

application.yml

spring:
  thymeleaf:
    cache: false                  # 是否开启模板缓存,默认为:true,开发时关闭缓存,不然没法看到实时页面!
    mode: HTML                    # 指定模板的模式,默认为:HTML
    encoding: UTF-8               # 指定模板的编码,默认为:UTF-8
    prefix: classpath:/templates/ # 指定模板的前缀,默认为:classpath:/templates/
    suffix: .html                 # 指定模板的后缀,默认为:.html
    servlet:
      content-type: text/html     # 指定 Content-Type 值,默认为:text/html

org.thymeleaf.templatemode.TemplateMode 中可见 Thymeleaf3.0.0 版本开始使用 HTML 替代 HTML5、LEGACYHTML5、XHTML、VALIDXHTML。如果还在使用 3.0.0 以前的版本,想要使用非严格的 HTML,需要做以下配置:

pom.xml 中引入 nekohtml 依赖

application.yml 中配置 spring.thymeleaf.mode=LEGACYHTML5

更多属性配置请参考「Appendix A. Common application properties」中 # THYMELEAF (ThymeleafAutoConfiguration) 模块的属性介绍。(TIPS:使用 CTRL + F 进行快速定位)

创建测试 Controller

创建一个 Controller,为 message 属性赋值并设置跳转,代码如下:

IndexController.java

@Controller
public class IndexController {

  @GetMapping(path = {"/", "index"})
  public String indexPage(Model model) {
    model.addAttribute("message", "Hello Thymeleaf!");
    return "index";
  }
}
创建测试 HTML 页面

templates 目录下创建 index.html 文件,并在 html 标签中声明 Thymeleaf 命名空间 xmlns:th="http://www.thymeleaf.org",代码如下:

index.html



  
    
    Thymeleaf
  
  
    

Hello World!

其中关键的代码是:

xmlns:th="http://www.thymeleaf.org"

主要是让 IDE 识别 Thymeleaf 命名空间,这样在标签里输入 th: 后,IDE 会提示相应的语法,方便开发!不加入这句代码也不会影响 Thymeleaf 模板引擎的渲染,以及页面的正常显示。

测试访问

启动成功后,访问 http://127.0.0.1:8080,即可看到效果:

访问结果:Hello Thymeleaf!

Thymeleaf 常用语法

JAVA 源码路径:TagsController.java

HTML 源码路径:templates 目录

获取变量值

name

可以看出获取变量值用 $ 符号,对于 JavaBean 的话使用 变量名.属性名 方式获取,这点和 EL 表达式一样。

另外 $ 表达式只能写在 th 标签内部,不然不会生效,上面例子就是使用 th:text 标签的值替换

...

标签里面的值,至于 p 里面的原有的值只是为了给前端开发时做展示用的。这样的话很好的做到了前后端分离。

内容信息输出:th:textth:utext

th:text:以纯文本的方式输出

th:utext:以 HTML 标签的方式输出,浏览器能正常渲染

HTML 代码:


  

以纯文本的方式输出

以 HTML 标签的方式输出,浏览器能正常渲染

JAVA 代码:

@GetMapping("/text-utext")
public String textAndutext(Model model) {
  model.addAttribute("content", "thymeleaf text output");
  return "text-utext";
}
引用 URL

对于 URL 的处理是通过语法 @{…} 来处理的:

HTML 代码:


  

JAVA 代码:

@GetMapping("/refer-url")
public String referUrl(Model model) {
  model.addAttribute("username", "y0ngb1n");
  return "refer-url";
}

类似的标签有:th:hrefth:src

字符串替换

很多时候可能我们只需要对一大段文字中的某一处地方进行替换,可以通过字符串拼接操作完成:

可以用另一种更简洁的方式:

文字替换本身可以和与其他表达式联合使用:

当然这种形式限制比较多,|…| 中只能包含变量表达式 ${…},不能包含其他常量、条件表达式等。

HTML 代码:


  

JAVA 代码:

@GetMapping("replace-text")
public String replaceText(Model model) {
  model.addAttribute("user", user);
  model.addAttribute("onevar", "one");
  model.addAttribute("twovar", "two");
  model.addAttribute("threevar", "three");
  return "replace-text";
}
运算符

在表达式中可以使用各类算术运算符,例如 +, -, *, /, %

th:with="isEven=(${user.age} % 2 == 0)"

逻辑运算符 >, <, <=, >=, ==, != 都可以使用,唯一需要注意的是使用 <, > 时需要用它的 HTML 转义符:

th:if="${user.age} > 1"
th:text=""Environment is " + ((${env} == "dev") ? "Development" : "Production")"

HTML 代码:


  

年龄为偶数

哟,才 18 呐!

当前年龄大于 18

JAVA 代码:

@GetMapping("/operator")
public String operator(Model model) {
  model.addAttribute("user", user);
  model.addAttribute("env", "dev");
  return "operator";
}
条件判断 th:if, th:unless

使用 th:ifth:unless 属性进行条件判断,下面的例子中,标签只有在 th:if 中条件成立时才显示:

Login
Login

th:unlessth:if 恰好相反,只有表达式中的条件不成立,才会显示其内容。

th:switch, th:case

支持多路选择 Switch 结构:

User is an administrator

User is a manager

默认属性 default 可以用 * 表示:

User is an administrator

User is a manager

User is some other thing

消息表达式:#{...},也称为文本外部化、国际化或 i18n

HTML 代码:


  登录
  

欢迎,tony

User is an administrator

User is a manager

User is some other thing

JAVA 代码:

@GetMapping("/condition")
public String condition(Model model) {
  model.addAttribute("user", user);
  return "condition";
}
循环

渲染列表数据是一种非常常见的场景,例如现在有 n 条记录需要渲染成一个表格,该数据集合必须是可以遍历的,使用 th:each 标签:

HTML 代码:


  
NAME AGE ADMIN
Onions 22 yes

可以看到,需要在被循环渲染的元素(这里是)中加入 th:each 标签,其中 th:each="prod : ${prods}" 意味着对集合变量 prods 进行遍历,循环变量是 prod 在循环体中可以通过表达式访问。

JAVA 代码:

@GetMapping("/loop")
public String loop(Model model) {
  List users = new ArrayList<>(3);
  users.add(user);
  users.add(User.builder().name("tony").age(23).role("user").build());
  users.add(User.builder().name("tom").age(21).role("user").build());

  model.addAttribute("users", users);
  return "loop";
}

更多标签用法请参考「Thymeleaf 常用语法」、「Thymeleaf 参考手册」解锁更多技巧            
               
                                           
                       
                 

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/72480.html

相关文章

  • Spring Boot 2.x 系列教程:WebFlux 系列教程大纲(一)

    摘要:使用则需要及以上版本。开发使用框架七系列教程目录系列教程大纲快速入门实践实践整合整合中和实践整合中实现缓存中实现通信集成测试及部署实战图书管理系统 WebFlux 系列教程大纲 一、背景 大家都知道,Spring Framework 是 Java/Spring 应用程序跨平台开发框架,也是 Java EE(Java Enterprise Edition) 轻量级框架,其 Spring ...

    jone5679 评论0 收藏0
  • Spring Boot 2 快速教程:WebFlux 快速入门(二)

    摘要:响应式编程是基于异步和事件驱动的非阻塞程序,只是垂直通过在内启动少量线程扩展,而不是水平通过集群扩展。三特性常用的生产的特性如下响应式编程模型适用性内嵌容器组件还有对日志消息测试及扩展等支持。 摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 02:WebFlux 快速入门实践 文章工程: JDK...

    gaara 评论0 收藏0
  • Spring Boot 2 快速教程:WebFlux 集成 Thymeleaf(五)

    摘要:数据和信息是不可分离的,数据是信息的表达,信息是数据的内涵。数据本身没有意义,数据只有对实体行为产生影响时才成为信息。主要目标是为开发提供天然的模板,并且能在里面准确的显示。目前是自然更加推荐。 这是泥瓦匠的第105篇原创 文章工程: JDK 1.8 Maven 3.5.2 Spring Boot 2.1.3.RELEASE 工程名:springboot-webflux-4-thym...

    姘存按 评论0 收藏0
  • 一起来学SpringBoot | 第四篇:整合Thymeleaf模板

    摘要:在使用上述模板,默认从下加载。介绍是现代化服务器端的模板引擎,不同与其它几种模板的是的语法更加接近,并且具有很高的扩展性。特点支持无网络环境下运行,由于它支持原型,然后在标签里增加额外的属性来达到模板数据的展示方式。 SpringBoot 是为了简化 Spring 应用的创建、运行、调试、部署等一系列问题而诞生的产物,自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,...

    TZLLOG 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<