一、关于javabean

javabean是固定写法的java类

书写格式为:

1)必须有无参构造函数

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

3)提供标准的getter和setter

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

javabean例子:

  1. //快捷键是shift+alt+s
  2. public class User
  3. {
  4. private String name;
  5. private int age;
  6. public String getName()
  7. {
  8. return name;
  9. }
  10. public void setName(String name)
  11. {
  12. this.name = name;
  13. }
  14. public int getAge()
  15. {
  16. return age;
  17. }
  18. public void setAge(int age)
  19. {
  20. this.age = age;
  21. }
  22. @Override
  23. //为了方便打印,添加一个toString方法
  24. public String toString()
  25. {
  26. return "User [age=" + age + ", name=" + name + "]";
  27. }
  28. }

二、关于 内省

内省是什么?: 通过反射的方式访问javabean的技术

Jdk中的api : PropertyDescriptor类操作Bean的属性

内省的作用:我们可以去实现一种通用性

1.传统的方式去访问javabean

  1. public class Demo1
  2. {
  3. public static void main(String[] args)
  4. {
  5. User user=new User();
  6.  
  7. user.setName("zhangsan");
  8. user.setAge(19);
  9. System.out.println(user);
  10. }
  11.  
  12. }

2.使用内省的方式来访问javabean

  1. public class Demo1
  2. {
  3. public static void main(String[] args) throws Exception
  4. {
  5. User user=new User();
  6. //创建属性描述器
  7. PropertyDescriptor descriptor=new PropertyDescriptor("name",User.class);
  8. //获得写方法
  9. Method writeMethod=descriptor.getWriteMethod();
  10.  
  11. //调用写方法
  12. writeMethod.invoke(user, "lisi");
  13. System.out.println(user);
  14.  
  15. }
  16.  
  17. }

3.简化书写,实现通用性。这里写一个通用的方法,让属性名称为一个变量,假如属性名很多的话,得到属性名后,就可以遍历,然后给他们一一的赋值,这就是内省的魅力。

如果不用反射,那么传统的方式是不可能实现通用的。

下面代码实现能够为任何的javabean赋任何的值,只有用内省的方法才可以做的到:

  1. import java.beans.IntrospectionException;
  2. import java.beans.PropertyDescriptor;
  3. import java.lang.reflect.InvocationTargetException;
  4. import java.lang.reflect.Method;
  5.  
  6. import cn.itcast.day08.domain.User;
  7.  
  8. public class Demo2 {
  9.  
  10. /**
  11. * @param args
  12. * @throws IntrospectionException
  13. * @throws InvocationTargetException
  14. * @throws IllegalAccessException
  15. * @throws IllegalArgumentException
  16. */
  17. public static void main(String[] args) throws Exception {
  18. // 内省
  19.  
  20. User user = new User();
  21.  
  22. setProperty(user, "name", "wangwu");
  23. setProperty(user, "age", 11);
  24.  
  25. System.out.println(user);
  26.  
  27. }
  28.  
  29. // 实现一个通用的方法 为任意的一个javabean的任意属性赋任意值
  30. public static void setProperty(Object bean, String fieldName, Object value) throws Exception {
  31. // 创建属性描述器
  32. PropertyDescriptor descriptor = new PropertyDescriptor(fieldName, bean.getClass());
  33.  
  34. // 获得 写方法
  35. Method writeMethod = descriptor.getWriteMethod();
  36.  
  37. // 调用 写方法
  38. writeMethod.invoke(bean, value);
  39. }
  40.  
  41. }

由于内省用起来特别麻烦,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

  1. package cn.itcast.day08.domain;
  2.  
  3. import java.util.Date;
  4.  
  5. // 一个javabean 是否有name属性取决于是否getter或setter方法
  6. public class User {
  7.  
  8. private String name; // 字段
  9.  
  10. private int age;
  11.  
  12. private Date birthday;
  13.  
  14. public String getName() {
  15. return name;
  16. }
  17.  
  18. public void setName(String name) {
  19. this.name = name;
  20. }
  21.  
  22. public int getAge() {
  23. return age;
  24. }
  25.  
  26. public void setAge(int age) {
  27. this.age = age;
  28. }
  29.  
  30. public Date getBirthday() {
  31. return birthday;
  32. }
  33.  
  34. public void setBirthday(Date birthday) {
  35. this.birthday = birthday;
  36. }
  37.  
  38. @Override
  39. public String toString() {
  40. return "User [name=" + name + ", age=" + age + "]";
  41. }
  42.  
  43. }

