从JSP快速过渡到Thymeleaf,你要掌握的Thymeleaf语法
从JSP快速过渡到Thymeleaf,你要掌握的Thymeleaf语法
背景介绍
Thymeleaf是⽤来开发Web和独⽴环境项⽬的现代服务器端Java模板引擎。
Thymeleaf的主要⽬标是为您的开发⼯作流程带来优雅的⾃然模板 - HTML。可以在直接浏览器中正确显⽰,并且可以作为静态原型,从⽽在开发团队中实现更强⼤的协作。
借助Spring Framework的模块,可以根据⾃⼰的喜好进⾏⾃由选择,可插拔功能组件,Thymeleaf是现代HTML5 JVM Web开发的理想选择 - 尽管它可以做的更多。
Spring官⽅⽀持的服务的渲染模板中,并不包含jsp。⽽是Thymeleaf和Freemarker等,⽽Thymeleaf与SpringMVC的视图技术,及SpringBoot的⾃动化配置集成⾮常完美,⼏乎没有任何成本,你只⽤关注Thymeleaf的语法即可
Thymeleaf
动静结合:Thymeleaf 在有⽹络和⽆⽹络的环境下皆可运⾏,即它可以让美⼯在浏览器查看页⾯的静态效果,也可以让程序员在服务器查看带数据的动态页⾯效果。这是由于它⽀持 html 原型,然后在 html 标签⾥增加额外的属性来达到模板+数据的展⽰⽅式。浏览器解释 html 时会忽略未定义的标签属性,所以 thymeleaf 的模板可以静态地运⾏;当有数据返回到页⾯时,Thymeleaf 标签会动态地替换掉静态内容,使页⾯动态显⽰。
开箱即⽤:它提供标准和spring标准两种⽅⾔,可以直接套⽤模板实现JSTL、 OGNL表达式效果,避免每天套模板、改jstl、改标签的困扰。同时开发⼈员也可以扩展和创建⾃定义的⽅⾔。
多⽅⾔⽀持:Thymeleaf 提供spring标准⽅⾔和⼀个与 SpringMVC 完美集成的可选模块,可以快速的实现表单绑定、属性编辑器、国际化等功能。
与SpringBoot完美整合,SpringBoot提供了Thymeleaf的默认配置,并且为Thymeleaf设置了视图解析器,我们可以像以前操作jsp⼀样来操作Thymeleaf。代码⼏乎没有任何区别,就是在模板语法上有区别
⽂章⽬录
快速开始
使⽤spring脚⼿架搭建环境
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="/POM/4.0.0"xsi="/2001/XMLSchema-instance"
schemaLocation="/POM/4.0.0 /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.2.7.RELEASE</version>
<relativePath/><!-- lookup parent from repository -->
</parent>
<groupId>com.junsir</groupId>
<artifactId>testthymeleaf</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>testthymeleaf</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-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
Thymeleaf默认会开启页⾯缓存,提⾼页⾯并发能⼒。但会导致我们修改页⾯不会⽴即被展现,因此我们关闭缓存:
# 关闭Thymeleaf的缓存
spring.thymeleaf.cache=false
另外,修改完毕页⾯,需要使⽤快捷键:Ctrl + Shift + F9来刷新⼯程。
创建Controller:
@Controller
public class HelloController {
@GetMapping("show1")
public String show1(Model model){
model.addAttribute("msg","Hello, Thymeleaf!");
model.addAttribute("msg","Hello, Thymeleaf!");
return"hello";
}
}
准备html:
注意:spring boot⾃动帮我们配置了视图解析器Resolver
⽽且,还配置了模板⽂件(html)的位置,与jsp类似的前缀+ 视图名 + 后缀风格:默认前缀:classpath:/templates/
默认后缀:.html
html:
<!DOCTYPE html>
<html lang="en"th="">
<head>
<meta charset="UTF-8">
<title>hello</title>
</head>
<body>
<h1 text="${msg}">⼤家好</h1>
</body>
</html>
注意,把html 的名称空间,改成:xmlns:th="" 会有语法提⽰
启动项⽬,访问:
Thymeleaf的主要作⽤是把model中的数据渲染到html中,因此其语法主要是如何解析model中的数据
变量
Thymeleaf通过${}来获取model中的变量,注意这不是el表达式,⽽是ognl表达式,但是语法⾮常像
<h1>
欢迎您:<span text="${user.name}">请登录</span>
</h1>
model.addAttribute("user", user);
return"show2";
动静结合:
Thymeleaf崇尚⾃然模板,意思就是模板是纯正的html代码,脱离模板引擎,在纯静态环境也可以直接运⾏。现在如果我们直接在html中编写 ${}这样的表达式,显然在静态环境下就会出错,这不符合Thymeleaf的理念
Thymeleaf中所有的表达式都需要写在指令中,指令是HTML5中的⾃定义属性,在Thymeleaf中所有指令都是以th:开头。因为表达式${user.name}是写在⾃定义属性中,因此在静态环境下,表达式的内容会被当做是普通字符串,浏览器会⾃动忽略这些指令,这样就不会报错了!
静态页⾯中,th指令不被识别,但是浏览器也不会报错,把它当做⼀个普通属性处理。这样span的默认值请登录就会展现在页⾯
如果是在Thymeleaf环境下,th指令就会被识别和解析,⽽th:text的含义就是替换所在标签中的⽂本内容,于是user.name的值就替代了span中默认值
指令的设计,正是Thymeleaf的⾼明之处,也是它优于其它模板引擎的原因。动静结合的设计,使得⽆论是前端开发⼈员还是后端开发⼈员可以完美契合
向下兼容:
但是要注意,如果浏览器不⽀持Html5怎么办?
如果不⽀持这种th:的命名空间写法,那么可以把th:text换成 data-th-text,Thymeleaf也可以兼容
escape:
另外,th:text指令出于安全考虑,会把表达式读取到的值进⾏处理,防⽌html的注⼊。
例如,<p>你好</p>将会被格式化输出为$lt;p$gt;你好$lt;/p$lt;。
如果想要不进⾏格式化输出,⽽是要输出原始内容,则使⽤th:utext来代替.
ognl表达式的语法糖:
刚才获取变量值,我们使⽤的是经典的对象.属性名⽅式。但有些情况下,我们的属性名可能本⾝也是变量,怎么办?
ognl提供了类似js的语法⽅式:
例如:${user.name} 可以写作${user['name']}
⽅法
ognl表达式中的⽅法调⽤:
ognl表达式本⾝就⽀持⽅法调⽤,例如:
<h2 object="${user}">
<p>FirstName: <span text="*{name.split('')[0]}">Jack</span>.</p>
<p>LastName: <span text="*{name.split('')[1]}">Li</span>.</p>
</h2>
这⾥我们调⽤了name(是⼀个字符串)的split⽅法
Thymeleaf内置对象:
Thymeleaf中提供了⼀些内置对象,并且在这些对象中提供了⼀些⽅法,⽅便我们来调⽤。获取这些对象,需要使⽤#对象名来引⽤⼀些环境相关对象
对象作⽤
#ctx获取Thymeleaf⾃⼰的Context对象
#requset如果是web程序,可以获取HttpServletRequest对象
#response如果是web程序,可以获取HttpServletReponse对象
#session如果是web程序,可以获取HttpSession对象
el表达式获取session中的值#servletContext如果是web程序,可以获取HttpServletContext对象
Thymeleaf提供的全局对象:
对象作⽤
#dates处理java.util.date的⼯具对象
#calendars处理java.util.calendar的⼯具对象
#numbers⽤来对数字格式化的⽅法
#strings⽤来处理字符串的⽅法
#bools⽤来判断布尔值的⽅法
#arrays⽤来护理数组的⽅法
#lists⽤来处理List集合的⽅法
#sets⽤来处理set集合的⽅法
#maps⽤来处理map集合的⽅法
举例
我们在环境变量中添加⽇期类型对象
model.addAttribute("today",new Date());
在页⾯中处理
<p>
今天是: <span text="${#dates.format(today,'yyyy-MM-dd')}">2018-04-25</span>
</p>
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论