×
文章路径: Java

Freemarker使用java枚举值、静态属性和调用静态方法

发表于7年前(May 17, 2016 3:14:52 PM)  阅读 13318  评论 0

分类: Java

标签: BeansWrapper TemplateHashModel StaticModels StaticModel 枚举值 enum 静态属性 静态方法

1、前言:

在java后台,规范的编码方式将会使我们使用很多静态属性,枚举值等,还有许多工具类,都会定义很多静态方法方便调用,这些都方便了我们java后台的开发,但如果结合到前台freemarker模板该如何使用呢,freemarker模板并不能像jsp那样import标签导入java类。

首先我们来看这么一个枚举值类OptionValueType:

 

package com.cangzhitao.common.enums;

/**
 * Created by cangzhitao on 16/5/13.
 */
public enum OptionValueType {

    TEXT(0), TEXTAREA(1), RADIO(2), SELECT(3), CHECKBOX(4), THEME(10), NAVMENU(11);

    private int code;

    private OptionValueType(int code) {
        this.code = code;
    }

    public String toString() {
        return String.valueOf(code);
    }

    public int value() {
        return code;
    }

    public static OptionValueType getEnum(int code) {
        for(OptionValueType s:OptionValueType.class.getEnumConstants()) {
            if(s.code==code) {
                return s;
            }
        }
        return null;
    }

}

 

大概是这么个意思,有个实体类里面有个属性valueType,他的取值范围使用这个枚举值类来定义和限制,这样编码的时候使用OptionValueType.TEXT,比起使用0,1这些数字优雅很多,我们也不需要费心的去记,或者来回查看0表示什么类型,1又表示什么类型。

后台使用枚举类这一般都能想到,但是到freemarker前台,笔者就发现很多人由于种种原因,又回到了直接使用数字的情况,有些人是不知道怎么在freemarker模板里面取这些静态的属性和方法,有些人则是懒得去做。

2、可选方法:

a、直接在freemarker里面像java后台那样使用静态属性和方法。这种形式是最好的,但是笔者发现用的人很少。

b、将需要用到的静态属性一股脑的扔到ModelAndView里面,这种方法最简单,属性不多的情况下也确实很实用,不过无法处理静态方法调用的情况。

c、定义TemplateMethodModel实现自定义freemarker方法。这种方法也是比较常见,一般是当freemarker处理起来比较麻烦时,转为java处理的一种方式。当然你的java后台方法可以只是一个简单地静态方法调用,或者静态常量、枚举值的获取。不过TemplateMethodModel实现起来稍微麻烦点,还需要修改配置文件,再者如果造成滥用,一堆TemplateMethodModel,想必不是一个好情况。

3、freemarker直接实用静态属性和方法:

首先我们来看下最终的代码:

 

public ModelAndView baseConfig(ModelAndView mv, BaseConfig config) {
        List<Map<String, Object>> annotationMapList = config.getAnnotationMapList();
        if(annotationMapList!=null) {
            mv.addObject("annotationMapList", annotationMapList);
            mv.addObject("className", config.getClass().getName());
            try {
                BeansWrapper wrapper = BeansWrapper.getDefaultInstance();
                TemplateHashModel staticModels = wrapper.getStaticModels();
                TemplateHashModel optionValueTypeStatics =
                        (TemplateHashModel) staticModels.get(OptionValueType.class.getName());
                mv.addObject("OptionValueType", optionValueTypeStatics);

                TemplateHashModel jsonUtilStatics =
                        (TemplateHashModel) staticModels.get(JsonUtil.class.getName());
                mv.addObject("JsonUtil", jsonUtilStatics);
            } catch (TemplateModelException e) {
                e.printStackTrace();
            }
        }
        return mv;
    }

 

这段代码是Controller里面的一部分,StaticModels的get方法将先从缓存中查找是否已经warpper了该TemplateModel,如果没有,将创建这么一个StaticModel,最后将相关属性方法都放到一个map集合里面。这里笔者将OptionValueType枚举类,以及JsonUtil这个工具类添加到了ModelAndView里面,这样我们在freemarker模版里面可以直接这样使用:

 

BeansWrapper wrapper = BeansWrapper.getDefaultInstance();
                TemplateHashModel staticModels = wrapper.getStaticModels();
                TemplateHashModel optionValueTypeStatics =
                        (TemplateHashModel) staticModels.get(OptionValueType.class.getName());
                mv.addObject("OptionValueType", optionValueTypeStatics);

                TemplateHashModel jsonUtilStatics =
                        (TemplateHashModel) staticModels.get(JsonUtil.class.getName());
                mv.addObject("JsonUtil", jsonUtilStatics);

 

 

<#elseif annotationMap.valueType==OptionValueType.RADIO.value()>
    <#list JsonUtil.getList(annotationMap.optionValues,"java.util.Map") as map>
        <label class="checkbox-inline">
            <input type="radio" class="radio icheck" name="${annotationMap.name}" id="${annotationMap.name}_map_index"
                value="${map.value}" <#if map.value=annotationMap.value>checked</#if>> ${map.text}
        </label>
    </#list>
<#elseif annotationMap.valueType==OptionValueType.SELECT.value()>

 

看,这种方法是不是最好的呢?

ps20170309:最新内容见"freemarker使用BeansWrapper获取静态类型和枚举类型" 

发表评论