From Gossip@caterpillar

JSP/Servlet: JavaBean 的多型(Polymorphic)



如果您為您的JavaBean定義了一個抽象類別,並讓所有的JavaBean實作該抽象類別,則在使用<jsp:useBean>時,可以使用type屬性來指定抽象型態,而使用class屬性來指定實際的實作類別。

舉例來說,假設您定義了一個Person抽象類別:

  • Person.java
package onlyfun.caterpillar;

public abstract class Person {
private String name;

public void setName(String name) {
this.name = name;
}

public String getName() {
return name;
}
}

然後您有定義一個Student類別實作了Person類別:
  • Student.java
package onlyfun.caterpillar;

public class Student extends Person {
private int number;

public void setNumber(int number) {
this.number = number;
}

public int getNumber() {
return number;
}
}

在使用<jsp:useBean>時,使用type來指定抽象型態,例如:
<jsp:useBean id="person" type="onlyfun.caterpillar.Person" class="onlyfun.caterpillar.Student"/>

則實際上在轉譯為Servlet時,就會產生如下的程式碼:
...
onlyfun.caterpillar.Person person = null;
if(person == null)
    person = new onlyfun.caterpillar.Student();
....

type屬性的設定可以是一個抽象類別,也可以是一個介面,如果您只設定type而沒有設定class,則您必須確定在某個範圍中已經存在您所要的Bean物件,否則會發生InstantiationException例外。