springboot整合Thymeleaf模板引擎
引入依赖
需要引入Spring Boot的Thymeleaf启动器依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>nekohtml</groupId>
<artifactId>nekohtml</artifactId>
</dependency>
说明:使用springboot的thymeleaf模板时默认会对HTML进行严格的检查,导致当你的标签没有闭合时就会通不过。nekohtml这个依赖可以解决这一问题。引入该依赖后一般会自动引入web依赖,不需要再单独引入web依赖。
简单配置
spring.thymeleaf.cache=false
spring.thymeleaf.mode = LEGACYHTML5
说明:第一行配置是清除缓存,实现热部署。也就是修改了html后不用重启,刷新页面就能看到效果。不过这儿特别强调一下,修改完html后一定要ctrl+f9重新build一下。再回到浏览器刷新,就能看到效果了。第二行配置是回避HTML进行严格的检查的配置,当然你需要提前引入nekohtml依赖。
使用模板
1、模板文件头部使用 <html xmlns:th="http://www.thymeleaf.org">定义。
2、html标签上使用 th:开头标识作为前缀。
3、通过 @{}引入web静态文件。
<link rel="stylesheet" th:href="@{/css/jquery.min.css}"/>
访问springmvc中的model数据: ${user.name},访问更多不同对象的数据请点击参考官方定义。
Springboot的static和templates
SpringBoot里面没有我们之前常规web开发的WebContent(WebApp),它只有src目录。在src/main/resources下面有两个文件夹,static和templates。springboot默认static中放静态页面,而templates中放动态页面。
静态页面:
在static放一个hello.html,然后直接输入http://localhost:8080/hello.html便能成功访问。(好像可以新建一个public文件夹,也可以放静态文件)。也可以通过controller跳转,输入http://localhost:8080/Hi就可以成功访问:
@Controller
public class HelloController {
@RequestMapping("/Hi")
public String sayHello() {
return "hello.html";
}
}
动态页面:
动态页面需要先请求服务器,访问后台应用程序,然后再转向到页面,比如访问JSP。spring boot建议不要使用JSP,默认使用Thymeleaf来做动态页面。在pom中要添加Thymeleaf组件jar包。
我们先在tempates文件夹中也新建一个hello.html但内容不同,然后先试一下直接访问该页面。
1、通过直接访问页面:输入http://localhost:8080/hello.html,结果显示访问的是静态目录里面的那个hello.html
2、通过controller跳转:。
原因:
静态页面的return默认是跳转到/static/index.html,当在pom.xml中引入了thymeleaf组件,动态跳转会覆盖默认的静态跳转,默认就会跳转到/templates/index.html,注意看两者return代码也有区别,动态没有html后缀。也就是我们要这样改controller:
@Controller
public class HelloController {
@RequestMapping("/Hi")
public String sayHello() {
return "hello";
}
}
如果用了thymeleaf模板还想返回static中的页面,那么就要用重定向,如果在使用动态页面时还想跳转到/static/index.html,可以使用重定向:return "redirect:index.html"。
@RequestMapping(value = "/mrfile", method = RequestMethod.GET)
public String mrfile(HttpServletRequest request, @RequestParam(value = "usrname") String usrname)
{
try
{
request.getServletContext().getRealPath(REAL_PATH);
return "redirect:Mrfile.html";
}
catch (Exception ex)
{
LOGGER.info(ex.toString());
return null;
}
}
注意:
1、拦截的url最后不要跟视图重合,否则会抛出Circular view path异常,然后就报错说会有个循环视图的错误,反正以后注意就是。
@Controller
public class HelloController {
@RequestMapping("/hello")
public String sayHello() {
return "hello.html";
}
}
2、每次改完都要重新停止应用,再重新启动很烦~但springboot有个叫热部署的东西,就是说在项目中修改代码可以不用重新停止应用再重新启动,可以自动重启,这里我们用的是devtools
thymeleaf中的相对路径
一.问题
最近在使用springboot框架,众所周知,该框架可以直接以jar的方式运行,在该方式运行的情况下,默认contextPath是/。在前台页面引用的时候,我是这样写相对路径的:
后台RequestMapping为/test/page1,前台访问路径就是"/test/page1",自动就会跳转到http://localhost:8080/test/page1路径,这样自然是没有什么问题的,但是当工程以war包的形式部署到tomcat下时,在访问时需要加上项目名,比如project1,这时的contextPath就是是/project1,那么在这种情况下,以前的相对路径写法"/test1/page1"就完全不能用了,因为它会自动跳转到http://localhost:8080/test/page1地址,很显然,这里缺少了/project1,正确路径是http://localhost:8080/project1/test/page1
那么怎么办呢?
二.解决过程
毫无疑问,这种情况是十分严重的,如果等项目完成了才发现路径都是错的,那无疑要花费巨大的精力去改,上网上查了一些资料,总结如下:
相对路径:
html页面中相对路径有两种:
第一种:/test/page1
这是相对于服务器根路径而言的,以之前的例子为例,使用结果就是直接从8080以后开始替换,如http://localhost:8080/test/page1
第二种:test/page2
这是相对于当前路径而言的,比如当前路径为http://localhost:8080/test/page1,那么替换以后就是。
http://localhost:8080/test/test/page,在这种情况下也有对应的语法,../表示上级目录,./表示当前目录,如test/page2就相当于./test/page2,如果写成../test/page2,那么替换后的路径就是http://localhost:8080/test/page了。
绝对路径:
绝对路径就是直接http://localhost:8080/test/page1,十分简单,但是也相当于写死了。
总结:
方案1,直接使用绝对路径。但是这样十分不好维护,写起来也麻烦,直接pass。
方案2, 使用相对路径第一种写法,部署的时候设置contextPath为/,这样自然没有问题,可以将springboot以jar方式部署,默认就是这种情况,如果一定要用tomcat部署,那么只能把war包解压出来的工程文件全部转移到tomcat的ROOT文件夹下,将ROOT文件夹内原有文件清空或转移,这样也可以实现根目录访问。这种方案一定程度上可以解决问题,但是对部署的方式限制太大了,只部署一个工程还可以,多了就没有办法了,因此也不是长久之计。
那么还有没有别的办法呢?
有!基本思路是利用thymeleaf动态生成html页面的特点,在相对路径前动态添加一个项目名,不就解决了?其实用jsp可以轻松做到,但是由于我的页面不是jsp页面,所以也不能使用这种方法。于是又进行了一番尝试,参考了很多资料,终于找到了解决方案!
方案3:直接利用thymeleaf的th:src或者th:href属性改变标签的链接路径,如
@{/js/{path}/myJs.js(path=${contextPath})}
对于thymeleaf来说,有四种相对URL:
页面相对 test/page1.html 同普通html相对路径第二种,替换末尾的路径
上下文相对 /test/page1.html 自动添加上下文路径在相对路径之前!实际生成路径/project1/test/page1.html
服务器相对 ~/test/page1.html 同普通html相对路径第一种,适合访问同一服务器不同上下文路径时使用,如同一个tomcat上的project2
协议相对 //code.jquery.com/jquery-2.0.3.min.js 跨域访问使用
另外附上带有变量的thymeleaf语法
@{/js/{path}/myJs.js(path=${contextPath},param=${contextPath})}
()内完成对变量或者参数的赋值,比如contextPath变量值为/app,那么最终生成的URL为http://localhost:11111/app/js//app/myJs.js?param=/app,
如果语句为
@{/js/{path}/myJs.js(path=${contextPath})}
那么会生成
http://localhost:11111/app/js//app/myJs.js
需要注意的是,thymeleaf将会以完成参数赋值后的结果来判断是哪种相对类型。
三.解决方案
<script src="../static/js/myJs.js" th:src="@{/js/myJs.js}"></script>
利用thymeleaf提供的相对上下文动态路径,轻松解决问题,静态路径可以用来描述当前页面文件与其他页面文件在当前工程的位置关系,这样即使在未联网的情况直接打开html文件,也可以找到所引用的js文件和css文件等其他文件,充分发挥thymeleaf的威力!
springboot整合Thymeleaf模板引擎的更多相关文章
- 【Springboot】Springboot整合Thymeleaf模板引擎
Thymeleaf Thymeleaf是跟Velocity.FreeMarker类似的模板引擎,它可以完全替代JSP,相较与其他的模板引擎,它主要有以下几个特点: 1. Thymeleaf在有网络和无 ...
- SpringBoot:2.SpringBoot整合Thymeleaf模板引擎渲染web视图
在Web开发过程中,Spring Boot可以通过@RestController来返回json数据,那如何渲染Web页面?Spring Boot提供了多种默认渲染html的模板引擎,主要有以下几种: ...
- Springboot整合thymeleaf模板
Thymeleaf是个XML/XHTML/HTML5模板引擎,可以用于Web与非Web应用. Thymeleaf的主要目标在于提供一种可被浏览器正确显示的.格式良好的模板创建方式,因此也可以用作静态建 ...
- SpringBoot使用thymeleaf模板引擎
(1).添加pom依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactI ...
- SpringBoot日记——Thymeleaf模板引擎篇
开发通常我们都会使用模板引擎,比如:JSP.Velocity.Freemarker.Thymeleaf等等很多,那么模板引擎是干嘛用的? 模板引擎,顾名思义,是一款模板,模板中可以动态的写入一些参数, ...
- 九、SpringBoot集成Thymeleaf模板引擎
Thymeleaf咋读!??? 呵呵,是不是一脸懵逼...哥用我的大学四级英文知识告诉你吧:[θaimlif]. 啥玩意?不会音标?...那你就这样叫它吧:“赛母李府”,大部分中国人是听不出破绽的.. ...
- Spring Boot 2.0 整合Thymeleaf 模板引擎
本节将和大家一起实战Spring Boot 2.0 和thymeleaf 模板引擎 1. 创建项目 2. 使用Spring Initlizr 快速创建Spring Boot 应用程序 3. 填写项目配 ...
- Springboot与Thymeleaf模板引擎整合基础教程(附源码)
前言 由于在开发My Blog项目时使用了大量的技术整合,针对于部分框架的使用和整合的流程没有做详细的介绍和记录,导致有些朋友用起来有些吃力,因此打算在接下来的时间里做一些基础整合的介绍,当然,可能也 ...
- Springboot系列:Springboot与Thymeleaf模板引擎整合基础教程(附源码)
前言 由于在开发My Blog项目时使用了大量的技术整合,针对于部分框架的使用和整合的流程没有做详细的介绍和记录,导致有些朋友用起来有些吃力,因此打算在接下来的时间里做一些基础整合的介绍,当然,可能也 ...
随机推荐
- 团队项目7——团队冲刺beta版本目录
Beta版本冲刺计划及安排http://www.cnblogs.com/zy-96/p/8017331.html 第二次项目冲刺(Beta版本12.04) www.cnblogs.com/zy-96/ ...
- Alpha冲刺——day3
Alpha冲刺--day3 作业链接 Alpha冲刺随笔集 github地址 团队成员 031602636 许舒玲(队长) 031602237 吴杰婷 031602220 雷博浩 031602634 ...
- Alpha 冲刺二
团队成员 051601135 岳冠宇 051604103 陈思孝 031602629 刘意晗 031602248 郑智文 031602234 王淇 会议照片 项目燃尽图 项目进展 暂无进展, 项目描述 ...
- appium获取Toast内容的方法
做自动化测试的时候,可能需要根据弹出的Toast提示来做下一步判断.这里记录一下获取Toast内容的方法,同时巩固一下显示等待的方法之一WebDriverWait. from selenium.web ...
- 洛谷P4301 [CQOI2013]新Nim游戏
P4301 [CQOI2013]新Nim游戏 题目描述 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同).两个游戏者轮流操作,每次可以选一个火柴堆拿走若干根火柴. ...
- jquery 绑定文本即时查询功能
bindFilterFunc: function () { if ("\v" == "v") { // IE only ...
- 洛谷 P2224 [HNOI2001]产品加工 解题报告
P2224 [HNOI2001]产品加工 题目描述 某加工厂有A.B两台机器,来加工的产品可以由其中任何一台机器完成,或者两台机器共同完成.由于受到机器性能和产品特性的限制,不同的机器加工同一产品所需 ...
- (转)灵活控制 Hibernate 的日志或 SQL 输出,以便于诊断
背景:项目开发需要.之前对于hibernate日志输出,log4j的绑定,之间的关系一直不是很清楚.终于找到一篇介绍的很详细的文章. 文章出处:https://unmi.cc/hibernate-lo ...
- 界面编程之QT的文件操作20180729
/*******************************************************************************************/ 一.QT文件 ...
- 127. Word Ladder(M)
127. Word LadderGiven two words (beginWord and endWord), and a dictionary's word list, find the leng ...