SpringBoot2.0(四) 整合thymeleaf

 

前言:什么是thymeleaf

SpringBoot官方推荐使用thymeleaf模版技术,而不是JSP。

JSP的痛点:

1.前后端沟通成本

其实就目前而言JSP比较适合页面相对固定,改动比较小的后台管理系统,因为当前端人员做好静态网页交给后端之后,后端需要将html网页改成JSP后缀的文件,这样一来如果页面发生比较大的变动需要在交给前端人员来处理的话将增加很大的沟通成本,毕竟大部分前端是不会EL表达式和C标签的。这就是为什么越来越多的互联网公司在推行前后端分离

2.JSP的性能问题

JSP在第一次被访问的适合,需要依赖于翻译为Servlet,在编译成class文件。

3.JSP的运行环境问题

JSP中常用的EL需要依赖于web容器,例如tomcat

总上所述,如果你们正在尝试使用SpringBoot,不妨尝试一下thymeleaf这个技术

 

一、搭建开发环境

在创建SpringBoot项目的适合,勾选Template Engines下的Thymeleaf (记得勾选web下的web,方便后续测试)

其实就是在pom.xml文件中多增加了一个对thymeleaf的支持

<!--thymeleaf-->
<dependency>
	 <groupId>org.springframework.boot</groupId>
	 <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!--web-->
<dependency>
	 <groupId>org.springframework.boot</groupId>
	 <artifactId>spring-boot-starter-web</artifactId>
</dependency>

下边开始学习thymeleaf了,thymeleaf的语法还是非常多的,所以我们需要抓住重点,有不少内容我们在平时的开发中是用不到的,所以在本文中介绍的都是常用的语法。

当然如果有兴趣的同学也可以通过thymeleaf的官网进行深入学习 https://www.thymeleaf.org/

那么什么是thymeleaf的重点内容呢? 

如果你用过JSP可以回忆一下,其实就是将模型中的数据渲染到静态页面中形成一个动态网页,下边我也是围绕这个核心进行学习。

二、变量表达式

thymeleaf中包含下列表达式 

${...} :变量表达式。
*{...} :选择表达式。

#{...} :消息(i18n)表达式。
@{...} :链接(URL)表达式。
~{...} :片段表达式。

标注为红色的表达式是常用的表达式,下边我们就赶紧测试一下变量表达式吧~~~

1),新建一个控制器,编写一个方法向ModelMap中存储一个字符串,最后转发到test_ty01.html网页

@Controller
@RequestMapping("/book")
public class BookController {


       @RequestMapping("test1")
       public String test1(ModelMap map){
         map.put("name","大鹏");
         return "test_ty01";
       }

      
}

2).在resources下的templates下新建一个test_ty01.html

     在html中添加xmlns:th="http://www.thymeleaf.org"    可避免编辑器出现html验证错误,这不是必须的

    在div标签中增加th:text="${name}" ,如果我们直接打开html网页,网页会显示div标签中的张三, 如果先访问控制器然后再转发到html就会显示控制器中向modelMap对象中存储的数据,这样一来前端人员和后端人员就可以配合开发,相互之间的影响可以降到最低

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>aaa</title>
</head>
<body>


    <!--在div中输出字符串-->
    <div th:text="${name}" >张三</div>
    
</body>
</html>

3.测试

先访问控制器,然后转发到html网页的结果:

直接访问html

注意:默认情况下你是不可以直接访问templates下的资源的,需要在application.properties中进行配置

application.properties中的配置

#配置静态路径,浏览器可以直接访问static和templates文件夹下的资源
spring.resources.static-locations=classpath:/static,classpath:/templates

#项目名
server.servlet.context-path=/springboot_thymeleaf

那么使用变量表达式还可以支持哪些操作呢? 

1.1在输入框中输出值

     使用input中的th:value输出name的值,不知道看到这大家是不是明白了什么,是的,在html标签原有的属性前边加上th可以替换原有的属性值。例如img标签 th:src 或者 a标签 th:href 

