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

Bài giảng lập trình ứng dụng mạng bài 1 GV võ tấn dũng

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 (796.33 KB, 86 trang )

TRƯỜNG CAO ĐẲNG CÔNG NGHỆ THÔNG TIN TP.HCM

LẬP TRÌNH ỨNG DỤNG MẠNG

BÀI 1

GIẢNG VIÊN:

VÕ TẤN DŨNG
1

GV: Võ Tấn Dũng

JAVA BEANS


PHẦN 1

2

GV: Võ Tấn Dũng

JavaBean Overview


• Component là các thành phần độc lập của phần mềm
được lắp ráp với nhau để hình thành một ứng dụng.
Các component trong Java được gọi là Bean hay
Java-Bean.
• Các component trong một ứng dụng có thể tương tác
với nhau. Để tương tác được với nhau thì các


component phải được đặt trong một container.
Container được gọi là environment. Bản thân container
cũng là một component.
• Mỗi Bean đều có các thuộc tính (properties) và các
hành vi (behaviors) cho phép Bean tương tác với
environment và tương tác với các Bean khác.
3

GV: Võ Tấn Dũng

COMPONENT MODEL


CÁC KHÁI NIỆM TRONG BEAN
Introspection (khám phá nội quan).
Properties (các thuộc tính).
Customization (sự tùy biến).
Events (các sự kiện).
Persistence (bảo tồn).
Methods (các phương thức).

4

GV: Võ Tấn Dũng










PHẦN 2

5

GV: Võ Tấn Dũng

Bean’s properties


THUỘC TÍNH CỦA BEAN (PROPERTIES)

6

GV: Võ Tấn Dũng

• Thuộc tính cho biết trạng thái (state) của một đối
tượng. Các thuộc tính được truy cập bằng tên của
thuộc tính.
• Người dùng tương tác với bean thông qua các thuộc
tính của nó. Bằng cách thay đổi thuộc tính, các nhà
phát triển ứng dụng sẽ đem đến cho component một
diện mạo và các hành vi khác.
• Thuộc tính của bean có thể được thay đổi bằng các
dòng lệnh trong code hoặc bằng các công cụ trực
quan (visual tools).
• Thuộc tính thật ra là nhưng biến nằm trong một lớp.



• Thông thường biến được dùng vào hai mục đích đó là
gán dữ liệu vào và lấy dữ liệu ra.
• Giá trị của các thuộc tính không nên được truy cập
trực tiếp mà cần phải thông qua các phương thức.
• Các phương thức để đọc dữ liệu từ biến được gọi là
các getter. Các phương thức để gán dữ liệu cho biến
được gọi là các setter.
• Các thuộc tính có các tính chất sau: read-and-write,
read-only, write-only.
• Kiểu dữ liệu của một thuộc tính có thể là kiểu sơ cấp
(primitive) như int, long, boolean,…hoặc kiểu dữ liệu
đối tượng của một lớp nào đó (kiểu wrapper class).
7

GV: Võ Tấn Dũng

CÁC GETTER VÀ SETTER


CÁC GETTER VÀ SETTER
• Các setter và getter nên theo các mẫu thiết kế (design
pattern) sau đây:
– public void set<PropertyName>(<PropertyType> value);
– public <PropertyType> get<PropertyName>();

• Nếu <PropertyType> có kiểu là boolean thì getter có
thể theo mẫu sau:
– public boolean is<PropertyName>();


• Ví dụ:

8

GV: Võ Tấn Dũng

– Xem trang 51,52/”Developing Java Bean”-Robert Englander
– Xem mục 3.2 chương 9/”Java-tập 1”-Phương Lan


Indexed properties
• Các phần tử của mảng được truy xuất nhờ vào chỉ số
cho nên những thuộc tính kiểu mảng được gọi là thuộc
tính chỉ số (indexed properties).
• Các mẫu thiết kế (design pattern):
– Setter:
• public <PropertyType>[] get<PropertyName>();
• public void set<PropertyName>(<PropertyType>[] value);

– Getter:
• public <PropertyType> get<PropertyName>(int index);
• public void set<PropertyName>(int index, <PropertyType> value);

