velocity中使用枚举
版权声明:本文为博主原创文章,转载请注明出处,欢迎使劲喷
一、为什么要在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中使用枚举的更多相关文章
- Java中的枚举的治理
版权声明:本文为博主原创文章,转载请注明出处,欢迎使劲喷 一.为啥用枚举&为啥要对枚举进行治理 1.先来说说为啥用枚举 表中某个字段标识了这条记录的状态,我们往往使用一些code值来标识,例如 ...
- 记录一次bug解决过程:velocity中获取url中的参数
一.总结 在Webx的Velocity中获取url中参数:$rundata.getRequest().getParameter('userId') 在Webx项目中,防止CSRF攻击(Cross-si ...
- Python 中的枚举类型~转
Python 中的枚举类型 摘要: 枚举类型可以看作是一种标签或是一系列常量的集合,通常用于表示某些特定的有限集合,例如星期.月份.状态等. 枚举类型可以看作是一种标签或是一系列常量的集合,通常用于表 ...
- JavaScript中的枚举
在JavaScript目前的版本中,没有枚举这个概念(当然,ECMA-262第三版中已经将enum作为关键字保留). 然而,如同JavaScript中没有class一样,但我们仍然可以通过间接的方式- ...
- java枚举与.net中的枚举区别
通过一段时间的项目实践,发现java中的枚举与.net中的枚举有很大的差别,初期造成了我对java中的枚举一些错误理解及部分有缺陷的应用,其实追其原因还是因为我会习惯性的认为java的枚举在作用以及定 ...
- 【译】Java中的枚举
前言 译文链接:http://www.programcreek.com/2014/01/java-enum-examples/ Java中的枚举跟其它普通类很像,在其内部包含了一堆预先定义好的对象集合 ...
- JAVA中的枚举小结
枚举 将一组有限集合创建为一种新的类型,集合里面的值可以作为程序组件使用: 枚举基本特性 以下代码是枚举的简单使用: 使用values方法返回enum实例的数组 使用ordinal方法返回每个enum ...
- .NET中的枚举(Enum)
摘要:.NET中的枚举分为简单枚举和标志枚举,这次主要总结一下标志枚举适用条件,以及它的使用方法,并在文章的最后列举枚举使用的一些规范. 在刚接触.NET的枚举时,只用简单的枚举,对于标记枚举,只知道 ...
- 说说Java中的枚举(一)
在实际编程中,往往存在着这样的“数据集”,它们的数值在程序中是稳定的,而且“数据集”中的元素是有限的.例如星期一到星期日七个数据元素组成了一周的“数据集”,春夏秋冬四个数据元素组成了四季的“数据集”. ...
随机推荐
- There is no getter for property named 'userId' in 'class java.lang.String'
[ERROR] 2017-01-18 04:37:06:231 cn.dataenergy.common.CenterHandlerExceptionResolver (CenterHandlerEx ...
- rf对时间控件的操作
1.如何去掉readonly属性 前端对于时间控件的设置,有时是为了限制用户不能进行手动输入方式进行选择时间,避免在手动输入的时候超限或者输入格式不正确,导致一些不必要的验证麻烦,这是前端开发工程师就 ...
- 基于MAC OS 操作系统安装、配置mysql
$ sudo mv mysql-5.1.45-osx10.6-x86_64 /usr/local/mysql$ cd /usr/local$ sudo chown -R mysql:mysql mys ...
- CentOS7 ssh无密码登录
准备工作:给各个主机取个名字,如master(主节点),slave01(从节点01),slave02(从节点02) 1.修改主机名: hostname master hostname slave01 ...
- CSS中:visited的隐私保护
CSS 伪类 (Pseudo-classes) 锚伪类:在支持 CSS 的浏览器中,链接的不同状态都可以不同的方式显示,这些状态包括:活动状态,已被访问状态,未被访问状态,和鼠标悬停状态. a:lin ...
- C# 基于DotRas的VPN管理
由于工作环境有部分网址被公司屏蔽,特意做了个VPN管理工具,在想访问公司被屏蔽的网址时就开启连接,不用时就关掉.对于做安卓开发的或者.net core类库更新还是很方便的,现在把运行效果展示一下: 点 ...
- JAVA构造函数的继承
1.子类中无参构造函数,可直接继承父类中无参构造函数,前提是所有变量均为public 如下:父类Student中有空构造函数Student(),子类Pupil中有空构造函数Pupil(),后者会继承前 ...
- shell变量数学运算
shell变量数学运算 #!/bin/sh # 本脚本说明shell脚本中变量运算的用法 # 错误的用法var=1var=$var+1echo $var 输出:1+1 # 第一种用法,letvar=1 ...
- dotnet new 命令使用模板
dotnet new 命令使用模板快速生成单页应用. 最新版.NET Core SDK RC4 最大改动是更新了 dotnet new 命令. dotnet new 默认不再创建控制台应用,而是展示帮 ...
- Azure 基础:使用 powershell 创建虚拟网络
什么是虚拟网络 虚拟网络是您的网络在 Azure 云上的表示形式.您可以完全控制虚拟网络的 IP 地址.DNS 的设置.安全策略和路由表.您还可以更进一步,把虚拟网络划分为多个子网.然后用它们连接您的 ...