Thymeleaf简介

  • Thymeleaf是一个HTML模板引擎
  • 功能是将一个HTML文件作为模板,并根据模板中的特定标记,对模板中的内容进行修改或替换,最后形成一个新的HTML。

为什么要使用Thymeleaf

  • 现在我们使用Servlet接收用户提交的请求,但是使用Servlet输出响应内容非常麻烦
  • 如果编写一个HTML作为模板,使用Thymeleaf修改或替换指定的内容,再输出这个页面,那么就可以响应出复杂的页面

Thymeleaf使用注意事项

  • HTML模板文件中的html标签属性必须按照规定编写
  • java代码中所有相关类均导包自org.thymeleaf包下

Thymeleaf运行原理

  • java通过Thymeleaf模板引擎,先将HTML模板读取到java,然后将模板中带有"th:"的部分根据特定的含义修改或者替换为Context对象中对应的内容

示例:
将ht1.html中的最后一个张飞替换成赵云

pom.xml中引入jab包thymeleaf

<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf</artifactId>
<version>3.0.11.RELEASE</version>
</dependency>

src/main/resources/th1.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>模板引擎</title>
</head>
<body>
<ul>
<li>刘备</li>
<li>关羽</li>
<li>张飞</li>
<li th:text=${name}>张飞</li>
</ul>
</body>
</html>

src/main/java/Th1Servlet.java

package cn.tedu.controller;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver;

import cn.tedu.utils.ThUtils;


public class Th1Servlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = "赵云";

// 创建模板引擎对象
TemplateEngine te = new TemplateEngine();
// 创建配置对象
ClassLoaderTemplateResolver r = new ClassLoaderTemplateResolver();
// 设置字符集
r.setCharacterEncoding("UTF-8");
// 将引擎和配置对象关联
te.setTemplateResolver(r);
// 创建上下文对象 用于装载数据的容器
Context context = new Context();
context.setVariable("name", name);
// 把容器里面的数据替换到模板页面中
String html = te.process("th1.html", context);

// 响应
response.setContentType("text/html;charset=utf-8");
PrintWriter pw = response.getWriter();
pw.print(html);
pw.close();

// 使用工具类写法
// Context context = new Context();
// context.setVariable("name", name);
// ThUtils.write("th1.html", context, response);
}
}

封装Thymeleaf上述代码

  • Thymeleaf代码在实现过程中有大量的代码重复
  • 通过简单的封装将代码中那些完全重复的代码封装到一个新的类中,方便调用

示例:
在utils工具包中创建ThUtils.java类

package cn.tedu.utils;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.http.HttpServletResponse;

import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver;

public class ThUtils {
private static TemplateEngine te;

static {
// 创建模板引擎对象
te = new TemplateEngine();
// 创建配置对象
ClassLoaderTemplateResolver r = new ClassLoaderTemplateResolver();
// 设置字符集
r.setCharacterEncoding("UTF-8");
// 将引擎和配置对象关联
te.setTemplateResolver(r);
}

public static void write(String fileName,Context context,HttpServletResponse resp) throws IOException {
// 将容器里面的数据替换到模板页面中
String html = te.process(fileName, context);
// 响应
resp.setContentType("text/html;charset=utf-8");
PrintWriter pw = resp.getWriter();
pw.print(html);
pw.close();
}
}