Springboot怎么集成Thymeleaf模板引擎?
迪丽瓦拉
2024-05-28 11:30:13
0

Thymeleaf介绍

Thymeleaf,是一个XML/XHTML/HTML模板引擎,开源的java库,可以用于SpingMVC项目中,用于代替JSP、FreeMarker或者其他的模板引擎;页面与数据分离,提高了开发效率,让代码重用更容易。

Springboot集成Thymeleaf

文章示例环境配置信息

jdk版本:1.8
开发工具:Intellij iDEA 2020.1
springboot:2.3.9.RELEASE

依赖引入

org.springframework.bootspring-boot-starter-thymeleaf

ognlognl3.1.26

配置文件

spring.thymeleaf.cache=false
spring.thymeleaf.suffix=.html
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.servlet.content-type=text/html
spring.thymeleaf.encoding=utf-8
spring.messages.basename=i18n/messages

集成示例

thymeleaf的用法,其实和jsp、freemarker差不多,下面用一个示例实际看一下thymeleaf是怎么使用的;

1、定义一个ExampleController类,注意,这里使用@Controller注解标记ExampleController,不要使用@RestController;

2、controller层具体处理请求的方法内,增加一个形参org.springframework.ui.Model,用于携带后台的处理数据;

3、返回值的“index”,表示classpath下templates中,模板名称是index,后缀是.html的模板;

4、contoller层处理完后,携带后台处理数据,到达视图层进行数据的渲染。

@Controller
@RequestMapping("/example")
public class ExampleController {@GetMapping("/index")public String index(Model model) {model.addAttribute("userName", "fanfu");model.addAttribute("msg", "thymeleaf模板内容");return "index";}
}

这里注意一下,通过xmlns:th="http://www.thymeleaf.org"引入了thymeleaf命名空间,th:text用于处理html标签体的文本内容,但是html5不允许使用th:*这些非标准属性的,因此可以切换到thymeleaf的data-th-*方法,来替换th:*方法;因此可以这么理解th:*和data-th-*的用法是等效的,为了遵循标准的用法,这篇文章的所有示例都采用data-th-*的写法。



测试

你好!
这是一个

Thymeleaf语法

表达式

thymeleaf内置了5种标准表达式,如下:

1、${...}:变量表达式,取出上下文环境中变量的值;

2、*{...}:选择变量表达式,取选择的对象的属性值;

3、#{...}:消息表达式,使用文字消息的国际化;

4、@{...}:链接表达式,用于表示各种超链接地址;

 

超链接

5、~{...}:片段表达式,引用一段公共的代码片段;如下:“example”表示另外一个模板名字,里面是一些通用代码片段,可以使用这种方式引入到当前模板中;

遍历

条件判断

条件判断语句有三种,分别是:th:if、th:unless、th:switch

th:if,如果表达式内容为真,则显示内容;

如果username不是null,我就会显示

th:unless,如果表达式内容为假,则显示内容;

如果username不是null,我就会显示

th:switch,为多路选择语句,需要搭配th:case来使用;

凡夫贬夫,你好

这是一个test

Thymeleaf应用场景

Thymeleaf可以替代JSP来进行动态网页的开发,但是在前后端分离、前端组件更加丰富多元化的今天,依然采用JSP的模式,用Thymeleaf来替代JSP进行动态网页的开发,未免有些落后了,因此Thymeleaf就没有用武之地吗?当然不。Thymeleaf是模板引擎,不仅可以处理html模板,还可以处理xml、CSS等其他一些格式的模板文件。例如:输出一些有样式的制式文本,如通知公告、申请书、建议书等。

下面是一个具体的示例,student.html是一个学生成绩展示的模板,但是学生会有很多,成绩也不一样,但是如果需要用一个制式的格式来展示这些数据,可以这么做:

1、先拿到学生的成绩数据;

2、然后用编程式的方法,使用thymeleaf模板引擎,根据模板生成静态的带有样式且加载好数据的html网页代码;

3、通常成绩、通知这类信息,一旦形成,基本上是不会改了,因此拿到已经加载数据的html网页内容就可以直接渲染显示了;

@Test
public void test() throws IOException {//测试数据List students = this.students();String staticDir = ResourceUtils.getFile("classpath:static\\").getPath() + File.separator;String targetFilePath=staticDir+"/student-data.html";//thymeleaf引擎上下文环境Context context=new Context();//在thymeleaf引擎上下文环境中装载模板上要渲染的数据context.setVariable("students",students);File file = new File(targetFilePath);if (!file.exists()) {file.delete();}//定义thymeleaf模板打印输出流PrintWriter printWriter=new PrintWriter(file);//定义thymeleaf模板解析器FileTemplateResolver fileTemplateResolver = new FileTemplateResolver();//thymeleaf模板解析器解析内容的后缀fileTemplateResolver.setSuffix(".html");//thymeleaf模板解析器解析内容的前缀String tempDir = ResourceUtils.getFile("classpath:templates\\").getPath()+File.separator;fileTemplateResolver.setPrefix(tempDir);//定义//thymeleaf模板引擎TemplateEngine templateEngine = new TemplateEngine();//装载thymeleaf模板解析器templateEngine.setTemplateResolver(fileTemplateResolver);//执行thymeleaf模板引擎的模板解析能力,有三个参数,分别是模板名字(不包括后缀和前缀)、上下文环境、打印输出流templateEngine.process("student",context,printWriter);
}
public List students() {List students = new ArrayList<>();for (int i = 0; i < 10; i++) {Student student = new Student();student.setName("张三" + i);student.setScore(98);students.add(student);}return students;
}


学生信息


-----

-----

相关内容