– private Color[] standardColor={Color.white,Color.green,Color.red};
– public int getStandardColor(int idx);
– public int setStandardColor(int idx, Color c);
9

GV: Võ Tấn Dũng


• Ví dụ:


Bound properties

10

GV: Võ Tấn Dũng

• Khi thuộc tính của bean có thay đổi giá trị, nó có thể
báo cho các bean khác biết sự thay đổi đó bằng cách
thông báo.
• Các thuộc tính có hỗ trợ các thông báo như vậy thì
được gọi là các bound properties (thuộc tính thể hiện
sự thay đổi).
• Hoạt động này được thực hiện thông qua Event và các
Listener.


Bound properties

11

GV: Võ Tấn Dũng

• Một PropertyChangeEvent của một bounded property
chỉ được thông báo ra bên ngoài khi nó có sự thay đổi.
Tức là sự kiện (event) về sự thay đổi đó đã xảy ra.
• Nếu một bean có bound property thì nó phải cung cấp
một hàm đăng ký (register) và một hàm gỡ bỏ đăng ký

(unregister) tương ứng với một bộ lắng nghe sự kiện
thuộc tính (PropertyChangeListener).
• Người lập trình có thể thiết kế và viết code cho các bộ
lắng nghe sự kiện thuộc tính này.


Bound properties
• Design Pattern cho các register và unregister:
– public void addPropertyChangeListener(PropertyChangeListener p);
– public void removePropertyChangeListener(PropertyChangelistener p);

• Trường hợp chỉ cần áp dụng cho một thuộc tính cụ thể
thì ta cài đặt theo mẫu sau:
– public void add<PropertyName>Listener(PropertyChangeListener p);
– public void remove<PropertyName>Listener(PropertyChangelistener p);

• Ví dụ: một bean có thuộc tính size kiểu int thì:

12

GV: Võ Tấn Dũng

– public void addSizeListener(PropertyChangeListener p);
– public void removeSizeListener(PropertyChangelistener p);


Bound properties
• Các register và unregister chỉ dùng để đăng ký và gỡ
bỏ đăng ký các Listener mà thôi. Để các đối tượng
Listener nhận biết được sự thay của thuộc tính thì ta

phải xây dựng hàm firePropertyChange trong bean.
– public void firePropertyChange(String propertyName, Object oldValue,
Object newValue);

• Khi thiết kế bộ lắng nghe sự kiện thuộc tính (Property
Change Listener) thì ta cần cài đặt phương thức:
• Khi có sự kiện thay đổi thuộc tính xảy ra tại bean, hàm
firePropertyChange của nó sẽ thông báo đến mọi đối
tượng Listener đã đăng ký để Listener xử lý sự kiện
bằng hàm propertyChange của Listener.
13

GV: Võ Tấn Dũng

– public void propertyChange(PropertyChangeEvent evt)


VÍ DỤ: về Bound properties

14

GV: Võ Tấn Dũng

• Ví dụ 9-1 và 9-2 chương 9/”Java-tập 1”-Phương Lan


Constrained properties

15


GV: Võ Tấn Dũng

• Hạn chế của các bound properties là các listener phải
chấp nhận giá trị thuộc tính đã thay đổi mà không
được quyền từ chối.
• Trong một số thời điểm, listener có quyền từ chối
không chấp nhận sự thay đổi của một thuộc tính nào
đó từ một bean. Các thuộc tính như vậy gọi là các
thuộc tính ràng buộc (constrained properties).


Constrained properties
• Để đăng ký đối tượng Listener cho một thuộc tính ràng
buộc thì bean phải được cài đặt register và unregister
theo các mẫu sau:
– public void add<PropertyName>Listener(VetoableChangeListener p);
– public void remove<PropertyName>Listener(VetoableChangeListener p);

• Hoặc:
– public void addVetoableChangeListener(VetoableChangeListener p);
– public void removeVetoableChangeListener(VetoableChangeListener p);

• Và hàm thông báo:

16

GV: Võ Tấn Dũng

– public void fireVetoableChange(String propertyName, Object oldvalue,
Object newValue)



