javabean以及内省技术详解

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

javabean例子:

[java]  view plain copy
  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
[java]  view plain copy
  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

[java]  view plain copy
  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赋任何的值,只有用内省的方法才可以做的到:

[java]  view plain copy
  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

[java]  view plain copy
  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.       
  44. }  

2.beanutils

[java]  view plain copy
  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.           
  53.           
  54.         System.out.println(user);  
  55.         System.out.println(user.getBirthday().toLocaleString());  
  56.           
  57.     }  
  58.   
  59. }  

四. WebUtils 工具类

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

1.用户注册jsp页面:

[html]  view plain copy
  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中去:

[java]  view plain copy
  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页面,注意查看导入的包名称!分清关系

[java]  view plain copy
  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. }  

jsp这块的重点为:

1. jsp运行原理(会被翻译成servlet)
2. jsp脚本表达式和脚本片段
3. jsp九大隐式对象
4. web开发的四个域对象
5. 内省
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值