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中的枚举(一)
在实际编程中,往往存在着这样的“数据集”,它们的数值在程序中是稳定的,而且“数据集”中的元素是有限的.例如星期一到星期日七个数据元素组成了一周的“数据集”,春夏秋冬四个数据元素组成了四季的“数据集”. ...
随机推荐
- 使用Grafana 展示Docker容器的监控图表并设置邮件报警规则
一.Docker 容器监控报警方式 接着上篇文章的记录,看到grafana的版本已经更新到4.2了,并且在4.0以后的版本中,加入了Alert Notifications 功能,这样在对容器 监控完, ...
- HDU5058
So easy Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- Spring之循环依赖
转:http://my.oschina.net/tryUcatchUfinallyU/blog/287936 概述 如何检测循环依赖 循环依赖如何解决 Spring如何解决循环依赖 主要的几个缓存 主 ...
- 从零开始学C#——基本语法(二)
基本语法 C#,又名Csharp,天朝喜欢叫C井. C#是一种面向对象的编程语言.在面向对象的程序设计方法中,程序有各种相互交互的对象组成.相同种类的对象通常具有相同的类型,或者说,是在先沟通那个的c ...
- 说说 bash 的 if 语句
说说 bash 的 if 语句 在开始先给大家列出几个术语,不做解释,不懂的可以参考其它资料. 术语和符号: 退出状态码 $? [...] (中括号,方括号) [[...]] (双中括号,双方括号) ...
- EF+SQLSERVER控制并发下抢红包减余额(改进)
最近几年想必大家一听到哪里有抢红包可以抢,马上会拿起手机点去~~~~然后问题来了... 如何控制在同一时间保证数据库中扣减红包余额不会出错.之前我们的做法是直接锁程序,这样子带来的坏处就是等待时间太长 ...
- 特殊的string类型
1.前言 string是属于引用类型的,这个大家都知道吧?但是平常在使用的过程中,发现它还是拥有一些值类型的特征的,这到底是为什么呢? 原因就是.Net考虑到假如大量的操作string对象的时候,大量 ...
- WebServerice的发布
在webserverice一文中,我们简单的介绍了一下什么是webserverice,以及如何建立一个webserverice服务.今天,我们一起学习下webserverice是如何发布的. 为什么要 ...
- 游戏UI框架设计(二) : 最简版本设计
游戏UI框架设计(二) --最简版本设计 为降低难度决定先讲解一个最简版本,阐述UI框架的核心设计理念.这里先定义三个核心功能: 1:UI窗体的自动加载功能. 2:缓存UI窗体. 3:窗体生命周期(状 ...
- IE浏览器和CSS盒模型
网页设计中常听的属性名:内容(content).填充(padding).边框(border).边界(margin), CSS盒子模式都具备这些属性. 盒子模型是CSS中一个重要的概念,理解了盒子模型才 ...