前台请求遍历java枚举,枚举多个属性,js插件接收

巨大的建筑,总是由一木一石叠起来的,我们何妨做做这一木一石呢?我时常做些零碎事,就是为此。
这是对的,但是我没有说过这句话! —— 鲁迅

在java中,对于一些字典项,可以用枚举表示,比如有多少种类型的车品牌等。
在前端,需要一个下拉框来表示这些车牌,如果在前台设置这些值的话,相当于同一件事干了两次。
这里就打算直接请求后端,返回枚举的列表。

多个属性的枚举

枚举是可以有自己的属性的,这里用 车辆品牌来举例,truckBrand

package com.enn.zhwl.commons.enums;

import java.io.Serializable;

public enum TruckBrand implements Serializable {
  DONGFENG("dongfeng", "东风", "DFYT", FuelType.OILHEAD),
  JIEFANG("jiefang", "解放", "JF", FuelType.GASHEAD),
  OUMAN("ouman", "欧曼", "FTOM", FuelType.OILHEAD),
  SITANNIYA("sitanniya", "斯坦尼亚", "SCANIA", FuelType.OILHEAD),
  DONGFENGTIANLONG("dongfengtianlong", "东风天龙", "DFTL", FuelType.GASHEAD),
  HUALING("hualing", "华菱", "HLYT", FuelType.OILHEAD),
  HUALINGLNG("hualinglng", "华凌LNG", "HLQT", FuelType.GASHEAD),
  //新增 @2019/03/14
  HUALINGHANMA("hualinghanma","华菱悍马", "HLHM", FuelType.GASHEAD),
  SHENGDAYIN("shengdayin", "圣达因", "SHDY", FuelType.OILHEAD),
  UD("ud", "UD", "UD", FuelType.OILHEAD);

  TruckBrand(String value, String desc, String diaoDuName, FuelType fuelType) {
    this.value = value;
    this.desc = desc;
    this.diaoDuName = diaoDuName;
    this.fuelType = fuelType;
  }

  private String value;
  private String desc;
  //对应调度平台的名称.
  private String diaoDuName;
  //该品牌车的燃料类型.
  private FuelType fuelType;

  public String getDiaoDuName() {
    return diaoDuName;
  }

  public FuelType getFuelType() {
    return fuelType;
  }

  public String getValue() {
    return value;
  }

  public String getDesc() {
    return desc;
  }


  @Override
  public String toString() {
    return new StringBuffer("{\"name\":\"").append(name())
        .append("\",\"value\":\"").append(value)
        .append("\", \"desc\":\"").append(desc)
        .append("\", \"diaoDuName\":\"").append(diaoDuName)
        .append("\", \"fuelType\":").append(fuelType)
        .append("}").toString();
  }
}

这个枚举有4个属性,value,desc,diaoDuName,fuelType.

values()方法

枚举中有一个很重要的方法是values()方法,他可以遍历枚举,返回枚举的列表。

打印枚举的所有属性

对于前台一般是使用JSON的,首先想到用JSON工具来转化一下,我这里用到的是fastJson,

System.out.println(JSON.toJSONString(TruckBrand.DONGFENG));

只打印出来 “DONGFENG”, 却没有相应的属性
后来通过跟代码,发现对于枚举可以进行设置,是打印名字,还是打印toString方法.
如下:

System.out.println(JSON.toJSONString(TruckBrand.DONGFENG, SerializerFeature.WriteEnumUsingToString));

当然,显示调用 toString方法也是可以的.

json 中双引号,单引号的问题

经过尝试,在json中假如使用单引号,或者无引号的话,是不能转换为JSON的,必须使用双引号才可以。


image.png

对于对象而言,不能使用双引号,不加引号就可以。这样才能把它当成一个对象来看待.加了引号会当成字符串来看待。


image.png

通过反射,来执行values方法

因为这个问题比较共性,客户端只需要传输枚举的类名即可。
假如通过 Class.forName()来获取的话,必须需要包路径,而枚举类的包路径不一定的固定的,这里直接使用map来保存相应的class.

  package com.enn.zhwl.api.common.system;

