JavaBean学习笔记
JavaBean产生背景
在JSP网页开发的初级阶段并没有框架与逻辑分层概念,需要将Java代码嵌入到网页中处理JSP页面中的一些业务逻辑,如字符串处理和数据库操作等,其开发流程如图所示。
此种开发流程虽看似简单,但是如果将大量Java代码嵌入到JSP页面,必定会为修改及维护带来一定的困难。因为在JSP页面中包含HTML、CSS和JS代码等,再添加业务逻辑处理代码。既不利于页面美工人员的设计,也不利于Java开发人员开发程序。而且将Java代码写入在JSP页面中,不能体现面向对象的开发模式,达不到代码的重用。
JavaBean的产生弥补了原始开发方式的缺点,为JSP程序设计注入了新的血液。
JavaBean的作用
如果使HTML与Java代码相分离,将Java代码单独封装成为一个处理某种业务逻辑的类。然后在JSP页面中调用此类,则可以降低HTML与Java代码之间的耦合度。并且简化JSP页面,提高Java程序代码的重用性及灵活性。这种与HTML代码相分离,而使用Java代码封装的类就是一个JavaBean组件。在Java Web开发可以使用该组件来完成业务逻辑的处理,应用JavaBean与JSP组合的开发模式如图所示。
可以看出JavaBean的应用简化了JSP页面,在JSP页面中只包含HTML和CSS代码等。但可以引用JavaBean组件来完成某一业务逻辑,如字符串处理和数据库操作等。
JavaBean的规范
JavaBean是一个可重用的Java软件组件模型,在编写时需要遵循Java的编码约定,一个标准的JavaBean应该具备以下规范。
(1)公共的无参构造方法
一个JavaBean对象必须拥有一个公共类型和默认的无参构造方法,从而可以通过new关键字直接对其实例化。(2)类的声明是非final类型
当一个类声明为final类型时,它是不可以更改的,所以JavaBean对象的声明应该是非final类型。
(3)实现可序列接口
JavaBean应该直接或间接实现java.io.Serializable接口,以支持序列化机制。
(4)为属性声明访问器JavaBean中的属性应该设置为private(私有)类型,为了防止外部直接访问,需要对外提供公共(public)的访问方法,即需要为属性提供getter/setter方法。
JavaBean的属性
属性是JavaBean组件内部状态的抽象表示,大致可分为4类。
Simple属性
只拥有getXXX()/setXXX()方法的变量属于Simple(简单)属性,如果变量的类型为boolean,对应的getXXX()方法还可以替换为isXXX()方法,其作用相同。
建议将属性的访问权限设为private,这样可以避免使用者直接通过访问属性修改其值。如果为属性提供了对应的getXXX()方法,表示该属性可读的;如果提供了对应的setXXX()方法,则可写。如果使用者不可以修改某个属性的值,则可以通过不提供对应的setXXX()方法实现。
Indexed属性
拥有getXXX()/setXXX()方法的数组属于Indexed(索引)属性,该属性需要提供两套对应的getXXX()/setXXX()方法,一套是获得或设置整个数组;另一套是获得或设置数组中的某个元素。
Bound属性
如果在Simple或Index属性上添加一种监听机制,即当某个属性值发生改变时通知监听器,则这个属性属于Bound(绑定)属性。监听器需要实现java.beans.PropertyChangeListener接口,负责接收由JavaBean组件产生的java.beans.PropertyChangeEvent对象,在该对象中包含了发生改变的属性名、改变前后的值,以及每个监听器可能要访问的新属性值。
JavaBean还需要实现addPropertyChangeListener()和removePropertyChangeListener()方法,以添加和取消属性变化监听器,还可以通过java.beans.PropertyChangeSupport类的firePropertyChange()方法传递属性名、改变前的值和改变后的值等信息。
Bound属性通常情况下在实现Java图形编程的JavaBean中大量使用,在开发JSP的过程中很少用到。
Constrained属性
Constrained(约束)属性在Bound属性的基础上添加了一个约束条件,即当某个监听器监测到某个属性值发生改变后,需要由所有的监听器验证通过才能够修改该属性值。只要有一个监听器否决了该属性的变化,值不能被修改。监听器需要实现java.beans.VetoableChangeListener接口,负责接收由JavaBean组件产生的java.beans.PropertyChange Event对象,JavaBean组件可以通过java.beans.VetoableChangeSupport类激活由监听器接收的实际事件。
JavaBean还需要实现addVetoableChangeListener()和removeVetoableChangeListener()方法,以便添加和取消可否决属性变化的监听器,也可以通过java.beans.VetoableChange Support类的fireVetoableChange()方法传递属性名称、改变前的值和改变后的值等信息。
Constrained属性通常情况下在实现Java图形编程的JavaBean中大量使用,在开发JSP的过程中很少能用到。
应用jsp:useBean标识
JSP页面之中存在4种不同的范围,分别为request、session、page和application。在JSP中应用JavaBean,其生命周期可以作用于这4种范围之中,与JSP完美结合。JSP提供的jsp:useBean动作标识不仅可以实例化JavaBean对象,而且能够设置JavaBean的作用域,其语法格式如下:
1 | <jsp:useBean id="实例名" scope="范围" class="完整类名" type="数据类型"> |
(1)id属性:指定创建的JavaBean实例的实例名,其属性值为合法的Java标识符。
(2)scope属性:指定JavaBean实例的有效范围,其值可以是page(当前页面)、request(当前请求)、session(当前会话)和application(当前应用),默认值为page。这4个可选值的说明如表1所示。
(3)class属性:可选,用于指定一个完整的类名,包括该类所存在的包路径。例如,要创建一个名为“UserForm”的JavaBean的实例,该JavaBean被保存在com.wgh包中,那么指定的class属性值为“com.wgh.UserForm”。在使用jsp:useBean标识时,通常使用class属性指定类名。
class属性所指定的类不能是抽象类,并且在一个jsp:useBean标识中该属性与beanName属性有且只有一个属性存在。
(4)type属性:指定所创建的JavaBean实例的类型,可以与class或beanName属性值完全相同。在通过class属性指定类名时该属性可有可无,但是通过beanName属性指定类名时,该属性是必须的。
(5)beanName属性:可选,用于指定一个完整的类名,其中包括完整的包名。该属性与type属性一起使用。
为了简化JSP页面创建对象的Java代码,可以使用jsp:useBean标识实例化对象,并且jsp:useBean标识还具有设置JavaBean作用域的强大功能。
应用jsp:getProperty标识
在JavaBean对象中为了防止外部直接调用JavaBean属性,通常将JavaBean中的属性设置为private。但需要为其提供public(公共的)访问方法,即getXXX()方法。
应用jsp:setProperty标识
编写JavaBean对象要遵循JavaBean规范,在JavaBean规范中还需要为privale属性声明访问器setXXX()方法,用于为JavaBean中的属性赋值。如果为JavaBean对象的属性提供了setXXX()方法,在JSP页面中可能通过jsp:setProperty为其赋值。
例如:创建商品对象的JavaBean,在这个类中提供属性及与属性相对应的getXXX()与getXXX()方法,在JSP页面中为JavaBean属性赋值并获取输出。
1 | public class Produce{ |
1 | <jsp:useBean id="produce" class="com.bean.Produce"></jsp:useBean> |