一、JavaBean的内省实现原理
javaBean的内省(完成javabean的数据封装)
*使用类:Introspector 内省
*三种获取class类:类名.class 对象.getClass() Class.forName("包类路径");
*方法:
-BeanInfo getBeanInfo(Class<?> beanClass)
在 Java Bean 上进行内省,了解其所有属性、公开的方法和事件
*接口BeanInfo
-PropertyDescriptor[] getPropertyDescriptors()
获得属性描述,返回数组
*类PropertyDescriptor
-Method getReadMethod()
获得应该用于读取属性值的方法。
- Method getWriteMethod()
获得应该用于写入属性值的方法。
*类Method
-Object invoke(Object obj, Object... args)
对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。
*案例:创建jsp页面,提交表单,表单提交到servlet里面,在servlet里面使用内省实现封装数据到javabean
-代码演示
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 获取提交的数据
Map<String, String[]> parameterMap = request.getParameterMap();
// 创建javabean
User u = new User();
// 使用内省封装数据
try {
populate(u, parameterMap);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(u.toString());
}
private void populate(User u, Map<String, String[]> parameterMap)
throws Exception {
// 得到bean里面所有的内容,Introspector方法getBeanInfo
BeanInfo beanInfo = Introspector.getBeanInfo(u.getClass());
// 属性的描述
PropertyDescriptor[] propertyDescriptors = beanInfo
.getPropertyDescriptors();
for (PropertyDescriptor pD : propertyDescriptors) {
// 得到属性名称,数据封装
String name = pD.getName();
// 判断表单输入项的name属性值和属性名称是否相同
boolean flag = parameterMap.containsKey(name);
if (flag) {
// 获取输入的值
String[] strings = parameterMap.get(name);
// 获取属性写的方法,返回method对象
Method writeMethod = pD.getWriteMethod();
// 执行method方法invoke
writeMethod.invoke(u, Arrays.toString(strings));
}
}
}
二、JavaBean使用BeanUtils实现数据封装
BeanUtils框架的使用
*类库
*作用:封装数据到javabean
*是apach组织开发的一个小型的javabean的api,要想使用beanutils,需要导入jar包。
web项目如何导入jar包?把需要导入的jar包,复制到webroot下的WEB-INF下的lib里面。
*表单输入项name属性值 和 javabean的名称要一样,不然不能使用
*使用到的类
-BeanUtils类
populate(Object bean ,Map properties)
参数一:JavaBean对象 参数二:表单数据集合Map
-ConvertUtils类
register(Converter converter , Class clazz)
参数一:参数类型转换器 参数二:要转换类型class
-Converter接口
convert()实现方法
*使用框架,如果属性是基本数据类型可以完成数据封装,需要使用转换类ConverUtils类
*代码演示
-servlet类BenaUtils.java
/**
* 使用beanUtils框架封装数据到javabean里面
*/
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 得到表单提交的数据,创建javabean对象 使用框架实现封装
User u = new User();
try {
ConvertUtils.register(new MyCovert(), Date.class);
BeanUtils.populate(u, request.getParameterMap());
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(u.toString());
}
-接口ConvertUtils实现MyConvert.java
public class MyCovert implements Converter {
public Object convert(Class c, Object o) {
String d1 = (String) o;
// 把字符串转换成date
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date date = null;
try {
date = format.parse(d1);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
}