国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

javabean的內省技術和BeanUtils的使用

2019-11-14 14:52:00
字體:
來源:轉載
供稿:網友

一、關于javabean

javabean是固定寫法的java類

書寫格式為:

1)必須有無參構造函數

2)屬性必須私有, 我們稱為字段

3)提供標準的getter和setter

例: name 字段 的getter: String getName() settter: void setName(String name)

javabean例子:

復制代碼
//快捷鍵是shift+alt+spublic class User{    PRivate String name;    private int age;    public String getName()    {        return name;    }    public void setName(String name)    {        this.name = name;    }    public int getAge()    {        return age;    }    public void setAge(int age)    {        this.age = age;    }    @Override    //為了方便打印,添加一個toString方法    public String toString()    {        return "User [age=" + age + ", name=" + name + "]";    }}
復制代碼

二、關于 內省

內省是什么?: 通過反射的方式訪問javabean的技術

Jdk中的api : PropertyDescriptor類操作Bean的屬性

內省的作用:我們可以去實現一種通用性

1.傳統的方式去訪問javabean

復制代碼
public class Demo1{    public static void main(String[] args)    {        User user=new User();                user.setName("zhangsan");        user.setAge(19);        System.out.println(user);    }    }
復制代碼

2.使用內省的方式來訪問javabean

