神器降临,从Form表单接收JavaBean对象,支持时间日期类型,支持前缀

概要:

神器降临,可以从Form表单直接接收一个JavaBean对象,实现了Java POJO Bean 对象与 Web Form 表单的自动装配,支持java.util.Date类型的直接接收,支持指定属性前缀。

| |目录

神器降临,可以从Form表单直接接收一个JavaBean对象,而且支持多层次属性注入,支持java.util.Date类型的直接接收,支持指定属性前缀。


用到的jar包:commons-beanutils-1.8.0.jar


工具类源码:BeanHelper 

package com.itshidu.commons.util;
import java.lang.reflect.InvocationTargetException;
import java.util.Date;
import java.util.Enumeration;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.beanutils.converters.DateConverter;

/**
 * Bean辅助工具,可以从Form表单中直接读取bean对象,也可以为bean对象设置多级属性
 * @author Mr.Xia v1.0	Date:2017年1月14日02:43:37
 */
public class BeanHelper {
	
	static {
		DateConverter converter = new DateConverter();
		converter.setPatterns(new String[]{"yyyy-MM-dd HH:mm:ss","yyyy-MM-dd"});
		ConvertUtils.register(converter, Date.class);
	}  

	/**
	 * 使用表单数据构建bean对象(只注入名称匹配的属性)
	 * @param request
	 * @param prefix
	 * @param c
	 * @return
	 * @throws IllegalAccessException
	 * @throws InvocationTargetException
	 * @throws InstantiationException
	 * @throws SecurityException
	 * @throws NoSuchMethodException
	 */
	public static <T> T bean(HttpServletRequest request,Class<T> c) throws IllegalAccessException, InvocationTargetException, InstantiationException, SecurityException, NoSuchMethodException{
		return (T) bean(request, null, c);
	}
	/**
	 * 使用表单数据构建bean对象(只注入名称匹配的属性)
	 * prefix用于指定前缀,当值为a时会处理以a.开头的参数(例如a.name,a.age),null或""时代表无前缀
	 * @param request
	 * @param prefix
	 * @param c
	 * @return
	 * @throws IllegalAccessException
	 * @throws InvocationTargetException
	 * @throws InstantiationException
	 * @throws SecurityException
	 * @throws NoSuchMethodException
	 */
	public static <T> T bean(HttpServletRequest request,String prefix,Class<T> c) throws IllegalAccessException, InvocationTargetException, InstantiationException, SecurityException, NoSuchMethodException{
		T obj = c.newInstance();
		Enumeration<?> pNames=request.getParameterNames();
		while(pNames.hasMoreElements()){
			String name=(String)pNames.nextElement();
			String[] value=request.getParameterValues(name);
			if(prefix!=null&&!prefix.isEmpty()){
				if(name.startsWith(prefix+".")){
					name = name.substring(prefix.length()+1);
				}else{
					break;
				}
			}
			setProperty(obj, name, value);
		}
		return (T) obj;
	}
	/**
	 * 设置对象的属性,pname支持多级,value可以是数组或对象
	 * 例1:setProperty(obj, "username","悟空");
	 * 例2:setProperty(obj, "category.parent.id",12);
	 * 例3:setProperty(obj, "title",12);
	 * @param obj
	 * @param pname
	 * @param value
	 * @throws IllegalAccessException
	 * @throws InvocationTargetException
	 * @throws InstantiationException
	 * @throws NoSuchMethodException
	 */
	static void setProperty(Object obj,String pname,Object value) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException, InstantiationException{
		if(pname.contains(".")){
	    	String fn1 = pname.substring(0,pname.indexOf("."));
	    	if(PropertyUtils.getPropertyType(obj, fn1)==null)return;
	    	String fn2 = pname.substring(pname.indexOf(".")+1,pname.length());
	    	BeanUtils.setProperty(obj, fn1, PropertyUtils.getPropertyType(obj, fn1).newInstance());
	    	setProperty(PropertyUtils.getProperty(obj, fn1), fn2,value);
	    }else{
	    	BeanUtils.setProperty(obj, pname, value);
	    }
	}
	
}



评论关闭
评论 还能输入200
评论关闭
评论 还能输入200
  • 全部评论(0)
资料加载中...
已关注 , 取消