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

之前在博客园的时候,更新过一篇文章[技巧篇]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国际许可证
本文首发于 码迷码迷吽 的博客(),版权所有,侵权必究。

posted on 2016-05-23 00:42  胖先生  阅读(459)  评论(0编辑  收藏  举报