2.beanutils

  1. package cn.itcast.day08.introspector;
  2.  
  3. import java.lang.reflect.InvocationTargetException;
  4. import java.text.ParseException;
  5. import java.text.SimpleDateFormat;
  6. import java.util.Date;
  7.  
  8. import org.apache.commons.beanutils.BeanUtils;
  9. import org.apache.commons.beanutils.ConvertUtils;
  10. import org.apache.commons.beanutils.Converter;
  11. import org.apache.commons.beanutils.converters.DateConverter;
  12. import org.apache.commons.beanutils.locale.converters.DateLocaleConverter;
  13.  
  14. import cn.itcast.day08.domain.User;
  15.  
  16. public class Demo3 {
  17.  
  18. public static void main(String[] args) throws Exception {
  19.  
  20. User user = new User();
  21.  
  22. String name = "zhangsan";
  23. String age = "19";
  24. String birthday = "19801122";
  25. // 11/22/1980 1980 11 22
  26.  
  27. // 注册一个转换器
  28. /* 使用匿名内部类来注册转换器
  29. ConvertUtils.register(new Converter() {
  30.  
  31. public Object convert(Class beanClass, Object value) {
  32. // String -- Date
  33. String birthday = (String) value;
  34. SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
  35. try {
  36. return sdf.parse(birthday);
  37. } catch (ParseException e) {
  38. return null;
  39. }
  40. }
  41. }, Date.class);
  42. */
  43. DateConverter converter = new DateConverter();
  44. converter.setPatterns(new String[]{"yyyy-MM-dd","yyyyMMdd","MM/dd/yyyy"});
  45. ConvertUtils.register(converter, Date.class);
  46.  
  47. String fieldName = "name";
  48. BeanUtils.setProperty(user, fieldName, name);
  49. BeanUtils.setProperty(user, "age", age);
  50. BeanUtils.setProperty(user, "birthday", birthday);
  51.  
  52. System.out.println(user);
  53. System.out.println(user.getBirthday().toLocaleString());
  54.  
  55. }
  56.  
  57. }

四. WebUtils 工具类

实现任何request提交的表单封装到对应的javabean

1.用户注册jsp页面:

  1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
  2. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  3. <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
  4.  
  5. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  6. <html>
  7. <head>
  8.  
  9. <title>用户注册表单</title>
  10.  
  11. </head>
  12.  
  13. <body style="text-align: center;">
  14. <form action="/myday08/servlet2" method="post" >
  15. <table border="1" width="600px">
  16. <tr>
  17. <td>用户名</td>
  18. <td>
  19. <input type="text" name="name" />
  20. </td>
  21. </tr>
  22.  
  23. <tr>
  24. <td>年龄</td>
  25. <td>
  26. <input type="text" name="age" />
  27. </td>
  28. </tr>
  29. <tr>
  30. <td>出生日期</td>
  31. <td>
  32. <input type="text" name="birthday" />
  33. </td>
  34. </tr>
  35.  
  36. <tr>
  37. <td>
  38. <input type="reset" value="重置" />
  39. </td>
  40. <td>
  41. <input type="submit" value="用户注册" />
  42. </td>
  43. </tr>
  44. </table>
  45. </form>
  46. </body>
  47. </html>

2.写一个工具类,把request里面所有的参数全部封装到javabean中去:

  1. package cn.itcast.day08.util;
  2.  
  3. import java.lang.reflect.InvocationTargetException;
  4. import java.sql.Date;
  5. import java.util.Enumeration;
  6.  
  7. import javax.servlet.http.HttpServletRequest;
  8.  
  9. import org.apache.commons.beanutils.BeanUtils;
  10. import org.apache.commons.beanutils.ConvertUtils;
  11. import org.apache.commons.beanutils.converters.DateConverter;
  12.  
  13. public class WebUtils
  14. {
  15. private WebUtils(){}
  16.  
  17. //定义一个通用工具方法,将请求参数封装到javabean
  18. public static Object request2bean(HttpServletRequest request,Class beanClass){
  19.  
  20. try{
  21. Object bean=beanClass.newInstance();
  22. // 获得所有请求参数名
  23. Enumeration names = request.getParameterNames();
  24. //注册日期转换器
  25. DateConverter converter=new DateConverter();
  26. converter.setPattern("yyyy-MM-dd");
  27. ConvertUtils.register(converter, Date.class);
  28.  
  29. //遍历
  30. while(names.hasMoreElements()){
  31. // 获得一个参数名
  32. String name = (String)names.nextElement();
  33. // 获得参数名对应的参数值
  34. String value = request.getParameter(name);
  35. //将参数名作为属性名 将参数值作为属性值,通过beanutils工具实现属性的封装
  36.  
  37. BeanUtils.setProperty(bean, name, value);
  38. }
  39. return bean;
  40. }catch (Exception e)
  41. {
  42. throw new RuntimeException(e);
  43. }//异常要抓下来,不能抛给servlet,把编译时异常包装称运行时异常
  44.  
  45. }
  46. }

