动态获取request对象中的元素封装至实体类中

在写java 的jsp的时候 我写了太多的 request.getparameter("") 写吐的不行不行的了 又不想用框架  想直接写一个工具将数据利用反射机制 封装到实体类中  哈哈 所以说 懒是第一生产力


废话少说 先看 需求 

1.得到用户传入的 HttpServletRequest  对象  

2.得到用户传入的javabean 的类对象 (用于反射生成实体类)

3.将数据按照javabean中的属性进行一对一映射


难点 

1.如何使 javabean的属性和表单中的name 一一对应 

2如何将将值动态传给属性


如何解决

1.java 的反射


1我们取得request 的请求参数 map(键值对)

2取得实体类的属性数组

3便利属性集合数组  (这里 我们以javabean为基准 why? 见为下文)

public Object inputRequestReturnEntity(Class clazz, HttpServletRequest request)
			throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException,
			InvocationTargetException, NoSuchMethodException, SecurityException {

		// Class clazz = CreateClass(ClassName);
		// 便利request中的所有请求参数及参数值
		// Enumeration enumeration = request.getParameterNames();
		Map map = request.getParameterMap();
		// 得到请求参数列表
		Set names = analysisProperty(map);
		// 开始填充实体类
		Object object = stuffEntity(clazz, map, names);
		return object;
	}


我们先说明一下 为什么以javabean为基准进行便利 

原因是  request中的请求参数 一定等于javabean的属性 而我们的目的是填充 javabean 对象 


之后的问题就是 比较 我们 的比较分为两种  (为了便于比较,我们首先将两个参数转为小写)

1.javabean属性的name equals request 的请求参数的请求参数

2. request 的请求参数的请求参数 包含 javabean属性的 name 

public Object stuffEntity(Class clazz, Map map, Set names) throws IllegalAccessException,
			IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {

		// 实例化此对象
		Object obj = CreatenewInstance(clazz);

		Field[] fields = clazz.getDeclaredFields();
		// Method[] methods = clazz.getMethods();

		// 以持久化类的属性为 基准 每比较一次属性 就便利循环一遍请求参数集合
		for (Field f : fields) {
			String name = f.getName();
			for (String param : names) {
				// 如果存在 相同参数
				if (StringUtilAndTools.ComparisonNameWithProperty(param, name)) {
					String paramvalue = map.get(param)[0];// 得到改请求参数 的值
					obj = setPropertyValue(f, paramvalue, obj, clazz);
					// 开始对属性赋值
					break;
				}
			}

		}
		return obj;
	}



在时候 我们利用 javabean的set 方法 填入值  

找一下相同点 :

所有的set方法均以set开头 属性的第一个字母会变为大写 

例子:

private String name;
public void setName(String name){
          this.name =name
}

所以 解决方法就是 

public Object setPropertyValue(Field field, String paramvalue, Object obj, Class clazz)
			throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException,
			SecurityException {

		// 得到当前类的 方法名和 传入值类型
		Method method = clazz.getDeclaredMethod(StringUtilAndTools.CreateFieldToMethod(field.getName()),field.getType());
		// 利用当前方法传入 已经实例化的对象 并且 传入值类型
		method.invoke(obj, StringUtilAndTools.judgmentC(field.getType(), paramvalue));

		return obj;
	}


顺带着的我们 将属性名的首字母大写 加上set就ok了

 public Method getDeclaredMethod(String name, Class... parameterTypes)
        throws NoSuchMethodException, SecurityException {
        checkMemberAccess(Member.DECLARED, Reflection.getCallerClass(), true);
        Method method = searchMethods(privateGetDeclaredMethods(false), name, parameterTypes);
        if (method == null) {
            throw new NoSuchMethodException(getName() + "." + name + argumentTypesToString(parameterTypes));
        }
        return method;
    }

之后 我们看 这是需要根据类型 传入 值啊 

so

public static Object judgmentC(Class clazzType, String paramvalue) {

		// 得到此类的 SimpleName
		String typename = clazzType.getSimpleName();

		// 得到 转换方法类 的类型
		Class clazz = ConvertClazz.class;

		Object object = null;
		try {
			//
			Object ConvertObj = clazz.newInstance();
			Method method = clazz.getDeclaredMethod("convert" + typename, String.class);
			object = method.invoke(ConvertObj, paramvalue);
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return object;
	}

当然 我们为了程序的可扩展性将 转换方法又进行了 分方法 而且 也用了反射  

public class ConvertClazz {

	public  Object convertInteger(String paramvalue){
		return (Object)Integer.parseInt(paramvalue);
	}
	public Object convertDouble(String paramvalue){
		return (Object)Double.parseDouble(paramvalue);
	}
	public Object convertShort(String paramvalue){
		return (Object)Short.parseShort(paramvalue);
	}
	public Object convertLong(String paramvalue){
		return (Object)Long.parseLong(paramvalue);
	}
	public Object convertString(String paramvalue){
		return paramvalue;
	}
	public Object convertbyte(String paramvalue){
		return (Object)Byte.parseByte(paramvalue);
	}
}

ok 核心代码 结束 哈哈 :)


稍后会发布源代码 

https://github.com/FullMateL/Utils_

你可能感兴趣的:(java)