Skip to content

FreeMarker

Apache FreeMarker 是一种通用的模板引擎,用于生成各种文本输出(从 HTML 到电子邮件、源代码等)。Spring MVC 内置了对 FreeMarker 的支持。

视图配置

要配置 FreeMarker 视图,你需要声明 FreeMarkerConfigurerFreeMarkerViewResolver

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>

Based on Spring Framework.