该标签可以最终生成类似<select><option></option></select>的html代码。
使用此标签可以简化页面的<select>控件的维护,而且可以兼容多种数据组织方式。可以轻松的控制的<select>的选中。
select.ftl
<#macro select list=[] defaultOptions={} optionName="name" optionValue="id" value="" extra...> <select<#include 'extra.ftl'>> <#list defaultOptions?keys as key> <#if key==value> <option value="${key}" selected="selected">${defaultOptions[key]}</option> <#else> <option value="${key}">${defaultOptions[key]}</option> </#if> </#list> <#if list?is_enumerable> <#list list as item> <#if item?is_hash> <#local option_Value = item[optionValue]!item/> <#--页面的1,2,3 没有经过包装,所以${3["a"]怎么写都会报错}--> <#local option_Name = item[optionName]!item/> <#else> <#local option_Value = item/> <#local option_Name = item/> </#if> <#if (option_Value?string)==value> <option value="${option_Value}" selected="selected">${option_Name}</option> <#else> <option value="${option_Value}">${option_Name}</option> </#if> </#list> <#elseif list?is_hash_ex> <#list list?values as item> <#local option_Name = item/> <#local option_Value = list?keys[item_index]/> <#if (option_Value?string)==value> <option value="${option_Value}" selected="selected">${option_Name}</option> <#else> <option value="${option_Value}">${option_Name}</option> </#if> </#list> </#if> <#nested> </select> </#macro>
extra.ftl
<#if extra?size!=0> <#assign x = extra.extra!extra><#list x?keys as a>${a}="${x[a]?html}"<#if a_has_next> </#if></#list></#if>
参数说明:
list 是要组织成select的基本数据:例如可以是一个map,可以是一个list<User> ,也可以是 [1,2,3]序列,也可以是[2014..2020]freemarker的数据结构等等
defaultOptions:默认要显示的选项,例如{"1","--请选择--"} 会在select上生成一个option 或者多个
optionName:当我们list 是一个类似于list<User> 的数据时,该参数有效,比如option的value 我们可以取得user.optionName
optionValue:同上面的optionName一样。
value:就是当前的选中值,很简便,再也不用脚本判断,或者在页面使用if判断了。
使用方式:
a.<@select name="year" list=2014..(.now?string('yyyy')?number) value="2015" style="border:none;"/>
则会生成
<select name="year" style="border:none;"><option value="2014">2014</option><option value="2015" selected="selected">2015</option></select>
b.
public static Map<Integer, String> map= new LinkedHashMap<Integer, String>();
noticeTypes.put(1, "通知公告");
noticeTypes.put(2, "培训动态");
noticeTypes.put(3, "培训简报");
noticeTypes.put(4, "政策文件");
<@select name="kind" list=map value="2" defaultOptions= {"":"--请选择类型--"}/>
c.
List<User> list= new ArrayList<User>();
list.add(user1);
list.add(user2);
<@select name="kind" list=map value="${user.id}" optionName="userName" optionValue="userID"/>