第四章 JavaBean技术
4.2.2 使用JavaBean的意义
如果使HTML代码与Java代码相分离,将Java代码单独封装成为一个处理某种业务逻辑的类,然后在JSP页面中调用此类,就可以降低HTML代码与Java代码之间的耦合度,简化JSP页面,提高Java程序代码的重用性及灵活性。这种与HTML代码相分离,而使用Java代码封装的类,就是一个JavaBean组件。
4.2.3 了解JavaBean的规范
JavaBean是一个可重用的Java软件组件模型,在编写时,需要遵循Java的一些编码约定。一个标准的JavaBean应该具有以下规范。
l
公共的无参的构造方法。
一个JavaBean对象必须拥有一个公共类型、默认的无参构造方法,从而可以通过new关键字直接对其进行实例化。(补充:当一个类创建了一个对象时,Java会自动调用该类的构造函数。构造函数具有和类完全相同的名称。无论是否定义构造函数,所有类都有构造函数,如果没有定义构造函数,系统会自动调用默认的构造函数。当然,一旦定义了自己的构造函数,也就不用调用默认的构造函数。一个类可以有多个构造函数,它们具有相同的方法名,即类名。构造函数分为默认的构造函数和带参数的构造函数。在编译阶段,编译器会根据参数的个数来决定调用那个构造函数。)
l
类的声明是非final类型的。
当一个类声明为final类型时,它是不可以更改的,所以,JavaBean对象的声明应该是非final类型的。
l
实现可序列接口。
JavaBean应该直接或间接实现java.io.Serialization接口,以支持序列化机制。
l
为属性声明访问器。
JavaBean中的属性应该设置为私有(private)类型,以防止外部直接访问,但它需要对外提供公共(public)的访问方法,也就是说需要为属性提供getter/setter方法。
补充:Serializable接口
public interface Serializable类通过实现
java.io.Serializable
接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。序列化接口没有方法或字段,仅用于标识可序列化的语义。
当遍历一个图形时,可能会遇到不支持可序列化接口的对象。在此情况下,将抛出 NotSerializableException,并将标识不可序列化对象的类。
序列化运行时使用一个称为 serialVersionUID
的版本号与每个可序列化类相关联,该序列号在反序列化过程中用于验证序列化对象的发送者和接收者是否为该对象加载了与序列化兼容的类。如果接收者加载的该对象的类的
serialVersionUID 与对应的发送者的类的版本号不同,则反序列化将会导致 InvalidClassException。可序列化类可以通过声明名为
"serialVersionUID"
的字段(该字段必须是静态 (static)、最终
(final)
的 long
型字段)显式声明其自己的 serialVersionUID:
ANY-ACCESS-MODIFIER
static final long serialVersionUID = 42L;
如果可序列化类未显式声明 serialVersionUID,则序列化运行时将基于该类的各个方面计算该类的默认
serialVersionUID 值,如“Java(TM)
对象序列化规范”中所述。不过,强烈建议
所有可序列化类都显式声明 serialVersionUID 值,原因计算默认的 serialVersionUID 对类的详细信息具有较高的敏感性,根据实现的不同可能千差万别,这样在反序列化过程中可能会导致意外的
InvalidClassException。因此,为保证
serialVersionUID 值跨不同 java
实现的一致性,序列化类必须声明一个明确的
serialVersionUID 值。还强烈建议使用
private 修改器显示声明
serialVersionUID(如果可能),原因是这种声明仅应用于立即声明类
-- serialVersionUID 字段作为继承成员没有用处。
当一个JavaBean在构造工具内被用户化,并与其它Bean建立连接之后,它的所有状态都应当可被保存,下一次被load进构造工具内或在运行时,就应当是上一次修改完的信息。为了能做到这一点,要把Bean的某些字段的信息保存下来,在定义Bean时要使它实现Java.io.Serializable接口。例如:
public class Button implements Java.io.Serializable {……}
实现了序列化接口的Bean中字段的信息将被
所谓的Serializable,就是java提供的通用数据保存和读取的接口。任何类型只要实现了Serializable接口,就可以被保存到文件中,或者作为数据流通过网络发送到别的地方。也可以用管道来传输到系统的其他程序中。这样子极大的简化了类的设计。只要设计一个保存一个读取功能就能解决上面说得所有问题。
4.3 JavaBean与JSP的完美结合
例4.1 通过非可视化的JavaBean封装邮箱地址对象,通过JSP页面调用此对象,来验证邮箱地址是否合法
(1)
创建名称为Email的JavaBean对象,用于封装邮箱地址,此类位于com.lyq.bean包中,其关键代码如下。
package com.lyq.bean;
import java.io.Serializable;
public class Email implements Serializable
{
private static final
long serialVersionUID=1L;
private String
mailAdd;
private boolean
email;
//public
Email(){
//}
public Email(String
mailAdd){
this.mailAdd=mailAdd;
}
public String
getMailAdd() {
return mailAdd;
}
public void
setMailAdd(String mailAdd) {
this.mailAdd = mailAdd;
}
public boolean
isEmail() {
//正则表达式,定义邮箱格式
String
regex="\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*";
if(mailAdd.matches(regex)){
email=true;
}
return email;
}
}
(2)
创建名称为index.jsp的页面。它是程序之中的首页,用于放置验证邮箱的表单,此表单的提交地址为result.jsp页面,其关键代码如下。