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中的枚举(一)
在实际编程中,往往存在着这样的“数据集”,它们的数值在程序中是稳定的,而且“数据集”中的元素是有限的.例如星期一到星期日七个数据元素组成了一周的“数据集”,春夏秋冬四个数据元素组成了四季的“数据集”. ...
随机推荐
- Bootstrap入门(三十)JS插件7:警告框
Bootstrap入门(三十)JS插件7:警告框 通过这个插件可以为警告信息添加点击以及消失的功能. 当使用一个.close按钮,它必须是第一个子元素.alert-dismissible,并没有文字内 ...
- 支持Angular 2的表格控件
前端框架一直这最近几年特别火的一个话题,尤其是Angular 2拥有众多的粉丝.在2016年9月份Angular 2正式发布之后,大量的粉丝的开始投入到了Angular 2的怀抱.当然这其中也包括我. ...
- Jquery右击显示菜单事件,运用smartMenu插件。
基本格式: 1.引用jquery.smartMenu插件.css样式: <script src="gongju/jquery-1.11.2.min.js" type=&quo ...
- C语言,使用宏来传数字参数
a.h #define xglue(x, y) x ## y #define glue(x, y) xglue(x, y) static int glue(load_elf, SZ)(void) { ...
- win10环境下python3.5安装步骤
点我去Python官网下载 往下翻几页就能看到各种版本的Python,当前最新的是Python3.6,也没多大区别,我选择的是3.5.2 64位的,点击download 根据自己的电脑配置,我选择的是 ...
- WPF开发进阶 - Fody/PropertyChanged(二)
前一篇 简单的介绍了Fody/PropertyChanged的使用方法, 这一篇,我们详细介绍它的一些比较重要的特性和规则 1. Attributes 通过在类或属性上标记这些特性,可以在编译代码时, ...
- Sass与Compass——回顾
compass 是sass的一个工具库 compass在sass 的基础上封装了一系列有用的模块,用来补充和丰富sass的工能, 安装: compass是用 ruby语言开发的,所以安装它之前必须安装 ...
- c++ 继承类强制转换时的虚函数表工作原理
本文通过简单例子说明子类之间发生强制转换时虚函数如何调用,旨在对c++继承中的虚函数表的作用机制有更深入的理解. #include<iostream> using namespace st ...
- 理解javascript this 的绑定过程
在理解this 的绑定过程之前,首先要理解调用位置:调用位置就是函数在代码中被调用的位置(而不是声明的位置).只有仔细分析调用位置才能回答这个问题:这个this 到底引用的是什么?通常来说,寻找调用位 ...
- phpcms的安装以及简单使用
先来说一下phpcms的安装 首先从网上下个phpcms的压缩包,解压 解压后就是个这样的文件夹 这里要注意,下载的时候要放在平时存动态网页的那个地址,www目录下,如图 点开phpcms文件夹,里面 ...