<input type="text" value="lisi" th:value="${name}"/>

1.2输出对象的属性值

//新建一个Book实体类,包含编号、名称、价格、状态几个属性
//在控制器中向modelMap中存储一个book对象
map.put("book",new Book(1,"西游记",100,0));
 <!--输出对象中的属性值-->
    <div>
        图书名称<span th:text="${book.bname}">xx</span>
        ,图书价格<span th:text="${book.price}">xx</span>
    </div>

1.3输出的结果中如果包含html网页

    th:utext和th:text的区别?   前者输出的内容如果包含html元素会以字符串的形式输出,后者会将标签解释输出

<div th:utext="${name}">xxx</div>

1.4输出集合(遍历)

    如果是一个list集合,我们需要遍历里面的元素

//在控制器中向modelMap中创建一个list集合,存储几个book对象
List<Book> list = new ArrayList<>();
list.add(new Book(1,"西游记",100,0));
list.add(new Book(2,"三国演义",200,0));
list.add(new Book(3,"水浒传",150,1));
map.put("list",list);

    第一种:th:each="bk:${list}" , 其中bk的名字是自己随便起的,bk存储遍历获取的元素。

 <!--循环遍历输出-->
 <table>
        <tr>
            <td>图书名称</td>
            <td>价格</td>
            <td>状态</td>
        </tr>
        <tr th:each="bk:${list}">
            <td th:text="${bk.bname}">图书名称</td>
            <td th:text="${bk.price}">价格</td>
            <td th:text="${bk.state == 0 ? '上架':'下架'}">状态</td>
        </tr>
 </table>

   第二种(记录循环状态):th:each="bk,iter:${list}"  iter名字是自己随便起的,存储遍历的状态

<tr th:each="bk,iter:${list}">
            <td th:text="${iter.count}">序号</td>
            <td th:text="${bk.bname}">图书名称</td>
            <td th:text="${bk.price}">价格</td>
            <td th:text="${bk.state == 0 ? '上架':'下架'}">状态</td>
 </tr>

iter对象的属性有

index:当前迭代对象的index(从0开始计算)
count: 当前迭代对象的index(从1开始计算)
size:被迭代对象的大小
current:当前迭代变量
even/odd:布尔值,当前循环是否是偶数/奇数(从0开始计算)
first:布尔值,当前循环是否是第一个
last:布尔值,当前循环是否是最后一个

1.5 输出session中的数据

       首先在控制器中向session中存储数据,然后再html中获取值输出

 <!--输出session中的输出-->
<div th:text="${session.user}"></div>

      这一块的语法和EL表达式有点类似

      ${param.x} 返回名为x 的 request参数。

       ${session.x} 返回名为x的Session参数。

       ${application.x} 返回名为 servlet context 的参数。

 

三、运算符

1.1 算数运算符


<!--直接运算符-->
<div th:text="${1+2}"></div>
<!--在context中获取数据在进行运算-->
<div th:text="${book.price + 50}"></div>

1.2比较运算符

其中在第二种写法中使用>和<会报错,所以需要使用gt 和 lt

<!--输出false-->
<div th:text="${2>1}"></div>
<!--图书价格是100,100>50输出true-->
<div th:text="${book.price gt 50}"></div>

1.3逻辑运算符

<!--输出true-->
<div th:text="${2>1 and 3>2}"></div>
<!--输出true-->
<div th:text="${2>1 or 2>3}"></div>

1.4三目运算符

<!--输出第二个值大-->
<div th:text="${2>3?'第一个值大':'第二个值大'}"></div>

1.5文本操作

+ (字符串拼接)   

<div th:text="'欢迎'+${name}+'访问我们的网站!'"></div>

|...| (更优雅的拼接字符串)

<div th:text="|欢迎${name}访问我们的网站!|"></div>

