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")