JavaWeb之如何把请求数据转成实体类

  • 自己写个工具类加入下面两个静态方法
  • 自定一个注解类DateTimeFormatting
  • 调用方式User user = util.ObjectFromMap(req.getParameterMap(), User.class)
  • 暂时支持8种基本数据类型对应包装类、BigDecimaljava.util.Date,可应对大多情况,如有需求,可以自己添加
  • 暂不支持数组
public static <T> T ObjectFromMap(Map<String,String[]> map, Class<T> type) {
try {
// 创建返回对象,是要转换的对象
T t = type.getConstructor().newInstance(); // 遍历map集合
for (Map.Entry<String, String[]> entry : map.entrySet()) {
// 获得属性名
String key = entry.getKey();
// 获得属性值
String[] values = entry.getValue(); // 自定义方法
// 如果类中没有这个属性跳出[本次]循环
if (!checkObjectHasField(type,key)) {
continue;
} // 获取属性描述对象,如果类中没有这个属性,报异常,所以要有上面那个操作
PropertyDescriptor pd = new PropertyDescriptor(key,type);
// 获取属性的set方法,所以对应属性要有set方法
Method method = pd.getWriteMethod(); // 暂时不支持数组
String value = values[0]; // req获取的值都是字符串,所以在对非字符串类型要转换
// 获取属性的类型
String propertyType = pd.getPropertyType().getName();
// 如果字符串长度为0 说明空串,valueOf会转换失败
if(value.length() > 0) {
switch (propertyType) {
case "java.lang.Byte":
method.invoke(t, Byte.valueOf(value));
break;
case "java.lang.Integer":
method.invoke(t, Integer.valueOf(value));
break;
case "java.lang.Short":
method.invoke(t, Short.valueOf(value));
break;
case "java.lang.Long":
method.invoke(t, Long.valueOf(value));
break;
case "java.lang.Float":
method.invoke(t, Float.valueOf(value));
break;
case "java.lang.Double":
method.invoke(t, Double.valueOf(value));
break;
case "java.lang.Boolean":
method.invoke(t, Boolean.valueOf(value));
break;
case "java.lang.Character":
method.invoke(t, value.charAt(0));
break;
case "java.lang.String":
method.invoke(t, value);
break;
case "java.math.BigDecimal":
method.invoke(t, new BigDecimal(value));
break;
case "java.util.Date":
// 默认使用格式化日期的格式
String format = "yyyy-MM-dd";
// 获取属性对象
Field field = type.getDeclaredField(key);
// 通过属性对象获取 DateTimeFormatting 注解
// 自定义注解
DateTimeFormatting anno = field.getAnnotation(DateTimeFormatting.class);
// 检查注解存在否
if (anno != null) {
// 存在使用注解的 value 来格式化时间
// 不存在使用上面的默认格式
format = anno.value();
}
method.invoke(t, new SimpleDateFormat(format).parse(value));
break;
default:
break;
}
} else {
// 如果字符串是空串,那么转成的bean对象对应属性也给个空串
// 如果想给null可以去掉
if (propertyType.equals("java.lang.String")) {
method.invoke(t, value);
}
}
}
return t;
} catch (InstantiationException | IllegalAccessException
| InvocationTargetException | NoSuchMethodException
| IntrospectionException | NoSuchFieldException e
| ParseException e) {
e.printStackTrace();
}
return null;
}
  • 校验对象中是否有指定属性
/**
* 校验对象中是否有指定属性
* @param type 对象的类型
* @param fieldName 属性名
* @return 是/否
*/
public static boolean checkObjectHasField(Class type,String fieldName) {
Field[] fields = type.getDeclaredFields();
for (Field field : fields) {
if (field.getName().equals(fieldName)) {
return true;
}
}
return false;
}
  • DateTimeFormatting注解
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface DateTimeFormatting {
String value() default "yyyy-MM-dd";
}

