最近在学习Thymeleaf,以前没有接触过,不过像这样的模板引擎大致与jsp语言相差不大
在这里整合了一下两个大佬博客的内容,主要是记录给自己看一下
先附上两位大佬的地址(若侵请联系我,我只是大自然的搬运工):
https://www.jianshu.com/p/84a25d699cf5
https://blog.csdn.net/qq_33535433/article/details/78876693
什么是Thymeleaf
1.java模板引擎,能够处理HTML,XML,JavaScript,CSS甚至是纯文本。类似于JSP和Freemarker;
2.作用就是把各个用户的公用的东西(页面)做一个提取,然后再根据不同的数据对页面进行渲染(个人理解就是可以做到静态动态分离,即前端可以根据需求绘画页面,无后台也可以正常显示静态页面,若有后台链接的时候,可以直接将数据嵌入进入进行渲染);
3.语法优雅易懂,支持这两种OGNL,SpringEL编码方式;
4.遵循Web的标准,支持HTML5.
一、thymleaf的标准语法(基本上th:属性名,这样的比较多)
1 2 | <span th:text="..."> <span data-th-text="..."> |
二、标准的表达式
- ${…}
1 2 3 4 | // 变量表达式 <span th:text="${book.author.name}" // 这样的方式可以直接访问到后台的service层 ${@dict.getLabel(参数)} |
2.消息表达式,也称为文本外部化,国际化或者i18n
- #{…}(一些日期、字符串处理的方法使用#的多)
1 2 3 4 5 | <table> <th th:text="#{header.address.city}">... </th> </table> ``` |
3.链接表达式
@{…}
1 2 3 4 5 | 链接表达式可以是相对的,在这种情况下,应用程序上下文将不会作为URL的前缀 也可以是服务器相对(同样的,没有应用文程序上下文前缀) 和协议相对(就像绝对URL,但是浏览器将使用在显示的页面中使用的相同的HTTP协议或者HTTPS协议) 当然,link表达式可以使绝对的 <a th:href=@{"http://www.mycompany.com/main"}>...</a> |
4.算术操作
1 2 3 4 | +、-、x、/ <、>、>=、<= 对应 gt、lt、ge、le ==、!= 对应eq、ne 条件运算符:三目运算符(?:) |
5.设置属性值
设置任意的属性值
1 2 3 4 | th:attr="action=..." 设置值到指定的属性 th:action="..." th:value="..."等 |
固定值布尔属性
1 2 3 4 5 6 | checked或者checked = "checked" th:chaecked="${user.active}" readonly default hidden selected等 |
6.迭代器(循环)
1 2 3 4 | th:each 将数组或者链表循环打印出来 数组、list、,map 状态变量:index(从0开始),count(从1开始),size(元素总数)current(当前迭代的变量),even/add(奇数还是偶数),first(当前迭代是不是第一个),last当前迭代是不是最后一个) |
7.条件语句
1 2 3 | th:if th:unless switch与case结合使用 |
8.模板布局
定义:th:fragment=".名称"
引用:
1 2 3 | th:insert="":简单地插入指定的片段作为正文的主标签 th:replace="":用来指定实际片段来替换其主标签 th:include="":类似于th:insert,但是不是插入片段,他只是插入此片段的内容(3.0版本后,不再推荐使用) |
不使用th:fragment=“名称”;
1 2 | 使用id="id" 引用:th:insert="~{footer::#id}" |
- 属性优先级
1 2 3 | 当在同一个标签中用了多个的属性,谁先别执行?详细可以查看thymeleaf的文档 th:insert=th:replace>th:each>th:if=th:unless=th:switch..... 按照属性的优先级先后执行,与属性的编写的先后顺序无关 |
10.注释
标准的HTML/XML的注释
thymeleaf解析器级注释块(即有两个包含反斜线的注释)
原型注释块:当模板静态打开的时候,也就是原型设计,不需要用到别注释的代码;而在模板被执行的时候,被注释掉的这一部分原型代码就能别识别出来,并正常显示出这部分代码的作用
11.表达式的基本对象
(1)基本对象:#ctx:上下文对象
-: #locale
(2)request/session等属性
(3)web上下文对象
1 2 3 | #request:直接访问当前的请求关联的javax.servlet.http.HttpServletRequest对象 #session:直接访问与当前请求关联的javax.servlet,http.HttpSession对象 #servletContext:直接访问与当前请求关联的javax.servlet.ServletContext对象 |
主要介绍String字符串的操作
- 判断是不是为空:null:
1 2 | <span th:if="${name} != null">不为空</span> <span th:if="${name1} == null">为空</span> |
- 判断是不是为空字符串: “”(上一个主要判断是否为null)
1 | <span th:if="${#strings.isEmpty(name1)}">空的</span> |
- 判断是否相同:
1 2 3 | <span th:if="${name} eq 'jack'">相同于jack,</span> <span th:if="${name} eq 'ywj'">相同于ywj,</span> <span th:if="${name} ne 'jack'">不相同于jack,</span>` |
- 不存在设置默认值:(此处主要是用到了三目表达式)
1 | <span th:text="${name2} ?: '默认值'"></span> |
- 是否包含(分大小写):
1 2 | <span th:if="${#strings.contains(name,'ez')}">包ez</span> <span th:if="${#strings.contains(name,'y')}">包j</span> |
- 是否包含(不分大小写)
1 | <span th:if="${#strings.containsIgnoreCase(name,'y')}">包j</span> |
- 下面基本上和java的String语法一致
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | //用于检测字符串是否以指定的前缀开始。返回布尔类型 ${#strings.startsWith(name,'o')} //用于测试字符串是否以指定的后缀结束。 ${#strings.endsWith(name, 'o')} ${#strings.indexOf(name,frag)}// 下标 ${#strings.substring(name,3,5)}// 截取 ${#strings.substringAfter(name,prefix)}// 从 prefix之后的一位开始截取到最后,比如 (ywj,y) = wj, 如果是(abccdefg,c) = cdefg//里面有2个c,取的是第一个c ${#strings.substringBefore(name,suffix)}// 同上,不过是往前截取 ${#strings.replace(name,'las','ler')}// 替换 ${#strings.prepend(str,prefix)}// 拼字字符串在str前面 ${#strings.append(str,suffix)}// 和上面相反,接在后面 ${#strings.toUpperCase(name)} //将所有字符转换成大写 ${#strings.toLowerCase(name)} //将所有字符转换成小写 ${#strings.trim(str)} //去掉前后空格 ${#strings.length(str)} //返回字符长度 ${#strings.abbreviate(str,10)}// 我的理解是 str截取0-10位,后面的全部用…这个点代替,注意,最小是3位 |
若喜欢,请为搬运工点赞。。。
若有错,请指正。。。
若讨厌,请留言并上边×号左键单击