枚举种在Struts2中的运用
枚举类在Struts2中的运用
虽然枚举类已经在 jdk1.5 中已经推出来,但是它的应用还不是很广泛,究竟其原因,有以下几个方面:
-
虽然 hibernate,ibatis 可以支持 enun ,但是出于稳定性的原因,大多数公司选择旧的、稳定的版本。
-
前端框架 strut2 对 enum 的支持不够,无法轻松的映射枚举型,增加开发难度。
-
编程习惯的问题,大多数开发人员已经习惯使用 Interface 来定义常量。
-
enum 类的了解程度不深。
如果要使用 Enum, 必须解决两个问题
-
在公司未采用支持 Enum 的数据层框架时,可以使用 Enum。
-
在公司采用支持 Enum 的数据层框架后,可以减少升级时间、提升效率。
-
使得struts2能够支持enum。
废话不多说,开始实施我们的方案,方案基于(strut2+freemarker).
第一步:编写Enum
import java.util.LinkedHashMap;
import java.util.Map;
public enum SettlementCycle implements ConstantSupport{
Buyout{
public String cnName(){
return "买断";
}
},
BillCycle{
public String cnName(){
return "单结";
}
},
WeekCycle{
public String cnName(){
return "每周";
}
},
MonthCycle{
public String cnName(){
return "每月";
}
},
QuarterCycle{
public String cnName(){
return "每季";
}
},
SemiannualCycle{
public String cnName(){
return "每半年";
}
},
YearCycle{
public String cnName(){
return "每年";
}; //年桔
};
private static final Map<Integer,String> ordinalMap;
private static final Map<String,String> stringMap;
static{
ordinalMap = new LinkedHashMap<Integer,String>();
for(SettlementCycle cycle:SettlementCycle.values()){
ordinalMap.put(cycle.ordinal(),cycle.cnName());
}
stringMap = new LinkedHashMap<String,String>();
for(SettlementCycle cycle:SettlementCycle.values()){
stringMap.put(cycle.name(),cycle.cnName());
}
}
public static Map ordinalMap(){
return ordinalMap;
}
public static Map stringMap(){
return stringMap;
}
public static String cnName(int i){
return SettlementCycle.values()[i].cnName();
}
}
第二步:增加EnumerationConverter使得struts2支持Enum的转化。
import ognl.DefaultTypeConverter; import java.util.Map; public class EnumerationConverter extends DefaultTypeConverter { @Override public Object convertValue(Map context, Object value, Class toType) { if (toType.isEnum()) { if (value == null)return null; if (value instanceof String[]) { String[] ss = (String[]) value; if (ss.length == 1) { return Enum.valueOf(toType, ss[0]); } else { Object[] oo = new Object[ss.length]; for (int i = 0; i < ss.length; i++) { oo[i] = Enum.valueOf(toType, ss[i]); } return oo; } } } return super.convertValue(context, value, toType); } }
第三步:往struts.xml添加语句,使得struts可以访问静态方法
<constant name="struts.ognl.allowStaticMethodAccess" value="true" />
第四步:在 freemarker调用enum
-
在下拉列表,单选框、复选框中使用enum
<@s.select list="@xx.SettlementCycle@ordinalMap()" name="contract.cycle" /> <@s.radio list="@xx.SettlementCycle@ordinalMap()" name="contract.cycle" /> <@s.checkboxlist list="@xx.SettlementCycle@ordinalMap()" name="contract.cycle" />
-
在
freemaker
显示枚举的中文名
<@s.property value=” @xx.SettlementCycle@cnName(name)”/>
其中第二部的enum转化器是从网络上获取的
如果更好的建议,欢迎拍砖:)