Boot Thymeleaf初步使用
注意:本页面内容为W3xue原创,未经授权禁止转载,违者必究!
来源:W3xue 发布时间:2019/9/26 16:16:01
我们已经学会了数据的全套增删改查,那么怎么把它应用到网页中去呢?这就要使用thymeleaf了。
Thymeleaf是什么?简而言之,它是一个模板引擎,类似于以前的JSP。用一句话来总结就是:前端页面整一套标准的数据或逻辑标签,嵌入在html代码里面,然后后端逻辑把数据绑定到数据标签上,而逻辑标签可以直接执行。
Thymeleaf 在无网络的条件下也可以可运行,它可以让美工直接在浏览器看到效果,也可以直接应用成动态页面。因为Thymeleaf 可以在 html 标签里增加额外的属性,而浏览器解释 html 时会忽略这些未定义的标签属性,而当有数据返回到页面时,Thymeleaf 标签会动态地替换掉静态内容,使页面动态显示。使用Thymeleaf 之后,我们就可以使用html 模板了!
本篇分为四个部分:
一、Thymeleaf 的配置和初步使用
在使用Thymeleaf 之前,我们需要先配置一下。
首先,如果你使用的是application.properties,那么就在文件中增加如下配置:
#thymelea模板配置 spring.thymeleaf.prefix=classpath:/templates/ spring.thymeleaf.suffix=.html spring.thymeleaf.mode=HTML5 spring.thymeleaf.encoding=UTF-8 spring.thymeleaf.content-type=text/html spring.thymeleaf.cache=false spring.resources.chain.strategy.content.enabled=true spring.resources.chain.strategy.content.paths=/**
在开发时建议将spring.thymeleaf.cache设置为false,否则会有缓存,导致页面更新不及时。
而我们之前已经建议你使用application.yml了,因此,我们在spring根节,增加如下配置:
thymeleaf: cache: false prefix: classpath:/templates/ suffix: .html mode: HTML5 encoding: UTF-8 servlet: content-type: text/html
在配置好application.properties或application.yml后,我们需要在pom.xml里的<dependencies>大节增加如下依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
在增加之后,IntelliJ IDEA会提示你,Maven Projects need to be imported,点击“Import Changes”导入修改即可,IntelliJ IDEA会自动帮你下载、导入依赖包。
我们再在controller文件夹建立一个controller层的类,鼠标放到controller文件夹,点右键,New->Java Class,在弹出的窗口中输入类名:MainController,你可以命名为任意的名字,只要你觉得方便,但我们建议使用“作用+层名字”作为标准。
大家应该还记得,我们在建立MainRestController类的时候,在类的申明代码上,有一个@RestController注解,这实际上一般被用来返回不使用页面模板的路径,这里我们需要使用@Controller注解,在类申明的上一行加上这个注解,IntelliJ IDEA会帮你自动导包,完成的代码如下:
package com.w3xue.jiaocheng.controller;
import org.springframework.stereotype.Controller;
@Controller
public class MainController {
}现在,让我们来建立第一个模板文件。你是否还记得和application.yml文件平行的 templates文件夹和 static文件夹,templates文件夹就是用来放模板文件的,而 static文件夹是用来存放图片、JS文件、CSS文件等静态文件的。

