再续前缘-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国际许可证。
本文首发于 码迷码迷吽 的博客(),版权所有,侵权必究。
再续前缘-apache.commons.beanutils的补充的更多相关文章
- Apache Commons BeanUtils
http://commons.apache.org/proper/commons-beanutils/javadocs/v1.9.2/apidocs/org/apache/commons/beanut ...
- myeclipse的项目导入到eclipse下,com.sun.org.apache.commons.beanutils.BeanUtils不能导入
com.sun.org.apache.commons.beanutils.BeanUtils这个包不能引入了怎么办自己下了个org.apache.commons的jar包了之后,改成import or ...
- 关闭log4j 输出 DEBUG org.apache.commons.beanutils.*
2016-03-23 10:52:26,860 DEBUG org.apache.commons.beanutils.MethodUtils - Matching name=getEPort on c ...
- Apache Commons Beanutils对象属性批量复制(pseudo-singleton)
Apache Commons Beanutils为开源软件,可在Apache官网http://commons.apache.org/proper/commons-beanutils/download_ ...
- org.apache.commons.beanutils.BeanMap简单使用例子
一.org.apache.commons.beanutils.BeanMap; 将一个java bean允许通过map的api进行调用, 几个支持的操作接口: Object get(Object ke ...
- 对于Java Bean的类型转换问题()使用 org.apache.commons.beanutils.ConvertUtils)
在进行与数据库的交互过程中,由数据库查询到的数据放在 map 中,由 map 到 JavaBean 的过程中可以使用 BeanUtils.populate(map,bean)来进行转换 这里要处理的问 ...
- Apache Commons Beanutils 三 (BeanUtils、ConvertUtils、CollectionUtils...)
前言 前面已经学习了Apache Commons Beanutils包里的PropertyUtils和动态bean,接下来将学习剩下的几个工具类,个人觉得还是非常实用的,特别是CollectionUt ...
- Apache Commons Beanutils 二 (动态Bean - DynaBeans)
相关背景 上一篇介绍了PropertyUtils的用法,PropertyUtils主要是在不修改bean结构的前提下,动态访问bean的属性: 但是有时候,我们会经常希望能够在不定义一个Java类的前 ...
- Apache Commons Beanutils 一 (使用PropertyUtils访问Bean属性)
BeanUtils简要描述 beanutils,顾名思义,是java bean的一个工具类,可以帮助我们方便的读取(get)和设置(set)bean属性值.动态定义和访问bean属性: 细心的话,会发 ...
随机推荐
- 并行程序模拟(Concurrency Simulator, ACM/ICPC World Finals 1991,Uva210)
任务介绍 你的任务是模拟n个程序的并行运算.(按照输入编号为1~n)的并行执行. 代码实现 #define LOCAL #include<bits/stdc++.h> using name ...
- jupyter notebook 使用cmd命令窗口打开
第一步:将文件路径改为你需要使用文件所在的路径 第二部: jupyter notebook
- 1.Hadoop介绍
1. Hadoop介绍 1.1 什么是Hadoop 开源的,可靠的,分布式的,可伸缩的 提供的功能: 利用服务器集群,根据用户的自定义业务逻辑,对海量数据进行分布式处理 1.2 处理方式 大众角度 数 ...
- 自测之Lesson4:gdb
题目:列出gdb过程中常用的命令. 常用命令: 命令 作用 使用示例1 使用示例2 list 列出代码 list 行号 list 函数名 break 设置断点 break 行号 b 行号 run 运行 ...
- iOS-根据两个经纬度计算相距距离
CLLocation *orig=[[[CLLocation alloc] initWithLatitude:[mainDelegate.latitude_self doubleValue] long ...
- osg::Vec2 Vec3 Vec4
osg::Vec2可以用于保存2D纹理坐标. osg::Vec3是一个三维浮点数数组. osg::Vec4用于保存颜色数据.
- lol人物模型提取(五)
修改了发过去后,那边说吊坠的绳子太细了,厚度至少1mm,推荐是2mm,需要我自己加粗,没办法又得用3ds max一根一根线地缩放了. 修改好后问报价,高精度树脂打印需要730元,还不带上色的, ...
- laravel 可用验证规则
accepted 验证的字段必须为 yes. on. 1.或 true.这在确认服务条款是否同意时相当有用. active_url 相当于使用了 PHP 函数 dns_get_record,验证的字段 ...
- Qt-排序
1.要求传入起始指针,总长度,单元素空间占用大小(sizeof(A[i])),判断函数. 判断函数参数类型为const void *,使用需要在函数内自行转换为对应类型, 返回值为整数型,升序排序时正 ...
- ZOJ 2072 K-Recursive Survival
https://vjudge.net/contest/67836#problem/K n people numbered 1 to n around a circle, we eliminate ev ...