版权声明:本文为博主原创文章,转载请注明出处,欢迎使劲喷

一、为什么要在velocity中使用枚举

1.目前接触到的系统,枚举通常用来在程序中定义数据字典。

举个支付的例子,比如一个字段用来标识一条记录的状态,如下:

010000  微信支付

010001  支付宝支付

010002  银联支付

我们在程序中需要用这些定义的字典去做相应的处理,比如微信支付时,我们调用微信支付的逻辑,等等。

2.当涉及与前端的交互时,我们可能需要从前端把三种支付方式对应的code值传到后台。此时,如果在页面上直接写010000这样的值,那么页面的逻辑就很不直观了,今天写的时候你还能认知,为了防止自己忘了,除了加注释别无办法。

为了解决后台可用,且前端页面直观,所以我们希望尝试在页面上直接用枚举来解决问题。

3.当然,这种方式同时可以使我们摆脱巨长的constants类,需要哪个枚举就直接获取哪个枚举,直观方便。

二、实现

1.先看页面如何处理(velocity页面中)

#set($payment=$enumTool.getInstance("Payment"))//直接写明要获取的枚举类型名称
#if($payment.get("Payment_WX") == $param.code)//通过枚举值获取其code值
    //做微信支付页面逻辑
#end

后台中使用到枚举的地方如下

if(param.equals(Payment.Payment_WX.getCode())){//直接使用枚举值做逻辑判断
         //微信逻辑处理
}

2.实现

2.1枚举的定义

/**
 * Created by Bright on 2017/3/13.
 *
 * @author :
 */
public enum Payment {
    Payment_WX("010000","微信支付"),
    Payment_ZFB("010001","支付宝支付"),
    Payment_YL("010002","银联支付");

    public static Map<String,String> map = new HashMap<String, String>();

    static{
        Payment[] values = Payment.values();
        if(values.length > 0){
            for(Payment product : values){
                map.put(product.getCode(),product.getName());
            }
        }
    }

    Payment(String code, String name){
        this.code = code;
        this.name = name;
    }

    private String code;

    private String name;

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

2.2VelocityEnumTools的实现

/**
 * Created by Bright on 2017/3/13.
 *
 * @author :
 */
public class VelocityEnumTools {

    public static final Logger logger = LoggerFactory.getLogger(VelocityEnumTools.class);

    public static Map<String, Map<String, String>> map = new HashMap<String, Map<String, String>>();

    /**
     * 需要在页面控制的enum,如Payment类似添加即可
     */
    static {
        map.put(Payment.class.getSimpleName(), getEnumMap(Payment.class));
    }

    public static Map<String, String> getInstance(String enumKey) {
        return map.get(enumKey);
    }

    public static <T> Map<String, String> getEnumMap(Class<T> clazz) {

        Map<String, String> map = new HashMap<String, String>();
        try {
            if (clazz.isEnum()) {
                Object[] enumConstants = clazz.getEnumConstants();
                for (int i = 0; i < enumConstants.length; i++) {
                    T t = (T) enumConstants[i];
                    Field code = t.getClass().getDeclaredField("code");
                    code.setAccessible(true);
                    map.put(t.getClass().getDeclaredFields()[i].getName(), (String) code.get(t));
                }
            }
        } catch (NoSuchFieldException e) {
            logger.error("枚举工具启动报错:{}", e);
        } catch (IllegalAccessException e) {
            logger.error("枚举工具启动报错:{}", e);
        }
        return map;
    }

}

2.3velocity-tools配置

<?xml version="1.0" encoding="UTF-8"?>
<toolbox>
    <tool>
        <key>enumTool</key>
        <class>com.bright.core.enumconstant.VelocityEnumTools</class>
    </tool>
    <tool>
        <key>stringTool</key>
        <class>org.apache.commons.lang.StringUtils</class>
    </tool>
    <tool>
        <key>dateTool</key>
        <class>org.apache.velocity.tools.generic.DateTool</class>
    </tool>
</toolbox>

velocity中使用枚举的更多相关文章

  1. Java中的枚举的治理

    版权声明:本文为博主原创文章,转载请注明出处,欢迎使劲喷 一.为啥用枚举&为啥要对枚举进行治理 1.先来说说为啥用枚举 表中某个字段标识了这条记录的状态,我们往往使用一些code值来标识,例如 ...

  2. 记录一次bug解决过程:velocity中获取url中的参数

