Spring + Hibernate 專案,原用 ThinkPHP 模板繼承(extend、block),現用 FreeMarker (.ftl) 僅支援宏,難以實現佈局復用與覆寫。
FreeMarker 2.3.23+ 內建 <#extend>、<#block> 指令,完整支援模板繼承:
layout.ftl<!DOCTYPE html>
<html>
<head><title><@block name="title">預設標題</@block></title></head>
<body>
<header>共用導航</header>
<main><@block name="content"></@block></main>
<footer>共用底部</footer>
</body>
</html>
list.ftl<#extend "layout.ftl">
<@block name="title">商品列表</@block>
<@block name="content">
<table>...</table>
</@block>
<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPath" value="/WEB-INF/views/" />
</bean>
<bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="cache" value="false" />
<property name="prefix" value="" />
<property name="suffix" value=".ftl" />
</bean>
#parse、#extend(需 VelocityTools),輕量但功能較弱。th:fragment、th:replace、th:insert,Spring Boot 官方推薦,語法更自然,支援原型瀏覽。templateLoaderPath 下,或使用相對路徑。<#block> 名稱唯一,子模板可選擇性覆寫。.ftl 宏,可漸進式遷移:新頁面用繼承,舊頁面維持宏調用。採用 FreeMarker 原生繼承或升級 Thymeleaf,即可獲得類 ThinkPHP 的模板繼承體驗。