介绍
- 当用户在网页输入框中输入数据,后端可以通过三种方式获取用户输入的数据。
第一种(简单)
使用
getParameter("xxx")
获取
- 代码示例:
String username = req.getParameter("username"); String password=req.getParameter("password"); String gender=req.getParameter("gender"); String[] hobby = req.getParameterValues("hobby");
第二种(比较复杂)
- 为什么比较复杂呢?因为这种方法使用
反射和内省
来实现封装数据。- 条件:
- 需要创建一个对应的实体类
- 实体类要变量命名和变量类型都有相应的要求,要求变量名跟提交参数的key(输入框中的name属性值)相同,变量跟参数类型相同!
- 代码示例:
//实体类 User user = new User(); //获取Map集合 Map<String, String[]> parameterMap = request.getParameterMap(); for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) { String name= entry.getKey(); try { PropertyDescriptor pd = new PropertyDescriptor(name,user.getClass()); if(pd!=null) { Method writeMethod = pd.getWriteMethod(); String[] value = entry.getValue(); if(pd.getPropertyType().isArray()){ writeMethod.invoke(user,(Object)value); }else{ writeMethod.invoke(user,value[0]); } }else{ continue; } } catch (Exception e) { e.printStackTrace(); continue; } }
第三种
使用Apache BeanUtils进行快速映射
- 作用:用来封装客户端发送的数据
- 需要导入对应jar包:
- commons-beanutils-1.9.3.jar
- commons-logging-1.2.jar
- commons-collections-3.2.1.jar(可选,使用集合时使用)
- 条件:
- 实体类
- 实体类要变量命名和变量类型都有相应的要求,要求变量名跟提交参数的key(输入框中的name属性值)相同,变量跟参数类型相同!
BeanUtils工具类的使用
- 代码示例:
//实体类需要和输入框中name属性值相对应,否则无法获取 User user1 = new User(); User user2 = new User(); //封装参数到实体类中 BeanUtils.populate(user1, request.getParameterMap()); //拷贝参数到另一个实体类中 BeanUtils.copyProperties(user2,user1); System.out.println(user1); System.out.println(user2);
遇到的问题
- BeanUtils封装参数时遇到的问题
- BeanUtils不能封装
Date
类型BigDecimal
数据为空(null)时,会出现异常,因为BigDecimal不能为空。
- 解决方法:
- 再封装之前写
转换器(ConvertUtils)
- 代码示例:
//添加String转Date类型的转换器 ConvertUtils.register(new Converter() { @Override public <T> T convert(Class<T> aClass, Object o) { if (o==null){ return null; } if (o instanceof String){ SimpleDateFormat[] sdf = { new SimpleDateFormat("yyyy-MM-dd"), new SimpleDateFormat("yyyy/MM/dd"), new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"), new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"), }; String str = (String) o; for (SimpleDateFormat simpleDateFormat : sdf) { try { return (T) simpleDateFormat.parse(str); } catch (ParseException e) { e.printStackTrace(); continue; } } } return null; } }, Date.class); //BigDecimal这个类型可以自动转换,但是BigDecimal不可为空时 //所以无法自动为BigDecimal赋值 ConvertUtils.register(new Converter() { @Override public <T> T convert(Class<T> aClass, Object o) { String str = (String) o; if(str==null||str.trim().length()==0){ return (T) new BigDecimal(0); } return (T) new BigDecimal(str); } },BigDecimal.class);