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国际许可证

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

最新文章

  1. T-SQL:毕业生出门需知系列(九)
  2. 解决VS Code调试.NET Core应用遇到的坑
  3. 原生cookie
  4. Myeclipse10编写jsp时出现 Multiple annotations found at this line:
  5. Entity Framework 学习笔记(2)
  6. Android开发_Gson解析
  7. 关于APlayer播放器在打包安装后提示“没有注册类”的解决办法
  8. c#中设置按钮Button为透明
  9. iOS依据字符串计算UITextView高度
  10. DataGrid 导出数据到 Excel
  11. Javascript面对对象. 第一篇
  12. php和js中,utf-8编码转成base64编码
  13. mysql5.7.1.3 安装说明 和出现的问题
  14. JAVA基础-IO流(二)
  15. template.helper()方法
  16. JasperReports&#174; Library | Jaspersoft Community
  17. Linux 分卷压缩
  18. MySQL5.7 查询用户,配置IP限制
  19. bash Shell 中如何实现条件判断之if判断
  20. iOS开发--整理常用的第三方资源

热门文章

  1. leetcode个人题解——#20 Valid Parentheses
  2. 测试下markdown!
  3. cp的使用
  4. zookeeper启动配置
  5. About Dynamic Programming
  6. .mat转成.npy文件+Python(Pytorch)压缩裁剪图片
  7. iOS- UIButton/UIImageView/UISlider/UISwitch操作
  8. Css入门课程 Css基础
  9. 结对作业二——WordCount进阶版
  10. CSS设计指南之一 HTML标记与文档结构