JavaWeb之如何把请求数据转成实体类的更多相关文章

  1. 使用反射将DataTable的数据转成实体类

    利用反射避免了硬编码出现的错误,但是实体类的属性名必须和数据库名字对应(相同) 1.利用反射把DataTable的数据写到单个实体类 /// <summary> ///利用反射把DataT ...

  2. 【转】C#中将JSon数据转换成实体类,将实体类转换成Json

    http://wo13145219.iteye.com/blog/2022667 http://json2csharp.chahuo.com/ using System; using System.C ...

  3. xml格式报文的拼装,和解析成实体类

    我们的微信支付,使用的是第三方的支付,某银行的微信支持渠道.所有的接口请求.应答都是xml格式报文,这样就需要用到xml格式报文的拼装和解析,这儿简单讲一下. 拼接xml格式报文. 从页面表单提交和配 ...

  4. Mybaits 源码解析 (八)----- 全网最详细,没有之一:结果集 ResultSet 自动映射成实体类对象(上篇)

    上一篇文章我们已经将SQL发送到了数据库,并返回了ResultSet,接下来就是将结果集 ResultSet 自动映射成实体类对象.这样使用者就无需再手动操作结果集,并将数据填充到实体类对象中.这可大 ...

  5. C# 将DataTable数据源转换成实体类

    using System; using System.Collections.Generic; using System.Data; using System.Reflection; /// < ...

  6. 使用Sql语句快速将数据表转换成实体类

    开发过程中经常需要根据数据表编写对应的实体类,下面是使用sql语句快速将数据表转换成对应实体类的代码,使用时只需要将第一行'TableName'引号里面的字母换成具体的表名称就行了: declare ...

  7. Spring MVC如何接收浏览器传递来的请求参数--request--形参--实体类封装

    阅读目录 1. 通过HttpServletRequest获得请求参数和数据 2. 处理方法形参名==请求参数名 3. 如果形参名跟请求参数名不一样怎么办呢?用@RequestParam注解 4. 用实 ...

  8. 0056 Spring MVC如何接收浏览器传递来的请求参数--request--形参--实体类封装

    浏览器总会向服务器传递一些参数,那么Spring MVC如何接收这些参数? 先写个简单的html,向服务器传递一些书籍信息,如下: <!DOCTYPE html> <html> ...

  9. python中操作excel数据 封装成一个类

    本文用python中openpyxl库,封装成excel数据的读写方法 from openpyxl import load_workbook from openpyxl.worksheet.works ...

随机推荐

  1. http多路复用?

    Keep-Alive: Keep-Alive解决的核心问题:一定时间内,同一域名多次请求数据,只建立一次HTTP请求,其他请求可复用每一次建立的连接通道,以达到提高请求效率的问题.这里面所说的一定时间 ...

  2. 说说对 SQL 语句优化有哪些方法?(选择几条)

    1.Where 子句中:where 表之间的连接必须写在其他 Where 条件之前,那些可 以过滤掉最大数量记录的条件必须写在 Where 子句的末尾.HAVING 最后. 2.用 EXISTS 替代 ...

  3. Scanner几个问题与正则简介

    Pre:最近做了头条的在线笔试,对Scanner输入的处理有些特殊,当时是一脸懵逼态,遂由此随笔(/@_@\),java小白,有错难免! 查了下Scanner的源码,没有头绪,但是其中用到了正则的知识 ...

  4. SynchronizedMap 和 ConcurrentHashMap 有什么区 别?

    SynchronizedMap 一次锁住整张表来保证线程安全,所以每次只能有一个线程来 访为 map. ConcurrentHashMap 使用分段锁来保证在多线程下的性能. ConcurrentHa ...

  5. Switch语句的条件只能接受什么类型的值

    switch语句只能针对基本数据类型使用,这些类型包括int.char.枚举.bool等.对于其他类型,则必须使用if语句. 在一个 switch 中可以有任意数量的 case 语句.每个 case ...

  6. 线程 B 怎么知道线程 A 修改了变量?

    1.volatile 修饰变量 2.synchronized 修饰修改变量的方法 3.wait/notify 4.while 轮询

  7. 学习Nginx(三)

      nginx的性能测试及常用优化手段 一.nginx的性能测试及对比 1.环境准备 [root@test8_hadoop_kaf ~]# yum install -y httpd-tools [ro ...

  8. idea中web项目的创建

    在idea中创建web项目 1)创建一个普通的Java项目 2)右键项目选择ADD Framework Support  3)勾选JavaEE 4)添加jar包 点击Project Structure ...

  9. c++中的赋值函数

    在c++中,对于任意一个类Class A,如果程序员不显示的声明和定义上述函数,C++编译器将会自动的为A产生4个public inline 的默认函数,这4个函数最常见的形式为: A() //默认构 ...

  10. Anaconda 怎么安装cv2

    Anaconda run python程序的时候,如果有import cv2, 但是遇到报错的时候, 可以考虑在anaconda 中安装opencv, 安装过程非常简单. 什么是opencv , op ...