我们首先在templates文件夹建立一个lucky.html模板文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<p style="color:red" th:text="'Hello, ' + ${welcomewords}"></p>
</body>
</html>注意里面有一个夹杂着Thymeleaf语法的段落标签:
<p style="color:red" th:text="'Hello, ' + ${welcomewords}"></p>建好之后,我们在MainController类添加如下的方法:
@RequestMapping(value = "/getlucky")
public ModelAndView getlucky(ModelAndView mv) {
mv.setViewName("/lucky"); //设置模板为根目录的lucky.html
String sWelcomeWords="欢迎使用Thymeleaf!";
mv.addObject("welcomewords",sWelcomeWords); //将sWelcomeWords变量的值,绑定到该模板的welcomewords标签上
return mv; //返回并渲染
}这个方法的注释,我基本上写进注释里了。使用这个方法需要导入2个包:
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView;
其中ModelAndView包是用来解析模板并呈现内容的。
然后我们运行下项目,访问如下地址就能看到效果啦(如果看不到,需要使用Maven重新清理打包,在右上角,之前已经介绍过):
http://localhost:8080/jiaocheng/getlucky
会出现下面的字样:
Hello, 欢迎使用Thymeleaf!
这说明配置已经成功了,我们第一使用了Thymeleaf模板引擎。
二、JAVA中另外两种使用模板的方法
除了上面介绍的使用Thymeleaf模板引擎的方法,我们还可以使用另外2种方法。
我们可以用返回String的方法,来使用模板:
@RequestMapping(value = "/getlucky2")
public String getlucky2(Map<String,Object> map){
String sWelcomeWords="欢迎使用Thymeleaf!";
map.put("welcomewords",sWelcomeWords); //直接将sWelcomeWords的值添加到map对象中
return "/lucky"; //使用lucky模板并返回
}该方法需要引用“java.util.Map”这个包,我们访问如下地址也可以出现一样的效果:
http://localhost:8080/jiaocheng/getlucky2
我们还可以使用带入Model对象的办法来使用模板:
@RequestMapping("/getlucky3")
public String getlucky3(Model model) { //自动带入Model对象
String sWelcomeWords="欢迎使用Thymeleaf!";
model.addAttribute("welcomewords", sWelcomeWords); //设置Model对象的welcomewords属性的值为sWelcomeWords
return "/lucky"; //使用lucky模板并返回
}该方法需要引用“org.springframework.ui.Model”这个包,我们访问如下地址也可以出现一样的效果:
http://localhost:8080/jiaocheng/getlucky3
但是我们一般不建议使用这2种办法。
三,text、utext和href
我们再来看下lucky模板的标签:
<p style="color:red" th:text="'Hello, ' + ${welcomewords}"></p>“th:text”标签的作用,就是替换文本,将标记该标签的html标记内的文本,替换为“th:text”标签规定的值。例如,我们把lucky.html里面的p标签加上文字:
<p style="color:red" th:text="'Hello, ' + ${welcomewords}">即将被替换的文本</p>我们会发现,这里面的文本被替换掉了,根本没有起到作用。
但是,th:text标签并不支持html代码,就是说,如果你在后端绑定了带有html代码的值,例如,我们在“getlucky”方法体里面,把“sWelcomeWords”变量的值加上html代码:
String sWelcomeWords="<b>欢迎使用Thymeleaf!</b>";
访问“http://localhost:8080/jiaocheng/getlucky”之后,发现html代码没有被渲染,被完完整整的打印出来了:
Hello, <b>欢迎使用Thymeleaf!</b>
这时,我们就需要使用另外一个标签“th:utext”。我们在lucky.html模板文件中,修改标签如下:
<p style="color:red" th:utext="'Hello, ' + ${welcomewords}">即将被替换的文本</p>重新运行项目之后,就会发现后端的html标签起作用了:
Hello, 欢迎使用Thymeleaf!
我们在lucky.html中添加一个链接标签:
<a href="https://www.baidu.com" th:href="${url}">查看链接</a>这个链接本来是链接到百度的,但是它不会起到任何作用,而是会被替换成后台绑定的数据,我们在“getlucky”方法体中增加如下一行绑定数据:
mv.addObject("url","https://www.w3xue.com/");我们再访问“http://localhost:8080/jiaocheng/getlucky”,就会发现这个链接是指向“https://www.w3xue.com/”的。
四、JavaScript中嵌入Thymeleaf标签
我们已经学习了html代码中Thymeleaf的基本使用方法,那么,如何在JS代码中嵌入Thymeleaf标签呢?我们使用双中括号把Thymeleaf标签包裹起来,就可以实现这一点!
首先,我们在lucky.html的<head>与</head>标签之间,加入如下代码:
<script>
alert('[[${jsstr}]]'); //注意alert部分使用的是单引号
</script>然后,在“getlucky”方法中,加入一个变量绑定:
mv.addObject("jsstr","w3xue教程Thymeleaf的使用\\n我是欢迎使用Thymeleaf传给JS执行的变量!");接着,我们访问“http://localhost:8080/jiaocheng/getlucky”,就可以发现,页面会弹出我们在后台绑定的数据:

