最近在学习spring MVC,还有jquery-easyui等框架,于是顺便自己搭了个框架玩玩,因为本人比较懒,又爱瞎折腾,于是就有了下面这些思考。
现在很多人在设计数据库的时候会将诸如“男女”,“启用,禁用”等常用的组合在保存到数据的时候不选择保存文字而选择使用01或者其他状态来取代,即0代表男,1代表女,这样可以节省数据库的存储,好处自然是不言而喻,我在公司做项目的时候也是采取这种方式。
但是也是因为自己在公司经历过,所以才深觉这种方式的痛苦,对于这种常用组合,在页面上使用的时候自然是给用户一组radio进行选择,然后获取0,1后保存。在前台的时候又重新根据值进行展示,我是一个懒人,没那么大的兴致去做这么多无意义的事情,而且有时候还会设计混淆了,有些地方不一定能做到统一,把男设计为1,女为0(某些邪恶思想冒出来了,此处内涵,不懂请飘过)很是麻烦,于是开始思变。
在一个偶然的机会,一个同事在办公室说到Java自从XXX版本(我也不记得了)支持中文变量了,也是这句话让我思路开始活跃起来了,便想到了另外一片天空:Enum。于是定义了这么一个类:
public enum Gender {
男,女
}
效果很好,在页面上定义两个radio
<input type=”radio” name=”sex” value=”男”>
<input type=”radio” name=”sex” value=”女”>
Spring MVC在值对类型转换的时候能够自动转换,而在JPA规范中也有一个相应的备注可以定义储存的时候是保存顺序而非显示值,这样就实现了前面的思想,不需要在
@Enumerated(value = EnumType.ORDINAL)
@Column(length=1)
public Gender getSex() {
return sex;
}
测试之后很顺利,页面显示没问题,数据保存也挺好,但是有个小问题:如启用禁用这一组数据,有些人喜欢启用警用,有些人喜欢启用不启用,在做项目的时候很难统一,再加上对于我这个懒人来说,需要持续在页面上打多个<input>标签也是个麻烦事,于是又有了一些思考:能否直接在前台的时候就直接通过Ajax来获取需要显示的所有字段,然后生成一组<input标签,想到便开始动手。
于是写了一个这么一个方法:
//所传classPath为需要调用的Enum的完整路径。
public List<String> getFromEnum(String classPath) {
try {
int id = 0;
List<String> result = new ArrayList<String>();
Class u = Class.forName(classPath);
for (Field f : u.getFields()) {
result.add(f.getName());
}
return result;
} catch (Exception e) {
e.printStackTrace();
return new ArrayList<String>();
}
}
如此前台即可只通过调用Ajax获取此数组,然后进行展示,即可避免不规范的问题了。
前文一直强调,我是一个懒人,作为一个懒人自然不能每次都重新写Ajax方法,然后进行重新生成,自然得封装起来,于是干脆写个jsp,将Ajax调用和处理统一写入,这样便完成了我的偷懒之路。当然偷懒不是那么容易的,比如有人在设计的时候喜欢使用radio,有人喜欢用comboBox,很多时候也根据不同语境需要不同设计,这个jsp文件似乎变得颇为重要了,需要考虑多种情况,现在未完善就先不贴出来了,最近会进行完善,待完善之后再贴出来分享。
另外,有个其他思路就是如果Enum的Ordinal方法能够重写就好了,这样储存的值可以不用从0开始,而是重新设计为1001,1002等,当然这只是一些杂想,实际上在重新构建一个系统的时候应该用不上这个。