在WEB项目中,利用反射得到jsp页面的数据并完成给对应对象的赋值
目标—定义工具类,添加转换方法。实现从请求取值并调用javaBean中相关setter访问器
1>定义一个工具类
public class UtilParameter{
/**
* 将HTTP请求的参数赋值给指定类型JavaBean的相关属性
*/
public static Object method01(HttpServletRequest req, Class classs){ }
/**
* 此方法将请求参数值转换为相关属性的类型
*/
public static Object parseValue(String [] value, Class type){ }
}
2>创建将HTTP请求的参数赋值给指定类型JavaBean的相关属性的方法
/**
* 将HTTP请求的参数赋值给指定类型JavaBean的相关属性
* @param req http请求
* @param classs 目标JavaBean类型
* @return classs类型的实例
* @throws Exception
*/
public static Object method01(HttpServletRequest req, Class classs)throws Exception{
// 创建类的实例
Object object=classs.newInstance();
//获得object中所有方法
Method[] methods=classs.getDeclaredMethods();
//获得表单中所有的文本域的name---从jsp页面获得
Enumeration<String> parameteNames = req.getParameterNames();
//判断如果表单中有元素就进入循环
while(parameteNames.hasMoreElements()) {
//获得每个文本域的name
String parameteName = parameteNames.nextElement();
//因为无法判断文本域是否是单值或者双值,所以我们全部使用双值接收
String[] parameteValues = req.getParameterValues(parameteName);
//判断如果这个name对应的值为空,或不存在,直接进行下一次循环
if(parameteValues==null||parameteValues.length<=0){
continue;
}
//打印parameteValues查看jsp页面输入的值是否拿到
// for (String parameteValue : parameteValues) {
// System.out.println("-----"+parameteValue);
// }
//遍历某类中的所有方法,从而获取setXXX()方法
for (Method method : methods) {
//对set开头的方法进行筛选
if (method.getName().startsWith("set")) {
//得到此方法的参数列表
Class[] parameterTypes = method.getParameterTypes();
//获取setXxx方法的Xxx...并把其转换为小写
String currentName = method.getName().substring(3,4).toLowerCase()+method.getName().substring(4);
//判断如果此参数列表只有一个参数
if (parameterTypes.length == 1) {
//把从jsp页面获取的name参数名称与currentName做对比,如果一样,就执行赋值操作
if (currentName.equals(parameteName)) {
//放入参数值之前对参数列表类型进行判断---parseValue()方法
Object obj=parseValue(parameteValues,parameterTypes[0]);
method.invoke(object,obj);
}
}
}
}
}
return object;
}
3>创建一个将请求参数值转换为相关属性类型的方法
/***
*
* 此方法将请求参数值转换为相关属性的类型
* @param value 对应值的类型
* @param type 参数类型
* @return 返回的值 各个类型
* @throws Exception 抛出错误
*/
public static Object parseValue(String [] value, Class type)throws Exception{
//如果是数组进入if块
if (type.isArray()) {
//获取type的类型
Class componentType = type.getComponentType();
//如果是String类型执行
if (String.class == componentType)
return value;
else {//如果是其他类型
//创建一个数组类型是componentType类型,长度是传过来的数组长度
//newInstance()方法的返回值是Object类型
Object result = Array.newInstance(componentType, value.length);
int i = 0;
for (String one : value)
//set方法用于给指定数组赋值
Array.set(result, (i++), parseValue(new String[]{one}, componentType));
return result;
}
}
//如果是String类型
if(type==String.class){
return value[0];
}
//如果是Boolean类型,默认给true,如有需要可根据需要更改
if(type==Boolean.class ||type==boolean.class){
return true;
}
//古国是double类型
if(type==double.class||type==Double.class){
return Double.parseDouble(value[0]);
}
//如果是short类型
if(type==Short.class ){
return Short.parseShort(value[0]);
}
//如果是long类型
if(type==Long.class ){
return Long.parseLong(value[0]);
}
//如果是int类型
if (type==int.class||type==Integer.class){
return Integer.parseInt(value[0]);
}
//如果是Date类型,其日期格式也可以根据需要更改
if (Date.class==type){
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
return sdf.parse(value[0]);
}
//如果是char类型
if(char.class==type||Character.class==type){
return value[0].charAt(0);
}
//找不到此类型返回null
return null;
}
以上工具类就已完成。注意的是,jsp页面中表单元素的name值要与pojo中实体类的属性一一对应(名字要一样)。
4>测试
在新增的servlet中的doGet()或doPost()方法中调用此转换方法
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
try {
UserInfoServiceImpl userInfoService=new UserInfoServiceImpl();
//得到某类的类信息
Class cls=Class.forName("cn.bscp.pojo.UserInfo");
//调用工具类中的转换方法,完成指定对象的赋值
UserInfo userInfo=(UserInfo) UtilParameter.method01(req,cls);
//调用新增的方法
int result= userInfoService.InsertUserInfo(userInfo);
if(result>0){
System.out.println("新增成功");
}else {
System.out.println("新增失败");
}
} catch (Exception e) {
e.printStackTrace();
}
}
加油每一天!😊