虽然枚举类已经在 jdk1.5 中已经推出来,但是它的应用还不是很广泛,究竟其原因,有以下几个方面:
如果要使用 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
<@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" />
<@s.property value=” @xx.SettlementCycle@cnName(name)”/>
其中第二部的enum转化器是从网络上获取的
如果更好的建议,欢迎拍砖:)