一般在Servlet获取Jsp页面传输过来的值的时候,都是通过声明一个String字符串参数调用request.getParameter()方法来获取,如果参数数量少,可以这样一个一个获取,当参数数量很多的时候就很不方便了,要写一堆request.getParameter()方法,如果还要装进person对象里面,就更不方便了,特别是做数据的新增或修改时候,获取了值之后还要调用set方法,一一装进对象里面,在这里提供一个反射工具类,它可以省略request.getParameter()和对象set设置值的使用,只需要调用这个工具类传入request参数和一个对象就可以获取到。代码如下:
package com.web.util;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.Date;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import javax.servlet.http.HttpServletRequest;
public class RequestHelper {
/**
* 把request请求的数据放到java对象中
*/
public static <T> T getSingleRequest(HttpServletRequest request,
Class<T> obj) {
// 创建实例
T instance = null;
try {
//获取对象所以成员变量
Field[] fields = obj.getDeclaredFields();
//获取对象实例
instance = obj.newInstance();
for (int i = 0; i < fields.length; i++) {
//获取成员变量名称
String name = fields[i].getName();
//判断成员变量是否含有serialVersionUID,有则跳过本次循环
if (name.equals("serialVersionUID")) {
continue;
}
//获取成员变量类型
Class<?> type = obj.getDeclaredField(name).getType();
// 首字母大写
String replace = name.substring(0, 1).toUpperCase()
+ name.substring(1);
// ---获取settter方法
Method setMethod = obj.getMethod("set" + replace, type);
//获取页面传输值
String str = request.getParameter(replace);
if (str == null || "".equals(str)) {
// 首字母小写
String small = name.substring(0, 1).toLowerCase()
+ name.substring(1);
str = request.getParameter(small);
}
//判断页面传输值是否为空,若不为空则调用set方法设置值,若为空则结束本次循环
if (str != null && !"".equals(str)) {
// ---判断读取数据的类型
if (type.isAssignableFrom(String.class)) {
setMethod.invoke(instance, str);
} else if (type.isAssignableFrom(int.class)
|| type.isAssignableFrom(Integer.class)) {
setMethod.invoke(instance, Integer.parseInt(str));
} else if (type.isAssignableFrom(short.class)
|| type.isAssignableFrom(Short.class)) {
setMethod.invoke(instance, Short.parseShort(str));
} else if (type.isAssignableFrom(Double.class)
|| type.isAssignableFrom(double.class)) {
setMethod.invoke(instance, Double.parseDouble(str));
} else if (type.isAssignableFrom(Boolean.class)
|| type.isAssignableFrom(boolean.class)) {
setMethod.invoke(instance, Boolean.parseBoolean(str));
} else if (type.isAssignableFrom(Date.class)) {
SimpleDateFormat dateFormat = new SimpleDateFormat(
"yyyy-MM-dd");
setMethod.invoke(instance, dateFormat.parse(str));
} else if (type.isAssignableFrom(Timestamp.class)) {
SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
setMethod.invoke(instance, new estamp(dateFormat.parse(str).getTime()));
}
}
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
return instance;
}
}
工具类调用方法如下,假如在新增用户保存的时候怎样调用上面反射类获取页面值:
public void addSave(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//声明一个对象接受RequestHelper类返回来的实例
User user = RequestHelper.getSingleRequest(request, User.class);
System.out.println("用户名:" + user.getUsername() + "\t" + "密码:"
+ user.getPassword());
String str = userService.insert(user);
System.out.println(str);
}
代码执行结果如下: