1. Trang chủ
  2. » Công Nghệ Thông Tin

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

86 305 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 86
Dung lượng 796,33 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

• 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.. Bound properties • Khi thuộc tính của bean có thay đổi giá trị, nó

Trang 2

PHẦN 1

JavaBean Overview

Trang 3

3 nD

COMPONENT MODEL

• 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

Trang 4

CÁC KHÁI NIỆM TRONG BEAN

• Introspection (khám phá nội quan)

Trang 6

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

• 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

Trang 7

7 nD

CÁC GETTER VÀ SETTER

• 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)

Trang 8

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ụ:

– Xem trang 51,52/”Developing Java Bean”-Robert Englander

– Xem mục 3.2 chương 9/”Java-tập 1”-Phương Lan

Trang 9

9 nD

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ộctí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);

• Ví dụ:

– private Color[] standardColor={Color.white,Color.green,Color.red};

– public int getStandardColor(int idx);

– public int setStandardColor(int idx, Color c);

Trang 10

Bound properties

• 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ácListener

Trang 11

• 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

Trang 12

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ì:

– public void addSizeListener(PropertyChangeListener p);

– public void removeSizeListener(PropertyChangelistener p);

Trang 13

13 nD

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:

– public void propertyChange(PropertyChangeEvent evt)

• Khi có sự kiện thay đổi thuộc tính xảy ra tại bean, hàmfirePropertyChange 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

Trang 14

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

Trang 15

15 nD

Constrained properties

• 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)

Trang 16

Constrained properties

• Để đăng ký đối tượng Listener cho một thuộc tính ràngbuộ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:

– public void fireVetoableChange(String propertyName, Object oldvalue,

Object newValue)

Trang 17

17 nD

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ứccần cài đặt là:

– public void vetoableChange(PropertyChangeEvent evt)

• 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ùngcho constrained property

Trang 18

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

Trang 20

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ươngtrì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:

– 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.

Trang 21

21 nD

• 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

Trang 23

23 nD

• 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:

– BeanDesciptor bd = new

BeanDescriptor(BeansBook.Simulator.Thermostat.class);

Trang 25

25 nD

• 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:

Trang 26

• Property Descriptor được dùng để cung cấp các thông tin tường minh

về các thuộc tính sẽ được phơi bày.

• Design pattern 1: dùng cho các properties có setter vàgetter chuẩn (có dạng getPropetyName và

– public PropertyDescriptor(String propertyName, Class beanClass,

String getterName, String setterName) throws IntrospectionException

• Design pattern 3:

– public PropertyDescriptor(String propertyName, Method getter, Method

setter) throws IntrospectionException

Trang 29

Method indexedSetter )throws IntrospectionException

Trang 30

Method Descriptor

• Method được phơi bày một cách đơn giản bằng cách

thêm tiền tố public trước tên phương thức Method

Descriptor cho phép ta chỉ định một cách tường minh

rằng method nào của một Bean sẵn có để được gọi

• Cú pháp:

– public MethodDescriptor(Method method)

– public MethodDescriptor(

Method method, ParameterDescriptor parameterDescriptors[]

)

Trang 31

Method clear = c.getMethod("clearStocks", null);

MethodDescriptor clearDesc = new MethodDescriptor(clear);

clearDesc.setShortDescription("Clears the list of stocks");

Class[ ] params = { java.lang.Integer.TYPE };

Method sort = c.getMethod("sortStocks", params);

ParameterDescriptor pd = new ParameterDescriptor();

pd.setShortDescription("Specifies the sort order");

ParameterDescriptor[ ] s = { pd };

MethodDescriptor sortDesc = new MethodDescriptor(sort, s);

sortDesc.setShortDescription("Sorts the list of stocks");

MethodDescriptor[ ] mda = { clearDesc, sortDesc };

return mda;

} catch (SecurityException e) { return null; }

catch (NoSuchMethodException e) { return null; }

}

Trang 32

Event Set Descriptor

• Event Set Descriptor phơi bày các sự kiện có thể sinh

ra bởi một Bean Nhiều event khác nhau có thể được

nhóm vào một Event Set bằng cách nhóm theo các

event methods trong cùng một Listener

• Các cú pháp:

– public EventSetDescriptor(

Class sourceClass, String eventSetName, Class listenerType,

String listenerMethodName ) throws IntrospectionException

Trang 33

– public EventSetDescriptor(

String eventSetName, Class listenerType, Method listenerMethods[], Method addListenerMethod, Method removeListenerMethod )throws IntrospectionException

– public EventSetDescriptor(

String eventSetName, Class listenerType, MethodDescriptor listenerMethodDescriptors[], Method addListenerMethod, Method removeListenerMethod ) throws IntrospectionException

Trang 34

"Property Change Event", PropertyChangeListener.class,

"propertyChange");

EventSetDescriptor[ ] eda = { ed } ; return eda;

}

catch (IntrospectionException e)

{ return null; }

}

Trang 35

"removePropertyChangeListener");

EventSetDescriptor[ ] eda = { ed } ; return eda;

} catch (IntrospectionException e) { return null; } }

Trang 36

PHẦN 4

EVENTS & LISTENERS

(sự kiện & bộ lắng nghe sự kiện)

Trang 37

