1. 概述

Spring Web 框架围绕 MVC(模型-视图-控制器)模式构建,这种模式使应用中的关注点分离变得简单。这让我们能灵活使用不同的视图技术——从传统的 JSP 到各种现代模板引擎。

本文将深入探讨可与 Spring 集成的主流模板引擎,包括它们的配置方法和使用示例。

2. Spring 视图技术

在 Spring MVC 应用中,由于关注点被清晰分离,切换视图技术主要是个配置问题。要渲染每种视图类型,我们需要为对应技术定义一个 ViewResolver bean。这意味着我们可以在 @Controller 映射方法中像返回 JSP 文件一样返回视图名称。

后续章节将介绍传统技术(如 JSP)和主流模板引擎(Thymeleaf、Groovy、FreeMarker、Jade4j、jte)的配置。每种技术都会涵盖标准 Spring 应用和 Spring Boot 应用的配置方式。

3. Java Server Pages (JSP)

JSP 是 Java 应用中最流行的视图技术之一,Spring 原生支持它。渲染 JSP 文件时,常用的 ViewResolver bean 类型是 InternalResourceViewResolver

@EnableWebMvc
@Configuration
public class ApplicationConfiguration implements WebMvcConfigurer {
    @Bean
    public ViewResolver jspViewResolver() {
        InternalResourceViewResolver bean = new InternalResourceViewResolver();
        bean.setPrefix("/WEB-INF/views/");
        bean.setSuffix(".jsp");
        return bean;
    }
}

接下来,在 /WEB-INF/views 目录创建 JSP 文件:

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<html>
    <head>
        <meta http-equiv="Content-Type" 
          content="text/html; charset=ISO-8859-1">
        <title>用户注册</title>
    </head>
    <body>
        <form:form method="POST" modelAttribute="user">
            <form:label path="email">邮箱: </form:label>
            <form:input path="email" type="text"/>
            <form:label path="password">密码: </form:label>
            <form:input path="password" type="password" />
            <input type="submit" value="提交" />
        </form:form>
    </body>
</html>

Spring Boot 简化配置
在 Spring Boot 应用中,无需在 ApplicationConfiguration 类中配置,直接在 application.properties 中添加:

spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp

Spring Boot 会根据这些属性自动配置所需的 ViewResolver

4. Thymeleaf

Thymeleaf 是一个 Java 模板引擎,可处理 HTML、XML、文本、JavaScript 或 CSS 文件。与其他模板引擎不同,Thymeleaf 允许将模板作为原型使用——意味着它们可以直接作为静态文件预览。

4.1 Maven 依赖

集成 Thymeleaf 需要添加以下依赖:

<dependency>
    <groupId>org.thymeleaf</groupId>
    <artifactId>thymeleaf</artifactId>
    <version>3.1.2.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.thymeleaf</groupId>
    <artifactId>thymeleaf-spring5</artifactId>
    <version>3.1.2.RELEASE</version>
</dependency>

⚠️ 注意:Spring 4 项目需使用 thymeleaf-spring4

4.2 Spring 配置

需要定义 SpringTemplateEngine bean 和指定视图文件位置/类型的 TemplateResolver bean。SpringResourceTemplateResolver 与 Spring 的资源解析机制集成:

@Configuration
@EnableWebMvc
public class ThymeleafConfiguration {
 
    @Bean
    public SpringTemplateEngine templateEngine() {
        SpringTemplateEngine templateEngine = new SpringTemplateEngine();
        templateEngine.setTemplateResolver(thymeleafTemplateResolver());
        return templateEngine;
    }

    @Bean
    public SpringResourceTemplateResolver thymeleafTemplateResolver() {
        SpringResourceTemplateResolver templateResolver 
          = new SpringResourceTemplateResolver();
        templateResolver.setPrefix("/WEB-INF/views/");
        templateResolver.setSuffix(".html");
        templateResolver.setTemplateMode("HTML5");
        return templateResolver;
    }
}

还需定义 ThymeleafViewResolver 类型的 ViewResolver bean:

@Bean
public ThymeleafViewResolver thymeleafViewResolver() {
    ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
    viewResolver.setTemplateEngine(templateEngine());
    return viewResolver;
}

4.3 Thymeleaf 模板

WEB-INF/views 目录创建 HTML 文件:

<html>
    <head>
        <meta charset="ISO-8859-1" />
        <title>用户注册</title>
    </head>
    <body>
        <form action="#" th:action="@{/register}" 
          th:object="${user}" method="post">
            邮箱:<input type="text" th:field="*{email}" />
            密码:<input type="password" th:field="*{password}" />
            <input type="submit" value="提交" />
        </form>
    </body>
</html>

Thymeleaf 模板语法与 HTML 高度相似。在 Spring 应用中使用时,它支持:

  • 表单行为定义
  • 表单输入与数据模型绑定
  • 表单输入验证
  • 消息源值显示
  • 模板片段渲染

4.4 Spring Boot 集成

添加 spring-boot-starter-thymeleaf 依赖即可启用自动配置:

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

