Servlet中三种获取客户端发送的数据

介绍

  • 当用户在网页输入框中输入数据,后端可以通过三种方式获取用户输入的数据。

第一种(简单)

使用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);


转载请注明:Memory的博客 » 点击阅读原文

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