    一.总结 在Webx的Velocity中获取url中参数:$rundata.getRequest().getParameter('userId') 在Webx项目中,防止CSRF攻击(Cross-si ...

  3. Python 中的枚举类型~转

    Python 中的枚举类型 摘要: 枚举类型可以看作是一种标签或是一系列常量的集合,通常用于表示某些特定的有限集合,例如星期.月份.状态等. 枚举类型可以看作是一种标签或是一系列常量的集合,通常用于表 ...

  4. JavaScript中的枚举

    在JavaScript目前的版本中,没有枚举这个概念(当然,ECMA-262第三版中已经将enum作为关键字保留). 然而,如同JavaScript中没有class一样,但我们仍然可以通过间接的方式- ...

  5. java枚举与.net中的枚举区别

    通过一段时间的项目实践,发现java中的枚举与.net中的枚举有很大的差别,初期造成了我对java中的枚举一些错误理解及部分有缺陷的应用,其实追其原因还是因为我会习惯性的认为java的枚举在作用以及定 ...

  6. 【译】Java中的枚举

    前言 译文链接:http://www.programcreek.com/2014/01/java-enum-examples/ Java中的枚举跟其它普通类很像,在其内部包含了一堆预先定义好的对象集合 ...

  7. JAVA中的枚举小结

    枚举 将一组有限集合创建为一种新的类型,集合里面的值可以作为程序组件使用: 枚举基本特性 以下代码是枚举的简单使用: 使用values方法返回enum实例的数组 使用ordinal方法返回每个enum ...

  8. .NET中的枚举(Enum)

    摘要:.NET中的枚举分为简单枚举和标志枚举,这次主要总结一下标志枚举适用条件,以及它的使用方法,并在文章的最后列举枚举使用的一些规范. 在刚接触.NET的枚举时,只用简单的枚举,对于标记枚举,只知道 ...

  9. 说说Java中的枚举(一)

    在实际编程中,往往存在着这样的“数据集”,它们的数值在程序中是稳定的,而且“数据集”中的元素是有限的.例如星期一到星期日七个数据元素组成了一周的“数据集”,春夏秋冬四个数据元素组成了四季的“数据集”. ...

随机推荐

  1. jquery 全选 全不选 事件绑定

    <td width="82%" colspan="3"><input type="checkbox" id="a ...

  2. C语言,使用宏来传数字参数

    a.h #define xglue(x, y) x ## y #define glue(x, y) xglue(x, y) static int glue(load_elf, SZ)(void) { ...

  3. asp.net权限认证:Forms认证

    asp.net权限认证系列 asp.net权限认证:Forms认证 asp.net权限认证:HTTP基本认证(http basic) asp.net权限认证:Windows认证 asp.net权限认证 ...

  4. Sublime Text3自定义主题

    设置背景色和关键字颜色(Color Scheme 生成器): Color Scheme 生成器地址:http://tmtheme-editor.herokuapp.com/ 首先:点击General- ...

  5. 使用Hugo搭建GitHub个人博客

    主题概况 Hugo 是一个用 Go 语言编写的静态网站生成器.类似的静态网站生成器还有Jekyll.hexo等等.以上生成器都使用过,但感觉要么环境麻烦,要么生成静态页面步骤繁琐以及生成缓慢.如果你正 ...

  6. 【.Net Framework 体积大?】不安装.net framework 也能运行!?原理简介-2

    接上一篇 [.Net Framework 体积大?]不安装.net framework 也能运行!?开篇叙述-1 昨天写了一个引子,还是有读者对这套“小把戏”感兴趣.那么不辜负大家的希望,争取博主不做 ...

  7. Js 跨域CORS报错 Response for preflight has invalid HTTP status code 405

    问题 公司项目H5调用接口遇到Response for preflight has invalid HTTP status code 405这样的错误,是使用PUT方式提交请求接口.Content-T ...

  8. Java程序测试之线程的同步

    package tickect; class ticketnum implements Runnable { public int tickets = 100; String str = new St ...

  9. Maven常用插件简单配置

    好久不见,甚是想念.一日不见,如隔三秋. 从春节到现在已经很久没有回归博客园了,今天回来温习一下maven常用的一些插件的配置,学东西一个很简单的诀窍就是重复重复再重复,这样一定能把知识掌握的很牢靠. ...

  10. MINIDVD

    import java.util.*; public class MiniDVD { public static void main(String[] args){ //扫描器 Scanner inp ...