无需显式配置。默认模板文件位置为 resources/templates

5. FreeMarker

FreeMarker 是 Apache 软件基金会开发的 Java 模板引擎,可用于生成网页、源代码、XML 文件、配置文件、邮件等文本格式。生成过程基于 FreeMarker 模板语言(FTL)编写的模板文件。

5.1 Maven 依赖

<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.23</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>5.2.8.RELEASE</version>
</dependency>

5.2 Spring 配置

定义 FreemarkerConfigurer bean 指定模板位置:

@Configuration
@EnableWebMvc
public class FreemarkerConfiguration {
 
    @Bean 
    public FreeMarkerConfigurer freemarkerConfig() { 
        FreeMarkerConfigurer freeMarkerConfigurer = new FreeMarkerConfigurer(); 
        freeMarkerConfigurer.setTemplateLoaderPath("/WEB-INF/views/");
        return freeMarkerConfigurer; 
    }
}

再定义 FreeMarkerViewResolver 类型的 ViewResolver

@Bean 
public FreeMarkerViewResolver freemarkerViewResolver() { 
    FreeMarkerViewResolver resolver = new FreeMarkerViewResolver(); 
    resolver.setCache(true); 
    resolver.setPrefix(""); 
    resolver.setSuffix(".ftl"); 
    return resolver; 
}

5.3 FreeMarker 模板

WEB-INF/views 目录创建 FTL 模板:

<#import "/spring.ftl" as spring/>
<html>
    <head>
        <meta charset="ISO-8859-1" />
        <title>用户注册</title>
    </head>
    <body>
        <form action="register" method="post">
            <@spring.bind path="user" />
            邮箱: <@spring.formInput "user.email"/>
            密码: <@spring.formPasswordInput "user.password"/>
            <input type="submit" value="提交" />
        </form>
    </body>
</html>

我们导入了 Spring 提供的宏库来处理表单绑定。FTL 语言还包含大量标签、指令和表达式,支持:

  • 集合操作
  • 流程控制
  • 逻辑运算
  • 字符串/数字格式化与解析

5.4 Spring Boot 集成

使用 spring-boot-starter-freemarker 简化配置:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-freemarker</artifactId>
    <version>3.1.5</version>
</dependency>

自动配置生效后,只需将模板文件放在 resources/templates 目录。

6. Groovy

Spring MVC 视图可通过 Groovy 标记模板引擎 生成。该引擎基于构建器语法,可生成任何文本格式。

6.1 Maven 依赖

<dependency>
    <groupId>org.codehaus.groovy</groupId>
    <artifactId>groovy-templates</artifactId>
    <version>2.4.12</version>
</dependency>

6.2 Spring 配置

定义 GroovyMarkupConfigurerGroovyMarkupViewResolver

@Configuration
@EnableWebMvc
public class GroovyConfiguration {
 
    @Bean
    public GroovyMarkupConfigurer groovyMarkupConfigurer() {
        GroovyMarkupConfigurer configurer = new GroovyMarkupConfigurer();
        configurer.setResourceLoaderPath("/WEB-INF/views/");
        return configurer;
    }
    
    @Bean
    public GroovyMarkupViewResolver groovyMarkupViewResolver() {
        GroovyMarkupViewResolver viewResolver = new GroovyMarkupViewResolver();
        viewResolver.setSuffix(".tpl");
        return viewResolver;
    }
}

6.3 Groovy 标记模板

Groovy 模板特点:

  • 编译为字节码
  • 支持片段和布局
  • 内置国际化支持
  • 渲染速度快

用户注册表单示例(包含数据绑定):

yieldUnescaped '<!DOCTYPE html>'                                                    
html(lang:'en') {                                                                   
    head {                                                                          
        meta('http-equiv':'"Content-Type" ' +
          'content="text/html; charset=utf-8"')      
        title('用户注册')                                                            
    }                                                                               
    body {                                                                          
        form (id:'userForm', action:'register', method:'post') {
            label (for:'email', '邮箱')
            input (name:'email', type:'text', value:user.email?:'')
            label (for:'password', '密码')
            input (name:'password', type:'password', value:user.password?:'')
            div (class:'form-actions') {
                input (type:'submit', value:'提交')
            }                             
        }
    }                                                                               
}

6.4 Spring Boot 集成

添加 spring-boot-starter-groovy-templates 启用自动配置:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-groovy-templates</artifactId>
    <version>2.5.6</version>
</dependency>

默认模板位置:resources/templates

7. Jade4j

Jade4j 是 JavaScript 模板引擎 Pug(原名 Jade)的 Java 实现,用于生成 HTML 文件。

7.1 Maven 依赖

<dependency>
    <groupId>de.neuland-bfi</groupId>
    <artifactId>spring-jade4j</artifactId>
    <version>1.2.5</version>
</dependency>

7.2 Spring 配置

定义 SpringTemplateLoaderJadeConfiguration bean:

@Configuration
@EnableWebMvc
public class JadeTemplateConfiguration {
 
