使用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>
注意文件路径需要使用引号括起来。