`

spring项目中velocity使用枚举类

阅读更多
在springmvc中配置velocity
<!--相关的文档http://docs.spring.io/spring/docs/4.2.9.RELEASE/spring-framework-reference/htmlsingle/#view-velocity-->
    <!-- 配置velocity引擎 -->
    <bean id="velocityConfigurer"
          class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
        <property name="resourceLoaderPath" value="/WEB-INF/vm/"/><!-- 模板存放的路径 -->
        <property name="configLocation" value="/WEB-INF/velocity/velocity.properties"/>
    </bean>
    <!-- 配置视图的显示 -->
    <bean id="ViewResolver" class="org.springframework.web.servlet.view.velocity.VelocityLayoutViewResolver">
        <property name="prefix" value="/"/><!-- 视图文件的前缀,即存放的路径 -->
        <property name="suffix" value=".vm"/><!-- 视图文件的后缀名 -->
        <property name="dateToolAttribute" value="date"/><!--日期函数名称-->
        <property name="numberToolAttribute" value="number"/><!--数字函数名称-->
        <property name="contentType" value="text/html;charset=UTF-8"/>
        <property name="exposeSpringMacroHelpers" value="true"/><!--是否使用spring对宏定义的支持-->
        <property name="exposeRequestAttributes" value="true"/><!--是否开放request属性-->
        <property name="requestContextAttribute" value="rc"/><!--request属性引用名称-->
        <property name="layoutUrl" value="layout/default.vm"/><!--指定layout文件-->
        <property name="toolboxConfigLocation" value="/WEB-INF/velocity/velocityToolbox.xml"/>
    </bean>

配置对应的velocityTool和layout这里忽略
配置相关的文件,主要是加载枚举类加载的路径
import com.google.common.collect.Maps;
import com.my.common.conf.PropertiesLoader;

import java.util.Map;

/**
 * 加载枚举类对应的配置文件
 * Created by Janle on 2017/3/8.
 */
public class EnumSetting {
    /**
     * 保存全局属性值
     */
    private static Map<String, String> map = Maps.newHashMap();
    /**
     * 属性文件加载对象
     */
    private static PropertiesLoader propertiesLoader = new PropertiesLoader(
            "common_key.properties");

    /**
     * 获取配置中对应的值.
     *
     * @param key
     * @return
     */
    public static String getConfig(String key) {
        String value = map.get(key);
        if ("".equals(value) || value == null) {
            value = propertiesLoader.getProperty(key);
            map.put(key, value);
        }
        return value;
    }

    /**
     * 获得对应key的value.
     *
     * @return
     */
    public static String getValue(String value) {
        return getConfig(value);
    }
}

属性加载器
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.support.PropertiesLoaderUtils;

import java.io.IOException;
import java.util.NoSuchElementException;
import java.util.Properties;

/**
 * Created by lijianzhen1 on 2017/3/8.
 */
public class PropertiesLoader {
    private static Logger logger = LoggerFactory.getLogger(PropertiesLoader.class);
    private final Properties properties;

    public PropertiesLoader(String resourcesPath) {
        properties = loadProperties(resourcesPath);
    }

    /**
     * 加载对应的properties文件
     *
     * @param resourcesPath
     * @return
     */
    private Properties loadProperties(String resourcesPath) {
        Properties props = null;
        try {
            props = PropertiesLoaderUtils.loadAllProperties(resourcesPath);
        } catch (IOException e) {
            logger.error("加载[{}].properties文件时候出现异常[{}]", resourcesPath, e);
        }
        return props;
    }

    /**
     * 返回当前加载的properties文件内容.
     *
     * @return
     */
    public Properties getProperties() {
        return properties;
    }

    /**
     * 获得当前文件的property
     *
     * @param key
     * @return
     */
    public String getProperty(String key) {
        String value = getValue(key);
        if (value == null) {
            throw new NoSuchElementException();
        }
        return value;
    }

    /**
     * 通过key获得value值
     *
     * @param key
     * @return
     */
    private String getValue(String key) {
        String systemProperty = System.getProperty(key);
        if (systemProperty != null) {
            return systemProperty;
        }
        if (properties.containsKey(key)) {
            return properties.getProperty(key);
        }
        return "";
    }

}
//[b]记得配置[/b]
common_key.properties

枚举类
public class StatusEnum{
  待付款(0), 付款成功(1), 退款中(2), 退款成功(3);

    private int code;//私有变量

    //创建私有构造
    private StatusEnum(int code) {
        this.code = code;
    }

    @Override
    public String toString() {
        return String.valueOf(this.code);
    }

    @Override
    public int getIntValue() {
        return this.code;
    }
}

对应的velocity工具类
/**
 * 使用具体说明:
 * 针对velocity前端页面引入枚举类
 * 使用自定义解析工具类标签
 * <p>
 * 迭代使用说明
 * #foreach($enumItem in $enums.getEnumList("InsurPeriodEnum"))
 * $!enumItem
 * #end
 * 获得枚举对象值
 * [$enums.getLabel("InsurPeriodEnum","0")]; 通过重构后的值获得枚举对象的中文名字
 * [$enums.getOrdinal("InsurPeriodEnum","年")] 获得枚举Ordinal值
 * [${myEnum}] 获得重构后的值
 * <p>
 * Created by lijianzhen1 on 2017/3/7.
 */
@DefaultKey("enums")
public class EnumsTool extends SafeConfig {
    private static Logger logger = LoggerFactory.getLogger(EnumsTool.class);
    //默认枚举读取的包
    private static final String ENUM_PACKAGE = "enum_default_package";

    /**
     * 已经扫描到的类缓存起来
     */
    private static final Map<String, Class<?>> ENUM_LOCAL_CACHE = Maps.newConcurrentMap();


    /**
     * 通过枚举类获得所有的枚举值
     *
     * @param enumName 枚举类的名称
     * @return
     */
    public static Enum[] getEnumList(String enumName) {
        Class<?> clazz = getEnumClass(enumName);
        try {
            Method method = null;
            try {
                method = clazz.getMethod("values");
                Object obj = method.invoke(clazz);
                if (obj instanceof Enum[])
                    return (Enum[]) method.invoke(clazz);
                logger.error("不能找到对应的枚举类[{}]", enumName);
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            }
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 通过枚举类和枚举值获得对应的ordinal值
     *
     * @param enumName
     * @param value
     * @return
     */
    public static Integer getOrdinal(String enumName, String value) {
        Enum[] enums = getEnumList(enumName);
        for (Enum en : enums) {
            if (StringUtils.equals(en.toString(), value)) {
                return en.ordinal();
            }
        }
        logger.error("对应的枚举类对象[{}]枚举值[{}]不能获得", enumName, value);
        return null;
    }

    /**
     * 通过枚举类和枚举值获得对应的Label值
     *
     * @param enumName
     * @param value
     * @return
     */
    public static String getLabel(String enumName, String value) {
        Enum[] enums = getEnumList(enumName);
        for (Enum en : enums) {
            if (StringUtils.equals(en.toString(), value)) {
                return en.name();
            }
        }
        logger.error("对应的枚举类对象[{}]枚举值[{}]不能获得", enumName, value);
        return null;
    }

    /**
     * 获得要代理的对象的方法
     *
     * @param clazz
     * @param methodName
     * @return
     */
    private static Method getInvokeMethod(Class<?> clazz, String methodName) {
        if (clazz == null) {
            logger.error("没有找到对应的枚举类[{}]", clazz);
            return null;
        }
        Method method = null;
        try {
            method = clazz.getMethod(methodName, String.class);
            if (method != null) {
                return method;
            }
            logger.error("没有获得对应要代理的方法[{}]" + methodName);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
        return method;
    }

    /**
     * 根据枚举类名称获取具体的枚举类Class
     *
     * @param enumName 枚举类名.
     * @return
     */
    private static Class<?> getEnumClass(String enumName) {
        return getEnumClass(enumName, EnumSetting.getValue(ENUM_PACKAGE));
    }

    /**
     * 根据枚举类名称获取具体的枚举类Class,和自定义package
     *
     * @param enumName
     * @param enumPackageKey
     * @return
     */
    private static Class<?> getEnumClass(String enumName, String enumPackageKey) {
        if (StringUtils.isEmpty(enumName)) {
            return null;
        }
        //如果缓存中有值从缓存中获得
        if (ENUM_LOCAL_CACHE.containsKey(enumName)) {
            return ENUM_LOCAL_CACHE.get(enumName);
        }
        if (null == enumPackageKey) {
            logger.error("没有找到对应的枚举类的包");
            return null;
        }
        String classPath = enumPackageKey + "." + enumName;
        Class<?> clazz = null;
        try {
            clazz = Class.forName(classPath);
            if (clazz != null) {
                ENUM_LOCAL_CACHE.put(enumName, clazz);
                return clazz;
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            logger.error("没有找到对应的枚举类[{}],对应的错误信息[{}]", classPath, e);
        }
        return null;
    }


}


需要修改页面的处理
**
 * 前端处理时候使用
 * Created by lijianzhen1 on 2017/3/17.
 */
public class EnumTypeEditor<E extends Enum<E>> extends PropertyEditorSupport {
    private final E[] anEnum;

    public EnumTypeEditor(E[] anEnum) {
        this.anEnum = anEnum;
    }

    @Override
    public void setAsText(String text) throws IllegalArgumentException {
        for (E en : anEnum) {
            if (StringUtils.equals(en.toString(), text)){
                this.setValue(en);
                break;
            }
        }
    }
    public String getAsText() {
        String value = (String)this.getValue();
        return value != null?value:"";
    }
}

测试页面
 #foreach($enumItem in $enums.getEnumList("InsurPeriodEnum"))
        <br/>
        $!enumItem
        ==
    #end
    #foreach($enumItem in $enums.getEnumList("InsurPeriodEnum"))
        <br/>
        $!enumItem.name()
        ==
    #end
    <br/>
    测试我velocity tool中返回的枚举类:[$enums.getLabel("InsurPeriodEnum","0")];[$enums.getOrdinal("InsurPeriodEnum","年")][${myEnum}]<br>


页面好了我们要存入数据库,我使用的是mybats操作的数据库,

/**
 * 主要是为了在数据库操作时候使用
 * Created by lijianzhen1 on 2017/3/16.
 */
public interface IntEnum<E extends Enum<E>> {
    int getIntValue();
}

public class EnumTypeHandler<E extends Enum<E> & IntEnum<E>> extends BaseTypeHandler<IntEnum> {
    private Class<IntEnum> clazz;

    public EnumTypeHandler(Class<IntEnum> enumType) {
        if (enumType == null)
            throw new IllegalArgumentException("enumType argument cannot be null");
        this.clazz = enumType;
    }

    /**
     * 将数据库映射的值转化为对应的枚举值
     *
     * @param code
     * @return
     */
    private IntEnum convert(int code) {
        IntEnum[] enumConstants = clazz.getEnumConstants();
        for (IntEnum im : enumConstants) {
            if (im.getIntValue() == code)
                return im;
        }
        return null;
    }

    @Override
    public void setNonNullParameter(PreparedStatement preparedStatement, int i, IntEnum intEnum, JdbcType jdbcType) throws SQLException {
        preparedStatement.setInt(i, intEnum.getIntValue());
    }

    @Override
    public IntEnum getNullableResult(ResultSet resultSet, String columnName) throws SQLException {
        return convert(resultSet.getInt(columnName));
    }

    @Override
    public IntEnum getNullableResult(ResultSet resultSet, int columnIndex) throws SQLException {
        return convert(resultSet.getInt(columnIndex));
    }

    @Override
    public IntEnum getNullableResult(CallableStatement callableStatement, int columnIndex) throws SQLException {
        return convert(callableStatement.getInt(columnIndex));
    }
}

在数据库的xml中获得添加
 <result column="service_status" jdbcType="TINYINT" property="serviceStatus"
                typeHandler="com.XX.mybatis.handlers.EnumTypeHandler"/>

service_status=#{serviceStatus,jdbcType=TINYINT,typeHandler=com.XX.mybatis.handlers.EnumTypeHandler}




分享到:
评论

相关推荐

    Java开源项目中文文档(Spring、Mybatis、Velocity...).pdf

    从提供的文件信息来看,文档涉及Java开源项目,包括Spring、Mybatis和Velocity等热门框架的中文资料。文件内容提到了Spring框架的多个版本,包括Spring 3.1的特性介绍以及IoC(控制反转)的概念。文档还提到了...

    Spring2.0 中文参考手册

    Spring是一个广泛使用的Java企业级应用开发框架,它以其依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)为核心理念,简化了复杂的应用程序设计。在Spring2.0版本中,引入...

    Spring3 jar

    在Spring3中,最重要的变化之一是增强了对Java 5和6的支持,包括泛型、注解(Annotation)和枚举等语言特性。这些新特性使得Spring框架的配置和使用变得更加简洁和类型安全。例如,Spring3引入了基于注解的配置,...

    spring 2.0包

    Spring框架是Java开发中的核心组件,它以依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)为核心理念,极大地简化了企业级应用的开发工作。Spring 2.0是该框架的一个重要...

    spring-framework-2.1-m1

    在2.1版本中,Spring MVC引入了更多模板技术的集成,如JSP、FreeMarker和Velocity,使得视图层的构建更加多样化。 对于数据访问,Spring 2.1 加强了对ORM(Object-Relational Mapping,对象关系映射)框架的集成,...

    Spring Framework 2.1 第一预览版

    Spring Framework 2.1 是一个重要的版本更新,它在Spring框架的发展历程中占据了显著的地位。这一版本的发布标志着Spring在...学习和掌握这些知识点对于理解Spring的核心理念以及在实际项目中应用Spring框架至关重要。

    mybatis-plus-generator.rar

    #MyBatis-Plus-Generator ...4. TemplateEnum:模板枚举类,可根据需要选择velocity(*.vm)或者freemarker(*.ftl)模板进行生成 注:大部分配置都已进行注释说明,若需更多自定义配置,请参考官方文档或者源代码。

    java初学者的比较好的学习路线(转)

    - **新特性介绍**:掌握J2SE 5.0中引入的新特性,如泛型、枚举、可变参数等。 - **常用API详解**:熟悉常用的API,如Collections框架、Comparator接口等。 ##### 4. 网络编程 - **Socket编程**:理解Socket的工作...

    一套基于模版的代码生成器

    在Java环境中,代码生成器可以用于创建Java类、接口、枚举、方法等,还可以生成JUnit测试用例、Spring Bean配置、DAO层、Service层等常见模块。 4. **代码质量**:尽管代码是自动生成的,但其质量不应打折。模板应...

    三大框架精华

    a) **配置Struts.xml**:在项目的配置文件中,我们需要声明Action类及其映射路径,这样Struts2才能正确地找到并调用Action。 b) **execute方法的返回值**:为了保持代码的可读性和可维护性,通常会定义一个枚举...

    开源jeesite框架

    3. **数据字典支持**:jeesite内置了数据字典管理,用于规范系统中的枚举类型数据,便于统一管理和维护,同时也提高了数据的可读性和一致性。 4. **工作流引擎**:jeesite集成了工作流引擎,支持自定义流程,可以...

    2018年JAVA架构师面试后的问题汇总-word范文 (2页).pdf

    25. **项目中的亮点**:项目中做得最好的部分可能是架构设计、性能优化、团队协作等方面。 以上是对Java架构师面试中常见问题的详细解释,涵盖了Java基础、并发编程、数据库设计、Web开发等多个领域,有助于深入...

    Java进阶路线

    - **局部类**:定义在方法中,只能在该方法内部使用。 - **匿名类**:没有名字的类,通常用于实现接口或抽象类。 #### 六、并发编程 并发编程是Java中一个重要的主题,涉及到线程安全、同步机制等多个方面: - **...

    电话面试题(华为/中兴/腾讯)

    11. **StringBuffer与StringBuilder**:前者线程安全,后者非线程安全,通常在单线程环境中使用StringBuilder以提高效率。 12. **OutOfMemoryException**:通过增加内存、优化代码、减少对象创建等方式解决。 13. **...

    顶级IT公司面试题

    - **枚举**:提供了一种定义具有有限数量固定实例的类的方式。 - **可变参数**:方法可以接受可变数量的参数。 - **静态导入**:简化代码,避免重复书写类名。 - **注解**:用于向源代码添加元数据。 #### 2. 字符...

Global site tag (gtag.js) - Google Analytics