javabean的内省技术和BeanUtils的使用

一、关于javabean

javabean是固定写法的java类

书写格式为:

1)必须有无参构造函数

2)属性必须私有, 我们称为字段

3)提供标准的getter和setter

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

javabean例子:

//快捷键是shift+alt+s
public 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);
    }

}

时间: 2024-08-07 16:44:44

javabean的内省技术和BeanUtils的使用的相关文章

JAVAWEB开发之Session的追踪创建和销毁、JSP详解(指令,标签,内置对象,动作即转发和包含)、JavaBean及内省技术以及EL表达式获取内容的使用

Session的追踪技术 已知Session是利用cookie机制的服务器端技术,当客户端第一次访问资源时 如果调用request.getSession() 就会在服务器端创建一个由浏览器独享的session空间,并分配一个唯一且名称为JSESSIONID的cookie发送到浏览器端,如果浏览器没有禁用cookie的话,当浏览器再次访问项目中的Servlet程序时会将JSESSIONID带着,这时JSESSIONID就像唯一的一把钥匙  开启服务器端对应的session空间,进而获取到sessi

JAVAWEB开发之Session的追踪创建和销毁、JSP具体解释(指令,标签,内置对象,动作即转发和包括)、JavaBean及内省技术以及EL表达式获取内容的使用

Session的追踪技术 已知Session是利用cookie机制的server端技术.当client第一次訪问资源时 假设调用request.getSession() 就会在server端创建一个由浏览器独享的session空间,并分配一个唯一且名称为JSESSIONID的cookie发送到浏览器端,假设浏览器没有禁用cookie的话,当浏览器再次訪问项目中的Servlet程序时会将JSESSIONID带着.这时JSESSIONID就像唯一的一把钥匙  开启server端相应的session空

javabean以及内省技术详解(转)

一.关于javabean javabean是固定写法的java类 书写格式为: 1)必须有无参构造函数 2)属性必须私有, 我们称为字段 3)提供标准的getter和setter 例: name 字段 的getter: String getName() settter: void setName(String name) javabean例子: //快捷键是shift+alt+s public class User { private String name; private int age;

javabean以及内省技术详解【转】

一.关于javabean javabean是固定写法的java类 书写格式为: 1)必须有无参构造函数 2)属性必须私有, 我们称为字段 3)提供标准的getter和setter 例: name 字段 的getter: String getName() settter: void setName(String name) javabean例子: //快捷键是shift+alt+s public class User { private String name; private int age;

jsp 以及javabean内省技术

l JSP l JavaBean及内省 l EL表达式 1.1 上次课内容回顾 会话技术: Cookie:客户端技术.将数据保存在客户端浏览器上.Cookie是有大小和个数的限制. Session:服务器端技术.将数据保存在服务器端.Session没有大小和个数限制.Session基于Cookie回写了一个JSESSIONID. Cookie的分类: * 会话级别的Cookie:浏览器关闭了,Cookie就销毁了! * 持久化的Cookie: * cookie.setMaxAge(时间); --

Java内省技术

-------<a href="http://www.itheima.com/"">android培训</a>.<a href="http://www.itheima.com/" ">java培训</a>期待与您交流!---------- JavaBean类: 在Java中有一种特殊的类,它用于程序中两个模块的信息交换.它的特点是将成员变量私有化.用getter和setter方法获取设置其成员变量的

内省技术

1 javaBean是什么? javabean是一种规范.其实就是一种实体类,需要满足以下的条件: ①必须是public的 ②必须实现Serializable接口 ③字段必须私有化 ④必须提供setter和getter方法 示例: package com; import java.io.Serializable; import java.util.Arrays; /** * 2017/11/2 * 说明: */ public class Student implements Serializab

JAVA中反射机制五(JavaBean的内省与BeanUtils库)

内省(Introspector) 是Java 语言对JavaBean类属性.事件的一种缺省处理方法. JavaBean是一种特殊的类,主要用于传递数据信息,这种类中的方法主要用于访问私有的字段,且方法名符合某种命名规则.如果在两个模块之间传递信息,可以将信息封装进JavaBean中,这种对象称为“值对象”(Value Object),或“VO”.方法比较少.这些信息储存在类的私有变量中,通过set().get()获得. 例如类UserInfo : package com.peidasoft.in

内省Introspector 和BeanUtils 工具对反射属性的包装(简单的不是一点点哦)

public void fun2() throws Exception { //通过反射和dom4j实例化id=stu1的对象,并输出 SAXReader reader = new SAXReader(); Document document = reader.read(this.getClass().getResourceAsStream("/beans.xml")); String xpath="/beans/bean[@id=\"stu1\"]&qu