Velocity在页面使用枚举类

1.java工具类
package com.***.util;

import java.lang.reflect.Method;
import java.util.Map;

import org.apache.commons.lang.StringUtils;

import com.google.common.collect.Maps;

/** 
* 提供页面直接调用枚举类的方法
* @author: gegewuqin9
* @since: 2016年12月8日  下午6:31:00
* @history:
*/
public class EnumHelper {

    /**已经扫描到的类缓存起来*/
    private static final Map<String, Class<?>> ENUM_CACHE        = Maps.newConcurrentMap();

    /**扫描此包下的枚举类,暴露给页面。具体暴露的枚举类需要在下面子包中添加名称*/
    private static final String                BASE_PACKAGE_PATH = "com.***.enums";

    /**扫描上面指定的基本包下面具体的子包下面的枚举类*/
    private static final String[]              BIZ_PACKAGE_NAMES = { "common", "company", "configure", "order"                               };

    /** 
     * 功能说明:在页面上直接获取枚举类的所有项
     * 
     * @param enumName
     * @return 
     * Object
     */
    public static Object getList(String enumName) {
        Class<?> clazz = getEnum(enumName);
        if (clazz == null) {
            return null;
        }
        try {
            Method method = clazz.getMethod("values");
            if (method != null) {
                return method.invoke(clazz);
            }
        } catch (Exception e) {
        }
        return null;
    }

    /** 
     * 功能说明:在页面上直接根据code获取枚举的值
     * 
     * @param enumName
     * @param code
     * @return 
     * Object
     */
    public static Object getName(String enumName, Integer code) {
        Class<?> clazz = getEnum(enumName);
        if (clazz == null) {
            return null;
        }
        try {
            Method method = clazz.getMethod("getName", Integer.class);
            if (method != null) {
                return method.invoke(clazz, code);
            }
        } catch (Exception e) {
        }
        return null;
    }
    
    /** 
     * 功能说明:在页面上直接根据code获取枚举的值
     * 
     * @param enumName
     * @param code
     * @return 
     * Object
     */
    public static Object getName(String enumName, String code) {
        Class<?> clazz = getEnum(enumName);
        if (clazz == null) {
            return null;
        }
        try {
            Method method = clazz.getMethod("getName", String.class);
            if (method != null) {
                return method.invoke(clazz, code);
            }
        } catch (Exception e) {
        }
        return null;
    }

    /** 
     * 功能说明:根据枚举类名称获取具体的枚举类Class
     * 
     * @param enumName
     * @return 
     * Class<?>
     */
    private static Class<?> getEnum(String enumName) {
        if (StringUtils.isEmpty(enumName)) {
            return null;
        }
        if (ENUM_CACHE.containsKey(enumName)) {
            return ENUM_CACHE.get(enumName);
        }
        for (String packageName : BIZ_PACKAGE_NAMES) {
            String classPath = BASE_PACKAGE_PATH + "." + packageName + "." + enumName;
            try {
                Class<?> clazz = Class.forName(classPath);
                if (clazz != null) {
                    ENUM_CACHE.put(enumName, clazz);
                    return clazz;
                }
            } catch (Exception e) {
            }
        }
        return null;
    }
}


注:
1.我们项目在enums包下还根据具体业务分了包,如果枚举类直接在emuns目录下,可以不用for循环,只定义BASE_PACKAGE_PATH就行了。
2.getName方法需要自己做枚举类里定义为static方法

2.配置toolbox.xml
<toolbox>
	<tool>
		<key>enumHelper</key> 
		<scope>application</scope> 
	   	<class>com.***.util.EnumHelper</class>
	</tool>
</toolbox>


3.页面使用
循环:#foreach($!type in $!enumHelper.getList("OrderTypeEnum"))
根据code获取值:$!enumHelper.getName("OrderTypeEnum", "1")

猜你喜欢

转载自gegewuqin9.iteye.com/blog/2343829