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 配置
定义 GroovyMarkupConfigurer
和 GroovyMarkupViewResolver
:
@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 配置
定义 SpringTemplateLoader
和 JadeConfiguration
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 配置
定义 TemplateEngine
和 ViewResolver
:
@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
注解注入模型类,创建表单接收 name
和 text
输入。
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 生态深度集成,后者以高性能见长。