在我们平时的开发中,用了很久的jsp作view显示层,但是标签库和JSP缺乏良好格式的一个副作用就是它很少能够与其产生的HTML类似。所以,在Web浏览器或HTML编辑器中查看未经渲染的JSP模板是非常令人困惑的,而且得到的结果看上去也非常丑陋(也就是不放到服务器,直接本地打开)。

但是Thymeleaf模板是原生的,不依赖于标签库。它能在接受原始HTML的地方进行编辑和渲染(也就是说我们通过thymeleaf写一个页面,如果不放到服务器进行渲染,也是可以看到效果的,跟后端打开基本相同)

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

配置springbean视图

首先我们需要让springboot(springmvc通用)知道我们的页面是通过什么来渲染的(jsp,freemarker,thymeleaf等等,以及模板的位置等信息)

/**
* 设置视图解析器
* @param templateEngine
* @return
*/
@Bean
public ViewResolver viewResolver(SpringTemplateEngine templateEngine){
ThymeleafViewResolver resolver = new ThymeleafViewResolver();
resolver.setTemplateEngine(templateEngine);
return resolver;
} /**
* 设置模板引擎
* @param templateResolver
* @return
*/
@Bean
public SpringTemplateEngine templateEngine(TemplateResolver templateResolver){
SpringTemplateEngine engine = new SpringTemplateEngine();
engine.setTemplateResolver(templateResolver);
return engine;
} /**
* 模板解析引擎
* @return
*/
@Bean
public TemplateResolver templateResolver(){
TemplateResolver resolver = new SpringResourceTemplateResolver();
resolver.setPrefix("/WEB-INF/template/");//设置地址前缀
resolver.setSuffix(".html");//设置后缀
resolver.setCacheable(false);//设置不缓存
resolver.setTemplateMode("HTML5");
return resolver; }

ThymeleafViewResolver是Spring MVC中ViewResolver的一个实现类。像其他的视图解析器一样,它会接受一个逻辑视图名称,并将其解析为视图

TemplateResolver会最终定位和查找模板。与之前配置InternalResourceViewResolver类似,它使用了prefix和suffix属性。前缀和后缀将会与逻辑视图名组合使用,进而定位Thymeleaf引擎。它的templateMode属性被设置成了HTML 5,这表明我们预期要解析的模板会渲染成HTML 5输出

到这里我们就基本配置完了 。


接下来我们在WEB-INF/template下建立home.html,头部加入thymeleaf的命令空间

<html xmlns:th="http://www.thymeleaf.org">

建立一个controller,写我们的第一个controller,打开访问localhost:8080/home就会转发到/WEB-INF/template/home.html

    @RequestMapping("/home")
public String hello(Map<String,Object> map){
User user = new User("1", "fei", 22, "爱好:篮球","admin");
map.put("user",user); List<User> list = new ArrayList<>();
for(int i =0;i<5;i++){
User u = new User(""+(i+2), "fei"+(i+2), 22+(i+2), "爱好:篮球"+(i+2),"user"+i);
list.add(u);
}
map.put("userList",list); return "home";
}

thymeleaf语法

文本显示

${}的使用和jsp的el表达式很类似,我们在后台绑定了一个user对象那么我们可以通过${user.name}获取用户名,相当于user.getName();但是注意这个只能放到th表达式里面

th:text就相当于把里面的渲染主来的值放到aaa的位置上,如果th:text里面的值只有${user.name},并且为null,那么就会显示aaa

<span th:text="'用户名:' +${user.name}">aaa</span>
#或者下面的这种方式,|…|中只能包含变量表达式${…},不能包含其他常量、条件表达式等
<span th:text="|用户名:${user.name}|"></span>

运算符

在表达式中可以使用各类算术运算符,例如+, -, *, /, %

<span th:text="'年龄*2='+ ${user.age}*2 "></span>

逻辑运算符

在表达式中可以使用逻辑运算符,但是除了==其他的要使用转义字符

>, <, >=, <= != 对应(gt, lt, ge, le, ne)

<span th:text="(${user.age} eq 22)">aaa</span>  //输出true
#可以使用二元表达式
<span th:text="(${user.age} ge 23?'超过年纪':'ok')"></span>

条件判断

th:if条件成立才会显示
th:unless条件不成立才会显示

<span th:if="(${user.age} gt 21)">年龄超过21才会显示</span>
<a th:href="@{/login}" th:unless=${session.user != null}>Login</a>

Switch

* 代表default,其他都没匹配到会显示带*的

<div th:switch="${user.role}">
<p th:case="'admin'">用户是管理员</p>
<p th:case="*">用户是普通人员</p>
</div>

循环

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

