关于将request的参数自动加入到javaBean中的实践

该博客分享了如何利用Java实现将HTTP请求的参数自动填充到JavaBean中,通过反射技术获取请求参数并调用Bean的set方法进行赋值。代码包括处理不同数据类型的转换方法,以及对数组参数的支持。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

经过一段时间的探索,昨天总算将request参数自动加入到JavaBean中测试成功,现将代码摘录如下:

 package test;

import java.io.Serializable;
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.DateFormat;
import java.text.ParseException;
import java.util.Enumeration;

import javax.servlet.http.HttpServletRequest;

public class TransBean {
/**
 * 根据request传来的参数,和指定的实体Bean的属性进行比较,将二者名称相同的参数转换成属性类型的值,
 * 并调用相应的set方法给Bean的属性赋值,
 * @param request
 * @param obj
 * @throws InvocationTargetException
 * @throws IllegalAccessException
 * @throws IllegalArgumentException
 */
 public static void transBean(HttpServletRequest request, Object obj) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
  Class objClass = obj.getClass();
  Method[] methods = objClass.getMethods();// 获得该Bean的所有方法的数组
  Field field = null;
  String methName = "";// 方法名
  String fieldName = "";// 属性名set方法后面的名字第一个字母改成小写
  String paramValue = "";// 请求参数字符串数值
  String[] paramValues=null;//请求参数字符串数组

