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 ...
随机推荐
- RenderDoc图形调试器详细使用教程(基于DirectX11)
前言 由于最近Visual Studio的图形调试器老是抽风,不得不寻找一个替代品了. 对于图形程序开发者来说,学会使用RenderDoc图形调试器可以帮助你全面了解渲染管线绑定的资源和运行状态,从而 ...
- InnoDB什么时候会锁表?
我们常常说InnoDB是行锁,但是这里介绍一下它锁表的情况. InnoDB行锁是通过索引上的索引项来实现的,这一点MySQL与Oracle不同,后者是通过在数据中对相应数据行加锁来实现的.InnoDB ...
- 为MySQL加锁?
在日常操作中,UPDATE.INSERT.DELETE InnoDB会自动给涉及的数据集加排他锁,一般的 SELECT 一般是不加任何锁的.我们可以使用以下方式显示的为 SELECT 加锁. 共享锁: ...
- 什么是Spring的MVC框架?
Spring 配备构建Web 应用的全功能MVC框架.Spring可以很便捷地和其他MVC框架集成,如Struts,Spring 的MVC框架用控制反转把业务对象和控制逻辑清晰地隔离.它也允许以声明的 ...
- jvm-learning-双亲委派机制
是什么 工作原理 例子 优势 什么是沙箱安全机制 其他知识 对类加载器的引用 类的主动使用和被动使用
- ConcurrentHashMap 的并发度是什么 ?
ConcurrentHashMap 的并发度就是 segment 的大小,默认为 16,这意味着最多同时可以有 16 条线程操作 ConcurrentHashMap,这也是ConcurrentHash ...
- java-中的代理
静态代理: 例子: 接口: public interface InterfaceBase { void proxy(); } 接口实现类: public class InterfaceBaseReal ...
- 安装ESLint
安装ESLint ESLint是静态代码检查工具,配合TypeScript使用可以帮助检查TypeScript的语法和代码风格. 添加ESLint到当前工程,yarn add -D eslint. 使 ...
- 微信小程序 使用filter过滤器几种方式
由于微信小程序 技术生态比较闭合,导致很多 现代前端框架很多积累出的成果都没有实现(可能未来会逐一实现). 用惯了现代 再耍小程序 总感觉很不顺手. 需要结果的请直接看最后的WXS View Filt ...
- 深入解析丨母婴App如何迅速收割2W新用户?
在讲案例前,我们需要先说一下精细化分析. 我们常说的精细化分析,就是一个持续"解构"的过程,通过像漏斗.留存.细分等高级分析功能,将"整体"按照事件属性解构成& ...