页面静态化--Thymeleaf (2)

页面静态化--Thymeleaf

而且,还配置了模板文件(html)的位置,与jsp类似的前缀+ 视图名 + 后缀风格:

页面静态化--Thymeleaf

默认前缀:classpath:/templates/

默认后缀:.html

所以如果我们返回视图:users,会指向到 classpath:/templates/users.html

Thymeleaf默认会开启页面缓存,提高页面并发能力。但会导致我们修改页面不会立即被展现,因此我们关闭缓存:

## 关闭Thymeleaf的缓存 spring.thymeleaf.cache=false

另外,修改完毕页面,需要使用快捷键:Ctrl + Shift + F9来刷新工程。

3.3.快速开始

我们准备一个controller,控制视图跳转:

@Controller public class HelloController { @GetMapping("show1") public String show1(Model model){ model.addAttribute("msg", "Hello, Thymeleaf!"); return "hello"; } }

新建一个html模板:

<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>hello</title> </head> <body> <h1 th:text="${msg}">大家好</h1> </body> </html>

注意,把html 的名称空间,改成:xmlns:th="http://www.thymeleaf.org" 会有语法提示

启动项目,访问页面:

页面静态化--Thymeleaf

4.语法

Thymeleaf的主要作用是把model中的数据渲染到html中,因此其语法主要是如何解析model中的数据。从以下方面来学习:

变量

方法

条件判断

循环

运算

逻辑运算

布尔运算

比较运算

条件运算

其它

4.1.变量 变量案例

我们先新建一个实体类:User

public class User { String name; int age; User friend;// 对象类型属性 }

然后在模型中添加数据

@GetMapping("show2") public String show2(Model model){ User user = new User(); user.setAge(21); user.setName("Jack Chen"); user.setFriend(new User("李小龙", 30)); model.addAttribute("user", user); return "show2"; }

语法说明:

Thymeleaf通过${}来获取model中的变量,注意这不是el表达式,而是ognl表达式,但是语法非常像。

示例:

我们在页面获取user数据:

<h1> 欢迎您:<span th:text="${user.name}">请登录</span> </h1>

效果:

页面静态化--Thymeleaf

感觉跟el表达式几乎是一样的。不过区别在于,我们的表达式写在一个名为:th:text的标签属性中,这个叫做指令

动静结合

指令:

Thymeleaf崇尚自然模板,意思就是模板是纯正的html代码,脱离模板引擎,在纯静态环境也可以直接运行。现在如果我们直接在html中编写 ${}这样的表达式,显然在静态环境下就会出错,这不符合Thymeleaf的理念。

Thymeleaf中所有的表达式都需要写在指令中,指令是HTML5中的自定义属性,在Thymeleaf中所有指令都是以th:开头。因为表达式${user.name}是写在自定义属性中,因此在静态环境下,表达式的内容会被当做是普通字符串,浏览器会自动忽略这些指令,这样就不会报错了!

现在,我们不经过SpringMVC,而是直接用浏览器打开页面看看:

页面静态化--Thymeleaf

静态页面中,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']}

4.2.自定义变量

场景

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyzdxp.html