使用freemarker通常要把一些常用的html代碼段封裝成一個整體使用,這裏就用到了freemarker的宏(macro)。
首先編寫存放macro代碼的模板文件,命名爲function.ftl:
<#--
# 展示數據字典組成的下拉列表
# @param data 數據集合
# @param optionVal 選項value屬性字段名,默認爲id
# @param optionTxt 選項文本屬性字段名,默認爲name
# @param name 下拉列表name值
# @param value 下拉列表value值
# @param nullable 決定下拉列表是否提供空選項,默認true
# @param nullVal 下拉列表空選項的取值,默認爲空字符串
# @param nullTxt 下拉列表空選項的文本,默認爲空字符串
# @param classList 下拉列表class值
# @param style 下拉列表節點樣式
# @param disabled 設置下拉列表爲禁用
#-->
<#macro select data=[] optionVal="id" optionTxt="name" name="" id="" value="" nullable=true nullVal="" nullTxt="" classList="" style="" disabled=false>
<select
<#if name??>name="${name}"
<#if id??>id="${id}"
<#if classList??>class="${classList}"
<#if style??>style="${style}"
<#if disabled>disabled >
<#if nullable><option value="${nullVal}">${nullTxt}</option>
<#list data as d>
<#assign option_val = ("d." + optionVal)?eval
option_txt = ("d." + optionTxt)?eval>
<option value="${option_val}" <#if option_val == value >selected>${option_txt}
</select>
</#macro>
完成後需要將這個文件配置到freemarker.properties中:
auto_import=/WEB-INF/freemarker/function.ftl as fn
這樣function.ftl就會被自動加載,其中fn相當於命名空間。這裏要注意的是,上面的路徑其實受到freemarker設置的模板加載路徑參數所影響,注意路徑寫正確,否則會報文件不存在異常。
然後就是使用這個宏,可以在ftl文件中這樣使用已完成的宏:
<@fn.select data=data value="1" nullTxt="請選擇" optionVal="id" optionTxt="username" />
如果只是在少數地方使用這個宏,也可以不配置auto_import,在使用的地方通過import指令來引入,如下:
<#import "/WEB-INF/freemarker/function.ftl" as fn>
注意文件路徑需要使用引號括起來。