我们还可以在<script>标签上加上一个属性:
<script th:inline="javascript">
加上th:inline="javascript"这个内联属性后,取得后台绑定数据的方式会有改变,首先,我们不改动其他的代码,只看看加上这个属性后的效果:

可以看出2处异样:一是弹出的信息都带了双引号,二是JAVA代码中的双反斜杠的换行符“\\n”,并没有被浏览器解释为警告框的换行。
关于第一点,这是由于加了th:inline="javascript"这个内联属性后,由于后台赋的值是JAVA的String类型,因此标签会被自动加上双引号,如果后台赋的值是JAVA的int或其他数字类型,就会没有双引号。比如,如果我要在后台数据中绑定含有单引号的数据,如果不用这个标签,是无法输出的,因为Thymeleaf 会自动把单引号还原。又比如,我在后台将jsstr这个标签赋值3,就不会出现双引号:
mv.addObject("jsstr",3);好了,为方便,我们把它改回来:
mv.addObject("jsstr","w3xue教程Thymeleaf的使用\\n我是欢迎使用Thymeleaf传给JS执行的变量!");现在我们来看第二点,我们在浏览器查看源代码后,发现为什么“\\n”没有被解释为警告框的换行了:
alert('"w3xue\u6559\u7A0BThymeleaf\u7684\u4F7F\u7528\\n\u6211\u662F\u6B22\u8FCE\u4F7F\u7528Thymeleaf\u4F20\u7ED9JS\u6267\u884C\u7684\u53D8\u91CF\uFF01"'); //注意alert部分使用的是单引号可以看出,文本都被转为Unicode编码了,原本的“\\n”也被完完整整的交给了浏览器。
因此,如果我们使用th:inline="javascript"这个内联属性,就必须做2点改动:一是把模板页lucky.html中JS代码警告框的单引号去掉:
alert([[${jsstr}]]);而在后台,如果要输出数字格式,就要考虑在JS中是否适用,比如不能将其赋值给需要使用string数字格式的地方(虽然JS对变量类型没有那么严格,但使用不当还是会导致错误)。
二是,把代码中的“\\n”改为“\n”,它会被转为Unicode编码,完完整整的被输出给浏览器:
mv.addObject("jsstr","w3xue教程Thymeleaf的使用\n我是欢迎使用Thymeleaf传给JS执行的变量!");我们还可以在模板页面lucky.html中,把警告框这样写:
alert(/*[[${jsstr}]]*/);这样,前端在写页面的时候,就不会出现JS错误,影响后面JS的执行。而Thymeleaf引擎会把这个注释自动去掉,因此并不影响使用。如果有点地方需要加点东西,前端才能显示正常,那么就这样写:
alert(/*[[${jsstr}]]*/ null);或者其他测试的数据:
alert(/*[[${jsstr}]]*/ "这里是后端给的jsstr数据");一样的道理,这些null、字符串会被Thymeleaf引擎干掉,只剩下后台传的数据。
好了,Thymeleaf 的简单使用就介绍到这里,其实,如果项目不是很复杂,这些在日常工作中已经基本够用了,但Thymeleaf 引擎是很强大的,下一节,我们来介绍它的高级功能。
注意:本页面内容为W3xue原创,未经授权禁止转载,违者必究!
来源:W3xue 发布时间:2019/9/26 16:16:01


优化或报错有奖