在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();
        }
    }

加油每一天!😊