thymeleaf,thymeleaf模板引擎
一篇文章搞懂Thymeleaf
在控制器中往页面传递几个变量:
在页面中使用变量表达式${}来获取它们:
可以看到变量表达式不但可以获取变量的属性值,甚至还可以访问变量的方法(getName()和upcaseName())。session代表HttpSession对象。
*{}代指th:object所指定的对象,即${session.user}。
URL链接表达式会给URL自动添加上下文的名字。比如:
解析后的href值为 。
当需要在URL中传递参数时,比如这样 ,可以如下操作:
传递多个参数:
路径变量的写法:
后端接受路径变量:
除了使用'...' + ${}来连接字面量和变量外,还可以使用|...|来代替,比如:
等价于:
注意: 在| ... |字面替换中只允许有变量表达式${...}
条件表达式实际上就是三目运算符。比如:
条件表达式也可以使用括号嵌套:
else表达式也可以省略,在这种情况下,如果条件为false,则返回空值:
默认表达式是一种特殊类型的条件值,不带then部分。比如:
表示,当${session.user.sex}为null时,值为sex is unknown,否则为表达式的值。这就好像为表达式指定了一个默认值一样。其等价于:
Thymeleaf默认提供了丰富的表达式工具类,这里列举一些常用的工具类。
比如:
注意事项 :
值得注意的是,在使用工具类对某个表达式进行处理时候,你可能会写成:
${#strings.isEmpty(${session.user.name})}。
实际上这种写法是错误的,将抛出异常。正确的写法为:
${#strings.isEmpty(session.user.name)}。
在Thymeleaf中,使用 th:each 标签可对集合类型进行迭代,支持的类型有:
1.任何实现了 java.util.List 的对象;
2.任何实现了 java.util.Iterable 的对象;
3.任何实现了 java.util.Enumeration 的对象;
4.任何实现了 java.util.Iterator 的对象;
5.任何实现了 java.util.Map 的对象。当迭代maps时,迭代变量是 java.util.Map.Entry 类型;
6.任何数组。
一个简单的例子:
其中${prods}为迭代值,prod为迭代变量。除此之外,我们还可以通过状态变量获取迭代的状态信息,比如:
其中stat就是状态变量。默认为迭代变量加上Stat后缀,在本例中,不直接申明stat,则状态变量名称为prodStat。状态变量包含以下信息:
1.index,当前迭代下标,从0开始;
2.count,当前迭代位置,从1开始;
3.size,迭代变量中的总计数量;
4.current,每次迭代的迭代变量;
5.even/odd,当前迭代是偶数还是奇数;
6.first,当前迭代的是不是第一个;
7.last,当前迭代的是不是最后一个;
例子:
页面显示如下:
当prod.comments不为空时,页面将渲染出该a标签。
另外,th:if有一个反向属性th:unless,用于代替上面的not:
th:case="*"表示默认选项,相当于default:
在模板的编写中,通常希望能够引入别的模板片段,比如通用的头部和页脚。Thymeleaf模板引擎的 th:include , th:insert 和 th:replace 属性可以轻松的实现该需求。不过从Thymeleaf 3.0版本后, 不再推荐使用 th:include 属性。
在index.html页面路径下创建一个footer.html:
在footer.html中,使用 th:fragment 属性定义了 footer 片段,然后在index.html中引用它:
其中footer为被引用的模板名称(templatename),copy为th:fragment标记的片段名称(selector),~{...}称为片段表达式,由于其不是一个复杂的片段表达式,所以可以简写为:
页面显示如下:
通过观察渲染出的源码可发现th:include,th:insert和th:replace的区别所在:
注意: 引用本页面的片段可以略去templatename,或者使用this来代替。
如果片段不包含th:fragment属性,我们可以使用CSS选择器来选中该片段,如:
引用方式:
使用th:fragment定义的片段可以指定一组参数:
然后在引用的时候给这两个参数赋值,有如下两种方式:
对于第二种方式,onevar和twovar的顺序不重要,并且使用第二种方式引用片段时,片段可以简写为:
比如有如下片段:
当value为all时,页面渲染为:
当value为body时,页面渲染为:
当value为tag时,页面渲染为:
当value为all-but-first时,页面渲染为:
在Thymeleaf模板引擎中,使用 th:with 属性来声明一个局部变量
在上面div中, th:width 属性声明了一个名为firstPer的局部变量,内容为 ${persons[0]} 。该局部变量的作用域为整个div内。
也可以一次性定义多个变量:
th:with属性允许重用在同一个属性中定义的变量:
参考:
thymeleaf怎么发音
thymeleaf发音是:? [taim li:f]
有关的造句如下:
1. The trees are coming into?leaf.
树开始长叶子了。
2. I was shaking like a?leaf.
我像树叶似的直哆嗦。
3. The trees are just coming into?leaf.
树木正好在长叶子。
4. At rest the insect looks like a dead?leaf.
这种昆虫不动时看上去像一片枯叶。
5. I was shaking all over, trembling like a?leaf.
我浑身颤抖、像一片叶子似的抖动。
6. The illustration shows a section through a?leaf.
图中所示为叶的剖面。
7.?Leaf-shoots were beginning to sprout on the hawthorn.
叶芽开始在山楂树上长出来。
thymeleaf测试结果很糟糕,为什么Spring还要推荐使用它?
一个产品的发行就算再差,也都会有它的优点和缺点,就只是在于你看它对于那个方面,所以一个产品的发行你要客观的去认识它,都有必要大体看待。对于thymeleaf的测试结果很糟糕,但是spring去推荐使用它,肯定是有好处的。
首先主要是thymeleaf的实现机制相较于其他模板引擎更加的优雅。由于各种绑定与控制采用属性的方式,绑定的机制可以采用属性的方式,你就试想一下,你打游戏有属性加成是不是很好用的,你有属性加成就会有可以使得模板不破坏html原有的语法结构,那么就会有不一样的效果,这样就获得了其他模板引擎没有的一个重要特性:thymeleaf定义的模板是可以被正常渲染的。那么这样你改模板和测试就会非常方便,你是不是就会更好操作,这是有利的。
其次就是Thymeleaf 的生产力比较好。它的生产能力非常强,它的标签比较简单,最大的优点,那么就是非常好的,所以要正确看待,它允许前端人员即时查看静态页面的效果,有的制造商时没有其它模板做不到的功能。所以你要学会考虑到横向添加服务很方便,那么你就意想不到,所以效率并不是什么大问题。
它的性能不是唯一指标,也就是让它一定能力,除此外还需要考虑开发效率它们的测试效率用户体验等等,比如你想减少内部的服务器资源消耗,完全可以把大部分渲染工作丢给用户浏览器,对他来的可能也就有一点点卡,那你就不好去考虑,所以你就会考虑其他的,毕竟要好的才会有人去推荐,不然谁会推荐。