一、关于javabean
javabean是固定写法的java类
书写格式为:
1)必须有无参构造函数
2)属性必须私有, 我们称为字段
3)提供标准的getter和setter
例: name 字段 的getter: String getName() settter: void setName(String name)
javabean例子:
//快捷键是shift+alt+s
public classUser
{privateString name;private intage;publicString getName()
{returnname;
}public voidsetName(String name)
{this.name =name;
}public intgetAge()
{returnage;
}public void setAge(intage)
{this.age =age;
}
@Override//为了方便打印,添加一个toString方法
publicString toString()
{return "User [age=" + age + ", name=" + name + "]";
}
}
二、关于 内省
内省是什么?: 通过反射的方式访问javabean的技术
Jdk中的api : PropertyDescriptor类操作Bean的属性
内省的作用:我们可以去实现一种通用性
1.传统的方式去访问javabean
public classDemo1
{public static voidmain(String[] args)
{
User user=newUser();
user.setName("zhangsan");
user.setAge(19);
System.out.println(user);
}
}
2.使用内省的方式来访问javabean
public classDemo1
{public static void main(String[] args) throwsException
{
User user=newUser();//创建属性描述器
PropertyDescriptor descriptor=new PropertyDescriptor("name",User.class);//获得写方法
Method writeMethod=descriptor.getWriteMethod();//调用写方法
writeMethod.invoke(user, "lisi");
System.out.println(user);
}
}
3.简化书写,实现通用性。这里写一个通用的方法,让属性名称为一个变量,假如属性名很多的话,得到属性名后,就可以遍历,然后给他们一一的赋值,这就是内省的魅力。
如果不用反射,那么传统的方式是不可能实现通用的。
下面代码实现能够为任何的javabean赋任何的值,只有用内省的方法才可以做的到:
importjava.beans.IntrospectionException;importjava.beans.PropertyDescriptor;importjava.lang.reflect.InvocationTargetException;importjava.lang.reflect.Method;importcn.itcast.day08.domain.User;public classDemo2 {/***@paramargs
*@throwsIntrospectionException
*@throwsInvocationTargetException
*@throwsIllegalAccessException
*@throwsIllegalArgumentException*/
public static void main(String[] args) throwsException {//内省
User user= newUser();
setProperty(user,"name", "wangwu");
setProperty(user,"age", 11);
System.out.println(user);
}//实现一个通用的方法 为任意的一个javabean的任意属性赋任意值
public static void setProperty(Object bean, String fieldName, Object value) throwsException {//创建属性描述器
PropertyDescriptor descriptor = newPropertyDescriptor(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
packagecn.itcast.day08.domain;importjava.util.Date;//一个javabean 是否有name属性取决于是否getter或setter方法
public classUser {private String name; //字段
private intage;privateDate birthday;publicString getName() {returnname;
}public voidsetName(String name) {this.name =name;
}public intgetAge() {returnage;
}public void setAge(intage) {this.age =age;
}publicDate getBirthday() {returnbirthday;
}public voidsetBirthday(Date birthday) {this.birthday =birthday;
}
@OverridepublicString toString() {return "User [name=" + name + ", age=" + age + "]";
}
}
2.beanutils
packagecn.itcast.day08.introspector;importjava.lang.reflect.InvocationTargetException;importjava.text.ParseException;importjava.text.SimpleDateFormat;importjava.util.Date;importorg.apache.commons.beanutils.BeanUtils;importorg.apache.commons.beanutils.ConvertUtils;importorg.apache.commons.beanutils.Converter;importorg.apache.commons.beanutils.converters.DateConverter;importorg.apache.commons.beanutils.locale.converters.DateLocaleConverter;importcn.itcast.day08.domain.User;public classDemo3 {public static void main(String[] args) throwsException {
User user= newUser();
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= newDateConverter();
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页面:
用户注册表单用户名年龄出生日期