Tải bản đầy đủ (.pdf) (16 trang)

EJB (enterprise java beans)

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (497.31 KB, 16 trang )

Trang 234
Chng 12: EJB (ENTERPRISE JAVA BEANS)
Chng này ta s nghiêm cu và xây dng mt trong nhng thành phn thú v ca
java ó là JavaBean mt mô hình quan trng trong kin trúc ca Java.
Các vn  chính sc  cp trong chng này
JavaBean và công ngh phn mm
Tìm hiu các thành phn ca JavaBean
Tìm hiu b phân tích Introspector ca java
Xây dng và s dng JavaBean
Tích hp JavaBean vi các công ngh thành phn khác
I. Tng quan v JavaBean
JavaBean là mt công ngh lp trình hng thành phn ca Sun da trên nn tng
a ngôn ng Java. JavaBean là mt giao din lp trình dùng  to ra nhng khi mã xây
ng sn và có th dùng li c. Nhng thành phn JavaBean có thc “nhúng” vào
t ng dng, liên kt vi thành phn JavaBean khác hay c dùng  kt ni vi các
ng dng. Bng cách s dng JavaBean các nhà phát trin ng dng có th gim khi
ng mã mà h phi vit. H có th t vit ra chúng hoc có th mua li ca mt hãng
phát trin th ba khác (third party).
JavaBean thc cht là mt lp Java nh các lp Java thông thng khác, nhng nó
c vit theo mt quy tc quy nh trc, Bn không cn phi vit thêm bt c mã
ph nào hay s dng nhng m rng ngôn ngc bit nào  to ra mt Bean.
u duy nht bn phi làm hi sa cách t tên cho các phng thc ca mình.
Chính tên phng thc mi báo cho công c xây dng bit ây có là mt thuc tính
hay mt s kin hay ch là mt phng thc thông thng.
II. Xây dng thành phn JavaBean
Nhã gii thiu  trên JavaBean thc cht là mt lp java thông thng. Nh vy
t JavaBean cng có các thuc tính và các phng thc. Mt câu hi bn t ra là làm th
nào  ngi dùng Bean ca bn có th bit c trong Bean ó có nhng thuc tính,
phng thc nào, kiu ca chúng ra làm sao? u này ã c các nhà thit k java gii
quyt mt cách rt n gin.  bit c các thuc tính và các phng thc ca mt Bean
n ch cn tuân th theo quy tc t tên sau:


i mt thuc tính có tên là xxx, thì bn to ra hai phng thc: getXxx() và setXxx().
u ý rng ký t th nht sau “get” hay “set” phi vit hoa. Kiu tr v ca phng
thc “get” cng chính là kiu ca i phng thc “set” và thng thì chúng cng là
kiu ca thuc tính xxx. Bn cng chú ý cho là tên ca thuc tính và kiu cho “get” và
“set” là không liên quan.
i mt thuc tính boolean, bn có th dùng cách tip cn “get” và “set”  trên, nhng
n cng có th dung “is” thay cho “get”.
Các phng thc thông thng ca Bean không tuân theo quy tc trên, nhng chúng
phi là phng thc public.
u Bean cho phép ng ký thính gi thì vi mt thính gi (listener) XxxListener bn
phi có hai phng thc tng ng i kèm là addXxxListener(XxxListener) và
Trang 235
removeXxxListener(XxxListener). Phn ln các bin c và thính gi là có sn bn có
th t to ra các bin c và thính gi riêng ca mình.
1. Thuc tính ca Bean
Thuc tính thc cht là mt bin nm bên trong mt lp, thông thng các thuc
tính thng c t mc truy cp là private.  truy cp n các thuc tính private này ta
thng dùng hai phng thc: “get” mang ngha là ly giá tr ca thuc tính và “set” hàm
ngha gán giá tr cho thuc tính. Ví d vi mt Bean n gin có tên là xBean nh sau:
public class xBean
{
private String myName;
public String getName() { return myName;}
public void setName(String newName) { myName=newName;}
}
Thuc tính myName trong lp xBean c ly và gán gián tr thông qua phng
thc getName và setName. Nh bn thy gia tên thuc tính và tên phng thc “get” và
“set” là không liên quan n nhau. Khi B phân tích (Instrospector) ca java thy trong
Bean có hai phng thc tên là getName và setName nó s hiu rng bên trong Bean này
có mt thuc tính tên là name (vì có hai phng thc tên là getName và setName).

