title: 再续前缘-apache.commons.beanutils的补充

toc: true

date: 2016-05-32 02:29:32

categories:

  • 实在技巧

tags:

  • 插件

之前在博客园的时候,更新过一篇文章[技巧篇]17.那些年一直再逃避的问题,还债Web阶段!,但是在测试时候,我只是对简单的数据进行了处理,但是对日期的处理还是有问题已经数据库中返回的数据转换为java.util.Date数据得时候有问题!马上要接一个新的班级了,所以多少再为了自己省事,我决定在重新弄一弄!没有考虑那些大的数据类型,我只是对日期进行了封装,将字符串转换为Date类型的处理!

/**
胖先生的核心代码
**/
//获取客户端的数据,这个是很关键的方法
Map<String, String[]> map = request.getParameterMap();
/**模拟数据的部分
Map<String, Object> map = new HashMap<String, Object>();
map.put("name", "悟空");
// map.put("user_id",);//测试数据
map.put("date", "2012-12-12 12:14:44");
map.put("hobbys", new String[]{ "A" , "B" , "C" });
*/
//对象实例化 --> 源代码
//TestData testData = new TestData();
//数据转换
//BeanUtils.populate(testData, map); //----------------------
// 改稿之后的调用源码为
BeanUtilsBeanSupport beanSupport = BeanUtilsBeanSupport.getInstance();
User user = beanSupport.populate(User.class, map);

无规则不成方圆

使用这个的时候,本想使用反射,但是感觉给自己徒增麻烦,只是讲课使用,不然知识点有扩充起来没有头了.所以这里就浅层的封装了一下,规则为保持数据库中字段,领域模型[二期说的实体Bean,一期告诉你们的POJO],前台表单name="这个名字",三者保持一致,基本上对我们的整个炒作应该是没有多大问题的!

学会制造轮子

关于如何造轮子,大家的说法不一,我个人的想法,我比较懒或者说胖哥比较笨,所以想偷懒,最好的方式是站在巨人的肩膀上时候,抱着这样的想法,我对org.apache.commons.beanutils的一个类进了继承,并且进行了方法的扩展!这就是快速制造轮子,想想看!其实比亚迪,众泰中国很多的品牌都是快速的发展,都是在一定别人的基础上发展,之后才努力的发展自己想要的东西!直接就贴代码了,二外的需要支持的jar包为

commons-logging commons-collection commons-lang3[以前用低版本]

这些都是对java的基础补充里面很多好玩好玩第三方库!

上代码了:日期工具类[里面涉的知识点比较多,但是我个人推荐使用]

Java时间处理神器之Joda-Time

package com.shxt.beanutils;