復制代碼
public class Demo1{    public static void main(String[] args) throws Exception    {        User user=new User();        //創建屬性描述器        PropertyDescriptor descriptor=new PropertyDescriptor("name",User.class);        //獲得寫方法        Method writeMethod=descriptor.getWriteMethod();                //調用寫方法        writeMethod.invoke(user, "lisi");        System.out.println(user);    }    }
復制代碼

 

3.簡化書寫,實現通用性。這里寫一個通用的方法,讓屬性名稱為一個變量,假如屬性名很多的話,得到屬性名后,就可以遍歷,然后給他們一一的賦值,這就是內省的魅力。

如果不用反射,那么傳統的方式是不可能實現通用的。

下面代碼實現能夠為任何的javabean賦任何的值,只有用內省的方法才可以做的到:

復制代碼
import java.beans.IntrospectionException;import java.beans.PropertyDescriptor;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import cn.itcast.day08.domain.User;public class Demo2 {    /**     * @param args     * @throws IntrospectionException      * @throws InvocationTargetException      * @throws IllegalaccessException      * @throws IllegalArgumentException      */    public static void main(String[] args) throws Exception {        // 內省                User user = new User();                setProperty(user, "name", "wangwu");        setProperty(user, "age", 11);                System.out.println(user);    }        // 實現一個通用的方法   為任意的一個javabean的任意屬性賦任意值    public static void setProperty(Object bean, String fieldName, Object value) throws Exception {        // 創建屬性描述器        PropertyDescriptor descriptor = new PropertyDescriptor(fieldName, bean.getClass());                // 獲得 寫方法        Method writeMethod = descriptor.getWriteMethod();                // 調用 寫方法        writeMethod.invoke(bean, value);    }}
復制代碼

 

由于內省用起來特別麻煩,Apache組織開發了一套用于操作JavaBean的API,如下詳講:

 

三、BeanUtils工具包

Apache組織開發了一套用于操作JavaBean的API(內省)

核心類 BeanUtils

setProperty(bean, name, value)

copyProperties(target, source);

可以支持String到8中基本數據類型轉換

其他引用數據類型都需要注冊轉換器 ConvertUtils.register(Converter, Class)

 

注意:1、要想使用beanutils需要導入外部的jar包:commons-beanutils-1.8.0.jar這個jar包到lib目錄里面

2、BeanUtils要想使用,還需要導入一個log的jar包:commons-logging.jar

下面我們來看看BeanUtils的魅力:

使用BeanUtils來格式化日期

1.javabean

復制代碼
package cn.itcast.day08.domain;import java.util.Date;// 一個javabean 是否有name屬性取決于是否getter或setter方法public class User {    private String name;    // 字段    private int age;        private Date birthday;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }        public Date getBirthday() {        return birthday;    }    public void setBirthday(Date birthday) {        this.birthday = birthday;    }    @Override    public String toString() {        return "User [name=" + name + ", age=" + age + "]";    }    }
復制代碼

2.beanutils

復制代碼
package cn.itcast.day08.introspector;import java.lang.reflect.InvocationTargetException;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;import org.apache.commons.beanutils.BeanUtils;import org.apache.commons.beanutils.ConvertUtils;import org.apache.commons.beanutils.Converter;import org.apache.commons.beanutils.converters.DateConverter;import org.apache.commons.beanutils.locale.converters.DateLocaleConverter;import cn.itcast.day08.domain.User;public class Demo3 {        public static void main(String[] args) throws Exception {                User user = new User();                String name = "zhangsan";        String age = "19";        String birthday = "19801122";        // 11/22/1980   1980 11 22                // 注冊一個轉換器        /* 使用匿名內部類來注冊轉換器        ConvertUtils.register(new Converter() {                        public Object convert(Class beanClass, Object value) {                // String -- Date                String birthday = (String) value;                SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");                try {                    return sdf.parse(birthday);                } catch (ParseException e) {                    return null;                }            }        }, Date.class);        */        DateConverter converter = new DateConverter();        converter.setPatterns(new String[]{"yyyy-MM-dd","yyyyMMdd","MM/dd/yyyy"});        ConvertUtils.register(converter, Date.class);                String fieldName = "name";        BeanUtils.setProperty(user, fieldName, name);        BeanUtils.setProperty(user, "age", age);        BeanUtils.setProperty(user, "birthday", birthday);                                System.out.println(user);        System.out.println(user.getBirthday().toLocaleString());            }}
復制代碼

 

四. WebUtils 工具類

實現任何request提交的表單封裝到對應的javabean

 

1.用戶注冊jsp頁面:

復制代碼
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>       <title>用戶注冊表單</title>      </head>    <body style="text-align: center;">       <form action="/myday08/servlet2" method="post" >           <table border="1" width="600px">               <tr>                   <td>用戶名</td>                   <td>                       <input type="text" name="name" />                   </td>               </tr>                          <tr>                   <td>年齡</td>                   <td>                       <input type="text" name="age" />                   </td>               </tr>               <tr>                   <td>出生日期</td>                   <td>                       <input type="text" name="birthday" />                   </td>               </tr>                              <tr>                   <td>                       <input type="reset" value="重置" />                   </td>                   <td>                       <input type="submit" value="用戶注冊" />                   </td>               </tr>           </table>       </form>  </body></html>
復制代碼

2.寫一個工具類,把request里面所有的參數全部封裝到javabean中去:

復制代碼
package cn.itcast.day08.util;import java.lang.reflect.InvocationTargetException;import java.sql.Date;import java.util.Enumeration;import javax.servlet.http.HttpServletRequest;import org.apache.commons.beanutils.BeanUtils;import org.apache.commons.beanutils.ConvertUtils;import org.apache.commons.beanutils.converters.DateConverter;public class WebUtils{    private WebUtils(){}        //定義一個通用工具方法,將請求參數封裝到javabean    public static Object request2bean(HttpServletRequest request,Class beanClass){    try{        Object bean=beanClass.newInstance();        //        獲得所有請求參數名        Enumeration names = request.getParameterNames();        //注冊日期轉換器        DateConverter converter=new DateConverter();        converter.setPattern("yyyy-MM-dd");        ConvertUtils.register(converter, Date.class);                //遍歷        while(names.hasMoreElements()){//            獲得一個參數名            String name = (String)names.nextElement();//            獲得參數名對應的參數值            String value = request.getParameter(name);            //將參數名作為屬性名 將參數值作為屬性值,通過beanutils工具實現屬性的封裝                        BeanUtils.setProperty(bean, name, value);            }                return bean;            }catch (Exception e)            {                throw new RuntimeException(e);            }//異常要抓下來,不能拋給servlet,把編譯時異常包裝稱運行時異常                    }    }
復制代碼

3.寫一個servlet頁面,注意查看導入的包名稱!分清關系

復制代碼
package cn.itcast.day08.web.servlet;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import cn.itcast.day08.domain.User;import cn.itcast.day08.util.WebUtils;public class Servlet2 extends HttpServlet {    public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        // 表單提交的參數封裝到javabean        User bean = WebUtils.request2Bean(request, User.class);                System.out.println(bean);    }    public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        doGet(request, response);    }}
復制代碼

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 阜平县| 报价| 孟津县| 怀仁县| 耒阳市| 长海县| 英超| 新干县| 尤溪县| 武鸣县| 化州市| 湟中县| 雷波县| 博客| 沅江市| 普兰县| 监利县| 肃南| 开鲁县| 锦屏县| 三门县| 河源市| 北京市| 灵宝市| 汾阳市| 怀安县| 北安市| 长子县| 民丰县| 桂林市| 平南县| 中江县| 台东市| 宝山区| 盘锦市| 吉安县| 田林县| 肃宁县| 科技| 固阳县| 天津市|