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

    运行结果:

 

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

你可能感兴趣的:(BeanUtils)