zoukankan      html  css  js  c++  java
  • 不使用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 }

        运行结果:

  • 相关阅读:
    使用 libevent 和 libev 提高网络应用性能
    An existing connection was forcibly closed by the remote host
    各种浏览器的兼容css
    vs输出窗口,显示build的时间
    sass
    网站设置404错误页
    List of content management systems
    css footer not displaying at the bottom of the page
    强制刷新css
    sp_executesql invalid object name
  • 原文地址:https://www.cnblogs.com/zxb5116/p/3747025.html
Copyright © 2011-2022 走看看