import java.text.ParseException;
import java.util.Calendar;
import java.util.Date; import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.commons.lang3.time.DateUtils; /**
* 扩展DateUtils的基础上扩展属于自己的工具类
* <p>
* </p>
*
* @author 刘文铭
* @since 1.0
* @date 2016年5月22日 下午5:36:56
* @see 新建
* @see com.shxt.beanutils.DateHelper
*/ public final class DateHelper extends DateUtils {
private final static String[] parsePatterns = { "yyyy-MM-dd" , "yyyy-MM-dd HH:mm:ss" , "yyyy-MM-dd HH:mm" ,
"yyyy-MM" , "yyyy/MM/dd" , "yyyy/MM/dd HH:mm:ss" , "yyyy/MM/dd HH:mm" , "yyyy/MM" , "yyyy.MM.dd" ,
"yyyy.MM.dd HH:mm:ss" , "yyyy.MM.dd HH:mm" , "yyyy.MM" }; private final static String DEFAULT_DATE_TIME = "yyyy-MM-dd HH:mm:dd";
private final static String DEFAULT_DATE = "yyyy-MM-dd";
private final static String DEFAULT_TIME = "HH:mm:dd";
private final static String DEFAULT_YEAR = "yyyy";
private final static String DEFAULT_MONTH = "MM";
private final static String DEFAULT_DAY = "dd";
private final static String DEFAULT_E = "E"; private static Date nowDate = new Date(); private static Calendar calendar = Calendar.getInstance(); /**
* java.util.Date转换格式(yyyy-MM-dd)
*
* @return
* String
*/
public static String getCurrentDate() {
return getDefDateTime(DEFAULT_DATE);
} /**
* java.util.Date转换格式(HH:mm:ss)
*
* @return
* String
*/
public static String getCurrentTime() {
return getDefDateTime(DEFAULT_TIME);
} /**
* java.util.Date转换格式(yyyy-MM-dd HH:mm:ss)
*
* @return
* String
*/
public static String getCurrentDateTime() {
return getDefDateTime(DEFAULT_DATE_TIME);
} /**
* 获取自定义格式的当前日期
* <p>
* 获取特定格式的日期
* </p>
*
* @param pattern
* 默认格式(yyyy-MM-dd) 可以为:"yyyy-MM-dd" "HH:mm:ss" "E"
* @return
* String
*/
public static String getDefDateTime(String pattern) {
return DateFormatUtils.format(nowDate, pattern);
} /**
* 得到当前年份字符串 格式(yyyy)
*
* @return
* String
*/
public static String getYear() {
return getDefDateTime(DEFAULT_YEAR);
} /**
* 得到当前月份字符串 格式(MM)
*
* @return
* String
*/
public static String getMonth() {
return getDefDateTime(DEFAULT_MONTH);
} /**
* 得到当天字符串 格式(dd)
*
* @return
* String
*/
public static String getDay() {
return getDefDateTime(DEFAULT_DAY);
} /**
* 得到当前星期字符串 格式(E)星期几
*
* @return
* String
*/
public static String getWeek() {
return getDefDateTime(DEFAULT_E);
} /**
* 获取日期字符串,java.util.Date转化为字符串
* <p>
* 使用格式化数据,
* </p>
*
* @param java.util.Date
* @param pattern
* 默认格式(yyyy-MM-dd) 可以为:"yyyy-MM-dd" "HH:mm:ss" "E"
* @return
* String
*/
public static String formatDate(Date date, String... pattern) {
String formatDate = null;
if (pattern != null && pattern.length > 0) {
formatDate = DateFormatUtils.format(date, pattern[0].toString().trim());
} else {
formatDate = DateFormatUtils.format(date, DEFAULT_DATE);
}
return formatDate;
} /**
* 日期型字符串转化为日期 格式
* { "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm",
* "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm",
* "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm" }
*/
public static Date parseDate(Object date_str) {
try {
if (date_str == null || String.valueOf(date_str).trim().length() == 0) {
return null;
}
return DateUtils.parseDate(String.valueOf(date_str).trim(), parsePatterns);
} catch (ParseException pe) {
System.out.println("DateHelper-->parseDate方法格式化错误");
return null;
}
} /**
* 获取过去的天数
*
* @param date
* @return
*/
public static long pastDays(Date date) {
long t = new Date().getTime() - date.getTime();
return t / (24 * 60 * 60 * 1000);
} /**
* 获取过去的小时
*
* @param date
* @return
*/
public static long pastHour(Date date) {
long t = new Date().getTime() - date.getTime();
return t / (60 * 60 * 1000);
} /**
* 获取过去的分钟
*
* @param date
* @return
*/
public static long pastMinutes(Date date) {
long t = new Date().getTime() - date.getTime();
return t / (60 * 1000);
} /**
* 转换为时间(天,时:分:秒.毫秒)
*
* @param timeMillis
* @return
*/
public static String formatDateTime(long timeMillis) {
long day = timeMillis / (24 * 60 * 60 * 1000);
long hour = (timeMillis / (60 * 60 * 1000) - day * 24);
long min = ((timeMillis / (60 * 1000)) - day * 24 * 60 - hour * 60);
long s = (timeMillis / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60);
long sss = (timeMillis - day * 24 * 60 * 60 * 1000 - hour * 60 * 60 * 1000 - min * 60 * 1000 - s * 1000);
return (day > 0 ? day + "," : "") + hour + ":" + min + ":" + s + "." + sss;
} /**
* 获取两个日期之间的天数
*
* @param before
* @param after
* @return
*/
public static double getDistanceOfTwoDate(Date before, Date after) {
long beforeTime = before.getTime();
long afterTime = after.getTime();
return (afterTime - beforeTime) / (1000 * 60 * 60 * 24);
} /**
* 获取当前日期,一周前的日期字符串
*
* @return
* String
*/
public static String getLastWeek() {
long rightnow = calendar.getTimeInMillis();
long aweekbefore = 6 * 24 * 60 * 60 * 1000;
return DateFormatUtils.format((rightnow - aweekbefore), DEFAULT_DATE);
} /**
* 获取格式化当前月第一天的表达式
*
* @return
* String
*/
public static String getFirstDayInMonth() {
calendar.set(getYearNUM(), getMonthNUM() - 1, 1);// 设为当前月的1号 ,月从0开始
return DateFormatUtils.format(calendar.getTime(), DEFAULT_DATE);
} /**
* 获取格式化给定月(参数:逻辑月)第一天的表达式,重载方法
*
* @param month
* @return
* String
*/
public static String getFirstDayInMonth(int month) {
calendar.set(getYearNUM(), month - 1, 1);// 设为当前月的1号 ,月从0开始
return DateFormatUtils.format(calendar.getTime(), DEFAULT_DATE);
} /**
* 获取格式化给定月(参数:逻辑月)最后一天的表达式
*
* @param month
* @return
* String
*/
public static String getLastDayInMonth(int month) {
calendar.set(getYearNUM(), month, 1); // 设成下个月的一号,往前减一天的时间
return DateFormatUtils.format((calendar.getTimeInMillis() - 24 * 60 * 60 * 1000), DEFAULT_DATE);
} /**
* 获取格式化当前季度第一天的表达式
*
* @return
* String
*/
public static String getFirstDayInQuart() {
int month = getMonthNUM();
if (month >= 1 && month <= 3) {
month = 1;
}
if (month >= 4 && month <= 6) {
month = 4;
}
if (month >= 7 && month <= 9) {
month = 7;
}
if (month >= 10 && month <= 12) {
month = 10;
}
calendar.set(getYearNUM(), month - 1, 1); // 当年当季一号,月从0开始
return DateFormatUtils.format(calendar.getTime(), DEFAULT_DATE);
} /**
* @return
* String 获取格式化一年第一天的表达式
*/
public static String getFirstDayInYear() { /** 获取格式化一年第一天的表达式 **/
calendar.set(calendar.get(Calendar.YEAR), 0, 1); // 当年第一个月一号,月从0开始
return DateFormatUtils.format(calendar.getTime(), DEFAULT_DATE);
} /**
* @return
* int 获得当前年份
*/
public static int getYearNUM() { /** 获得当前年份 */
return calendar.get(Calendar.YEAR);
} /**
* @return
* int 获得当前月份
*/
public static int getMonthNUM() { /*** 获得当前月份 **/
return calendar.get(Calendar.MONTH) + 1;
} /**
* @return
* int 获得当前周数
*/
public static int getWeekNUM() { /*** 获得当前周数 **/
return calendar.get(Calendar.DAY_OF_WEEK);
} /**
*
* @return
* int 取到一天中的小时数
*/
public static int getHoursofDay() {
return Calendar.HOUR_OF_DAY;
} /**
* 获取最近ndays天(含今天)的日期,返回日期表达式数组
*
* @param ndays
* @return
* String[]
*/
public static String[] getDaysBackward(int ndays) {
String[] daysBackward = new String[ndays];
Calendar lastDate;
for (int i = 0; i < ndays; i++) {
lastDate = Calendar.getInstance();
lastDate.add(Calendar.DATE, -1 * i); // 减去一天,变为上月最后一天
daysBackward[ndays - 1 - i] = DateFormatUtils.format(lastDate.getTimeInMillis(), DEFAULT_DATE);
}
return daysBackward;
} }

