• 不使用BeanUtils,利用Java反射机制:表单数据自动封装到JavaBean


      在百度搜“java反射 将表单数据自动封装到javabean ”,第一页显示的都是一样的代码,都是利用导入第三方jar包<commons-beanutils>和<commons-logging>去实现。

      最近自己也研究的一下,不使用这两个第三方jar包,可不可以实现呢?--------------可以

    说明:以下代码是我自己写的,为了不占用太多篇幅,一些自动生成的代码我没有贴上

    开发环境:MyEclipse 10.7(亲测在MyEclipse 2014 上正常运行 

    web project 版本:Java EE 6.0

    JDK:1.7

    Tomcat服务器版本:apache-tomcat-7.0.53

      JSP页面:

     1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
     2 
     3 <html>
     4 <head>
     5 <script type="text/javascript">
     6         function submitForm(){
     7             document.myForm.submit();
     8         }
     9     </script>
    10 
    11 </head>
    12   
    13   <body>
    14     <form name="myForm" action="${pageContext.request.contextPath }/regServlet" method="post"> 
    15     <center>
    16     用户名:<input type="text" name="userName" value=""><br>
    17     密码:<input type="password" name="password" value=""><br>
    18     年龄:<input type="text" name="age" value=""><br>
    19     工资:<input type="text" name="salary" value=""><br>
    20     <input type="button" value="注册" onclick="submitForm()" >
    21     </center>
    22     </form>
    23   </body>
    24 </html>

      JAVABean:

     1 package com.it.beans;
     2 
     3 public class Users {
     4     private String userName;
     5     private String password;
     6     private int age;
     7     private float salary;
     8     
     9     public String getUserName() {
    10         return userName;
    11     }
    12     public void setUserName(String userName) {
    13         this.userName = userName;
    14     }
    15     public String getPassword() {
    16         return password;
    17     }
    18     public void setPassword(String password) {
    19         this.password = password;
    20     }
    21     public int getAge() {
    22         return age;
    23     }
    24     public void setAge(int age) {
    25         this.age = age;
    26     }
    27     public float getSalary() {
    28         return salary;
    29     }
    30     public void setSalary(float salary) {
    31         this.salary = salary;
    32     }
    33     
    34 }

      Servlet:

     1 package com.it.servlet;
     2 
     3 import java.io.IOException;
     4 import javax.servlet.ServletException;
     5 import javax.servlet.http.HttpServlet;
     6 import javax.servlet.http.HttpServletRequest;
     7 import javax.servlet.http.HttpServletResponse;
     8 
     9 import com.it.beans.Users;
    10 
    11 public class RegServlet extends HttpServlet {
    12 
    13   //这里只写了doGet()和doPost()方法,其他自动生成代码没有粘贴,请注意!
    14    public void doGet(HttpServletRequest request, HttpServletResponse response)
    15             throws ServletException, IOException {
    16 
    17         this.doPost(request, response);
    18     }
    19    public void doPost(HttpServletRequest request, HttpServletResponse response)
    20             throws ServletException, IOException {
    21         request.setCharacterEncoding("UTF-8");
    22         Users user=(Users)Utils.getBean(request,"com.it.beans.Users");
    23 
    24       //这里只做后台打印演示,其他转发跳转可自行补充
    25         System.out.println(user.getUserName());
    26         System.out.println(user.getPassword());
    27         System.out.println(user.getAge());
    28         System.out.println(user.getSalary());
    29     }    
    30     
    31 }

      Utils工具类:

     1 package com.it.servlet;
     2 
     3 import java.lang.reflect.InvocationTargetException;
     4 import java.lang.reflect.Method;
     5 import java.util.Enumeration;
     6 
     7 import javax.servlet.http.HttpServletRequest;
     8 
     9 public class Utils {
    10     //传入className字符串作为参数,只是想利用反射来实现这个功能
          //也可以传入Object obj一个对象,就看自己的设计了 11 public static Object getBean(HttpServletRequest request, String className) { 12 try { 13       //className为JavaBean路径,获取Class 14 Class c=Class.forName(className); 15      //利用反射读取构造,创建bean对象 16 Object obj=c.getConstructor().newInstance(); 17      //利用request获取所有表单项name,同时规范要求bean的属性名和表单项名必须一致。 18 Enumeration<String> enu=request.getParameterNames(); 19 while(enu.hasMoreElements()){ 20 String fieldName=enu.nextElement(); 21          //利用属性名获取set/get方法名 22 String setMethodName="set"+fieldName.substring(0,1).toUpperCase()+fieldName.substring(1); 23 String getMethodName="get"+fieldName.substring(0,1).toUpperCase()+fieldName.substring(1); 24         //获取无参的get方法 25 Method getMethod=c.getMethod(getMethodName, null); 26         //利用无参有返回值的get方法获得对应的set方法(get方法返回类型与set方法参数录入类型一致) 27 Method setMethod=c.getMethod(setMethodName, getMethod.getReturnType()); 28         //调用录入具体的参数值,保存到bean对象中。 29 String value=request.getParameter(fieldName); 30 31          //因为set方法中的参数类型不一样,因此要做相应的转换 32          switch (getMethod.getReturnType().getName()) { 33   case "int": 34   setMethod.invoke(obj, Integer.parseInt(value)); 35    break; 36   case "float": 37    setMethod.invoke(obj, Float.parseFloat(value)); 38   break; 39   case "double": 40    setMethod.invoke(obj, Double.parseDouble(value)); 41    break; 42   case "long": 43    setMethod.invoke(obj, Long.parseLong(value)); 44   break; 45   default: 46    setMethod.invoke(obj, value); 47    }
              }
    48 return obj; 49 } catch (ClassNotFoundException e) { 50 // TODO Auto-generated catch block 51 e.printStackTrace(); 52 } catch (InstantiationException e) { 53 // TODO Auto-generated catch block 54 e.printStackTrace(); 55 } catch (IllegalAccessException e) { 56 // TODO Auto-generated catch block 57 e.printStackTrace(); 58 } catch (IllegalArgumentException e) { 59 // TODO Auto-generated catch block 60 e.printStackTrace(); 61 } catch (InvocationTargetException e) { 62 // TODO Auto-generated catch block 63 e.printStackTrace(); 64 } catch (NoSuchMethodException e) { 65 // TODO Auto-generated catch block 66 e.printStackTrace(); 67 } catch (SecurityException e) { 68 // TODO Auto-generated catch block 69 e.printStackTrace(); 70 } 71 return null; 72 } 73 74 }

        运行结果:

  • 相关阅读:
    Java异常简介
    Java中的接口
    Java中的抽象类
    Java的多态
    关于this
    面向对象的继承方式详解
    1像素边框问题
    HTML5之本地存储SessionStorage
    js数组去重的4个方法
    前端模块化
  • 原文地址:https://www.cnblogs.com/zxb5116/p/3747025.html
Copyright © 2020-2023  润新知