Ví d: Trình bày cách to ra các thuc tính và cách xây dng các phng thc “get” và
“set”
public class Bean1 {
private String str; // thuc tính kiu String
private int i; // thuc tính kiu int
private int[] arr; // thuc tính kiu mng int
private boolean b; // thuc tính kiu logic
private float f; // thuc tính kiu float
private java.io.DataInputStream is; // thuc tính kiu i tng
private java.io.DataOutputStream os;
public String getStr() { //Phng thc get cho thuc tính str
return str;
}
public void setStr(String str) { //Phng thc set cho thuc tính str
this.str = str;
}
public int getI() { //Phng thc get cho thuc tính i
return i;
}
public void setI(int i) { //phng thc set cho thuc tính i
this.i = i;
}
//Phng thc get cho thuc tính arr thuc tính này là mt //mng nên giá tr tr v là mt
ng
public int[] getArr() { return arr; }
//Phng thc set cho thuc tính arr, thuc tính này là mt //mng nên tham s là mt
ng
public void setArr(int[] arr) { this.arr = arr; }
Trang 236
//Phng thc get cho thuc tính b, do thuc tính này kiu //logic nên bn có th s dng

is thay cho get
public boolean isB() { return b; }
public void setB(boolean b) { this.b = b; }
public float getF() { return f; }
public void setF(float f) { this.f = f; }
//nu thuc tính là mt i tng thì phng thc get tr //v mt i tng kiu i
ng
public java.io.DataInputStream getIs() { return is; }
public void setIs(java.io.DataInputStream is) { this.is = is; }
public java.io.DataOutputStream getOs() { return os; }
public void setOs(java.io.DataOutputStream os) { this.os = os; }
}
a) Các thuc tính th hin s thay i (Bound Property)
JavaBean là các thành phn riêng bit nhng nó vn có th tng tác vi các i
ng khác thông qua c ch truyn thông p (message). Khi mt thuc tính ca mt
Bean A thay i nó có th thông báo cho các i tng khác bit là thuc tính ca A ã
thay i i tng này thc hin công vic gì ó chng hn nh cp nht li giá tr ca
nó theo thuc tính ca A.
 ch cài t  mt thuc tính có th thông báo cho các i tng khác bit khi nó
thay i rt n gin ch cn cài t hai phng thc dùng ng ký và loi b mt
i tng listener nh sau:
public void add<PropertyName>Listener(PropertyChangeListener lst)
public void remove<PropertyName>Listener(PropertyChangeListener lst)
Ví d: n có mt JavaBean A có mt thuc tính size cho bit kích c gì ó. Khi thuc tính
size thay i  các i tng khác u bit s thay i này ta cài t nh sau:
public class BeanA
{float size;
private PropertyChangeSupport changeSize=new PropertyChangeSupport(this);
public void addSizeListener(PropertyChangeListener lst){}
public void removeSizeListener(PropertyChangeListener lst){}

}
Các i tng mun nhn c thông báo t JavaBean này u phi cài t giao
din PropertyChangeListener , sau ó ng ký vi thành phn BeanA nh các phng
thc mà bn xây dng  bc trên. Phng thc duy nht mà bn phi ghi è khi cài t
giao din PropertyChangeListener là public void propertyChange(PropertyChangeEvent
evt) {..}
Các th tc trên ây ch thc hin nhim vng ký và to i tng Listener mà
thôi.  các i tng Listener này có th nhn bit c s thay i ca thuc tính size ta
phi gi phng thc firePropertyChange ca i tng PropertyChangeSupport t thành
phn BeanA nh sau:
public void firePropertyChange (String propertyName, Object oldValue, Object
newValue)
Phng thc này s thông báo n mi i tng listener (bng cách gi phng
thc propertyChange ca listener) ã ng ký vi thành phn JavaBean. S thay i bao
Trang 237
m giá tr trc khi thay i (oldValue) và giá tr sau khi thay i (newValue) và tên
thuc tính c thay i.
Di ây là cài t lp BeanA và mt lp  th nghim thuc tình nhn bit s
thay i size
//BeanA.java
import java.beans.*;
public class BeanA {
//Khai báo thuc tính size
private float size;
// changeSize có nhim v qun lý các i tng listener ã ng //ký và gi thông báo
n chúng mi khi thuc tính size thay i
PropertyChangeSupport changeSize = new PropertyChangeSupport(this);
public float getSize() { return size; }
//Phng thc gán giá tr cho cho thuc tính size
public void setSize(float newSize) {

float oldSize = size; size = newSize;
//Nu có thay i v kích thc thì thông báo n tt c các i //tng ã ng ký lng
nghe
if(oldSize!=newSize)
changeSize.firePropertyChange("size", new Float(oldSize), new Float(newSize));
}
public void addSizeListener(PropertyChangeListener lst) {
changeSize.addPropertyChangeListener(lst);
}
public void removeSizeListener(PropertyChangeListener lst) {
changeSize.removePropertyChangeListener(lst);
}
}
Ví d sau th nghim BeanA va cài t  trên
// TestBeanA.java
import java.beans.*;
public class TestBeanA {
public static void main(String[] args) {
// to ra mt i tng BeanA
BeanA ba = new BeanA();
//ng ký i tng lng nghe vi i tng ba
ba.addSizeListener(new MyListener());
//thay i giá tr ca thuc tính size
ba.setSize(333);
} }
//To ra i tng có kh nng lng nghe s thay i ca thuc tính
class MyListener implements PropertyChangeListener {
//Phng thc duy nht cn phi cài t, phng thc này //c triu gi mi khi
thuc tính thay i
public void propertyChange(PropertyChangeEvent evt) {

float oldSise = ( (Float) evt.getOldValue()).floatValue();
float newdSise = ( (Float) evt.getNewValue()).floatValue();
String propertyName = evt.getPropertyName();
Trang 238
System.out.println("Change " + propertyName + " old value " + oldSise +
" new value " + newdSise);
}
}
t qu khi chy chng trình nh sau:
Change size old value 1.0 new value 333.0
Chú ý:
Trong ví d trên tên ca phng thc dùng ng ký là addSizeListener và tên ca
phng thc dùng  g bng ký là removeSizeListener tuy nhiên bn có tht
cho nó mt cái tên thu thích chng hn nh dangKyLangNghe  ng ký i
ng lng nghe hay huyBoLangNghe  hu bi tng lng nghe.
Các i tng s không bit n s thay i ca thuc tính size cho n khi bn gi
phng thc firePropertyChange ca i tng PropertyChangeSupport.
b) Các thuc tính ràng buc (Constrain Property)
Hn ch ca các thuc tính bound  trên là các i tng ch phn ng li khi giá tr
a thuc tính ã b thay i. Java cung cp mt kh nng khác mnh hn ó là to ra các
thuc tính b ràng buc (constrain property). Tng t nh thuc tính bound mi khi thuc
tính constrain nh thay i giá tr (ch dnh ch cha thay i) nó s thông báo n tt
 các i tng ang lng nghe. i tng lng nghe có th t chi s thay i và nh vy