创建转换器

我这里练习使用单例模式和Final的用法,巩固知识点!

package com.shxt.beanutils;

import java.text.ParseException;

import org.apache.commons.beanutils.Converter;

/**
*
* <p>
* java.util.Date的转换 {@link 跟BeanUtilsBean有关系}
* </p>
*
* @author 刘文铭
* @since 1.0
* @see 新建
* @see com.shxt.beanutils.DateConvertSupport
*/ @SuppressWarnings("unchecked")
public class DateConvertSupport implements Converter { @Override
public <T> T convert(Class<T> type, Object value) {
try {
if (value == null) {
return null;
} else {
if (value instanceof java.util.Date) {
return (T) value;
}
if (value instanceof Long) {
Long longValue = (Long) value;
return (T) new java.util.Date(longValue.longValue());
}
if (value instanceof java.sql.Date) {
java.sql.Date sqlDateToutilDate = (java.sql.Date) value;
return (T) new java.util.Date(sqlDateToutilDate.getTime());
}
if (value instanceof String) {
String dateStr = (String) value;
java.util.Date endTime = null;
try {
String regexp1 = "([0-9]{4})-([0-1][0-9])-([0-3][0-9])T([0-2][0-9]):([0-6][0-9]):([0-6][0-9])";
String regexp2 = "([0-9]{4})-([0-1][0-9])-([0-3][0-9])(/t)([0-2][0-9]):([0-6][0-9]):([0-6][0-9])";
String regexp3 = "([0-9]{4})-([0-1][0-9])-([0-3][0-9])";
if (dateStr.matches(regexp1)) {
dateStr = dateStr.split("T")[0] + " " + dateStr.split("T")[1];
endTime = DateHelper.parseDate(dateStr, "yyyy-MM-dd HH:mm:ss");
return (T) endTime;
} else if (dateStr.matches(regexp2)) {
endTime = DateHelper.parseDate(dateStr, "yyyy-MM-dd HH:mm:ss");
return (T) endTime;
} else if (dateStr.matches(regexp3)) {
endTime = DateHelper.parseDate(dateStr, "yyyy-MM-dd");
return (T) endTime;
} else {
return (T) dateStr;
}
} catch (ParseException e) {
e.printStackTrace();
}
}
}
return (T) value;
} catch (Exception ex) {
ex.printStackTrace();
System.out.println("DateConvertSupport日期数据转换数据出错了--->" + ex.getMessage());
return null;
} } }