<table>
<tr>
<th>index</th>
<th>id</th>
<th>name</th>
<th>age</th>
</tr>
<tr th:each="user,iterStat: ${userList}" >
<td th:text="${iterStat.index}">1</td>
<td th:text="${user.id}">1</td>
<td th:text="${user.name}">王五</td>
<td th:text="${user.age}">55</td>
</tr>
</table>

* 号和$符号共用

*{}里面的值就是上层th:object对象里面对应的属性

 <div th:object="${user}">
<p>Name: <span th:text="*{name}">wangwu</span>.</p>
<p>AGE: <span th:text="*{age}">22</span>.</p>
</div>

Utilities

Utilities为了模板更加易用,Thymeleaf还提供了一系列Utility对象(内置于Context中),可以通过#直接访问

- dates : java.util.Date的功能方法类。
- calendars : 类似#dates,面向java.util.Calendar
- numbers : 格式化数字的功能方法类
- strings : 字符串对象的功能类,contains,startWiths,prepending/appending等等。
- objects: 对objects的功能类操作。
- bools: 对布尔值求值的功能方法。
- arrays:对数组的功能类方法。
- lists: 对lists功能类方法
- sets
- maps

表达式基本对象
- #ctx: 上下文对象.
- #vars: context中的变量们.
- #locale: context中的locale.
- #httpServletRequest: (只在web context中) HttpServletRequest对象.
- #httpSession: (只在web context中) HttpSession对象.