3.写一个servlet页面,注意查看导入的包名称!分清关系

  1. package cn.itcast.day08.web.servlet;
  2.  
  3. import java.io.IOException;
  4.  
  5. import javax.servlet.ServletException;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9.  
  10. import cn.itcast.day08.domain.User;
  11. import cn.itcast.day08.util.WebUtils;
  12.  
  13. public class Servlet2 extends HttpServlet {
  14.  
  15. public void doGet(HttpServletRequest request, HttpServletResponse response)
  16. throws ServletException, IOException {
  17. // 表单提交的参数封装到javabean
  18. User bean = WebUtils.request2Bean(request, User.class);
  19.  
  20. System.out.println(bean);
  21. }
  22.  
  23. public void doPost(HttpServletRequest request, HttpServletResponse response)
  24. throws ServletException, IOException {
  25. doGet(request, response);
  26. }
  27.  
  28. }

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

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

    一.关于javabean javabean是固定写法的java类 书写格式为: 1)必须有无参构造函数 2)属性必须私有, 我们称为字段 3)提供标准的getter和setter 例: name 字段 ...

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

    Session的追踪技术 已知Session是利用cookie机制的server端技术.当client第一次訪问资源时 假设调用request.getSession() 就会在server端创建一个由 ...

  3. Java基础扫盲系列(三)— Java内省技术

    前言 Java内省技术属于Java基础体系的的一部分,但是很多人都不甚了解.笔者也是在学习Spring源码的过程中遇到该技术模块的.为了完善技术体系,本文将全面的学习该技术.在提到Java内省技术,就 ...

  4. jsp 以及javabean内省技术

    l JSP l JavaBean及内省 l EL表达式 1.1 上次课内容回顾 会话技术: Cookie:客户端技术.将数据保存在客户端浏览器上.Cookie是有大小和个数的限制. Session:服 ...

  5. JavaBean和内省

    JavaBean和内省 JavaBean是一个遵循特定的写法的java类     1. 必须有一个无参的构造方法     2.属性私有化     3.私有你给的属性必须通过public类型的方法暴露给 ...

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

    内省(Introspector) 是Java 语言对JavaBean类属性.事件的一种缺省处理方法. JavaBean是一种特殊的类,主要用于传递数据信息,这种类中的方法主要用于访问私有的字段,且方法 ...

  7. Javaweb学习笔记——(十二)——————JSP指令:page指令、include指令、taglib指令,JavaBean,内省,EL表达式

    JSP指令JSP指令分类 JSP有三大指令: *page指令 *include指令 *taglib指令 在JSP中没有任何指令是必须的. 但基本上每个JSP都是使用page指令============ ...

  8. Java 内省(Introspector)和 BeanUtils

    人生若只如初见,何事秋风悲画扇. 概述 内省(Introspector) 是Java 语言对 JavaBean 类属性.事件的一种缺省处理方法. JavaBean是一种特殊的类,主要用于传递数据信息, ...

  9. Java反射之对JavaBean的内省操作

    上一篇我们说了Java反射之数组的反射应用 这篇我们来模拟实现那些javabean的框架(BeanUtils)的基本操作. [一] 什么是JavaBean JavaBean 是一种JAVA语言写成的可 ...

随机推荐

  1. vue的声明式渲染

    声明式渲染 答:2018-8-23声明式渲染是vue对数据进行操作的模式,也叫做响应式渲染当dom节点上绑定了vue的对象的属性时,如果这个属性发生了改变,无需你进行其它的操作,页面上的数据会自动发生 ...

  2. 引入类型struct(结构),提高代码的逻辑性和可读性

    创建一个新类型(struct, 即 结构)SComplex 来表示复数,提高了代码的逻辑性和可读性,代码更加的简洁. #include "stdafx.h" #include &q ...

  3. 微信小程序上滑加载更多

    onReachBottom: function () { var that = this var limit = that.data.limit var count = that.data.count ...

  4. 使用gogs和glide来轻松拉取golang第三方库

    golang的第三方代码拉取一直是让人头疼的问题,在github托管的代码还好,托管在其他网站上的代码总会由于大家都懂的原因,无法访问.纵使是github,在拉取文件数量较多的库时,也是比较慢的. 有 ...

  5. 常用代码c#

    当使用 HttpContext.Current用到不是当前线程会出null的情况,可使用 System.Web.HttpRuntime.AppDomainAppPath获取程序的根路 string p ...

  6. NetWork——关于TCP协议的三次握手和四次挥手

    分钟. (2)服务器B存在一个保活状态,即如果A突然故障死机了,那B那边的连接资源什么时候能释放呢? 就是保活时间到了后,B会发送探测信息,以决定是否释放连接. (3)为什么连接的时候是三次握手,关闭 ...

  7. HDU 5972 Regular Number

    Regular Number http://acm.hdu.edu.cn/showproblem.php?pid=5972 题意: 给定一个字符串,求多少子串满足,子串的第i位,只能是给定的数(小于等 ...

  8. 1057: [ZJOI2007]棋盘制作

    1057: [ZJOI2007]棋盘制作 https://www.lydsy.com/JudgeOnline/problem.php?id=1057 分析: 首先对于(i+j)&1的位置0-& ...

  9. ORB代码框架梳理

    这里从单目入手,画了一个框架图:

  10. Mysql 8.0.* zip版本 windows安装

    一,MySQL8.0.*zip版本安装步骤. 1,下载 https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.15-winx64.zip 注现 ...