上述的代码中涉及到了一些泛型,但是大部分是可以阅读的,但是我想说的还没有继续优化! 应该继续考虑,或者弄出接口,但是又是工具类,感觉无伤大雅!暂时不懂!

站在别人身上

不知道怎么,跟对人,跟对人,以及跟对人,很重要!看看一看,你所在的地方大家彼此都是同事,仅此而已,职业人!呵呵!有意思吗?没有意思吗?谁知道呢!

上硬菜

/**
* com.shxt.beanutils
* BeanUtilsHP.java
* 功能:封装基本操作
* 作者:刘文铭
* 类名:BeanUtilsHP.java
*
* version 变更日 部门 开发者 变更内容
* ─────────────────────────────────────────────────────
* V1.0 2016年5月22日 教研部 刘文铭 初版
* ─────────────────────────────────────────────────────
*
* Copyright (c) 2016 Infopower corporation All Rights Reserved.
*/
package com.shxt.beanutils; import java.lang.reflect.InvocationTargetException;
import java.util.Map; import org.apache.commons.beanutils.BeanUtilsBean2;
import org.apache.commons.beanutils.ConvertUtilsBean;
import org.apache.commons.beanutils.converters.SqlTimestampConverter; /**
*
* <p>
* 描述该类情况 {@link 代表跟谁有关系}
* </p>
*
* @author 刘文铭
* @since 1.0
* @date 2016年5月22日 下午5:19:05
* @see 新建|修改|放弃
* @see com.shxt.beanutils.BeanUtilsHP
*/ public final class BeanUtilsBeanSupport extends BeanUtilsBean2 {
private static class BeanUtilsHPHolder {
private static final BeanUtilsBeanSupport INSTANCE = new BeanUtilsBeanSupport();
} private BeanUtilsBeanSupport() {
} public static BeanUtilsBeanSupport getInstance() {
return BeanUtilsHPHolder.INSTANCE;
} private static ConvertUtilsBean cub = null;
static {
cub = getInstance().getConvertUtils();
// 注册java.util.Date的日期转换
cub.register(new DateConvertSupport(), java.util.Date.class);
cub.register(new SqlTimestampConverter(), java.sql.Timestamp.class); // 注册sql.date的转换器,即允许BeanUtils.copyProperties时的源目标的sql类型的值允许为空
// cub.register(new SqlDateConverter(), java.util.Date.class);
} public <T> T populate(Class<T> clazz, Map<String, ? extends Object> properties)
throws InstantiationException, IllegalAccessException, InvocationTargetException {
T bean = clazz.newInstance();
super.populate(bean, properties);
return bean;
} }

就到这里吧!大家都很辛苦了!夺命,个人不会再别的地方发布资源了!这里是唯一的途径了!还是比较累的!折腾不起了!

找一个地方静静的写自己想写东西,不想别人的关注!我不想让别人的知道我的存在,低调,准备中!


版权声明



创作共用保留署名-非商业-禁止演绎4.0国际许可证

本文首发于 码迷码迷吽 的博客(),版权所有,侵权必究。

