该标签可以最终生成类似<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"/>