`

struts2 enum值相关

阅读更多
public enum Dimension implements Serializable, IntegerValuedEnum {
    LARGE(234, 60, 0), SMALL(125, 125, 1);

    private final int width;
    private final int height;
    private final int code;

    private Dimension(int width, int height, int code) {
        this.width = width;
        this.height = height;
        this.code = code;
    }

    public int getWidth() {
        return width;
    }

    public int getHeight() {
        return height;
    }

    @Override
    public int getCode() {
        return code;
    }

    public String getDisplay() {
        return "" + this.width + "*" + this.height;
    }
}

 

public class IntegerValuedEnumType<T extends Enum & IntegerValuedEnum> implements
        EnhancedUserType, ParameterizedType {

    /**
     * Enum class for this particular user type.
     */
    private Class<T> enumClass;

    /**
     * Value to use if null.
     */
    private Integer defaultValue;

    public IntegerValuedEnumType() { }

    public void setParameterValues(Properties parameters) {
        String enumClassName = parameters.getProperty("enum");
        try {
            enumClass = (Class<T>) Class.forName(enumClassName).asSubclass(Enum.class)
                    .asSubclass(IntegerValuedEnum.class); 
        } catch (ClassNotFoundException e) {
            throw new HibernateException("Enum class not found", e);
        }
        
        String defaultValueStr = parameters.getProperty("defaultValue");
        if (defaultValueStr != null && !defaultValueStr.isEmpty()) {
            try {
                setDefaultValue(Integer.parseInt(defaultValueStr));
            } catch (NumberFormatException e) {
                throw new HibernateException("Invalid default value", e);
            }
        }
    }

    public Integer getDefaultValue() {
        return defaultValue;
    }

    public void setDefaultValue(Integer defaultValue) {
        this.defaultValue = defaultValue;
    }

    /**
     * The class returned by <tt>nullSafeGet()</tt>.
     * 
     * @return Class
     */
    public Class returnedClass() {
        return enumClass;
    }

    public int[] sqlTypes() {
        return new int[] { Types.TINYINT };
    }

    public boolean isMutable() {
        return false;
    }

    /**
     * Retrieve an instance of the mapped class from a JDBC resultset.
     * Implementors should handle possibility of null values.
     * 
     * @param rs         a JDBC result set
     * @param names     the column names
     * @param owner     the containing entity
     * @return Object
     * @throws HibernateException
     * @throws SQLException
     */
    public Object nullSafeGet(ResultSet rs, String[] names, Object owner)
        throws SQLException {
        
        Integer value = rs.getInt(names[0]);
        if (value == null) {
            value = getDefaultValue();
            if (value == null) { // no default value
                return null;
            }
        }
        String name = IntegerValuedEnumReflect.getNameFromValue(enumClass, value);
        if (rs.wasNull() || name == null || name.isEmpty()) {
        	return null;
        } else {
        	return Enum.valueOf(enumClass, name);
        }
    }

    /**
     * Write an instance of the mapped class to a prepared statement.
     * Implementors should handle possibility of null values. A multi-column
     * type should be written to parameters starting from <tt>index</tt>.
     * 
     * @param st        a JDBC prepared statement
     * @param value        the object to write
     * @param index        statement parameter index
     * @throws HibernateException
     * @throws SQLException
     */
    public void nullSafeSet(PreparedStatement st, Object value, int index)
        throws SQLException {
        
        if (value == null) {
            st.setNull(index, Types.TINYINT);
        } else {
            st.setInt(index, ((T) value).getCode());
        }
    }

    public Object assemble(Serializable cached, Object owner) {
        return cached;
    }

    public Serializable disassemble(Object value) {
        return (Enum) value;
    }

    public Object deepCopy(Object value) {
        return value;
    }

    public boolean equals(Object x, Object y) {
        return x == y;
    }

    public int hashCode(Object x) {
        return x.hashCode();
    }

    public Object replace(Object original, Object target, Object owner) {
        return original;
    }

    public String objectToSQLString(Object value) {
        return '\'' + String.valueOf(((T) value).getCode()) + '\'';
    }

    public String toXMLString(Object value) {
        return String.valueOf(((T) value).getCode());
    }

    public Object fromXMLString(String xmlValue) {
        Integer value = Integer.parseInt(xmlValue);
        String name = IntegerValuedEnumReflect.getNameFromValue(enumClass, value);
        if (name == null || name.isEmpty()) {
        	return null;
        } else {
        	return Enum.valueOf(enumClass, name);
        }
    }
}
 
public final class IntegerValuedEnumReflect {

    /**
     * Don't let anyone instantiate this class.
     * 
     * @throws UnsupportedOperationException
     *             Always.
     */
    private IntegerValuedEnumReflect() {
        throw new UnsupportedOperationException("This class must not be instanciated.");
    }

    /**
     * All Enum constants (instances) declared in the specified class.
     * 
     * @param enumClass        Class to reflect
     * @return Array of all declared EnumConstants (instances).
     */
    private static <T extends Enum> T[] getValues(Class<T> enumClass) {
        return enumClass.getEnumConstants();
    }

    /**
     * All possible string values of the string valued enum.
     * 
     * @param enumClass        Class to reflect.
     * @return Available integer values.
     */
    public static <T extends Enum & IntegerValuedEnum> int[] getStringValues(
            Class<T> enumClass) {
        T[] values = getValues(enumClass);
        int[] result = new int[values.length];
        for (int i = 0; i < values.length; i++) {
            result[i] = values[i].getCode();
        }
        return result;
    }

    /**
     * Name of the enum instance which hold the respecified string value. If
     * value has duplicate enum instances than returns the first occurrence.
     * 
     * @param enumClass        Class to inspect.
     * @param value            The int value.
     * @return name of the enum instance.
     */
    public static <T extends Enum & IntegerValuedEnum> String getNameFromValue(
            Class<T> enumClass, int value) {
        T[] values = getValues(enumClass);
        for (int i = 0; i < values.length; i++) {
            if (values[i].getCode() == value) {
                return values[i].name();
            }
        }
        return null;
    }
}
 
public class IntegerValuedEnumSetType<T extends Enum<T> & IntegerValuedEnum> implements
        EnhancedUserType, ParameterizedType {

    /**
     * Enum class for this particular user type.
     */
    private Class<T> enumClass;

    public IntegerValuedEnumSetType() { }

    public void setParameterValues(Properties parameters) {
        String enumClassName = parameters.getProperty("enum");
        try {
            enumClass = (Class<T>) Class.forName(enumClassName).asSubclass(Enum.class)
                    .asSubclass(IntegerValuedEnum.class); 
        } catch (ClassNotFoundException e) {
            throw new HibernateException("Enum class not found", e);
        }
    }

    /**
     * The class returned by <tt>nullSafeGet()</tt>.
     * 
     * @return Class
     */
    public Class returnedClass() {
        return enumClass;
    }

    public int[] sqlTypes() {
        return new int[] { Types.TINYINT };
    }

    public boolean isMutable() {
        return false;
    }

    /**
     * Retrieve an instance of the mapped class from a JDBC resultset.
     * Implementors should handle possibility of null values.
     * 
     * @param rs         a JDBC result set
     * @param names     the column names
     * @param owner     the containing entity
     * @return Object
     * @throws HibernateException
     * @throws SQLException
     */
    public Object nullSafeGet(ResultSet rs, String[] names, Object owner)
        throws SQLException {
        
        Integer value = rs.getInt(names[0]);
        if (value == null) {
            return null;
        }

        return decode(value);
    }

    /**
     * Write an instance of the mapped class to a prepared statement.
     * Implementors should handle possibility of null values. A multi-column
     * type should be written to parameters starting from <tt>index</tt>.
     * 
     * @param st        a JDBC prepared statement
     * @param value        the object to write
     * @param index        statement parameter index
     * @throws HibernateException
     * @throws SQLException
     */
    public void nullSafeSet(PreparedStatement st, Object value, int index)
        throws SQLException {
        
        if (value == null) {
            st.setNull(index, Types.TINYINT);
        } else {
            st.setInt(index, encode((EnumSet<T>)value));
        }
    }

    public Object assemble(Serializable cached, Object owner) {
        return cached;
    }

    public Serializable disassemble(Object value) {
        return (Enum) value;
    }

    public Object deepCopy(Object value) {
        return value;
    }

    public boolean equals(Object x, Object y) {
        return x == y;
    }

    public int hashCode(Object x) {
        return x.hashCode();
    }

    public Object replace(Object original, Object target, Object owner) {
        return original;
    }

    public String objectToSQLString(Object value) {
        return '\'' + String.valueOf(encode((EnumSet<T>)value)) + '\'';
    }

    public String toXMLString(Object value) {
        return String.valueOf(encode((EnumSet<T>)value));
    }

    public Object fromXMLString(String xmlValue) {
    	try {
    		Integer value = Integer.parseInt(xmlValue);
    		return decode(value);
    	} catch (NumberFormatException e) {
    		return EnumSet.noneOf(enumClass);
    	}
        
    }
    
    /*
     * Encode the EnumSet into an integer based on bit on/off
     */
    private int encode(EnumSet<T> set) {
        int ret = 0;
        for (T val : set) {
            ret |= 1 << val.getCode();
        }
        return ret;
    }

    /*
     * Decode the integer back to a EnumSet based on bit on/off
     */
    private EnumSet<T> decode(int code) {
		Map<Integer, T> codeMap = new HashMap<Integer, T>();
		for (T val : EnumSet.allOf(enumClass)) {
			codeMap.put(val.getCode(), val);
		}
    	  
        EnumSet<T> result = EnumSet.noneOf(enumClass);
        while (code != 0) {
            int ordinal = Integer.numberOfTrailingZeros(code);
            code ^= Integer.lowestOneBit(code);
            result.add(codeMap.get(ordinal));
        }
        return result;
    }
}
 

 

 

 

 

 

public interface IntegerValuedEnum {   
   
    /**
     * Current int value stored in the enum.
     * @return int value.
     */
    int getCode();
   
}

 

 

maping.xml

<property name="dimension" column="DIMENSION">
            <type name="com.xxx.bbb.hibernate.IntegerValuedEnumType">
                <param name="enum">com.xxx.bbb.beans.Dimension</param>
            </type>
        </property>

 存到数据库只是 0  1 2

 

 

 

转换器

public class DimensionConverter extends StrutsTypeConverter {

    @Override
    public Object convertFromString(Map arg0, String[] values, Class clazz) {
        if (values != null && values.length > 0 && values[0] != null
                && !values[0].isEmpty()) {
            String value = values[0];
            if (value.equals("0")) {
                return Dimension.LARGE;
            } else if (value.equals("1")) {
                return Dimension.SMALL;
            } 
        }
        return null;
    }

    @Override
    public String convertToString(Map arg0, Object o) {
        System.out.println(o.toString());
        Dimension dimension = (Dimension) o;
        return String.valueOf(dimension.getCode());
    }
}

 

 

 

 

 

 

js

$("#dimensionSelect").val(${request.dimension.code});

 

 

<s:select id="dimensionSelect" name="dimension" list="#{@beans.Dimension@LARGE.code:@beans.Dimension@LARGE.display, @beans.Dimension@SMALL.code:@beans.Dimension@SMALL.display}" tabindex="4"/>

分享到:
评论

相关推荐

    struts2枚举值、日期值转换示例

    在这个“struts2枚举值、日期值转换示例”中,我们将关注如何自定义枚举值和日期值的转换器。 首先,枚举(Enum)在Java中是一种特殊的类,用于表示有限集合中的固定数量的值。在Struts2中,如果Action类的属性是...

    Struts2中的参数传递

    1. **封装OGNL操作,实现值的传递**:Struts2通过对OGNL表达式的封装,实现从客户端传入的参数到Java对象之间的值传递。这一过程包括但不限于对各种复杂类型的处理,如数组、列表、映射等。 2. **类型转换**:为了...

    Struts2 中的类型转换

    2. **Converter**:是Struts2类型转换的核心接口,用于将Action属性的字符串值转换为适当的Java类型。Struts2提供了一系列内置的转换器,可以处理基本类型和一些常见的复杂类型,如Date和Enum。 3. **...

    struts2标签大全

    Struts2标签大全是Java Web开发中非常重要的一个部分,它是Struts2框架提供的一系列预定义的JSP标签,用于简化MVC(Model-View-Controller)模式下的视图层开发。这些标签大大提高了代码的可读性和可维护性,同时也...

    Struts2单选按钮详解及枚举类型的转换代码示例

    在Struts2中,我们可以使用枚举类型来表示单选按钮的值。例如,我们可以定义一个枚举类型Gender: ``` public enum Gender { MAN, WOMEN } ``` 然后,我们可以使用枚举类型来生成单选按钮: ``` 男', Gender.WOMEN:...

    enum-converter:枚举的自定义转换器

    在Java编程语言中,枚举(Enum)是一种特殊的类,用于定义一组预定义的常量。枚举类型在很多场景下被广泛使用,...在实际项目中,根据具体需求选择合适的框架或库提供的转换功能,可以大大简化枚举相关的数据处理工作。

    Java基础、Java集合、多线程、JDBC、HTTP、JSP、Servlet、Struts面试题汇总(附答案).docx

    2. `switch`语句的适用范围:在Java 7之前,`switch`仅支持`byte`, `short`, `char`, `int`或它们的封装类以及`Enum`类型。自Java 7起,`switch`可以处理`String`类型。 3. `Integer`与`int`的区别:`Integer`是`...

    java笔试面试题(含有笔试题,核心技术,重点知识,struts,hibernate,spring,eclipse)

    - **Enum**:枚举类型,用于表示一组固定的常量值。 #### 四、集合类、泛型、自动装箱与拆箱 - **集合类**:包括List、Set、Map等,用于存储和操作数据集合。 - **泛型**:提供类型安全的容器,避免运行时...

    JAVA代码生成工具

    enumString="枚举值,以分号分隔,示例值:M(1,男);F(0,女) 或者是:M(男);F(女)" enumClassName="如果枚举有值,生成的类名称将是这个,没有枚举值,该配置无用.示例值:Sex" /&gt; 数据库表名&gt; --&gt; 用户信息" &gt; ...

    好用的代码生成源码

    框架将各个零散的框架(struts,strust2,springmvc,hibernate,ibatis,spring_jdbc,flex)搭建好,并内置一个代码生成器,辅助项目开发,可以生成java的hibernat model,dao,manager,struts+struts2 action类,可以生成jsp...

    整理后java开发全套达内学习笔记(含练习)

    enum (关键字) execute vt.执行 ['eksikju:t] exhibit v.显示, 陈列 [ig'zibit] exist 存在, 发生 [ig'zist] '(SQL关键字 exists) extends (关键字) 继承、扩展 [ik'stend] false (关键字) final (关键字) ...

    java必备1000单词学习

    2. **access** - 访问:描述类、接口和变量的可访问性,如public、private、protected等访问修饰符。 3. **algorithm** - 算法:解决特定问题的步骤或过程,通常与计算机程序设计相关。 4. **Annotation** - 代码...

    JAVA常用指令.pdf

    - `enum`:Java 5引入的枚举类型,用于创建固定的值集合。 3. **控制流**: - `assert`:断言,用于测试假设条件,如果条件为假,程序会抛出AssertionError。 - `continue`:终止当前循环的剩余部分,继续下一轮...

    74个java面试题,只有题目没有答案

    Struts 2 是一个基于 Java 的 Web 应用程序框架。 42. Java 注解 * Java 中什么是注解?注解是一种元数据,用于修饰类、方法和变量。 43. Java 泛型 * Java 中什么是泛型?泛型是一种机制,用于在编译时检查类型...

    bai1

    2. **枚举(Enum)**:比传统的常量类更安全,提供了固定的值集合。 3. **匿名内部类**:可以在需要的地方直接创建不需命名的新类实例。 4. **Lambda表达式**:Java 8引入的新特性,简化了函数式编程,如Stream ...

    java 面试宝典 免费提供

    - 两个对象值相等(`x.equals(y) == true`),它们的`hashCode`可以不同。 - `equals`方法用于比较对象的内容是否相等,`hashCode`用于散列数据结构。 #### 十七、`String`类的继承 - `String`类是final的,不可被...

    shaine-cl

    - **枚举(Enum)**:提供预定义的一组值,常用于表示固定数量的常量。 - **注解(Annotation)**:元数据,提供编译时或运行时的信息,如@Override、@Deprecated等。 5. **Java开发工具**: - **JDK(Java ...

Global site tag (gtag.js) - Google Analytics