You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在基于Eclipse的Web应用中配置Thymeleaf(Servlet场景)

集成Thymeleaf到Servlet Web应用(Eclipse环境)

一、需要下载的资源

  • Thymeleaf核心库:thymeleaf-x.x.x.jar(建议使用最新稳定版,如3.1.2.RELEASE)
  • Thymeleaf Servlet集成库:thymeleaf-servlet-x.x.x.jar(版本需与核心库保持一致)
  • 可选补充:若需使用复杂表达式功能,可添加ognl-x.x.x.jar,Thymeleaf 3.x已内置简化版OGNL,多数场景无需额外下载

将以上Jar包直接放入Web项目的WEB-INF/lib目录,Eclipse会自动识别并添加到类路径。

二、配置与实现步骤

1. 初始化Thymeleaf模板引擎

创建Servlet上下文监听器,在应用启动时完成模板引擎的配置:

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.templatemode.TemplateMode;
import org.thymeleaf.templateresolver.ServletContextTemplateResolver;

@WebListener
public class ThymeleafInitializer implements ServletContextListener {

    private TemplateEngine templateEngine;

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        ServletContext servletContext = sce.getServletContext();
        ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver(servletContext);
        
        // 设置模板模式为HTML
        templateResolver.setTemplateMode(TemplateMode.HTML);
        // 模板文件存放路径前缀
        templateResolver.setPrefix("/WEB-INF/templates/");
        // 模板文件后缀
        templateResolver.setSuffix(".html");
        // 编码格式
        templateResolver.setCharacterEncoding("UTF-8");
        // 开发环境关闭缓存,生产环境可设为true
        templateResolver.setCacheable(false);

        templateEngine = new TemplateEngine();
        templateEngine.setTemplateResolver(templateResolver);
        
        // 将引擎存入ServletContext,供后续Servlet调用
        servletContext.setAttribute("templateEngine", templateEngine);
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        // 销毁阶段无需额外操作
    }
}

2. 创建Thymeleaf模板文件

在WEB-INF/templates目录下创建示例HTML模板index.html:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Thymeleaf Servlet Demo</title>
</head>
<body>
    <h1>Hello, <span th:text="${username}"></span>!</h1>
    <p>当前时间:<span th:text="${currentTime}"></span></p>
</body>
</html>

3. 在Servlet中设置变量并渲染模板

编写Servlet,获取模板引擎、设置变量并输出渲染结果:

import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.WebContext;

@WebServlet("/hello")
public class HelloServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        
        // 从ServletContext获取初始化好的模板引擎
        ServletContext servletContext = getServletContext();
        TemplateEngine templateEngine = (TemplateEngine) servletContext.getAttribute("templateEngine");
        
        // 创建Web上下文对象
        WebContext context = new WebContext(request, response, servletContext);
        
        // 设置模板变量
        context.setVariable("username", "Lorenzo");
        String currentTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        context.setVariable("currentTime", currentTime);
        
        // 渲染模板并输出到响应流
        templateEngine.process("index", context, response.getWriter());
    }
}

4. 传统XML配置(可选)

若项目未使用Servlet 3.0+注解,需在WEB-INF/web.xml中配置监听器和Servlet:

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <listener>
        <listener-class>com.example.ThymeleafInitializer</listener-class>
    </listener>

    <servlet>
        <servlet-name>HelloServlet</servlet-name>
        <servlet-class>com.example.HelloServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>HelloServlet</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>

</web-app>

三、运行测试

将Web应用部署到Tomcat等Servlet容器,访问http://localhost:8080/你的项目名/hello,即可看到渲染后包含变量内容的页面。

内容的提问来源于stack exchange,提问作者Lorenzo Zorri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 22:25:03