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

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

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

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

010000  微信支付

010001  支付宝支付

010002  银联支付

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

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

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

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

二、实现

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

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

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

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

2.实现

2.1枚举的定义

  1. /**
  2. * Created by Bright on 2017/3/13.
  3. *
  4. * @author :
  5. */
  6. public enum Payment {
  7. Payment_WX("010000","微信支付"),
  8. Payment_ZFB("010001","支付宝支付"),
  9. Payment_YL("010002","银联支付");
  10.  
  11. public static Map<String,String> map = new HashMap<String, String>();
  12.  
  13. static{
  14. Payment[] values = Payment.values();
  15. if(values.length > 0){
  16. for(Payment product : values){
  17. map.put(product.getCode(),product.getName());
  18. }
  19. }
  20. }
  21.  
  22. Payment(String code, String name){
  23. this.code = code;
  24. this.name = name;
  25. }
  26.  
  27. private String code;
  28.  
  29. private String name;
  30.  
  31. public String getCode() {
  32. return code;
  33. }
  34.  
  35. public void setCode(String code) {
  36. this.code = code;
  37. }
  38.  
  39. public String getName() {
  40. return name;
  41. }
  42.  
  43. public void setName(String name) {
  44. this.name = name;
  45. }
  46. }

2.2VelocityEnumTools的实现

  1. /**
  2. * Created by Bright on 2017/3/13.
  3. *
  4. * @author :
  5. */
  6. public class VelocityEnumTools {
  7.  
  8. public static final Logger logger = LoggerFactory.getLogger(VelocityEnumTools.class);
  9.  
  10. public static Map<String, Map<String, String>> map = new HashMap<String, Map<String, String>>();
  11.  
  12. /**
  13. * 需要在页面控制的enum,如Payment类似添加即可
  14. */
  15. static {
  16. map.put(Payment.class.getSimpleName(), getEnumMap(Payment.class));
  17. }
  18.  
  19. public static Map<String, String> getInstance(String enumKey) {
  20. return map.get(enumKey);
  21. }
  22.  
  23. public static <T> Map<String, String> getEnumMap(Class<T> clazz) {
  24.  
  25. Map<String, String> map = new HashMap<String, String>();
  26. try {
  27. if (clazz.isEnum()) {
  28. Object[] enumConstants = clazz.getEnumConstants();
  29. for (int i = 0; i < enumConstants.length; i++) {
  30. T t = (T) enumConstants[i];
  31. Field code = t.getClass().getDeclaredField("code");
  32. code.setAccessible(true);
  33. map.put(t.getClass().getDeclaredFields()[i].getName(), (String) code.get(t));
  34. }
  35. }
  36. } catch (NoSuchFieldException e) {
  37. logger.error("枚举工具启动报错:{}", e);
  38. } catch (IllegalAccessException e) {
  39. logger.error("枚举工具启动报错:{}", e);
  40. }
  41. return map;
  42. }
  43.  
  44. }

2.3velocity-tools配置

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <toolbox>
  3. <tool>
  4. <key>enumTool</key>
  5. <class>com.bright.core.enumconstant.VelocityEnumTools</class>
  6. </tool>
  7. <tool>
  8. <key>stringTool</key>
  9. <class>org.apache.commons.lang.StringUtils</class>
  10. </tool>
  11. <tool>
  12. <key>dateTool</key>
  13. <class>org.apache.velocity.tools.generic.DateTool</class>
  14. </tool>
  15. </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. 使用Grafana 展示Docker容器的监控图表并设置邮件报警规则

    一.Docker 容器监控报警方式 接着上篇文章的记录,看到grafana的版本已经更新到4.2了,并且在4.0以后的版本中,加入了Alert Notifications 功能,这样在对容器 监控完, ...

  2. HDU5058

    So easy Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  3. Spring之循环依赖

    转:http://my.oschina.net/tryUcatchUfinallyU/blog/287936 概述 如何检测循环依赖 循环依赖如何解决 Spring如何解决循环依赖 主要的几个缓存 主 ...

  4. 从零开始学C#——基本语法(二)

    基本语法 C#,又名Csharp,天朝喜欢叫C井. C#是一种面向对象的编程语言.在面向对象的程序设计方法中,程序有各种相互交互的对象组成.相同种类的对象通常具有相同的类型,或者说,是在先沟通那个的c ...

  5. 说说 bash 的 if 语句

    说说 bash 的 if 语句 在开始先给大家列出几个术语,不做解释,不懂的可以参考其它资料. 术语和符号: 退出状态码 $? [...] (中括号,方括号) [[...]] (双中括号,双方括号) ...

  6. EF+SQLSERVER控制并发下抢红包减余额(改进)

    最近几年想必大家一听到哪里有抢红包可以抢,马上会拿起手机点去~~~~然后问题来了... 如何控制在同一时间保证数据库中扣减红包余额不会出错.之前我们的做法是直接锁程序,这样子带来的坏处就是等待时间太长 ...

  7. 特殊的string类型

    1.前言 string是属于引用类型的,这个大家都知道吧?但是平常在使用的过程中,发现它还是拥有一些值类型的特征的,这到底是为什么呢? 原因就是.Net考虑到假如大量的操作string对象的时候,大量 ...

  8. WebServerice的发布

    在webserverice一文中,我们简单的介绍了一下什么是webserverice,以及如何建立一个webserverice服务.今天,我们一起学习下webserverice是如何发布的. 为什么要 ...

  9. 游戏UI框架设计(二) : 最简版本设计

    游戏UI框架设计(二) --最简版本设计 为降低难度决定先讲解一个最简版本,阐述UI框架的核心设计理念.这里先定义三个核心功能: 1:UI窗体的自动加载功能. 2:缓存UI窗体. 3:窗体生命周期(状 ...

  10. IE浏览器和CSS盒模型

    网页设计中常听的属性名:内容(content).填充(padding).边框(border).边界(margin), CSS盒子模式都具备这些属性. 盒子模型是CSS中一个重要的概念,理解了盒子模型才 ...