- 浏览: 71171 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (76)
- Acitviti (5)
- mybatis (4)
- 大数据 (5)
- servlet (1)
- 负载均衡 (1)
- lucene5.X (3)
- mysql (3)
- 数据库 (2)
- Linux (3)
- Java (10)
- SSO (2)
- spring (3)
- layer (1)
- JAVA多线程 (12)
- 设计模式 (1)
- hadoop (6)
- hdfs (2)
- zookeeper (3)
- yarn (1)
- hive (4)
- sqoop (1)
- redis (1)
- GSON (1)
- velocity (1)
- git (1)
- logback (1)
- shell (9)
- IntellJ idea (1)
- JVM (2)
- maven (1)
最新评论
在springmvc中配置velocity
配置对应的velocityTool和layout这里忽略
配置相关的文件,主要是加载枚举类加载的路径
属性加载器
枚举类
对应的velocity工具类
需要修改页面的处理
测试页面
页面好了我们要存入数据库,我使用的是mybats操作的数据库,
在数据库的xml中获得添加
<!--相关的文档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等热门框架的中文资料。文件内容提到了Spring框架的多个版本,包括Spring 3.1的特性介绍以及IoC(控制反转)的概念。文档还提到了...
Spring是一个广泛使用的Java企业级应用开发框架,它以其依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)为核心理念,简化了复杂的应用程序设计。在Spring2.0版本中,引入...
在Spring3中,最重要的变化之一是增强了对Java 5和6的支持,包括泛型、注解(Annotation)和枚举等语言特性。这些新特性使得Spring框架的配置和使用变得更加简洁和类型安全。例如,Spring3引入了基于注解的配置,...
Spring框架是Java开发中的核心组件,它以依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)为核心理念,极大地简化了企业级应用的开发工作。Spring 2.0是该框架的一个重要...
在2.1版本中,Spring MVC引入了更多模板技术的集成,如JSP、FreeMarker和Velocity,使得视图层的构建更加多样化。 对于数据访问,Spring 2.1 加强了对ORM(Object-Relational Mapping,对象关系映射)框架的集成,...
Spring Framework 2.1 是一个重要的版本更新,它在Spring框架的发展历程中占据了显著的地位。这一版本的发布标志着Spring在...学习和掌握这些知识点对于理解Spring的核心理念以及在实际项目中应用Spring框架至关重要。
#MyBatis-Plus-Generator ...4. TemplateEnum:模板枚举类,可根据需要选择velocity(*.vm)或者freemarker(*.ftl)模板进行生成 注:大部分配置都已进行注释说明,若需更多自定义配置,请参考官方文档或者源代码。
- **新特性介绍**:掌握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方法的返回值**:为了保持代码的可读性和可维护性,通常会定义一个枚举...
3. **数据字典支持**:jeesite内置了数据字典管理,用于规范系统中的枚举类型数据,便于统一管理和维护,同时也提高了数据的可读性和一致性。 4. **工作流引擎**:jeesite集成了工作流引擎,支持自定义流程,可以...
25. **项目中的亮点**:项目中做得最好的部分可能是架构设计、性能优化、团队协作等方面。 以上是对Java架构师面试中常见问题的详细解释,涵盖了Java基础、并发编程、数据库设计、Web开发等多个领域,有助于深入...
- **局部类**:定义在方法中,只能在该方法内部使用。 - **匿名类**:没有名字的类,通常用于实现接口或抽象类。 #### 六、并发编程 并发编程是Java中一个重要的主题,涉及到线程安全、同步机制等多个方面: - **...
11. **StringBuffer与StringBuilder**:前者线程安全,后者非线程安全,通常在单线程环境中使用StringBuilder以提高效率。 12. **OutOfMemoryException**:通过增加内存、优化代码、减少对象创建等方式解决。 13. **...
- **枚举**:提供了一种定义具有有限数量固定实例的类的方式。 - **可变参数**:方法可以接受可变数量的参数。 - **静态导入**:简化代码,避免重复书写类名。 - **注解**:用于向源代码添加元数据。 #### 2. 字符...