上一章链接:Cookie和Session
JavaBean是一个特殊的Java类,其遵守了一定的JavaBean API规范。这部分的内容并不需要掌握,只需要了解即可。
JavaBean特殊之处
说起JavaBean,其实说陌生也不陌生。在这里还是得指出其和其他Java类不同的地方:
第一,必须要有默认构造器,即无参构造方法
第二,必须为成员提供get或set方法
第三,需要被序列化并且实现Serializable接口
举例如下:
import java.io.Serializable;
public class Student implements Serializable{
private String name;
private int age;
private String sex;
public Student() {
super();
}
public Student(String name, int age, String sex) {
super();
this.name = name;
this.age = age;
this.sex = sex;
}
public String getId() {
return "Id_andomInt";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + ", sex=" + sex + "]";
}
}
需要注意的是:一般把具有get/set方法的成员变量称之为属性,但是也可以没有成员变量而有get/set方法,如上述Student类中的getId()方法,id也是Student类的属性之一。
对于JavaBean的属性,分为四种:单值属性、索引属性(数组类型)、关联属性、限制属性。
BeanInfo
这里稍微微地提一下,JavaBean这个规范的提出,最早的目的是在可视化工具中完成一些组件的显示。一个真正的bean想要加载到可视化工具中还得需要一个BeanInfo。在J2SE的API文档中可以查到相关的BeanInfo接口类。
对于BeanInfo,只需要知道如何获取到BeanInfo以及BeanInfo中又有什么信息。那么又是如何获取到BeanInfo呢?这就得靠一个java.beans.Introspector的getBeanInfo()方法获取BeanInfo实例。而这个Introspector,称之为“内省”。
这个方法的底层是建立在反射之上的,通过反射读取这个BeanInfo的内容,从而得到满足JavaBea规范的属性。那么得到这些属性有什么用呢?从BeanInfo内的方法来看,
这叫属性描述符和方法描述符,所有满足JavaBean规范的属性都会提取出来。通过这方法返回一个数组,数组里面有读、写方法,得到方法后就可以调用这些方法,这就相似于反射。
现在用图描述一下这个内省的过程:
如图所示,通过内省类获取Bean信息,然后再从BeanInfo中获取属性描述符,最后通过属性描述符中的属性对应的Method,反射调用这个Method完成整个过程。
以下用代码演示(Bean类为上面的Student类,以单个属性为例):
public static void main(String[] args) {
// 根据class实例化对象
Class beanClass = Class.forName("it.test.Student");
Object bean = beanClass.newInstance();
// 获取BeanInfo以及获取单个属性
BeanInfo info = Introspector.getBeanInfo(beanClass);
PropertyDescriptor descriptor = new PropertyDescriptor("name", beanClass);
Method m = descriptor.getWriteMethod();
m.invoke(bean, "zhangsan");
System.out.println(bean);
}
结果如图所示:
每一次都需要亲自去写这样的过程,这样未免太过于麻烦了。因此有两个包:commons-beanutils和commons-loggin导入来负责完成这个过程。
代码演示如下:
public static void main(String[] args) {
Class beanClass = Class.forName("it.test.Student");
Object bean = beanClass.newInstance();
BeanUtils.setProperty(bean, "name", "zhangsan");
BeanUtils.setProperty(bean, "age", "18");
// 如果没有这个属性则不会设置成功,如果缺少了那就是null
BeanUtils.setProperty(bean, "xxx", "XXX");
System.out.println(bean);
}
结果和上面是一致的。
除了一个一个属性设置以外,还可以用Map的属性封装到bena中。但是需要注意的是,Map的key必须和Bean类的属性名相同。
演示如下:
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
map.put("name", "zhansan");
map.put("age", "18");
map.put("sex", "male");
// Map中设定的key名要和Student的属性名是一样的
Student stu = new Student();
BeanUtils.populate(stu, map);
System.out.println(bean);
}
结果如下:
后话
'''
原本JavaBean这个知识点应该可以直接放到JSP基础那一章去的
这个东西所附带的<jsp:useBean>JSP标签现阶段都基本没人用了
毕竟是很早以前只有jsp没有servlet时代的时候的用具
因此这一章其实也没什么需要理解记忆的,只需要了解即可
'''