注意: | .. | 里面只能包含变量表达式

 

四、选择表达式

*{}的作用是为了简化${}的使用

例如我们想在一个div标签中输出图书名称和图书价格,其实我们有两种写法 。下边两种方式是等价的

th:object=${book} 可以理解将一个book对象从context中获取然后存到一个object对象中,在当前div标签中使用*{}会从object对象中查找属性的值,这个div中依然支持${}从context中取值

<!--输出对象中的属性值-->
    <div>
        图书名称<span th:text="${book.bname}">xx</span>,
        图书价格<span th:text="${book.price}">xx</span>
    </div>
<!--换一种方式-->
    <div th:object="${book}">
        图书名称<span th:text="*{bname}">xx</span>,
         图书价格<span th:text="*{price}">xx</span>
    </div>

五、链接表达式

在web开发中,少不了写url地址,例如<a>的href属性  <img>标签的src 还有引入css和js的url路径,下边可以使用@{}的方式编写url地址

<!--
   下边这个超链接的href地址最终会输出成:
     /springboot_thymeleaf/book/delete?id=1
     带上项目名,另外可以自动生成?以及后边的参数
-->
<a href="xx" th:href="@{/book/delete(id=${book.id})}">删除</a>
<!--
     跟多个参数
    /springboot_thymeleaf/book/delete?id=1&price=200
-->
<a href="xx" th:href="@{/book/delete(id=${book.id},price=${book.price})}">删除</a>
<!--
    restful风格
     /springboot_thymeleaf/book/delete/1
-->
<a href="xx" th:href="@{/book/delete/{id}(id=${book.id})}">删除</a>

六、内嵌变量

为了支持更丰富的模版操作,thymeleaf提供了一些对象(内置于context中),可以通过#直接访问

calendars : 处理date对象
numbers :   处理数值
strings :      处理字符串
arrays:     处理数组
lists:           处理list集合
maps:     处理map集合

上边的对象中包含了大量的方法,此处不再一一介绍,大家可以根据自己的需求使用,下边对几个常用对象的方法做一些介绍

1.1 格式化日期

      首先在控制器中向modelMap中存储一个date对象

map.put("date1",new Date());

       在网页中格式化输出

<div th:text="${#calendars.format(date1,'yyyy-MM-dd HH:mm:ss')}">2018-2-3</div>

1.2 截取字符串

<div th:text="${#strings.substring(book.bname,1,2)}"></div>

 1.3 判断list集合的长度

<div th:text="${#lists.size(list)}"></div>

  这几个内置对象已经可以满足大部分开发需求,大家可以根据实际开发的需求再进行进一步的学习和使用

 

七、常用的th:属性操作

 

1.1 th:if 和 th:unless  (单条件判断)

  th:if后边的执行结果如果成立,会输出div标签,否则不会输出

<div th:if="${2>1}">aaaaaaaaaaa</div>

  th:unless和th:if正好相反,如果条件不成立则输出div

<div th:unless="${2>1}">bbbbbb</div>

1.2 th:switch (多条件判断) 

      第三个th:case后边的*代表通配符 ,也就是else

<div th:switch="${book.price}">
        <span th:case="100">100元</span>
        <span th:case="200">200元</span>
        <span th:case="*">其他</span>
</div>

 

 1.3 th:with   (  给变量赋值)

<div th:with="a1=${book.bname}">
        <span th:text="${a1}"></span>
 </div>

  1.4 th:block 

      作用:有的时候直接给现有的html标签添加th:属性不合适,如果增加新的div标签又影响布局就可以考虑使用th:block

<th:block th:text="${book.bname}">
 </th:block>

     

八、内联js

使用[[...]]的方式获取,外部JS文件无法使用这种方式.

<script th:inline="javascript">
        var a1 = [[${book.bname}]];
        console.log(a1);
</script>

 

 

 

 

 

 

 

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值