JavaWeb之如何把请求数据转成实体类
JavaWeb之如何把请求数据转成实体类
- 自己写个工具类加入下面两个静态方法
- 自定一个注解类DateTimeFormatting
- 调用方式
User user = util.ObjectFromMap(req.getParameterMap(), User.class)
- 暂时支持8种基本数据类型对应包装类、
BigDecimal
、java.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之如何把请求数据转成实体类的更多相关文章
- 使用反射将DataTable的数据转成实体类
利用反射避免了硬编码出现的错误,但是实体类的属性名必须和数据库名字对应(相同) 1.利用反射把DataTable的数据写到单个实体类 /// <summary> ///利用反射把DataT ...
- 【转】C#中将JSon数据转换成实体类,将实体类转换成Json
http://wo13145219.iteye.com/blog/2022667 http://json2csharp.chahuo.com/ using System; using System.C ...
- xml格式报文的拼装,和解析成实体类
我们的微信支付,使用的是第三方的支付,某银行的微信支持渠道.所有的接口请求.应答都是xml格式报文,这样就需要用到xml格式报文的拼装和解析,这儿简单讲一下. 拼接xml格式报文. 从页面表单提交和配 ...
- Mybaits 源码解析 (八)----- 全网最详细,没有之一:结果集 ResultSet 自动映射成实体类对象(上篇)
上一篇文章我们已经将SQL发送到了数据库,并返回了ResultSet,接下来就是将结果集 ResultSet 自动映射成实体类对象.这样使用者就无需再手动操作结果集,并将数据填充到实体类对象中.这可大 ...
- C# 将DataTable数据源转换成实体类
using System; using System.Collections.Generic; using System.Data; using System.Reflection; /// < ...
- 使用Sql语句快速将数据表转换成实体类
开发过程中经常需要根据数据表编写对应的实体类,下面是使用sql语句快速将数据表转换成对应实体类的代码,使用时只需要将第一行'TableName'引号里面的字母换成具体的表名称就行了: declare ...
- Spring MVC如何接收浏览器传递来的请求参数--request--形参--实体类封装
阅读目录 1. 通过HttpServletRequest获得请求参数和数据 2. 处理方法形参名==请求参数名 3. 如果形参名跟请求参数名不一样怎么办呢?用@RequestParam注解 4. 用实 ...
- 0056 Spring MVC如何接收浏览器传递来的请求参数--request--形参--实体类封装
浏览器总会向服务器传递一些参数,那么Spring MVC如何接收这些参数? 先写个简单的html,向服务器传递一些书籍信息,如下: <!DOCTYPE html> <html> ...
- python中操作excel数据 封装成一个类
本文用python中openpyxl库,封装成excel数据的读写方法 from openpyxl import load_workbook from openpyxl.worksheet.works ...
随机推荐
- Oracle 数据库应用开发 30 忌
原创 LaoYuanPython CSDN 今天 作者 | LaoYuanPython 责编 | 欧阳姝黎出品 | CSDN原力计划 引言 笔者及所在团队从 2000 年开始的 CRM 等 ...
- switch语句能否作用在byte上,能否作用在long上,能否作用在String上?
在Java 7以前,在switch(expr1)中,expr1只能是一个整数表达式(但不包括long和Long)或者枚举常量,整数表达式可以是int基本类型或Integer包装类型,byte.shor ...
- 什么是 zuul路由网关?
(1)Zuul 包含了对请求的路由和过滤两个最主要的功能:其中 责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础而过滤器功能则负 请求的处理过程进行干预,是实现请求校验.服务聚合等功 ...
- 在多线程环境下,SimpleDateFormat 是线程安全的吗?
不是,非常不幸,DateFormat 的所有实现,包括 SimpleDateFormat 都不是 线程安全的,因此你不应该在多线程序中使用,除非是在对外线程安全的环境中 使用,如 将 SimpleDa ...
- centos 7环境下安装jdk
在此之前已经安装了xshell并能传输文件. 1.下载对应版本的jdk:jdk-8u191-linux-x64.tar.gz 2.上传到centos的目录下 3.解压jdk的gz包,命令: tar - ...
- MyBatis Plus 2.3 个人笔记-02-基本注解
实体类注解 /* * MybatisPlus会默认使用实体类的类名到数据中找对应的表. * */ @TableName("tbl_employee") public class E ...
- vue 3d轮播组件 vue-carousel-3d
开发可视化项目时,需要3d轮播图,找来找去发现这个组件,引用简单,最后实现效果还不错.发现关于这个组件,能搜到的教程不多,就分享一下我的经验. 插件github地址:https://wlada.git ...
- poj_2386_dfs
描述 由于最近的一场雨,农夫john的田地里很多地方流入了水,由一个N*M的矩形表示.每个方格要么有水(W)要么是干的(.).农夫想要知道他的田地里形成了多少池塘. 一个池塘由有水的方块相连,每个方块 ...
- PAT B1071 小赌怡情
题目描述: 常言道"小赌怡情".这是一个很简单的小游戏:首先由计算机给出第一个整数:然后玩家下注赌第二个整数将会比第一个数大还是小:玩家下注 t 个筹码后,计算机给出第二个数.若玩 ...
- for 循环详解
学习目标: 掌握 for 循环的使用 学习内容: 1.for语法 for(初始化语句; boolean表达式; 循环后操作语句) { 循环体; } 流程图如下: 特点: 初始化语句:只在循环开始时执行 ...