在项目使用一个下拉框绑定或单选或复选框的绑定的应用:
在struts2.0中一个复选库可以选中多个但是真正的保存的只是数据而非enum对象。
在工具类中编写一个类实现枚举对象值和数据库对象的绑定:
public abstract class PersistenceUtils {
/**
*
*/
private static final String DEFAULT_ENUM_IDENTITY_PROPERTY = "code";
/**
*
*/
public static final String SEPERATOR = ",";
public static <T extends Enum<T>> List<T> getEnumsAsList(Class<T> enumClass, String identityProperty, String enumString) {
if (StringUtils.isBlank(enumString)) {
return new ArrayList<T>();
}
List<T> enumList = new ArrayList<T>();
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 <T extends Enum<T>> List<T> getEnumsAsList(Class<T> enumClass, String enumString) {
return getEnumsAsList(enumClass, DEFAULT_ENUM_IDENTITY_PROPERTY, enumString);
}
@SuppressWarnings("unchecked")
public static <T extends Enum<T>> String getEnumsToString(Class<T> enumClass, final String identityProperty, List<T> enums) {
if (CollectionUtils.isNotEmpty(enums)) {
Collection<String> 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 <T extends Enum<T>> String getEnumsToString(Class<T> enumClass, List<T> enums) {
return getEnumsToString(enumClass, DEFAULT_ENUM_IDENTITY_PROPERTY, enums);
}
}
在使用是如下:
将得到的枚举字符串voteTypes,转换为所需的枚举对象集合
public List<FunTicketType> getVoteTypeAsList() {
return PersistenceUtils.getEnumsAsList(FunTicketType.class,
this.voteTypes);
}
将枚举集合转换为所需的枚举字符串
public void setVoteTypeAsList(List<FunTicketType> voteTypeAsList) {
this.voteTypes = PersistenceUtils.getEnumsToString(FunTicketType.class,
voteTypeAsList);
}
在struts2.0 的IOC功能的强大也就显示出来了:
Model层的Set方法注入:
在jsp页面中实现如下:
单选组:
<s:radio name="entity.tableType"
list="@com.unutrip.user.model.enums.DinnerType@values()"
listKey="code" listValue="name" />
下拉框:
<s:select name="entity.noticeType"
list="@com.unutrip.user.model.enums.NoticeModeType@values()"
listKey="code" listValue="name" />
复选框:
<s:checkboxlist name="entity.voteTypeAsList"
list="@com.unutrip.user.model.enums.FunTicketType@values()"
listKey="code" listValue="name" />