thymeleaf模板引擎原理,模板引擎 thymeleaf 与 vue
一篇文章搞懂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属性允许重用在同一个属性中定义的变量:
参考:
【springboot 入门篇】第3篇 从controller开始学起
在写web项目的时候,controller里的返回值一般分为两种,一种是返回页面,也就是ModeAndView,另一种是直接返回数据,比如json格式的数据。
返回一个页面,我们需要用到一些模板引擎,比如熟知的jsp,模板引擎后面会详细讲解。
返回数据一般会选择返回json数据,我们之前的demo项目中使用的@RestController就是一个返回数据的注解。
spring-boot 支持多种模版引擎包括:
我们在讲前后端分离之前,都会使用Thymeleaf模板引擎,先简单的介绍一下它。
Thymeleaf是一个java类库,它是一个xml/xhtml/html5的模板引擎,可以作为mvc的web应用的view层。
Thymeleaf还提供了额外的木块与spring mvc集成,所以使用ssm框架的也可以使用这个模板引擎。
接下来,我们通过一个项目,来实践一下两种不同的返回结果。
先看一下最终的目录结构:
这里我们使用了Thymeleaf模板引擎来获得后台传来的数据并解析,使用bootstrap框架显示数据。可以看到,Thymeleaf的用法和jsp还是有点像的。可以直接通过${}的形式来获得attribute中的数据。
可以看到,我们成功的在前端获取到了数据。方式就是将数据保存在attribute中,然后再前端页面获取。
我们修改了注解,发现结果变了,直接显示了“index”,是因为@RestController会直接返回数据,而不是渲染页面,所以直接返回了index(这个index,是return语句中的)
访问
获得了json格式的数据
访问
列表也可以直接渲染为json。
访问
访问
会发现这两个都报错了,因为@Controller注解是渲染视图的,而我们返回的是对象或者集合,不能完成正常的渲染。
本文主要讲解了spring boot 如何渲染视图和数据,讲解了@Controller和@RestController的区别与用法。如果有什么疑问,请及时联系我。
我之前写过一个重新认识java系类(还没写完,会写完的。。),篇幅很长,每一篇文章多的有7、8千字,和多人抱怨说看到一半就不想看了,因为太长了,所以 spring boot 这个系类会尽量的短小精悍,每篇文章只讲一个知识点,这样看着不累~
「SpringBoot实战」视图技术-Thymeleaf
在一个Web应用中,通常会采用MVC设计模式实现对应的模型、视图和控制器,其中,视图是用户看到并与之交互的界面。对最初的Web应用来说,视图是由HTML元素组成的静态界面;而后期的Web应用更倾向于使用动态模板技术,从而实现前后端分离和页面的动态数据展示。Spring Boot框架为简化项目的整体开发,提供了一些视图技术支持,并主要推荐整合模板引擎技术实现前端页面的动态化内容。本文对SpringBoot常用的Thymeleaf进行整合。
Thymeleaf是一种现代的基于服务器端的Java模板引擎技术,也是一个优秀的面向Java的XML、XHTML、HTML5页面模板,它具有丰富的标签语言、函数和表达式,在使用Spring Boot框架进行页面设计时,一般会选择 Thymeleaf模板。我们在这里学习Thymeleaf 常用的标签、表达式。
Thymeleaf标签
使用标签只需要加上一个命名空间就可以了。 即修改原html的第二行就可以了。
变量表达式${..}主要用于获取上下文中的变量值,示例代码如下。
这是标题
- 使用了Thymeleaf模板的变量表达式${..}用来动态获取p标签中的内容 - 如果当前程序没有启动或者当前上下文中不存在title变量,该片段会显示标签默认值“这是标题”; - 如果当前上下文中存在title 变量并且程序已经启动,当前p标签中的默认文本内容将会被tite变量的值所替换,从而达到模板引擎页面数据动态替换的效果。
Thymeleaf为变量所在域提供了一些内置对象
结合上述内置对象的说明,假设要在Thymeleaf模板擎页面中动态获取当前国家信息,可以使用#locale内置对象
选择交量表达式和变量表达式用法类似,一般用于从被选定对象而不是上下文中获取属性值,如果没有选定对象,则和变量表达式一样,示例代码如下。
消息表达式#{..}主要用于Thymeleaf模板页面国际化内容的动态替换和展示。使用消息表这式#{..}进行国际化设置时,还需要提供一些国际化配置文件。关于消息表达式的使用,下文写国际化时会详细说明。
链接表达式@{..}一般用于页面跳转或者资源的引入,在Web开发中占据着非常重要的地位,并且使用也非常频繁。
片段表达式~{..}是一种用来将标记片段移动到模板中的方法。其中,最常见的用法是使用th:insert或th:replace 属性插入片段
Spring Boot默认设置了静态资源的访问路径,默认将/**所有访问映射到以下目录。
我们创建一个springboot项目用于本次实验。项目名为springboot_01_thyme。java8,springboot2.6.6
创建一个LoginController类用于数据替换效果测试。
我们写一个login.html进行测试。我们导入一个bootstrap的样式到static/login里面,并且自己定义一些css。
最后我们通过访问 可以查看效果
在resources目录下创建名为i18n的文件夹,数一数这个单词多少个字母internationalization,就知道为什么叫i18n了。
然后我们在i18n文件夹下面创建login.properties、 login_zh_CN.properties、 login_en_US.properties文件。
目录结构:这个Resource Bundle 'login'时idea自动创建的,我们不需要管,只需要完成我们的就行。
login.properties
login_zh_CN.properties
login_en_US.properties
然后我们在配置文件application.properties里面添加代码
我们在config包下面创建一个MyLocalResovel类,自定义国际化功能区域信息解析器。
这里我们基本就完成了,但是在访问中文的时候会出现乱码现象。
我们打开idea的file-settings-file Encodings.
将Default encoding for properties的编码改为utf-8,同时勾选Transparentnative-to-ascii conversion
然后我们重新编写login.properties和其他相关的
但是这种方法1只对当前项目有效。下次创建还是使用GBK编码
本文我们主要了解了Thymeleaf的基本语法、标签、表达式、基本使用、同时还实现了页面登录页得国际化。
本文作者:hjk-airl
本文链接:
thymeleaf测试结果很糟糕,为什么Spring还要推荐使用它?
一个产品的发行就算再差,也都会有它的优点和缺点,就只是在于你看它对于那个方面,所以一个产品的发行你要客观的去认识它,都有必要大体看待。对于thymeleaf的测试结果很糟糕,但是spring去推荐使用它,肯定是有好处的。
首先主要是thymeleaf的实现机制相较于其他模板引擎更加的优雅。由于各种绑定与控制采用属性的方式,绑定的机制可以采用属性的方式,你就试想一下,你打游戏有属性加成是不是很好用的,你有属性加成就会有可以使得模板不破坏html原有的语法结构,那么就会有不一样的效果,这样就获得了其他模板引擎没有的一个重要特性:thymeleaf定义的模板是可以被正常渲染的。那么这样你改模板和测试就会非常方便,你是不是就会更好操作,这是有利的。
其次就是Thymeleaf 的生产力比较好。它的生产能力非常强,它的标签比较简单,最大的优点,那么就是非常好的,所以要正确看待,它允许前端人员即时查看静态页面的效果,有的制造商时没有其它模板做不到的功能。所以你要学会考虑到横向添加服务很方便,那么你就意想不到,所以效率并不是什么大问题。
它的性能不是唯一指标,也就是让它一定能力,除此外还需要考虑开发效率它们的测试效率用户体验等等,比如你想减少内部的服务器资源消耗,完全可以把大部分渲染工作丢给用户浏览器,对他来的可能也就有一点点卡,那你就不好去考虑,所以你就会考虑其他的,毕竟要好的才会有人去推荐,不然谁会推荐。