FreeMarker默认值在参数传递时出现的问题


在FreeMarker中定义宏,生成下拉列表框的选项

<#macro select_options choices selected = 'N/A' empty = 'N/A'>
    <#if empty != 'N/A'>
        
    
    <#list choices! as value, name>
        <#if selected == value>
            
        <#else>
            
        
    

 调用该宏的用法如下:

<@select_options dict['contentStatus']!{} RequestParameters['status']! '--所有状态--' />

 注意宏调用中传递的第二个参数RequestParameters['status'],如果该参数的值不存在使用默认值,只是简单使用了一个默认值的符号(!),没有指定具体的值,这是默认值的简略用法,还具体指定默认值,默认为空字符串。之后的第三个参数是一个字符串常量。但在实际使用中发现第三个参数没有正确传递,测试发现由于第二个参数不存在使用了默认值的简略用法,但默认值却不是空字符串,而是第三个参数的字符串,而第三个参数则没有被正确传递使用了宏定义中的参数默认值。

如果正确获得第二个参数的默认值,并且成功传递第三个参数,在宏调用时必须明确指定第二个参数的默认值,具体用法如下:

<@select_options dict['contentStatus']!{} RequestParameters['status']!'' '--所有状态--' />

 这次第二个参数明确指定了默认值(两个单引号表示的空字符串),分析这个问题发现即使默认值与默认值前缀有空格分开也会当作是一个整体。因此在宏传递参数时默认值的使用必须严格且完整。

另外,还有一种方法可以使用默认值和简略形式,就是在宏调用时具体指定参数名称调用,这样也不会发生默认值不正确传递的问题,调用方法如下:

<@select_options choices=dict['contentStatus']!{} selected=RequestParameters['status']! empty='--所有状态--' />

 在使用指定参数名称调用宏的时候,默认值可使用一个符号的简略格式。