import com.alibaba.fastjson.JSON;
import com.enn.zhwl.commons.Result;
import com.enn.zhwl.commons.ResultSet;
import com.enn.zhwl.commons.State;
import com.enn.zhwl.commons.enums.TruckBrand;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/**
 * @author liuzhenning
 * @version 0.0.1
 * @since 0.0.1 2019-03-14
 * 字典请求类.
 */
@Controller
@RequestMapping("/dic")
public class DicApi {

  private Logger logger = LoggerFactory.getLogger(DicApi.class);

  private static Map<String, Class> enumMaps = new HashMap<String, Class>() {{
    put("truckBrand", TruckBrand.class);
  }};

  @RequestMapping(value = "/{enumName}", method = RequestMethod.GET)
  @ResponseBody
  public Result<Object, State> findDict(@PathVariable String enumName) {
    Result<Object, State> resultSet = new Result<>();
    try {
      if (enumMaps.containsKey(enumName)) {
        Class aClass = enumMaps.get(enumName);
        Method valuesMethod = aClass.getMethod("values");
        Object[] values = (Object[])valuesMethod.invoke(null);
        resultSet.setData(JSON.parseArray(Arrays.toString(values)));
        resultSet.setCode(State.SUCCESS);
      } else {
        resultSet.setCode(State.FAILED);
        resultSet.setMessage("key not exist");
      }
    } catch (Exception e) {
      e.printStackTrace();
      resultSet.setCode(State.FAILED);
      resultSet.setMessage(e.getMessage());
    }
    return resultSet;
  }

}

这里是显示的调用了toString方法,即 Arrays.toString(values),这样调用的。
在返回到前台的时候,spring MVC在这里自动使用 fastJson转了一下,因为默认的是不用toString方法的,所以这里将相应的对象转化为字符串,再转化为对象
(这里的对象就不是枚举了,而是JSONObject了),这样就能传回到前台了。

前端js接收相应的返回值,构建成select下拉框.

  /***
 * @Author:liuzhenning
 * @function:直接从服务端获取Enum。
 * @Date: 2019-03-14
 * 直接调用makeHtml(enumName) enumName 为枚举类,如:truckBrand
 */

(function (win,$) {
    /**
     * 对象.
     * @param enumName 枚举类
     * @param head 头一个要显示的,比如:品牌
     * @constructor
     */
    var Enum = function (enumName,head) {
        this.enumName = enumName;
        this.head = head;
        this.datas = '';
    }

    win.Enum = Enum;

    Enum.prototype.getEnum = function () {
        var me = this;
        var enumName = me.enumName;
        $.ajax({
            url:api_host + "dic/" + enumName,
            type:'get',
            async:false,
            dataType:'json',
            success:function (result) {
                var code = result.code;
                var data = result.data;
                if (result.code == 'SUCCESS') {
                    me.datas = data;
                }
            }
        })
    };
    Enum.prototype.makeHtml = function () {
        var me = this;
        var enumName = me.enumName;
        if (!me.datas) {
            me.getEnum(enumName);
        }
        var datas = me.datas;
        var $select = $('<select name="'+ enumName +'"></select>');
        var $head = $('<option value="">'+ me.head +'</option>');
        $select.append($head);
        for (var i=0;i<datas.length;i++) {
            var data = datas[i];
            var $option = $('<option value="'+ data.name +'">'+ data.desc +'</option>');
            $select.append($option);
        }
        return $select;
    };
    Enum.prototype.getDataItem = function (name) {
        var datas = this.datas;
        for (var i=0;i<datas.length;i++) {
            var temp = datas[i];
            if (name == temp.name) {
                return temp;
            }
        }
        return null;
    }
})(window,jQuery);

代码见上面,稍微封装了一下,具体的做法,可以参考 https://www.jianshu.com/p/fa24f71be4e7
调用如下:

var truckBrandEnum = new Enum('truckBrand','品牌');
var $select = truckBrandEnum.makeHtml();

假如是品牌的话,只需要new一次就行了,假如再加另外一个,比如:性别,就再new一个.

后记

感觉java的枚举不好用,还不如直接将 这些字典 存到库中,建造一个字典类来处理,刚方便.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342