自定义一个 freemarker的select标签

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

你可能感兴趣的:(自定义一个 freemarker的select标签)