将date渲染成后面的格式
${#dates.format(date, 'dd/MMM/yyyy HH:mm')}
得到当前时间
${#dates.createNow()}
得到当前时间并显示
<span th:text=" ${#dates.format(new java.util.Date().getTime(), 'yyyy-MM-dd hh:mm:ss')} "></span>

utilities其他使用链接,很详细

内联

Text inlining

后面[[]]里面的值是从域中获取的text文本,跟使用th:text效果类似

<span th:inline="text">[[${user.name}]]</span>

JavaScript inlining

<script th:inline="javascript">
var name = [[${user.name}]];
</script>

下面这个意思是如果没有跑在服务器,name就会是我们的lisi,如果在服务器上,会取出user.name的值,忽略lisi

var name = /*[[${user.name}]]*/"lisi";

CSS inlining

<style th:inline="css">
.[[${classname}]] {
text-align: [[${align}]];
}
</style>

none inlining

但是如果我么就要显示[[${user.name}]]不需要他转换呢,就会用到none inlining

<span th:inline="none">[[${user.name}]]</span>

嵌套

在当前home.html路径下有个footer.html,内容如下

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<body>
<footer th:fragment="copy">
&copy; 2011 The Good Thymes Virtual Grocery
</footer>
</body>
</html>

在home.html引用这个footer,footer代表html的名称,copy代表fragmen的值

<div th:replace="footer:: copy"></div>
<div th:include="footer:: copy"></div>

展现的源码:

<footer>
&copy; 2011 The Good Thymes Virtual Grocery
</footer>
<div>
&copy; 2011 The Good Thymes Virtual Grocery
</div>

得出结论:
 - th:replace会将当前div整个替换成foot的元素
 - th:include只是将footer里面的内容拷贝进来


链接

链接一般用th:href="@{地址}",“@{}”表达式,用来计算相对于URL的路径,在html ==<a  href="/register"></a>

<a th:href="@{/register}">register</a>

常用标签


springboot简化配置

当然在springboot中,上面的视图解析器等注册都不需要我们做了,因为springboot都默认帮我们做了,(只要我们将Thymeleaf maven依赖添加到项目的pom文件下,就启用了Spring Boot的自动配置。当应用运行时,Spring Boot将会探测到类路径中的Thymeleaf,然后会自动配置视图解析器、模板解析器以及模板引擎)

如果什么都不配置,springboot会默认查找类跟目录下的templates文件夹下的模板,home.html放到src/main/ resources/templates目录下

如果我们要在home的html中引入一些静态资源怎么办呢,这点springboot也帮我们考虑到了

springboot它会将“/**”映射到几个资源路径中

  • META-INF/resources/
  • resources
  • static
  • public

也就是说我们在有一个static/css/home.css

那么我们这样引入就可以了。

<link type="text/css" rel="stylesheet" th:href="@{/css/home.css}"></link>

当然,我们还是可以配置前缀后缀,以及是否缓存等,只需要一个简单的配置即可

#配置前缀
#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

github代码地址

(二)springboot整合thymeleaf模板的更多相关文章

  1. Springboot整合thymeleaf模板

    Thymeleaf是个XML/XHTML/HTML5模板引擎,可以用于Web与非Web应用. Thymeleaf的主要目标在于提供一种可被浏览器正确显示的.格式良好的模板创建方式,因此也可以用作静态建 ...

  2. 【Springboot】Springboot整合Thymeleaf模板引擎

    Thymeleaf Thymeleaf是跟Velocity.FreeMarker类似的模板引擎,它可以完全替代JSP,相较与其他的模板引擎,它主要有以下几个特点: 1. Thymeleaf在有网络和无 ...

  3. springboot整合Thymeleaf模板引擎

    引入依赖 需要引入Spring Boot的Thymeleaf启动器依赖. <dependency> <groupId>org.springframework.boot</ ...

  4. SpringBoot:2.SpringBoot整合Thymeleaf模板引擎渲染web视图

    在Web开发过程中,Spring Boot可以通过@RestController来返回json数据,那如何渲染Web页面?Spring Boot提供了多种默认渲染html的模板引擎,主要有以下几种: ...

  5. 3.SpringBoot整合Thymeleaf模板

    一.前言 SrpingBoot支持如JSP.Thymeleaf.FreeMarker.Mustache.Velocity等各种模板引擎,同时还为开发者提供了自定义模板扩展的支持. 使用嵌入式Servl ...

  6. springboot整合 Thymeleaf模板

    首先引入maven jar依赖 <dependency> <groupId>org.springframework.boot</groupId> <artif ...

  7. SpringBoot 整合 Thymeleaf & 如何使用后台模板快速搭建项目

    如果你和我一样,是一名 Java 道路上的编程男孩,其实我不太建议你花时间学 Thymeleaf,当然他的思想还是值得借鉴的.但是他的本质在我看来就是 Jsp 技术的翻版(Jsp 现在用的真的很少很少 ...

  8. SpringBoot 之Thymeleaf模板.

    一.前言 Thymeleaf 的出现是为了取代 JSP,虽然 JSP 存在了很长时间,并在 Java Web 开发中无处不在,但是它也存在一些缺陷: 1.JSP 最明显的问题在于它看起来像HTML或X ...

  9. springboot整合thymeleaf+tiles示例

    网上关于此框架的配置实在不多,因此想记录下来以防忘记 因为公司框架基于上述(公司采用gradle构建项目,楼主采用的是maven),所以楼主能少走些弯路: 1.创建springboot-maven项目 ...

随机推荐

  1. 使用wsimport和JAX-WS调用Web Service接口

    本文简单举例说明如何使用wsimport工具和JAX-WS API调用Web Service接口.此方法的优点:使用JDK自带的工具和API接口,无需依赖第三方库. JDK版本:1.8.0_141开发 ...

  2. Windows+Apache2.4.10+PHP7.0+MySQL5.6.21安装

    一.安装包下载 apache2.4.10 http://www.apachelounge.com/download/win64/ PHP7.0.7 http://windows.php.net/dow ...

  3. MMORPG战斗系统随笔(四)、优化客户端游戏性能

    转载请标明出处http://www.cnblogs.com/zblade/ 说到游戏性能,这是一个永恒的话题.在游戏开发的过程中,性能问题一直是我们研发需要关注的一个节点.当然,说句客观话,很多程序员 ...

  4. C#分布式事务解决方案-TransactionScope

    引用一下别人的导读:在实际开发工作中,执行一个事件,然后调用另一接口插入数据,如果处理逻辑出现异常,那么之前插入的数据将成为垃圾数据,我们所希望的是能够在整个这个方法定义为一个事务,Transacti ...

  5. C# 中函数内定义函数的委托方法

    //定义委托方法Action(无返回值)Func(有返回值) //无返回值委托 Action<string> SetKeyAndValue = delegate(string key) { ...

  6. JavaScript性能优化之函数节流(throttle)与函数去抖(debounce)

    函数节流,简单地讲,就是让一个函数无法在很短的时间间隔内连续调用,只有当上一次函数执行后过了你规定的时间间隔,才能进行下一次该函数的调用. 函数节流的原理挺简单的,估计大家都想到了,那就是定时器.当我 ...

  7. 浅析php curl_multi_*系列函数进行批量http请求

    何起: 一系列 数量很大 数据不热 还希望被蜘蛛大量抓取的页面,在蜘蛛抓取高峰时,响应时间会被拉得很高. 前人做了这样一个事儿:页面分3块,用3个内部接口提供,入口文件用curl_multi_*系列函 ...

  8. 编写 WPF DataGrid 列模板,实现更好的用户体验

    Julie Lerman 下载代码示例 最近我在为一个客户做一些 Windows Presentation Foundation (WPF) 方面的工作. 虽然我提倡使用第三方工具,但有时也会避免使用 ...

  9. Xp下麦克风设备及音量检测

    从Vista开始,windows底层的音频架构发生了改变:原本是底层API的waveXXX.mixerXXX等都在Core Audio APIs的基础上进行了重构,上升为了高层API:底层API变为C ...

  10. 使用MxNet新接口Gluon提供的预训练模型进行微调

    1. 导入各种包 from mxnet import gluon import mxnet as mx from mxnet.gluon import nn from mxnet import nda ...