不使用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 }

    运行结果:

原文地址:https://www.cnblogs.com/zxb5116/p/3747025.html