Constrained properties
• Để phản ứng lại với các thay đổi của constrained
property thì ta phải xây dựng các bộ lắng nghe sự kiện
từ giao diện VetoableChangeListener với phương thức
cần cài đặt là:
• Nếu Listener không đồng ý cho thay đổi thuộc tính nó
sẽ ném ra ngoại lệ PropertyVetoException. Thành
phần bean có thuộc tính constraint sẽ bắt lấy và hủy
bỏ quá trình thay đổi giá trị cho thuộc tính.
• Đối tượng VetoableChangeSupport cũng tương tự
như PropertyChangeSupport dùng để quản lý các đối
tượng listener. PropertyChangeSupport được dùng
cho bound property còn VetoableChangeSupport dùng
17
cho constrained property.

GV: Võ Tấn Dũng

– public void vetoableChange(PropertyChangeEvent evt)


VÍ DỤ: về Constrained properties

18

GV: Võ Tấn Dũng

• Ví dụ 9-3 và 9-4 chương 9/”Java-tập 1”-Phương Lan



PHẦN 3

Introspection

19

GV: Võ Tấn Dũng

(khám phá nội quan)


KHÁI NIỆM INTROSPECTION
• Introspection là tiến trình phơi bày các thuộc tính
(properties), các phương thức (methods), các sự kiện
(events) mà một Bean có thể hỗ trợ.
• Tiến trình này được dùng vào lúc run-time của chương
trình hoặc bởi các công cụ phát triển trực quan (visual
development tool) vào lúc design-time.
• Có hai cách để thực hiện tiến trình này:

20

GV: Võ Tấn Dũng

– Cơ chế phản ánh mức thấp (low-level reflection mechanism).
Hay còn được gọi là Introspector ngầm định.
– Xây dựng BeanInfo class bên cạnh một Bean.



BeanInfo Class

21

GV: Võ Tấn Dũng

• Trong một số trường hợp, ta muốn phơi bày những
thuộc tính, sự kiện, phương thức của một Bean theo ý
muốn hơn là dùng Introspetor ngầm định.
• Khi đó ta xây dựng một BeanInfo class dựa theo
BeanInfo interface.
• Bean class được thiết kế bên cạnh một Bean nhằm để
xác định các thông tin của Bean.


BeanInfo Class

22

GV: Võ Tấn Dũng

• Một BeanInfo class hiện thực giao tiếp
java.beans.BeanInfo xác định một tập các method
được dùng để thu thập các thông tin về một Bean. Các
method đó là:


BeanInfo Class (Bean Descriptor)
• Lớp java.beans.BeanDescriptor được dùng để mô tả

lớp hiện thực của Bean.
• Cú pháp:
– public BeanDescriptor(Class beanClass)
– public BeanDescriptor(Class beanClass, Class customizerClass)

• Ví dụ: có một Bean tên là Thermostat được hiện thực
bởi lớp Thermostat.class. Ta xây dựng Bean
Descriptor cho nó như sau:

23

GV: Võ Tấn Dũng

– BeanDesciptor bd = new
BeanDescriptor(BeansBook.Simulator.Thermostat.class);


BeanInfo Class (Bean Descriptor)
• Ví dụ:
package BeansBook.Simulator;
import java.beans.*;

24

GV: Võ Tấn Dũng

public class ThermostatBeanInfo extends SimpleBeanInfo
{
public BeanDescriptor getBeanDescriptor()
{

BeanDescriptor bd = new BeanDescriptor(Thermostat.class);
bd.setDisplayName("Simulated Thermostat");
return bd;
}
}


BeanInfo Class (Icon)

• Ví dụ:
public java.awt.Image getIcon(int iconKind)
{ if (iconKind == BeanInfo.ICON_COLOR_16x16)
{
java.awt.Image img = loadImage("thermostat.gif");
return img;
}
return null;
}

25

GV: Võ Tấn Dũng

• Mỗi Bean cần có một Icon tương ứng để được các
công cụ phát triển trực quan đặt Bean vào palettes
hoặc tool-bars. Các icon này có định dạng là file ảnh
GIF với các kích thước và màu sắc theo bảng sau:



×