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

一、为什么要在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. 使用SpringMvc调用POI jar导出excel的源码

    @RequestMapping(value = "/result/export") public String export(ResultIn in,HttpServletRequ ...

  2. Struct 和 Union 的详细区别

    Union: 共用体 Struct:结构体 两者的区别: 1:共用体和结构体都是由多个不同的数据类型成员组成, 但在任何同一时刻, 共用体只存放一个被选中的成员, 而结构体则存放所有的成员变量. 2: ...

  3. TSQL编程

    1.索引 唯一键/主键添加索引,设计界面,在任何一列前右键--索引/键--点击进入添加某一列为索引 2.视图 视图就是我们查询出来的虚拟表创建视图:create view 视图名  as  SQL查询 ...

  4. 双击startup.bat启动tomcat时闪退原因及解决方案

    在启动免安装tomcat时,很容易遇到双击startup.bat,启动窗口闪退而tomcat服务未启动的状况. 具体原因:tomcat在启动时,需要读取环境变量和配置信息,如果缺少Java环境,即缺少 ...

  5. 关于post与get请求参数存在特殊字符问题

    遇到项目中存在文本编辑框输入特殊字符 比如:# ? & 空格 , 导致后台接受不到参数问题,对可能存在特殊字符的参数进行encodeURIComponent; C#后台接受参数不需要解码 也可 ...

  6. java作业—3

    动手动脑: 一.编写一个方法,使用以上算法生成指定数目(比如1000个)的随机整数. 方法1(数据类型)(最小值+Math.random()*(最大值-最小值+1)) 例:(int)(1+Math.r ...

  7. js设置、获取、清除cookie

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  8. Kosaraju算法解析: 求解图的强连通分量

    Kosaraju算法解析: 求解图的强连通分量 欢迎探讨,如有错误敬请指正 如需转载,请注明出处 http://www.cnblogs.com/nullzx/ 1. 定义 连通分量:在无向图中,即为连 ...

  9. delegate vs event

    What are the differences between delegate and an event? An event declaration adds a layer of abstrac ...

  10. unity3d 脚本学习系列

    最近使用unity3d,对其中的脚本部分进一系列总结,算是这一段时间的收获吧.