经过一段时间的探索,昨天总算将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));
}
}