1. 概述
Spring Web框架是围绕MVC(模型-视图-控制器)模式构建的,这使得在应用程序中分离关注点变得更加容易。 允许使用不同的视图技术,从成熟的JSP技术到各种模板引擎。
在本文中,我们介绍可以与Spring一起使用的主要模板引擎、它们的配置和使用示例。
2. Spring视图技术
考虑到Spring MVC应用程序中的关注点是完全分离的,从一种视图技术切换到另一种视图技术主要是配置问题。
为了呈现每种视图类型,我们需要定义一个与每种技术对应的ViewResolver bean。 这意味着我们可以从@Controller映射方法返回视图名称,就像我们通常返回JSP文件一样。
在下面的小节中,我们介绍更传统的技术,例如JSP,以及可以与Spring一起使用的主要模板引擎:Thymeleaf、Groovy、FreeMarker、Jade。
对于其中的每一个,我们会介绍标准Spring应用程序和使用Spring Boot构建的应用程序中所需的配置。
3. 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=UTF-8">
<title>User Registration</title>
</head>
<body>
<form:form method="POST" modelAttribute="user" action="register">
<form:label path="email">Email:</form:label>
<form:input path="email" type="text"/>
<br/>
<form:label path="password">Password:</form:label>
<form:input path="password" type="password"/>
<br/>
<input type="submit" value="Submit"/>
</form:form>
</body>
</html>
如果我们将文件添加到Spring Boot应用程序,那么我们可以在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与Spring集成,我们需要添加thymeleaf和thymeleaf-spring5依赖项:
<!-- @formatter:off -->
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf</artifactId>
<version>3.0.12.RELEASE</version>
</dependency>
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
<version>3.0.12.RELEASE</version>
</dependency>
<!-- @formatter:on -->
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:
public class ThymeleafConfiguration {
@Bean
public ThymeleafViewResolver thymeleafViewResolver() {
ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
viewResolver.setTemplateEngine(templateEngine());
return viewResolver;
}
}
4.3 Thymeleaf模板
现在我们可以在WEB-INF/views文件夹中添加一个HTML文件:
<html>
<head>
<meta charset="UTF-8"/>
<title>User Registration</title>
</head>
<body>
<form action="#" method="post" th:action="@{/register}" th:object="${user}">
Email:<input th:field="*{email}" type="text"/> <br/>
Password:<input th:field="*{password}" type="password"/> <br/>
<input type="submit" value="Submit"/>
</form>
</body>
</html>
Thymeleaf模板在语法上与HTML模板非常相似。
在Spring应用程序中使用Thymeleaf时可用的一些功能包括:
- 支持定义表单行为
- 将表单输入绑定到数据模型
- 表单输入验证
- 显示来自消息源的值
- 渲染模板片段
你可以在Thymeleaf in Spring MVC一文中阅读有关使用Thymeleaf模板的更多信息。
4.4 Spring Boot中的Thymeleaf
Spring Boot通过添加spring-boot-starter-thymeleaf依赖项为Thymeleaf提供自动配置:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
<version>2.6.1</version>
</dependency>
无需任何其他显式配置,默认情况下,HTML文件应放置在resources/templates文件夹中。
5. FreeMarker
FreeMarker是由Apache软件基金会构建的基于Java的模板引擎。 它可用于生成网页,也可用于生成源代码、XML文件、配置文件、电子邮件和其他基于文本的格式。
生成是基于使用FreeMarker模板语言编写的模板文件完成的。
5.1 Maven依赖
我们需要添加freemarker依赖项:
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.27-incubating</version>
</dependency>
对于Spring集成,我们还需要spring-context-support依赖:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>5.3.13</version>
</dependency>
5.2 Spring配置
将FreeMarker与Spring MVC集成需要定义一个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 class FreemarkerConfiguration {
@Bean
public FreeMarkerViewResolver freemarkerViewResolver() {
FreeMarkerViewResolver resolver = new FreeMarkerViewResolver();
resolver.setCache(true);
resolver.setPrefix("");
resolver.setSuffix(".ftl");
return resolver;
}
}
5.3 FreeMarker模板
我们可以在WEB-INF/views文件夹中使用FreeMarker创建一个HTML模板:
<#import "/spring.ftl" as spring/>
<html>
<head>
<meta charset="UTF-8"/>
<title>User Registration</title>
</head>
<body>
<form action="register" method="post">
<@spring.bind path="user" />
Email:<@spring.formInput "user.email"/> <br/>
Password:<@spring.formPasswordInput "user.password"/> <br/>
<input type="submit" value="Submit"/>
</form>
</body>
</html>
在上面的代码中,我们导入了一组由Spring定义的宏,用于处理FreeMarker中的表单,包括将表单输入绑定到数据模型。
此外,FreeMarker模板语言包含大量标签、指令和表达式,用于处理集合、流控制结构、逻辑运算符、格式化和解析字符串、数字和其他许多功能。
5.4 Spring Boot中的FreeMarker
在Spring Boot应用程序中,我们可以通过使用spring-boot-starter-freemarker依赖项来简化所需的配置:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
<version>2.6.1</version>
</dependency>
该启动器添加了必要的自动配置,我们需要做的就是将模板文件放在resources/templates文件夹中。
6. Groovy
Spring MVC视图也可以使用Groovy Markup模板引擎生成。 该引擎基于生成器语法,可用于生成任何文本格式。
6.1 Maven依赖
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-templates</artifactId>
<version>2.4.12</version>
</dependency>
6.2 Spring配置
Markup模板引擎与Spring MVC的集成需要定义一个GroovyMarkupConfigurer bean和一个GroovyMarkupViewResolver类型的ViewResolver:
@Configuration
@EnableWebMvc
public class GroovyConfiguration {
@Bean
public GroovyMarkupConfigurer groovyMarkupConfigurer() {
GroovyMarkupConfigurer configurer = new GroovyMarkupConfigurer();
configurer.setResourceLoaderPath("/WEB-INF/views/");
return configurer;
}
@Bean
public GroovyMarkupViewResolver thymeleafViewResolver() {
GroovyMarkupViewResolver viewResolver = new GroovyMarkupViewResolver();
viewResolver.setSuffix(".tpl");
return viewResolver;
}
}
6.3 Groovy Markup模板
模板是用Groovy语言编写的,具有以下几个特点:
- 它们被编译成字节码
- 它们包含对片段和布局的支持
- 他们为国际化提供支持
- 渲染速度很快
让我们为“用户注册”表单创建一个Groovy模板,其中包括数据绑定:
yieldUnescaped '<!DOCTYPE html>'
html(lang: 'en') {
head {
meta('http-equiv': '"Content-Type" content="text/html; charset=utf-8"')
title('User Registration')
}
body {
form(id: 'userForm', action: 'register', method: 'post') {
label(for: 'email', 'Email')
input(name: 'email', type: 'text', value: user.email ?: '')
label(for: 'password', 'Password')
input(name: 'password', type: 'password', value: user.password ?: '')
div(class: 'form-actions') {
input(type: 'submit', value: 'Submit')
}
}
}
}
6.4 Spring Boot中的Groovy模板引擎
Spring Boot包含Groovy模板引擎的自动配置,它是通过包含spring-boot-starter-groovy-templates依赖项启用的:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-groovy-templates</artifactId>
<version>2.6.1</version>
</dependency>
模板的默认位置是/resources/templates。
7. Jade4j
Jade4j是用于Javascript的Pug模板引擎(最初称为Jade)的Java实现,Jade4j模板可用于生成HTML文件。
7.1 Maven依赖
对于Spring集成,我们需要添加spring-jade4j依赖项:
<dependency>
<groupId>de.neuland-bfi</groupId>
<artifactId>spring-jade4j</artifactId>
<version>1.2.5</version>
</dependency>
7.2 Spring配置
要将Jade4j与Spring一起使用,我们必须定义一个配置模板位置的SpringTemplateLoader bean,以及一个JadeConfiguration bean:
public class JadeTemplateConfiguration {
@Bean
public JadeConfiguration jadeConfiguration() {
JadeConfiguration configuration = new JadeConfiguration();
configuration.setCaching(false);
configuration.setTemplateLoader(templateLoader());
return configuration;
}
@Bean
public SpringTemplateLoader templateLoader() {
SpringTemplateLoader templateLoader = new SpringTemplateLoader();
templateLoader.setBasePath("/WEB-INF/views/");
templateLoader.setSuffix(".jade");
return templateLoader;
}
}
接下来,我们需要定义类型为JadeViewResolver的ViewResolver bean:
public class JadeTemplateConfiguration {
@Bean
public ViewResolver viewResolver() {
JadeViewResolver viewResolver = new JadeViewResolver();
viewResolver.setConfiguration(jadeConfiguration());
return viewResolver;
}
}
7.3 Jade4j模板
Jade4j模板的特点是易于使用的区分空格的语法:
doctype html
html
head
title User Registration
body
form(action="register" method="post" )
label(for="email") Email:
input(type="text" name="email")
label(for="password") Password:
input(type="password" name="password")
input(type="submit" value="Submit")
该项目还提供了一个非常有用的交互式文档,你可以在编写模板时查看模板的输出。
Spring Boot不提供Jade4j启动器,因此在Spring Boot项目中,我们必须添加与上面定义的相同Spring配置。
8. 其他模板引擎
除了到目前为止描述的模板引擎之外,还有很多模板引擎可以使用。
Velocity是一个比较老的模板引擎, 它非常复杂,缺点是Spring自4.3版以来已弃用它,并在Spring 5.0.1中完全删除。
JMustache是一个模板引擎, 可以通过使用spring-boot-starter-mustache依赖项轻松集成到Spring Boot应用程序中。
Pebble在其库中包含对Spring和Spring Boot的支持。
也可以使用在JSR-223脚本引擎(例如Nashorn)之上运行的其他模板库, 如Handlebars或React。
9. 总结
在本文中,我们介绍了一些最常见的Spring Web应用程序模板引擎。
与往常一样,本教程的完整源代码可在GitHub上获得。