1、什么是内省??
内省:JDK提供的一套操作JavaBean的API,内省是基于反射技术的,之所以学习内省,是为了更方便的
操作javaBean.
2、JavaBean属性计算方法?
1)、通过Introspector获得JavaBean的类的相关信息
2)、通过BeanInfo获得方法描述器和属性
getMethodDescriptors()
getPropertyDescriotors()----重点
JavaBean属性的多少不是看那个类中中成员变量的多少,而是通过get和set方法计算得到的:
例如:假如有一个getName-----去掉get将Name首字母小写-----得到name属性
由于每一个对象都继承了Object,继承getClass()方法----因此会得到class属性
3、内省的应用------将Map的key与JavaBean对象属性进行匹配,自动将value值保存到对象中。
详解:jsp02/demo2...
其实,之前的<jsp:setProperty property="*" />就是上面的这个原理。(源码看jsp02/demo2..)
4、在Model1中,完成form参数的传递 ---- JavaBean自动封装
<jsp:setProperty property="*" name="calculator" />
5、在Model2中 不可以使用 jsp标签,在Servlet中完成 将form表单中的数据 封装到 javabean对象
使用内省技术(基于反射,方便操作javabean API )完成form数据 封装 javabean对象 -------- 内省在编写代码上复杂
BeanUtils 工具包 (完成对javabean封装操作)
6、BeanUtils一套开发包,Apache公司提供 ,专门进行javabean操作,在web层各种框架中 被使用 例如:struts 使用BeanUtils操作JavaBean
采用BeanUtils编写快速入门案例
1)、下载BeanUtils的jar :commons-beanutils 、commons-logging
BeanUtils依赖 Logging的jar包
2)、将beanutils和logging的 jar包复制 工程/WebRoot/WEB-INF/lib
3)、编写BeanUtils的封装程序
BeanUtils.populate(person, request.getParameterMap());
如果在Person类添加特殊类型Date类型,对于特殊类型如何封装 ?
1、自定义转换器 ---- 需要实现Converter接口
2、在调用populate方法前,注册转换器
ConvertUtils.register(Converter converter, Class clazz)
结论:
1、如果form表单参数是String类型,javabean属性String类型 ---- 调用BeanUtils.populate 将form数据封装 javabean
2、如果JavaBean属性类型不是String ---- 将form数据封装javabean 需要转换器 ----- 在BeanUtils API 提供很多默认转换器(完成常见转换)
3、如果需要转换类型非常特殊,可以通过自定义转换器完成 定义类实现Converter接口,实现convert方法 ,在populate调用之前通过ConvertUtils.register注册转换器
-------------------------------------------------------------------------------------------------------