  for (int i = 0; i < methods.length; i++) {// 遍历方法数组,目的是找出所有的set方法
   methName = methods[i].getName();//获得方法名
   if (methName.startsWith("set")) {// 如果是以set开头的方法则调用他
    fieldName = toLowerCase(methName);//调用自身的转换方法将set方法后的名字的第一个字母转换成小写
    
    Class[] calss = methods[i].getParameterTypes();// 获得set方法的参数类型数组
    Class paramType = calss[0];// set方法只有一个参数,故取得第一个参数类型
    
    if(paramType.isArray()){//如果set方法参数类型是数组则应该调用获得数组方法
     paramValues=request.getParameterValues(fieldName);
     Class arrayType=paramType.getComponentType();//获得数组的类型
     System.out.println("arrayType="+arrayType.getName());
     Object objArray=convertArray(paramValues,arrayType);
     methods[i].invoke(obj, objArray);//调用set方法给数组属性赋值     
    }else{     
     paramValue = request.getParameter(fieldName);// 根据字段名从请求对象中获取相应参数
     if (paramValue != null||paramValue!="") {// 如果按照此参数名获得参数值不为空,则调用set方法给其属性赋值
      try {
       Serializable setValue = convert(paramValue, paramType);//将字符串参数转换为指定的类型的值
       methods[i].invoke(obj, setValue);//调用set方法给属性赋值
      } catch (Exception e) {       
       //如果setValue的值是null,则会抛出异常,此时可以不管它       
      }
     }
    }
   }
  }
 }

 /**
  * 将传入的字符串参数转化成制定的数据类型,如果格式不匹配则返回null
  * @param <T>
  * @param param 要转换的参数字符串
  * @param clas 转换的目标CLASS
  * @return
  */
 private static <T extends Serializable> T convert(String param, Class clas) {
  if (param == null || param == "" || clas == null)
   return null;
  String type = clas.getName();// 获得要转换的数据类型名称
  //System.out.println(type);
  if (type.equals("java.lang.String"))
   return (T) param;
  try {//根据不同类型的属性,返回不同的结果,如果出现异常,则返回null
   if (type.equals("java.util.Date")) {    
    return (T) new java.util.Date(java.sql.Date.valueOf(param).getTime());
   }
   if (type.equals("java.sql.Date")) {
    return (T) java.sql.Date.valueOf(param);
   }
   if (type.equals("java.sql.Timestamp")) {
    return (T) java.sql.Timestamp.valueOf(param);
   }
   if (type.equals("java.lang.Char")) {
    return (T) Character.valueOf(param.charAt(0));
   }
   if (type.equals("java.lang.Integer") || type.equals("int")) {
    return (T) new Integer(param);
   }
   if (type.equals("java.lang.Double") || type.equals("double")) {
    return (T) new Double(param);
   }
   if (type.equals("java.lang.Float") || type.equals("float")) {
    return (T) new Double(param);
   }
   if (type.equals("java.lang.Byte") || type.equals("boolean")) {
    return (T) new Boolean(param);
   }
   if (type.equals("java.lang.Short") || type.equals("short")) {
    return (T) new Short(param);
   }
   if (type.equals("java.lang.Long") || type.equals("long")) {
    return (T) new Long(param);
   }
   if (type.equals("java.lang.Boolean") || type.equals("boolean")) {
    return (T) new Boolean(param);
   }
  } catch (Exception e) {
  }
  return null;
 }
 
 /**
  * 将传入的字符串数组参数转化成指定的数据类型的数组,如果格式不匹配则返回null
  * @param <T>
  * @param param 要转换的参数字符串
  * @param clas 转换的目标CLASS
  * @return
  */
 private static Object convertArray(String[] param, Class clas) {
  if (param == null|| clas == null)
   return null;
  String type = clas.getName();// 获得要转换的数据类型名称
  
  Object array= Array.newInstance(clas,param.length);//创建指定类型的数组对象
  if (type.equals("java.lang.String")){
   return param;
  }
  if(type.equals("java.util.Date")||type.equals("java.sql.Date")||type.equals("java.sql.Timestamp")){
   
  }
   
  try {//根据不同类型的属性,返回不同的结果,如果出现异常,则返回null   
   if (type.equals("java.lang.Character")) {
    
    for(int i=0;i<param.length;i++){
     Array.setChar(array,1,param[i].charAt(i));
    }
    return array;
   }
   if (type.equals("java.lang.Integer") || type.equals("int")) {
    for(int i=0;i<param.length;i++){
     Array.setInt(array,i,Integer.parseInt(param[i]));
    }
    return array;
   }
   if (type.equals("java.lang.Double") || type.equals("double")) {
    for(int i=0;i<param.length;i++){
     Array.setDouble(array,i,Double.parseDouble(param[i]));
    }
    return array;
   }
   if (type.equals("java.lang.Float") || type.equals("float")) {
    for(int i=0;i<param.length;i++){
     Array.setFloat(array,i,Float.parseFloat(param[i]));
    }
    return array;
   }
   if (type.equals("java.lang.Byte") || type.equals("byte")) {
    for(int i=0;i<param.length;i++){
     Array.setByte(array,i,Byte.parseByte(param[i]));
    }
    return array;
   }
   if (type.equals("java.lang.Short") || type.equals("short")) {
    for(int i=0;i<param.length;i++){
     Array.setShort(array,i,Short.parseShort(param[i]));
    }
    return array;
   }
   if (type.equals("java.lang.Long") || type.equals("long")) {
    for(int i=0;i<param.length;i++){
     Array.setLong(array,i,Long.parseLong(param[i]));
    }
    return array;
   }
   if (type.equals("java.lang.Boolean") || type.equals("boolean")) {
    for(int i=0;i<param.length;i++){
     Array.setBoolean(array,i,Boolean.parseBoolean(param[i]));
    }
    return array;
   }
  } catch (Exception e) {
  }
  return null;
 }

 // 将set方法名后面的第一个字母变成小写
 private static String toLowerCase(String methName) {
  String fieldName = "";

  fieldName = methName.substring(3);// 取得set后面的方法名的字符串
  Character firstChar = fieldName.charAt(0);
  firstChar = Character.toLowerCase(firstChar);
  fieldName = firstChar + fieldName.substring(1);// 将首字母小写

  return fieldName;
 }

 // private Static

 public static void main(String[] ss) {
  // System.out.println(toLowerCase("setManName"));
  System.out.println(convert("2010-9-9", java.util.Date.class));
 }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值