一、Thymeleaf服务器端Java模板引擎
模板引擎:jsp、Velocity、Freemarker、Thymeleaf(Spring Boot推荐)
思想:模板引擎作用是写一个页面模板,比如一些值是动态的,写一些表达式,这些值从哪里来?是组装一些数据,找到,然后把模板和数据交给模板引擎,模板引擎按照数据解析表达式填充到指定位置,最终生成想要的内容,写出去。
什么是模板引擎?
相对html+js的传统设计,现在很多网站都采用div&css+标签化+ 模块化 的设计 。模板引擎根据一定的语义,将数据填充到模板中,产生最终的HTML页面 模板引擎。主要分两种,客户端引擎和服务端引擎。
客户端渲染: 模板和数据分别传送到客户端,在客户端由JavaScript模板引擎渲染出最终的HTML视图。将模板渲染放置在客户端做,可以降低服务端的压力,并且如果前端内容分别来自多个后台系统,而这些后台的架构各不相同(Java、.NET、Ruby等),则服务器端渲染需要采用不同的技术,模板资源无法共享。
服务端渲染:引擎在服务器端将模板和数据合成,返回最终的html页面,相对于客户端渲染,数据存储更加安全。主要有freemarker、velocity、thymeleaf等。
什么是Thymeleaf?
Thymeleaf是一个现代服务器端Java模板引擎,适用于Web和独立环境,能够处理HTML,XML,JavaScript,CSS甚至纯文本。Thymeleaf利用最少的IO操作来获得更快的速度,使用thymeleaf模板引擎加快了前后端开发工作的并行运作。Thymeleaf还提供了国际化。Thymeleaf提供了最基础的两个编程API:ServletContextTemplateResolver 和TemplateEngine。Servletcontexttemplateresolver负责解析模板、Templateengine使用templateengine process()方法处理模板数据。模板引擎表达式可以从properties文件和WebContext获取属性值从而展示到页面。
Thymeleaf的主要目标是提供一种优雅且高度可维护的模板创建方式。为实现这一目标,它以自然模板的概念为基础,将其逻辑注入模板文件,其方式不会影响模板被用作设计原型。这改善了设计沟通,缩小了设计和开发团队之间的差距。
thymeleaf最大的优势后缀为html,所以能够直接在浏览器中打开并正确显示模板页面,而不需要启动整个Web应用。还有就是thymeleaf可以很好的和spring集成,Spring的官方文档中很多部分的渲染都是用这个。
Thymeleaf跟velocity, jsp等有很大的差别,它的语法结构更像angular等在tag的属性里加上一些东西来做渲染的,因为它本身就是一个加入了特别的tag property的Html文件,只是不经过服务端渲染的话,数据和逻辑等东西不会在html中体现而已。
学习链接记录:
https://tutorial.e-learn.cn/read/thymeleaf/standardurlsyntax
Thymeleaf的特点
- 动静结合:Thymeleaf 在有网络和无网络的环境下皆可运行,即它可以让美工在浏览器查看页面的静态效果,也可以让程序员在服务器查看带数据的动态页面效果。这是由于它支持 html 原型,然后在 html 标签里增加额外的属性来达到模板+数据的展示方式。浏览器解释 html 时会忽略未定义的标签属性,所以 thymeleaf 的模板可以静态地运行;当有数据返回到页面时,Thymeleaf 标签会动态地替换掉静态内容,使页面动态显示。
- 开箱即用:它提供标准和spring标准两种方言,可以直接套用模板实现JSTL、 OGNL表达式效果,避免每天套模板、该jstl、改标签的困扰。同时开发人员也可以扩展和创建自定义的方言。
- 多方言支持:Thymeleaf 提供spring标准方言和一个与 SpringMVC 完美集成的可选模块,可以快速的实现表单绑定、属性编辑器、国际化等功能。
- 与SpringBoot完美整合,SpringBoot提供了Thymeleaf的默认配置,并且为Thymeleaf设置了视图解析器,我们可以像以前操作jsp一样来操作Thymeleaf。代码几乎没有任何区别,就是在模板语法上有区别。
问题:动态页面技术已经有JSP,为什么还要用Thymeleaf?
主要原因包括以下几点:
- 使用模块引擎来编写动态页面,让开发人员无法在页面上编写 Java 代码,使得java代码和前端代码绝对的分离。
- SpringBoot默认整合Thymeleaf,不需要任何配置直接整合成功,打jar包发布不需要做任何配置。
- Thymeleaf相对于其他的模板引擎(如:Freemaker、velocity),有强大的工具支持。
- 相对于Jsp页面,执行效率高。
Thymeleaf:
官网:http://www.thymeleaf.org/
1.引入thymeleaf
<!--thymeleaf模板引擎,无需再引入web模块-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
2.thymeleaf使用&语法
在properties或yml中可以配置thymeleaf模板解析器属性,下面是部分yml格式的属性
# THYMELEAF (ThymeleafAutoConfiguration)
spring.thymeleaf:
#开启模板缓存(默认值:true)
cache: true
#Check that the template exists before rendering it.
check-template: true
#检查模板位置是否正确(默认值:true)
check-template-location: true
#开启MVC Thymeleaf视图解析(默认值:true)
enabled: true
#模板编码
encoding: UTF-8
#要被排除在解析之外的视图名称列表,用逗号分隔
spring.thymeleaf.excluded-view-names:
#要运用于模板之上的模板模式。另见StandardTemplate-ModeHandlers(默认值:HTML5)
mode: HTML5
#在构建URL时添加到视图名称前的前缀(默认值:classpath:/templates/)
prefix: classpath:/templates/
#在构建URL时添加到视图名称后的后缀(默认值:.html)
suffix: .html
#Thymeleaf模板解析器在解析器链中的顺序。默认情况下,它排第一位。顺序从1开始,
#只有在定义了额外的TemplateResolver Bean时才需要设置这个属性。
template-resolver-order:
#可解析的视图名称列表,用逗号分隔
spring.thymeleaf.view-names:
只要把HTML页面放在classpath/templates/,thymeleaf就能自动渲染;
使用:
1.导入thymeleaf的名称空间(语法提示)
<html lang="en" xmlns:th="http://www.thymeleaf.org">
2.使用thymeleaf语法
th:text="${hello}"
3.语法规则
- th:test:改变当前元素里面的文本内容
th:任意html属性;-------来替换原生属性的值
2)表达式语法:
简单表达式:
可用值表达式(后台设置): ${…} 获取变量值:OGNL
1)获取对象的属性、调用方法
2)使用内置的基本对象,如#ctx、#vars、#locale、#request、#response、#session、 #servletContext
#ctx:上下文对象
#vars:上下文变量
#locale:上下文语言环境
#httpServletRequest:(只有在Web上下文)HttpServletRequest对象
#httpSession:(只有在Web上下文)HttpSession对象。
用法:<span th:text="${#locale.country}">US</span>.
3)内置的工具对象,如#numbers、#message、#uris、#dates
#dates: java.util的实用方法。对象:日期格式、组件提取等.
#calendars:类似于#日期,但对于java.util。日历对象
#numbers:格式化数字对象的实用方法。
#strings:字符串对象的实用方法:包含startsWith,将/附加等。
#objects:实用方法的对象。
#bools:布尔评价的实用方法。
#arrays:数组的实用方法。
#lists:list集合。
#sets:set集合。
#maps:map集合。
#aggregates:实用程序方法用于创建聚集在数组或集合.
#messages:实用程序方法获取外部信息内部变量表达式,以同样的方式,因为它们将获得使用 #{…}语法
#ids:实用程序方法来处理可能重复的id属性(例如,由于迭代)。
<span th:text="${information}">
所有可用值表达式: *{…} 选择表达式:和${}在功能上一样
补充:配合 th:object = "${session.user}"
<div th:object="${session. user}" >
Name: <span th: text=" *{firstName}" >Sebastian.
Surname: <span th: text=" *{lastName}" >Pepper.
Nationality: <span th: text=" *{nationality}" >Saturn.
</div>
消息表达式: #{…} 国际化时使用,也可以使用内置的对象,比如date格式化数据
链接表达式: @{…} 用来配合link src href使用的语法,可以链接目录下的静态资源,也可以链接到后端请求处 理接口
片段表达式: ~{…} 用来引入公共部分代码片段,并进行传值操作使用的语法。
字面值:
文本: ‘one text’,’another text’,…
数字: 1,2,1.2,…
布尔: true,false
空值:null
文字标记: something,main,name,one,sometext, main,…
文本操作:
并置:+
替换:|The name is ${name}|
html
<a href="" th:href="@{|/name/${test.size()}|}">链接地址:</a>
//渲染后的结果
<a href="/name/3">链接地址:</a>
数学操作:
二元操作:+, - , * , / , %
一元操作: - (负)
布尔操作
一元 : and or
二元 : !,not
比较:
比较:> , < , >= , <= ( gt , lt , ge , le )
等于:== , != ( eq , ne )
条件:
If-then: (if) ? (then)
If-then-else: (if) ? (then) : (else)
Default: (value) ?: (defaultvalue)
无操作
使用_ 来禁止转义。
二、Lambda表达式
Lambda 表达式,也可称为闭包,它是 Java 8 发布的新特性。
Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
使用 Lambda 表达式可以使代码变的更加简洁紧凑。
新特性
Java8 新增了非常多的特性:
- Lambda 表达式 − Lambda 允许把函数作为一个方法的参数(函数作为参数传递到方法中)。
- 方法引用 − 方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码。
- 默认方法 − 默认方法就是一个在接口里面有了一个实现的方法。
- 新工具 − 新的编译工具,如:Nashorn引擎 jjs、 类依赖分析器jdeps。
- Stream API −新添加的Stream API(java.util.stream) 把真正的函数式编程风格引入到Java中。
- Date Time API − 加强对日期与时间的处理。
- Optional 类 − Optional 类已经成为 Java 8 类库的一部分,用来解决空指针异常。
- Nashorn, JavaScript 引擎 − Java 8提供了一个新的Nashorn javascript引擎,它允许我们在JVM上运行特定的javascript应用。
使用匿名内部类存在的问题
当需要启动一个线程去完成任务时,通常会通过Runnable接口来定义任务内容,并使用Thread类来启动线程。
//使用匿名内部类
//面向对象冗余
//创建一个Runnable接口的匿名内部类对象来指定线程要执行的任务内容,再将其交给一个线程来启动
new Thread(new Runnable(