thông báo với bên nhận rằng có điều gì đó đáng chú ý

đã xảy ra Phía bên nhận cần có một bộ lắng nghe sự

kiện (listener) để xử lý (handle) sự kiện

• Mô hình sự kiện (event model) của Java bao gồm:

event objects, event listeners, event sources

• Trong event source có method thông báo sự kiện, khi

có sự kiện xảy ra tại event source, event source sẽ

thông báo cho event listener nhờ method này Thông

tin về sự kiện chứa trong Event object Event object

được truyền từ event source sang event listener

Event listener có chứa method để xử lý sự kiện

Trang 39

39 nD

EVENT OBJECTS

• Event Object đóng gói tất cả các thông tin về sự kiện

mà nó đặc tả Ví dụ, Event Object về sự kiện chuột sẽ

chứa các thông tin như tọa độ của chuột, nút nào của

chuột được nhấn và nhấn mấy lần

• Lớp cơ sở java.util.EventObject có các phương thức

theo bảng sau Trong đó, phương thức toString() có

thể đọc ra (read out) một Event Object như là một

chuỗi

Trang 40

EVENT OBJECTS

• Bất cứ khi nào ta muốn định nghĩa một event object đểthông tin về một sự kiện nào đó thì ta phải tạo một

subclass thừa kế từ java.util.EventObject và tên lớp

phải có đuôi là “Event” để dễ quản lý

Trang 41

public double getTemperature() // get the temperature value

{

return theTemperature;

}

}

Trang 42

EVENT LISTENERS

• Muốn tạo một bộ lắng nghe sự kiện ta phải định nghĩa

một lớp con thừa kế từ interface java.util.EventListener

• Để dễ quản lý, tên của một bộ lắng nghe sự kiện phải

kết thúc bằng đuôi “Listener”

• Trong bộ lắng nghe sự kiện phải có các hàm xử lý sự

kiện Bất cứ lớp nào muốn nhận thông báo về sự kiện

đều phải hiện thực phương thức đó

• Một bộ lắng nghe sự kiện có thể có nhiều method để

xử lý sự kiện Mỗi method tương ứng với một sự kiện

khác nhau

• Các method đó theo design pattern sau đây:

– void <eventOccurenceMethodName>(<EventObjectType> evt);

Trang 43

public interface TempChangeListener extends java.util.EventListener

{ // this method is called whenever the ambient temperature changes

void tempChanged(TempChangedEvent evt);

void tempBelowFreezing(TempChangedEvent evt);

// this method is called if the temperature rises above the boiling point of water

void tempAboveBoiling(TempChangedEvent evt);

}

Trang 44

EVENT SOURCES

• Event Source là các đối tượng sinh ra sự kiện Các đốitượng này phải có các phương thức register và

unregister để cho phép các Event listener đăng ký

– public void add<ListenerType>(<ListenerType> listener); //register

– public void remove<ListenerType>(<ListenerType> listener); //unregister

• Nhiều listener có thể đăng ký vào một event source

Khi đó, nếu một sự kiện xảy ra thì sẽ được thông báo

Trang 45

45 nD

EVENT SOURCES

Ví dụ: import java.util.Vector;

public class Temperature

{ // the current temperature in Celsius

protected double currentTemp = 22.2;

// the collection of objects listening for temperature changes

private Vector tempChangeListeners = new Vector();

public Temperature(double startingTemp) // the constructors

{ currentTemp = startingTemp; }

public Temperature() { }

// add a temperature change listener

public synchronized void addTempChangeListener(TempChangeListener l)

{ if (!tempChangeListeners.contains(l)) // add a listener if it is not already registered

{ tempChangeListeners.addElement(l); } } // remove a temperature change listener

public synchronized void removeTempChangeListener(TempChangeListener l)

{

if (tempChangeListeners.contains(l)) // remove it if it is registered { tempChangeListeners.removeElement(l); } } //còn tiếp ở slide sau

Trang 46

EVENT SOURCES

// tiếp theo slide trước

// notify listening objects of temperature changes

protected void notifyTemperatureChange()

{ // create the event object

TempChangedEvent evt = new TempChangedEvent(this, currentTemp);

// make a copy of the listener object vector so that it cannot // be changed while we are firing events

}

Trang 47

public class Thermometer implements TempChangeListener

{ // a reference to the temperature object that we are monitoring

protected Temperature theTemperature;

// handle the temperature change events

public void tempChanged(TempChangedEvent evt)

{ // do something with the temperature that we can retrieve

// by calling evt.getTemperature() }

}

Trang 48

EVENT ADAPTERS

• Nếu một đối tượng muốn lắng nghe các sự kiện từ

nhiều nguồn khác nhau, nó sẽ phải hiện thực interface tương ứng với mỗi nguồn Đây không phải là phương

pháp hay nếu chỉ có một vài sự kiện là cần thiết cho

listener

• Hoặc khi một listener lắng nghe cùng một sự kiện từ

nhiều nguồn khác nhau thì nó phải biết sự kiện được

sinh ra từ nguồn nào

• Để giải quyết các rắc rối trên, Java cho phép dùng

adapter Adapter đóng vai trò trung gian giữa nguồn vàđích của sự kiện

Ngày đăng: 04/12/2015, 17:49

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm