枚举类在Struts2中的运用

虽然枚举类已经在 jdk1.5 中已经推出来,但是它的应用还不是很广泛,究竟其原因,有以下几个方面:

  1. 虽然 hibernate,ibatis 可以支持 enun ,但是出于稳定性的原因,大多数公司选择旧的、稳定的版本。
  2. 前端框架 strut2 enum 的支持不够,无法轻松的映射枚举型,增加开发难度。
  3. 编程习惯的问题,大多数开发人员已经习惯使用 Interface 来定义常量。
  4. enum 类的了解程度不深。

如果要使用 Enum, 必须解决两个问题

  1. 在公司未采用支持 Enum 的数据层框架时,可以使用 Enum。
  2. 在公司采用支持 Enum 的数据层框架后,可以减少升级时间、提升效率。
  3. 使得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

 

  1. 在下拉列表,单选框、复选框中使用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" />
     
  2. freemaker 显示枚举的中文名
    <@s.property value=” @xx.SettlementCycle@cnName(name)”/> 

其中第二部的enum转化器是从网络上获取的

如果更好的建议,欢迎拍砖:)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值