FreeMarker
Apache FreeMarker 是一种通用的模板引擎,用于生成各种文本输出(从 HTML 到电子邮件、源代码等)。Spring MVC 内置了对 FreeMarker 的支持。
视图配置
要配置 FreeMarker 视图,你需要声明 FreeMarkerConfigurer 和 FreeMarkerViewResolver。
java
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.freeMarker();
}
@Bean
public FreeMarkerConfigurer freeMarkerConfigurer() {
FreeMarkerConfigurer configurer = new FreeMarkerConfigurer();
configurer.setTemplateLoaderPath("/WEB-INF/freemarker");
configurer.setDefaultCharset(StandardCharsets.UTF_8);
return configurer;
}
}kotlin
@Configuration
class WebConfig : WebMvcConfigurer {
override fun configureViewResolvers(registry: ViewResolverRegistry) {
registry.freeMarker()
}
@Bean
fun freeMarkerConfigurer() = FreeMarkerConfigurer().apply {
setTemplateLoaderPath("/WEB-INF/freemarker")
defaultCharset = StandardCharsets.UTF_8
}
}如果控制器返回视图名 welcome,解析器会查找 /WEB-INF/freemarker/welcome.ftl 模板。
表单绑定
Spring 为 FreeMarker 提供了一套宏(Macros),用于处理表单绑定和错误显示,类似于 JSP 中的 <spring:bind> 标签。
html
<#import "/spring.ftl" as spring />
<form action="" method="POST">
Name:
<@spring.bind "personForm.name"/>
<input type="text" name="${spring.status.expression}" value="${spring.status.value?html}"/>
<#list spring.status.errorMessages as error> <b>${error}</b> <br /> </#list>
</form>补充教学
1. FreeMarker vs Thymeleaf
- 性能:在高并发场景下,FreeMarker 的解析性能通常优于 Thymeleaf。
- 用途:FreeMarker 不局限于 HTML,非常适合生成邮件模板、代码生成器等非 HTML 文本。
- 预览性:FreeMarker 模板不是有效的 HTML,无法直接双击预览。
2. 宏 (Macros) 的威力
FreeMarker 的宏类似于编程语言中的函数。你可以封装复杂的 UI 组件(如分页条、树形菜单),然后在各个页面中通过一行代码调用。
3. 数据类型注意点
FreeMarker 对 Java 类型比较敏感(如 Boolean, Number)。如果传入一个空值(null),FreeMarker 默认会报错。建议在模板中使用 ! 来提供默认值:
html
<h1>Hello, ${user.name!"Guest"}</h1>