giá tr ca thuc tính vn gi nguyên giá tr ban u. Ngc li nu tt c các i tng
ng nghe u không phn i s thay i thì lúc ó thuc tính này mi nhn c giá tr
i.
 mt thuc tính có th thông báo cho các i tng khác bit khi nó sp thay i
giá tr rt n gin bn ch cn cài t hai phng thc dùng ng ký và loi b
t i tng listener nh sau:
public void add<PropertyName>Listener(VetoableChangeListener lst)

public void remove<PropertyName>Listener(VetoableChangeListener lst)
Các i tng mun nhn c thông báo t JavaBean này u phi cài t giao
din VetoableChangeListener, sau ó ng ký, loi vi thành phn BeanA nh các
phng thc mà bn xây dng  bc trên. Phng thc duy nht mà bn phi ghi
è khi cài t giao din VetoableChangeListener là
public void vetoableChange(PropertyChangeEvent evt) throws PropertyVetoException
{.. }
i tng lng nghe không ng ý cho thay i thuc tính nó ch cn ném ra mt
ngoi l PropertyVetoException, thành phn JavaBean có thuc tính constrain s bt
y và hu b vic thay i giá tr cho thuc tính.
ng nh thuc tính bound, khi thuc tính constrain có dnh thay i giá tr trong
phng thc “set” nó cn thông báo n các i tng ã ng ký lng nghe
(listener) vi nó bng phng thc fireVetoableChange ca i tng
VetoableChangeSupport t thành phn JavaBean nh sau:
public void fireVetoableChange (String propertyName, Object oldValue, Object
newValue)
Trang 239
Phng thc này s thông báo n mi i tng listener (bng cách gi phng
thc vetoableChange ca listener) ã ng ký vi thành phn JavaBean.
Nhn xét: i tng VetoableChangeSupport cng tng t nh i tng
PropertyChangeSupport dùng  qun lý các i tng listener. PropertyChangeSupport
c dùng vi các thuc tính bound còn VetoableChangeSupport dùng cho thuc tính
constrain.
i ây là mt cài t cho mt JavaBean B có thuc tính size. Mi khi size thay i nó s
thông báo cho các thành phn khác bit thông qua i tng listener. i tng listener
này s t chi không cho thay i nu size >100.
// BeanB.java
import java.beans.*;
public class BeanB {
//Khai báo thuc tính size

private int size = 0;
// vetoAgent vó nhim v qun lý tt c các i tng listener //ã ng ký
private VetoableChangeSupport vetoAgent = new VetoableChangeSupport(this);
//Phng thc ly v giá tr ca thuc tính size
public int getSize() { return size; }
//Phng thc dùng  thay i giá tr ca thuc tính size
public void setSize(int newSize) {
int oldSize = size;
try { // Thông báo n tt c các i tng ã ng ký lng nghe
vetoAgent.fireVetoableChange("size", oldSize, newSize);
}
catch (PropertyVetoException ex) {
// Nu có mt listener nào ó phn i không cho phép thay i //giá tr ca thuc
tính size thì kt thúc phng thc
return;
}
//Nu tt c các listener u không phn i s thay i thì // tin hành gán giá tr mi
cho thuc tính size
size = newSize;
}
//Phng thc dùng ng ký i tng lng nghe
public void addSizeListener(VetoableChangeListener lst) {
vetoAgent.addVetoableChangeListener(lst);
}
//Phng thc dùng  g bi tng lng nghe
public void removeSizeListener(VetoableChangeListener lst) {
vetoAgent.removeVetoableChangeListener(lst);
}
}
Ví d sau dùng  test th BeanB va to

// TestBeanB.java
import java.beans.*;
public class TestBeanB {
public static void main(String[] args) {

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×