zoukankan      html  css  js  c++  java
  • 再续前缘-apache.commons.beanutils的补充


    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国际许可证
    本文首发于 码迷码迷吽 的博客(),版权所有,侵权必究。

  • 相关阅读:
    计算机网络第一章_20210512
    bootloader_华清远见
    C#3.17
    linux--cd命令
    国内的开源网站
    安装linux
    如何自我介绍
    课堂破冰游戏“猜猜他是谁”
    办公软件---word
    计算机网络--技能训练
  • 原文地址:https://www.cnblogs.com/pangxiansheng/p/5518484.html
Copyright © 2011-2022 走看看