    @Bean
    public SpringTemplateLoader templateLoader() {
        SpringTemplateLoader templateLoader 
          = new SpringTemplateLoader();
        templateLoader.setBasePath("/WEB-INF/views/");
        templateLoader.setSuffix(".jade");
        return templateLoader;
    }
 
    @Bean
    public JadeConfiguration jadeConfiguration() {
        JadeConfiguration configuration 
          = new JadeConfiguration();
        configuration.setCaching(false);
        configuration.setTemplateLoader(templateLoader());
        return configuration;
    }
}

再定义 JadeViewResolver

@Bean
public ViewResolver viewResolver() {
    JadeViewResolver viewResolver = new JadeViewResolver();
    viewResolver.setConfiguration(jadeConfiguration());
    return viewResolver;
}

7.3 Jade4j 模板

Jade4j 使用缩进敏感的简洁语法:

doctype html
html
  head
    title 用户注册
  body
    form(action="register" method="post" )
      label(for="email") 邮箱:
      input(type="text" name="email")
      label(for="password") 密码:
      input(type="password" name="password")
      input(type="submit" value="提交")

Spring Boot 注意
Spring Boot 未提供 Jade4j starter,需手动添加上述 Spring 配置。

8. Java 模板引擎 (jte)

jte 是专为 Java/Kotlin Web 应用设计的轻量级、高性能模板引擎。

8.1 Maven 依赖

<dependency>
    <groupId>gg.jte</groupId>
    <artifactId>jte</artifactId>
    <version>3.1.15</version>
</dependency>

建议安装 jte IntelliJ 插件 获得代码提示。

8.2 Spring 配置

定义 TemplateEngineViewResolver

@Configuration
@EnableWebMvc
class Config implements WebMvcConfigurer {
    @Bean
    TemplateEngine templateEngine(ServletContext context) {
        String root = context.getRealPath("/WEB-INF/views/");
        DirectoryCodeResolver codeResolver = new DirectoryCodeResolver(Path.of(root));
        String classesPath = context.getRealPath("/WEB-INF/classes/");
        return TemplateEngine.create(
          codeResolver, Path.of(classesPath), ContentType.Html, this.getClass().getClassLoader());
    }

    @Bean
    ViewResolver viewResolver(TemplateEngine templateEngine) {
        return (viewName, locale) -> (model, request, response) -> {
          templateEngine.render(
            viewName + ".jte",
            (Map<String, Object>) model,
            new PrintWriterOutput(response.getWriter()));
        };
    }
}

8.3 JTE 模板

WEB-INF 目录创建 .jte 文件:

@import com.baeldung.spring.domain.Message
@param Message message

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Baeldung - 用户页面</title>
</head>
<body>
    <form action="/welcome" method="post">
        姓名: <input type="text" name="text" value="${message.getName()}">
        消息: <input type="submit" value="${message.getText()}">
        <input type="submit" value="提交">
    </form>
</body>
</html>

通过 @import 注解注入模型类,创建表单接收 nametext 输入。

8.4 Spring Boot 集成

根据 Spring Boot 版本选择 starter:

  • Spring Boot 3:
    <dependency>
        <groupId>gg.jte</groupId>
        <artifactId>jte-spring-boot-starter-3</artifactId>
        <version>3.1.15</version>
    </dependency>
    <dependency>
        <groupId>gg.jte</groupId>
        <artifactId>jte</artifactId>
        <version>3.1.15</version>
    </dependency> 
    
  • Spring Boot 2:
    <dependency>
        <groupId>gg.jte</groupId>
        <artifactId>jte-spring-boot-starter-2</artifactId>
        <version>3.1.15</version>
    </dependency>
    

默认模板位置:src/main/jte。可通过 application.properties 覆盖:

gg.jte.templateLocation=src/main/resources/jte
gg.jte.templateSuffix=.jte
gg.jte.developmentMode=true  # 开发模式启用热更新

9. 其他模板引擎

除上述引擎外,还有其他可选方案:

  • Velocity:老牌模板引擎,功能强大但复杂。Spring 4.3 起已弃用,5.0.1 完全移除。
  • JMustache:通过 spring-boot-starter-mustache 可轻松集成到 Spring Boot。
  • Pebble:库内建对 Spring/Spring Boot 的支持。
  • Handlebars/React:基于 JSR-223 脚本引擎(如 Nashorn)运行。

10. 总结

本文系统介绍了 Spring Web 应用中主流模板引擎的集成方案,包括:

  • 传统 JSP 技术
  • 现代引擎:Thymeleaf、FreeMarker、Groovy、Jade4j、jte

每种引擎都提供了标准 Spring 和 Spring Boot 的配置示例。选择时需考虑:

  • 语法偏好(HTML 友好 vs 代码风格)
  • 性能需求
  • 生态支持(如 Spring Boot 自动配置)

对于新项目,推荐优先考虑 Thymeleaf 或 jte——前者与 Spring 生态深度集成,后者以高性能见长。


原始标题:Template Engines for Spring | Baeldung