JavaWeb(五)JavaBean

上一章链接: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时代的时候的用具
            因此这一章其实也没什么需要理解记忆的,只需要了解即可
        '''

下一章链接:EL表达式和JSTL标签库

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值