Chinaunix首页 | 论坛 | 博客
  • 博客访问: 390211
  • 博文数量: 80
  • 博客积分: 2682
  • 博客等级: 少校
  • 技术积分: 907
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-16 09:55
文章分类

全部博文(80)

文章存档

2012年(80)

分类: 系统运维

2012-06-29 16:17:41

Hibernate中完美支持枚举类型。在bean中直接使用枚举类型,hibernate会将它转化为int类型存储到数据库中。hibernate通过调用枚举类型ordinal()方法获取对应的int值。显示的时候又会自动将int转化为enum枚举类型。

例如 User.java (setter、getter 方法略):
 @Entity
 @Table(name = "tb_user")
 public class User {

@Column(nullable = false)
 private ***Type ***;
 }
其中,***Type为枚举类型,代码为:
public enum ***Type {
Male, Female;
public String getLabel() {
   switch (this) {
    case Male:
     return "男";
    case Female:
     return "女";
    }
   return super.toString();
 }
}
 该枚举类型中添加 getLabel()方法,是为了在页面中直接显示中文性别。这样struts2标签中可这么写:


也可以直接覆盖 toString()方法输出中文。但不推荐这么写,因为toString()方法还有别的大用途(用在转换器中)。

※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※

struts2中  自定义enum类型转换器
添加一个  xwork-conversion.properties   文件(如果已有,则修改)。添加枚举类型转换器:
   java.lang.Enum=com.helloweenpad.util.EnumerationConverter

编写转换器类   java 代码:
import java.util.Map;
import ognl.DefaultTypeConverter;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class EnumerationConverter extends DefaultTypeConverter {

  private static final Log log = LogFactory.getLog(EnumerationConverter.class);

  @SuppressWarnings({ "rawtypes", "unchecked" })
  @Override
  public Object convertValue(Map context, Object value, Class toType) {

    if (toType.isEnum()) {
      log.info(toType.getSuperclass());
      log.info("convertValue: " + value + " => " + toType);

      if (value == null)
        return null;

      if (value instanceof String[]) {
        String[] strArray = (String[]) value;
        if (strArray.length == 1) {
          return Enum.valueOf(toType, strArray[0]);
        } else {
          Object[] enums = new Object[strArray.length];
          for (int i = 0; i < strArray.length; i++) {
            enums[i] = Enum.valueOf(toType, strArray[i]);
          }
          return enums;
        }
      }
    }

    return super.convertValue(context, value, toType);
  }
}


好,到此为止,枚举类型的显示、中文显示、自动转化,完美结束。原理请见书中。
到目前为止,struts2是不支持枚举类型自动转化的(有兴趣可以看下 ognl.OgnlOps.convertValue(java.lang.Object, java.lang.Class)方法,里面只有int、string、long等基本类型转换代码)。但实际上完全可以做到,因此struts2中未来 可能会添加代码支持,届时就不需要这般折腾了。

※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※

在Struts2.0 中将Enum对象与组件的绑定
  在项目使用一个下拉框绑定或单选或复选框的绑定的应用:
在struts2.0中一个复选库可以选中多个但是真正的保存的只是数据而非enum对象。
在工具类中编写一个类实现枚举对象值和数据库对象的绑定:
public abstract class PersistenceUtils {
 
 /**
  *
  */
 private static final String DEFAULT_ENUM_IDENTITY_PROPERTY = "code";
 
 /**
  *
  */
 public static final String SEPERATOR = ",";

 public static > List getEnumsAsList(Class enumClass, String identityProperty, String enumString) {
  if (StringUtils.isBlank(enumString)) {
   return new ArrayList();
  }
  List enumList = new ArrayList();
  String[] fragments = StringUtils.split(enumString, SEPERATOR);
  try {
   for (String fragment : fragments) {
    Field identityField = BeanUtils.getDeclaredField(enumClass, identityProperty);
    enumList.add(EnumUtils.fromEnumProperty(enumClass, identityProperty,
      ConvertUtils.convert(fragment, identityField.getType())));
   }
  } catch (NoSuchFieldException e) {
   ReflectionUtils.rethrowRuntimeException(e);
  }
  return enumList;
 }
 
 public static > List getEnumsAsList(Class enumClass, String enumString) {
  return getEnumsAsList(enumClass, DEFAULT_ENUM_IDENTITY_PROPERTY, enumString);
 }
 
 @SuppressWarnings("unchecked")
 public static > String getEnumsToString(Class enumClass, final String identityProperty, List enums) {
  if (CollectionUtils.isNotEmpty(enums)) {
   Collection enumStrings = CollectionUtils.collect(enums, new Transformer() {
    @Override
    public Object transform(Object input) {
     try {
      Object identity = BeanUtils.getDeclaredFieldValue(input, identityProperty);
      return ConvertUtils.convert(identity, String.class);
     } catch (NoSuchFieldException e) {
      ReflectionUtils.rethrowRuntimeException(e);
      //never to here
      return null;
     }
    }
   });
   return StringUtils.join(enumStrings, SEPERATOR);
  }
  return null;
 }
 
 public static > String getEnumsToString(Class enumClass, List enums) {
  return getEnumsToString(enumClass, DEFAULT_ENUM_IDENTITY_PROPERTY, enums);
 }

}
在使用是如下:

将得到的枚举字符串voteTypes,转换为所需的枚举对象集合

public List getVoteTypeAsList() {
  return PersistenceUtils.getEnumsAsList(FunTicketType.class,
    this.voteTypes);
 }

 

 将枚举集合转换为所需的枚举字符串

 public void setVoteTypeAsList(List voteTypeAsList) {
  this.voteTypes = PersistenceUtils.getEnumsToString(FunTicketType.class,
    voteTypeAsList);
 }

 

在struts2.0 的IOC功能的强大也就显示出来了:

Model层的Set方法注入:

 

 

在jsp页面中实现如下:

  单选组:        

            list="@com.unutrip.user.model.enums.DinnerType@values()"
           listKey="code" listValue="name" />

 

下拉框:

            list="@com.unutrip.user.model.enums.NoticeModeType@values()"
           listKey="code" listValue="name" />

复选框:

                       list="@com.unutrip.user.model.enums.FunTicketType@values()"
            listKey="code" listValue="name" />
阅读(3670) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~