再续前缘-apache.commons.beanutils的补充的更多相关文章

  1. Apache Commons BeanUtils

    http://commons.apache.org/proper/commons-beanutils/javadocs/v1.9.2/apidocs/org/apache/commons/beanut ...

  2. myeclipse的项目导入到eclipse下,com.sun.org.apache.commons.beanutils.BeanUtils不能导入

    com.sun.org.apache.commons.beanutils.BeanUtils这个包不能引入了怎么办自己下了个org.apache.commons的jar包了之后,改成import or ...

  3. 关闭log4j 输出 DEBUG org.apache.commons.beanutils.*

    2016-03-23 10:52:26,860 DEBUG org.apache.commons.beanutils.MethodUtils - Matching name=getEPort on c ...

  4. Apache Commons Beanutils对象属性批量复制(pseudo-singleton)

    Apache Commons Beanutils为开源软件,可在Apache官网http://commons.apache.org/proper/commons-beanutils/download_ ...

  5. org.apache.commons.beanutils.BeanMap简单使用例子

    一.org.apache.commons.beanutils.BeanMap; 将一个java bean允许通过map的api进行调用, 几个支持的操作接口: Object get(Object ke ...

  6. 对于Java Bean的类型转换问题()使用 org.apache.commons.beanutils.ConvertUtils)

    在进行与数据库的交互过程中,由数据库查询到的数据放在 map 中,由 map 到 JavaBean 的过程中可以使用 BeanUtils.populate(map,bean)来进行转换 这里要处理的问 ...

  7. Apache Commons Beanutils 三 (BeanUtils、ConvertUtils、CollectionUtils...)

    前言 前面已经学习了Apache Commons Beanutils包里的PropertyUtils和动态bean,接下来将学习剩下的几个工具类,个人觉得还是非常实用的,特别是CollectionUt ...

  8. Apache Commons Beanutils 二 (动态Bean - DynaBeans)

    相关背景 上一篇介绍了PropertyUtils的用法,PropertyUtils主要是在不修改bean结构的前提下,动态访问bean的属性: 但是有时候,我们会经常希望能够在不定义一个Java类的前 ...

  9. Apache Commons Beanutils 一 (使用PropertyUtils访问Bean属性)

    BeanUtils简要描述 beanutils,顾名思义,是java bean的一个工具类,可以帮助我们方便的读取(get)和设置(set)bean属性值.动态定义和访问bean属性: 细心的话,会发 ...

随机推荐

  1. parity 注记词

    spousal tint untold around rosy daintily unrated sheep choice showpiece chirping gala

  2. SpringCloud IDEA 教学 (四) 断路器(Hystrix)

    写在开始 在SpringCloud项目中,服务之间相互调用(RPC Remote Procedure Call —远程过程调用),处于调用链路底层的服务产生不可用情况时,请求会产生堆积使得服务器线程阻 ...

  3. [leetcode-718-Maximum Length of Repeated Subarray]

    Given two integer arrays A and B, return the maximum length of an subarray that appears in both arra ...

  4. POJ 2987 Firing(最大流最小割の最大权闭合图)

    Description You’ve finally got mad at “the world’s most stupid” employees of yours and decided to do ...

  5. LintCode-366.斐波纳契数

    斐波纳契数列 查找斐波纳契数列中第 N 个数. 所谓的斐波纳契数列是指: 前2个数是 0 和 1 . 第 i 个数是第 i-1 个数和第i-2 个数的和. 斐波纳契数列的前10个数字是:0, 1, 1 ...

  6. iOS-tableView刷新指定行,组

    /一个section刷新 NSIndexSet *indexSet=[[NSIndexSet alloc]initWithIndex:]; [tableview reloadSections:inde ...

  7. Thinkphp5图片、音频和视频文件上传

    首先是同步上传,最为基础的上传的方式,点击表单提交之后跳转那种.如下前端代码 <!DOCTYPE html> <html lang="en"> <he ...

  8. phpcms v9 thumb(缩略图) 函数说明

    打开phcmsc/libs/functions/global.func.php文件,找到如下代码:/** * 生成缩略图函数 * @param  $imgurl 图片路径 * @param  $wid ...

  9. new关键字 、this关键字、base关键字

    使用new,所做的三件事: 1. (类是引用对象,引用对象是在堆中开辟空间)在堆中开辟空间 2. 在开辟的堆空间中创建对象 3. 调用对象的构建函数 4. 隐藏父类成员:子类的成员可以与隐藏从父类继承 ...

  10. Oracle中预定义角色有哪些?

    1. CONNECT 2. RESOURCE 3. DBA 4. EXP_FULL_DATABASE 5. IMP_FULL_DATABASE 6. DELETE_CATALOG_ROLE 7. EX ...