freemark 自定义标签 总结

参考:

http://grails.org/doc/latest/ref/Tags/select.html

http://freemarker.sourceforge.net/

 

调用:

<@d_select id="type_4" optionKey="position" optionValue="id" list=adSpaceBoList callBack="test();" value="4f0eabc9073c1f0de52b25d2" ></@d_select> 指定list对象名:list=adSpaceBoList;选项key对应集合中的属性:optionKey="position";选项value对应集合中的属性:optionValue="id";

 

实现类:

implements TemplateDirectiveModel

public void execute (Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body)
            throws TemplateException, IOException {

// id
        String id = MapUtils.getString(params, "id", "selectId");

// multiple

boolean multiple = Boolean.valueOf(MapUtils.getString(params, "multiple"));

// onEventName:默认有callback时为onChange
        String onEventName = MapUtils.getString(params, "onEventName","onChange");

 

Map<String, Object> templateContext = new HashMap<String, Object>();

//list
        Object temp = params.get("list");
        if(temp instanceof SimpleSequence){
            SimpleSequence lists = (SimpleSequence) params.get("list");

            templateContext.put("list",lists.toList());
        }
       
        //strList
        String strList = MapUtils.getString(params, "strList");// strList : 文字:1,图片:2
        if(StringUtils.isNotBlank(strList)){
            if(StringUtils.isNotBlank(strList)){
                templateContext.put("strList", Arrays.asList(strList.split(",")));
            }
        }
       
        //map
        SimpleHash map=(SimpleHash)params.get("map");
        if(null!=map){
            templateContext.put("map",map.toMap());
        }

 

templateContext.put("id", id);

//.....

 

        Template template = env.getConfiguration().getTemplate("/ftl/select.ftl");
        template.process(templateContext, env.getOut());

}

 

页面:

eval:把字符串当做ftl代码处理;处理后对象的值要以string的length来判断,如果直接用??,则对象为空 ;

 

<#list list as obj>
        <#if obj??>
            <#assign keys = ('obj.'+ optionKey) >
            <#assign values = ('obj.'+ optionValue) >
            <#if ((values?eval)?length gt 0 && (keys?eval)?length gt 0) >
                <option value="${values?eval}" <#if ((value??)&& value == values?eval) >selected</#if>>${keys?eval!''}</option>
            </#if>
        </#if>
    </#list>

 

最后,还要在项目里注册自定义的标签;

注册:
sothis.properties
sothis.freemarker.directive.d_select.class=com.fangjia.bkoff.util.SelectDirective

 

底层(部分):

private SothisConfig config;

 

String configLocation = filterConfig.getInitParameter("configLocation");
                if (null == configLocation) {
                    configLocation = "sothis.properties";
                }
                config = SothisConfig.initConfig(configLocation);

你可能感兴趣的:(freemark)