Bài 1 Java Beans

• 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áccomponent trongJava đượ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ươngtác được với nhau thì các component phải đượcđặttrongmộtcontainer. Container được gọi là environment. Bản thân container cũng là một component.

pdf86 trang | Chia sẻ: lylyngoc | Lượt xem: 2256 | Lượt tải: 2download
Bạn đang xem trước 20 trang tài liệu Bài 1 Java Beans, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
1 GIẢNG VIÊN: VÕ TẤN DŨNG TRƯỜNG CAO ĐẲNG CÔNG NGHỆ THÔNG TIN TP.HCM LẬP TRÌNH ỨNG DỤNG MẠNG BÀI 1 JAVA BEANS G V : V õ T ấ n D ũ n g 2PHẦN 1 JavaBean Overview G V : V õ T ấ n D ũ n g 3G V : V õ T ấ n D ũ n g 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. 4G V : V õ T ấ n D ũ n g 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). 5PHẦN 2 Bean’s properties G V : V õ T ấ n D ũ n g 6G V : V õ T ấ n D ũ n g 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. 7G V : V õ T ấ n D ũ n g 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). 8G V : V õ T ấ n D ũ n g 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( value); – public get(); • Nếu có kiểu là boolean thì getter có thể theo mẫu sau: – public boolean is(); • 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 9G V : V õ T ấ n D ũ n g 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 [] get(); • public void set([] value); – Getter: • public get(int index); • public void set(int index, value); • Ví dụ: – private Color[] standardColor={Color.white,Color.green,Color.red}; – public int getStandardColor(int idx); – public int setStandardColor(int idx, Color c); 10 G V : V õ T ấ n D ũ n g 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ác Listener. 11 G V : V õ T ấ n D ũ n g Bound properties • 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. 12 G V : V õ T ấ n D ũ n g 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 addListener(PropertyChangeListener p); – public void removeListener(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); 13 G V : V õ T ấ n D ũ n g 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à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. 14 G V : V õ T ấ n D ũ n g VÍ DỤ: về Bound properties • Ví dụ 9-1 và 9-2 chương 9/”Java-tập 1”-Phương Lan 15 G V : V õ T ấ n D ũ n g 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). 16 G V : V õ T ấ n D ũ n g 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 addListener(VetoableChangeListener p); – public void removeListener(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) 17 G V : V õ T ấ n D ũ n g 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à: – 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ùng cho constrained property. 18 G V : V õ T ấ n D ũ n g VÍ DỤ: về Constrained properties • Ví dụ 9-3 và 9-4 chương 9/”Java-tập 1”-Phương Lan 19 PHẦN 3 Introspection (khám phá nội quan) G V : V õ T ấ n D ũ n g 20 G V : V õ T ấ n D ũ n g 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: – 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. 21 G V : V õ T ấ n D ũ n g BeanInfo Class • 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. 22 G V : V õ T ấ n D ũ n g BeanInfo Class • 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à: 23 G V : V õ T ấ n D ũ n g 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: – BeanDesciptor bd = new BeanDescriptor(BeansBook.Simulator.Thermostat.class); 24 G V : V õ T ấ n D ũ n g BeanInfo Class (Bean Descriptor) • Ví dụ: package BeansBook.Simulator; import java.beans.*; public class ThermostatBeanInfo extends SimpleBeanInfo { public BeanDescriptor getBeanDescriptor() { BeanDescriptor bd = new BeanDescriptor(Thermostat.class); bd.setDisplayName("Simulated Thermostat"); return bd; } } 25 G V : V õ T ấ n D ũ n g BeanInfo Class (Icon) • 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: • 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; } 26 G V : V õ T ấ n D ũ n g BeanInfo Class (Property Descriptor) • 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à setPropertyName): – public PropertyDescriptor(String propertyName, Class beanClass) throws IntrospectionException • Design pattern 2: dùng cho các properties có setter và getter không theo dạng chuẩn: – 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 27 G V : V õ T ấ n D ũ n g BeanInfo Class (Property Descriptor) • Các vị dụ về Property Descriptor: Xem trang 156,157,158/”Developing Java Bean”-Robert Englander 28 G V : V õ T ấ n D ũ n g Indexed Property Descriptor • Cú pháp: – public IndexedPropertyDescriptor(String propertyName, Class beanClass) throws IntrospectionException • Ví dụ: public PropertyDescriptor[ ] getPropertyDescriptors() { try { IndexedPropertyDescriptor ip = new IndexedPropertyDescriptor("Stocks", WatchList.class); PropertyDescriptor[ ] pda = { ip }; return pda; } catch (IntrospectionException e) { return null; } } 29 G V : V õ T ấ n D ũ n g Indexed Property Descriptor Các dạng cú pháp khác: • public IndexedPropertyDescriptor( String propertyName, Class beanClass, String getterName, String setterName, String indexedGetterName, String indexedSetterName ) throws IntrospectionException • public IndexedPropertyDescriptor( String propertyName, Method getter,Method setter, Method indexedGetter, Method indexedSetter )throws IntrospectionException 30 G V : V õ T ấ n D ũ n g 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[] ) 31 G V : V õ T ấ n D ũ n g Method Descriptor • Ví dụ: public MethodDescriptor[ ] getMethodDescriptors() { try { Class c = WatchList.class; 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; } } 32 G V : V õ T ấ n D ũ n g 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 33 G V : V õ T ấ n D ũ n g Event Set Descriptor • Các cú pháp (tiếp theo): – public EventSetDescriptor( Class sourceClass, String eventSetName, Class listenerType, String listenerMethodNames[], String addListenerMethodName, String removeListenerMethodName )throws IntrospectionException – 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 34 G V : V õ T ấ n D ũ n g Event Set Descriptor • Ví dụ 1: public EventSetDescriptor[] getEventSetDescriptors() { try { EventSetDescriptor ed = new EventSetDescriptor(Temperature.class, "Property Change Event", PropertyChangeListener.class, "propertyChange"); EventSetDescriptor[ ] eda = { ed } ; return eda; } catch (IntrospectionException e) { return null; } } 35 G V : V õ T ấ n D ũ n g Event Set Descriptor • Ví dụ 2: public EventSetDescriptor[] getEventSetDescriptors() { try { String[] names = { "propertyChange" } ; EventSetDescriptor ed = new EventSetDescriptor(Temperature.class, "Property Change Event", PropertyChangeListener.class, names, "addPropertyChangeListener", "removePropertyChangeListener"); EventSetDescriptor[ ] eda = { ed } ; return eda; } catch (IntrospectionException e) { return null; } } 36 PHẦN 4 EVENTS & LISTENERS (sự kiện & bộ lắng nghe sự kiện) G V : V õ T ấ n D ũ n g 37 G V : V õ T ấ n D ũ n g MÔ HÌNH SỰ KIỆN • Các sự kiện là các thông điệp (messages) được gửi từ một đối tượng (Object) đến các đối tượng khác để 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. 38 G V : V õ T ấ n D ũ n g MÔ HÌNH SỰ KIỆN • Event listener phải đăng ký với event source thì mới có thể nhận được các thông báo từ event source. • Mỗi sự kiện trong Java có thể tương ứng với một hoặc nhiều bộ lắng nghe sự kiện. 39 G V : V õ T ấ n D ũ n g 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. 40 G V : V õ T ấ n D ũ n g 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ý. • Ví dụ: public class SimpleEvent extends java.util.EventObject { // construct the simple event type SimpleEvent(Object source) { super(source); } } 41 G V : V õ T ấ n D ũ n g EVENT OBJECTS Ví dụ: package BeansBook.Simulator; public class TempChangedEvent extends java.util.EventObject { protected double theTemperature; // the new temperature value in Celsius // constructor public TempChangedEvent(Object source, double temperature) { super(source); // pass the source object to the superclass theTemperature = temperature; // save the new temperature } public double getTemperature() // get the temperature value { return theTemperature; } } 42 G V : V õ T ấ n D ũ n g 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 ( evt); 43 G V : V õ T ấ n D ũ n g EVENT LISTENERS • Ví dụ: package BeansBook.Simulator; public interface TempChangeListener extends java.util.EventListener { // this method is called whenever the ambient temperature changes void tempChanged(TempChangedEvent evt); } • Ví dụ: package BeansBook.Simulator; public interface AdvancedTempChangeListener extends TempChangeListener { // this method is called if the temperature drops below the freezing // point of water void tempBelowFreezing(TempChangedEvent evt); // this method is called if the temperature rises above the boiling point of water void tempAboveBoiling(TempChangedEvent evt); } 44 G V : V õ T ấ n D ũ n g EVENT SOURCES • Event Source là các đối tượng sinh ra sự kiện. Các đối tượ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( listener); //register – public void remove( 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 đến nhiều listener cùng một lúc. • Bản thân Event source phải có một hàm thông báo sự kiện. Ví dụ: – public void firePropertyChange(String propertyName, Object oldValue, Object newValue); 45 G V : V õ T ấ n D ũ n g 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 { te
Tài liệu liên quan