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) |