Bài gi ng Ngôn ng l p trình Java

Size: px
Start display at page:

Download "Bài gi ng Ngôn ng l p trình Java"

Transcription

1 M CL C NG 1. GI I THI U T NG QUAN V NGÔN NG L P TRÌNH JAVA L ch s ra đ i và phát triển c a Java M t s đặc tr ng c a Java Đ n gi n H ng đ i t ng Đ c l p v i h n n M nh m H tr l p trình đa tuy n Phân tán H tr Internet Thông d ch Các kiểu ng dụng Java ng dụng Applets ng dụng dòng l nh (console) ng dụng đ họa(window form) JSP/Servlet ng dụng c s d li u ng dụng m ng ng dụng nhi u tầng(multi-tier) ng dụng cho các thi t b di đ ng Máy o Java (JVM-Java Virtual Machine) B công cụ phát triển JDK (Java Development Kit) Java Core API Ch ng trình Java đầu tiên C u trúc ch ng trình Java Ch ng trình Java đầu tiên Biên d ch và ch y ch ng trình CH NG 2. L P TRỊNH H NG Đ I T NG TRONG JAVA BÀI 1. N N T NG L P TRÌNH JAVA T khóa c a Java Đ nh danh trong Java (tên) Chú thích trong ch ng trình Kiểu d li u D li u kiểu nguyên thuỷ Kiểu d li u tham chi u (reference) Ép kiểu (Type casting) Bi n, m ng và hằng trong Java Khai báo bi n Khai báo m ng CH Page 1

2 5.2.1 M ng m t chi u M ng nhi u chi u Xâu ký tự L p String L p StringBuffer L p StringTokenizer BÀI 2. CÁC C U TRÚC L P TRÌNH C u trúc r nhánh Phát biểu if Biểu th c đi u ki n C u trúc switch C u trúc lặp while và do-while Lặp kiểm tra đi u ki n tr c Lặp kiểm tra đi u ki n sau C u trúc for L nh break và continue BÀI 3. L P TRỊNH H NG Đ I T NG TRONG JAVA Đ nh nghĩa l p Khai báo l p Khai báo thu c tính Khai báo ph ng th c Chi ti t v khai báo m t ph ng th c T ng quát m t ph ng th c đ c khai báo nh sau Nh n giá tr tr v t ph ng th c Truy n tham s cho ph ng th c Thân c a ph ng th c S dụng l p Khai báo m t bi n, m ng đ i t ng Truy u t t i các thành phần c a l p Ph ng th c t o dựng (constructor) Công dụng Cách vi t hàm t o Đặc điểm c a ph ng th c t o dựng Hàm t o mặc đ nh Gọi hàm t o t hàm t o Kh i kh i đầu vô danh và kh i kh i đầu tĩnh Kh i vô danh Kh i kh i đầu tĩnh Dọn dẹp: k t thúc và thu rác Ph ng th c finalize Page 2

3 4.2. C ch gom rác c a java T khóa this Đi u khiển vi c truy c p đ n các thành viên c a m t l p Các thành phần private Các thành thành phần protected Các thành phần public Các thành phần có m c truy u t gói N p ch ng ph ng th c Khái ni m v ph ng th c b i t i Yêu cầu c a các ph ng th c b i t i BÀI 4 K TH A (INHERITANCE), ĐA HỊNH L p c s và l p d n u t Cách ây dựng l p d n u t Th a k các thu c tính Th a k ph ng th c Ph ng th c kh i t o c a l p c s Tr t tự kh i đầu Tr t tự dọn dẹp Ghi đè ph ng th c (Override) T khoá final Thu c tính final Đ i s final Ph ng th c final L p final L p c s tr u t ng Đa hình thái BÀI 5. GIAO DI N, L P TRONG, GÓI Giao di n (Interface) Phần khai báo c a giao di n Phần thân Triển khai giao di n L p trong CH NG 3. L P TRỊNH ĐA TUY N(MULTITHREAD) L P TRÌNH SOCKET BÀI 1. L P TRỊNH ĐA TUY N Các ki n th c liên quan Ti n trình ( process) Tiểu trình ( thread ) H đi u hơnh đ n nhi m, đa nhi m Các tr ng thái c a ti n trình Page 3

4 1.5. Mi n găng ( Critical Section ) Khoá ch t (deadlock) L p trình đa tuy n trong Java L p Thread Vòng đ i c a Thread Lu ng ch y ngầm (deamon) Giao di n Runnable Thi t l p đ u tiên cho tuy n Nhóm tuy n (Thread Group) Đ ng b các tuy n thi hành BÀI 2. L P TRÌNH SOCKET Các ki n th c liên quan Gi i thi u Socket L p trình Socket trong java Kh o sát m t s l p trong gói java.net L p InetAddress L p URL và URI L p Socket M t s hàm t o c a l p Socket L y v thông tin gắn v i Socket Đóng Socket Truy n trong ch đ haft duple L p ServerSocket M t s hàm t o c a l p ServerSocket Ch p nh n vơ đóng k t n i L p DatagramSocket L p DatagramPacket TCP Socket CH NG 4 CÔNG NGH JSP/SERVLET VÀ L P TRÌNH K T N I C S D LI U TRONG JAVA Công ngh Jsp/Servlet Gi i thi u So sánh JSP/Servlet và CGI, ASP, ISAPI Servlet là gì Gi i pháp v i Servlet Môi tr ng runtime c a servlet Giao ti p vơ vòng đ i c a servlet Các đ i t ng request và response D li u chia sẻ và c đ nh (Persistent and shared data) Các thu c tính ServletContet Page 4

5 1.3.7 Các thu c tính và tài nguyên yêu cầu (Request attributes and resources) Đa tuy n (Multithreading) Truy c p c s d li u trong java T ng quan Các l p trong JDBC API dùng để truy c p CSDL M t s giao di n và l p trong gói java.sql M t s giao di n và l p trong gói java.sql K t n i CSDL v i JDBC T ng tác v i CSDL T o ra m t JDBC Statements S dụng đ i t ng Prepared Statements Gọi th tục l u tr bằng JDBC Qu n lý giao d ch CH NG 5. L P TRÌNH THI T B DI Đ NG V I J2ME Gi i thi u v J2ME và l p trình cho thi t b di đ ng Ki n trúc c a J2ME Gi i thi u các thành phần trong n n t ng J2ME Đ nh nghĩa v Profile L p trình v i J2ME MIDlet ậ Vòng đ i c a m t MIDlet Đ i t ng Display Đ i t ng Displayable Giao di n ng i dùng c p cao Đ i t ng Display, Displayable và Screens Thành phần Form và Items Thành phần List, Tetbo, Alert, và Ticker Ch ng trình J2ME đầu tiên Thi t l p môi tr ng l p trình T o project T o ng dụng MIDP Using Source Editor T o ng dụng MIDP Using the Visual Mobile Designer Đóng gói vơ t i ng dụng j2me vơo đi n tho i Đóng gói ng dụng T i ng dụng vào thi t b di đ ng qua Internet TÀI LI U THAM KH O Page 5

6 CH NG 1. GI I THI U T NG QUAN V NGÔN NG TRÌNH JAVA N i dung c a ch L P ng nơy t p trung trình bày các v n đ sau: L ch s ra đ i và phát triển c a Java M t s đặc tr ng c a Java Các kiểu ng dụng Java Máy o Java B công cụ phát triển JDK Java Core API Ch ng trình Java đầu tiên 1. L ch s ra đ i và phát triển của Java Năm 1991, m t nhóm kỹ s c a Sun Microsystems mu n l p trình để điểu khiển các thi t b điển t nh tivi, t l nh, máy giặt, lò n ng, Ban đầu họ đ nh dùng C/C++ nh ng trình biên d ch c a C/C++ l i phụ thu c vào t ng lo i CPU. Do đó họ bắt tay vào ây dựng m t ngôn ng ch y nhanh, gọn, hi u qu, đ c l p v i thi t b và ngôn ng có tên là OAK (Oak- là cây s i mọc phía sau văn phòng c a nhà thi t k chính ông Jame Gosling sau này ông th y rằng đư có ngôn ng l p trình tên Oak r i, do v y nhóm thi t k quy t đ nh đ i tên, Java lơ cái tên đ nhóm thi t k java hay đ n đó u ng). c chọn, Java là tên c a m t quán cafe mà Ngôn ng l p trình Java đ c Sun Microsystems đ a ra gi i thi u vào tháng 6 năm 1995 vơ đư nhanh chóng tr thành m t ngôn ng l p trình c a các l p trình viên chuyên nghi p. Java đ c ây dựng dựa trên n n t ng c a C vơ C++, nghĩa lơ Java s dụng cú pháp c a C vơ đặc tr ng h ng đ i t ng c a C++. Java là ngôn ng v a biên d ch v a thông d ch. Ngày nay, Java đ c s dụng r ng rãi, không ch để vi t các ng dụng trên máy cục b hay trên m ng để ây dựng các trình đi u khiển thi t b di đ ng. 2. M t s đặc tr ng của Java Ngôn ng l p trình Java có các đặc tr ng c b n sau: Đ n gi n H ng đ i t ng Đ cl pv ih n n M nh m H tr l p trình đa tuy n L p trình phân tán Page 6

7 H tr Internet Thông d ch 2.1. Đơn giản Nh ng ng i thi t k mong mu n phát triển m t ngôn ng d học và quen thu c v i đa s ng i l p trình. Java tựa nh C++, nh ng đư l c b đi các đặc tr ng ph c t p, không cần thi t c a C vơ C++ nh : thao tác con tr, thao tác đ nh nghĩa ch ng toán t (operator overloading), Java không s dụng l nh goto cũng nh file header (.h). C u trúc struct vơ union cũng đ c lo i b kh i Java. Nên có ng i b o Java lơ C++--, ngụ ý b o java lơ C++ nh ng đư b đi nh ng th ph c t p, không cần thi t Hướng đối tượng Có thể nói java là ngôn ng l p trình hoơn toơn h ng đ i t ng, t t c trong java đ u là sự v t, đơu đơu cũng lơ sự v t Độc lập với hệ nền Mục tiêu chính c a các nhà thi t k Java lơ đ c l p v i h n n hay còn gọi lơ đ c l p phần c ng và h đi u hơnh. Đơy lơ kh năng m t ch ng trình đ c vi t t i m t máy nh ng có thể ch y đ c b t kỳ đơu Tính đ c l p v i phần c ng đ c hiểu theo nghĩa m t ch ng trình Java n u ch y đúng trên phần c ng c a m t họ máy nơo đó thì nó cũng ch y đúng trên t t c các họ máy khác. M t ch ng trình ch ch y đúng trên m t s họ máy cụ thể đ c gọi là phụ thu c vào phần c ng. Tính đ c l p v i h đi u hơnh đ c hiểu theo nghĩa m t ch ng trình Java có thể ch y đ c trên t t c các h đi u hành. M t ch ng trình ch ch y đ c trên m t s h đi u hơnh đ c gọi là phụ thu c vào h đi u hành. Các ch ng trình vi t bằng java có thể ch y trên hầu h t các h n n mà không cần ph i thay đ i gì, đi u nơy đư đ c nh ng ng i l p trình đặt cho nó m t khẩu hi u viết một lần, chạy mọi nơi, đi u này là không thể có v i các ngôn ng l p trình khác. Đ i v i các ch ng trình vi t bằng C, C++ hoặc m t ngôn ng nào khác, trình biên d ch s chuyển t p l nh thành mã máy (machine code), hay l nh c a b vi lý. Nh ng l nh này phụ thu c vào CPU hi n t i trên máy b n. Nên khi mu n ch y trên lo i CPU khác, chúng ta ph i biên d ch l i ch ng trình Mạnh mẽ Java là ngôn ng yêu cầu chặt ch v kiểu d li u, vi c ép kiểu tự đ ng b a bãi c a C, C++ nay đ c h n ch trong Java, đi u nơy lơm ch ng trình rõ rơng, sáng và ít l i h n. Java kiểm tra lúc biên d ch và c trong th i gian thông d ch vì v y Java lo i b Page 7

8 m t m t s lo i l i l p trình nh t đ nh. Java không s dụng con tr và các phép toán con tr. Java kiểm tra t t c các truy nh p đ n m ng, chu i khi thực thi để đ m b o rằng các truy nh p đó không ra ngoơi gi i h n kích th c. Trong các môi tr ng l p trình truy n th ng, l p trình viên ph i tự mình c p phát b nh. Tr c khi ch ng trình k t thúc thì ph i tự gi i phóng b nh đư c p. V n đ n y sinh khi l p trình viên quên gi i phóng b nh đư in c p tr c đó. Trong ch ng trình Java, l p trình viên không ph i b n tơm đ n vi c c p phát b nh. Quá trình c p phát, gi i phóng đ c thực hi n tự đ ng, nh d ch vụ thu nhặt nh ng đ i t ng không còn s dụng n a (garbage collection). C ch b y l i c a Java giúp đ n gi n hóa qúa trình lý l i và h i phục sau l i Hỗ trợ lập trình đa tuyến Đơy lơ tính năng cho phép vi t m t ch ng trình có nhi u đo n mã l nh đ c ch y song song v i nhau. V i Java ta có thể vi t các ch ng trình có kh năng ch y song song m t cách d dơng, h n th n a vi c đ ng b tơi nguyên dùng chung trong Java cũng r t đ ng gi n. Đi u này là không thể có đ i v i m t s ngôn ng l p trình khác nh C/C++, pascal 2.6. Phân tán Java h tr đầy đ các mô hình tính toán phân tán: mô hình client/server, gọi th tục t a 2.7. Hỗ trợ Internet Mục tiêu quan trọng c a các nhơ thi t k Java lơ t o đi u ki n cho các nhơ phát triển ng dụng có thể vi t các ch ng trình ng dụng internet vơ web m t cách d dơng, v i Java ta có thể vi t các ch ng trình s dụng các giao th c TCP, UDP m t cách d dàng, v l p trình web phía máy khách Java có công ngh Java applet, v l p trình web phía máy ch Java có công ngh Servlet/JSP, v l p trình phơn tán Java có công ngh RMI, CORBA, EJB, Web Service Thông dịch Các ch ng trình Java cần đ c thông d ch tr c khi ch y, m t ch ng trình Java đ c biên d ch thơnh mư byte code mư đ c l p v i h n n, ch ng trình thông d ch Java s ánh mã byte code này lên m i n n cụ thể, đi u này khi n Java ch m ch p đi phần nào. 3. Các kiểu ng d ng Java V i Java ta có thể ây dựng các kiểu ng dụng sau: 3.1. ng dụng Applets Page 8

9 Applet lơ ch ng trình Java đ c t o ra để s dụng trên Internet thông qua các trình duy t h tr Java nh IE hay Netscape. Applet đ Khi trang Web hiển th trong trình duy t, Applet s đ 3.2. c nhúng bên trong trang Web. c t i v và thực thi t i trình duy t. ng dụng dòng lệnh (console) Các ch ng trình nơy ch y t d u nhắc l nh và không s dụng giao di n đ họa. Các thông tin nh p u t đ c thể hi n t i d u nhắc l nh ng dụng đồ họa(window form) Đơy lơ các ch ng trình Java ch y đ c l p cho phép ng i dùng t ng tác qua giao di n đ họa. 3.4 JSP/Servlet Java thích h p để phát triển ng dụng nhi u l p. Applet lơ ch ng trình đ họa ch y trên trình duy t t i máy tr m. các ng dụng Web, máy tr m g i yêu cầu t i máy ch. Máy ch lý và g i k t qu tr l i máy tr m. Các Java API ch y trên máy ch ch u trách nhi m lý t i máy ch và tr l i các yêu cầu c a máy tr m. Các Java API ch y trên máy ch này m r ng kh năng c a các ng dụng Java API chuẩn. Các ng dụng trên máy ch nơy đ c gọi là các JSP/Servlet. hoặc Applet t i máy ch. X lý Form c a HTML là cách s dụng đ n gi n nh t c a JSP/Servlet. Chúng còn có thể đ c dùng để lý d li u, thực thi các giao d ch vơ th ng đ c thực thi thông qua máy ch Web ng dụng cơ sở dữ liệu Các ng dụng này s dụng JDBC API để k t n i t i c s d li u. Chúng có thể là Applet hay ng dụng, nh ng Applet b gi i h n b i tính b o m t ng dụng mạng Java là m t ngôn ng r t thích h p cho vi c ây dựng các ng dụng m ng. V i th vi n Socket b n có thể l p trình v i hai giao th c: UDP và TCP ng dụng nhiều tầng(multi-tier) V i Java b n có thể ây dựng phân tán nhi u tầng v i nhi u h tr khác nhau nh : RMI, CORBA, EJB, Web Service 3.8. ng dụng cho các thiết bị di động Hi n nay phần l n các thi t b di đ ng nh : Đi n tho i di đ ng, máy tr giúp cá nhơn đ u h tr Java. Th nên b n có thể ây dựng các ng dụng ch y trên các thi t b di đ ng nơy. Đơy lơ m t kiểu ng dụng khá h p dãn, b i vì các thi t b di đ ng này ngày càng ph bi n và nhu cầu có các ng dụng ch y trên đó, đặc bi t là các ng dụng mang tính ch t gi i trí nh game 4. Máy o Java (JVM-Java Virtual Machine) Page 9

10 Máy o là m t phần m m mô ph ng m t máy tính th t (máy tính o). Nó có t p h p các l nh logic để ác đ nh các ho t đ ng c a máy tính và có m t h đi u hành o. Ng i ta có thể em nó nh m t máy tính th t (máy tính có phần c ng o, h đi u hành o). Nó thi t l p các l p tr u t ng cho: Phần c ng bên d i, h đi u hơnh, mư đư biên d ch. Trình biên d ch chuyển mã ngu n thành t p các l nh c a máy o mà không phụ thu c vào phần c ng và h đi u hành cụ thể. Trình thông d ch trên m i máy s chuyển t p l nh nơy thơnh ch ng trình thực thi. Máy o t o ra m t môi tr ng bên trong để thực thi các l nh bằng cách: N p các file.class Qu n lý b nh Dọn rác Vi c không nh t quán c a phần c ng làm cho máy o ph i s dụng ngăn p để l u tr các thông tin sau: Các Frame ch a các tr ng thái c a các ph Các toán h ng c a mã bytecode. Các tham s truy n cho ph Các bi n cục b. ng th c. ng th c. Khi JVM thực thi mã, m t thanh ghi cục b có tên Program Counter đ c s dụng. Thanh ghi này tr t i l nh đang thực hi n. Khi cần thi t, có thể thay đ i n i dung thanh ghi để đ i h ng thực thi c a ch ng trình. Trong tr t ng l nh m t n i ti p nhau s đ c thực thi. ng h p thông th ng thì M t khái ni m thông dụng khác trong Java là trình biên d ch Just In Time-JIT. Các trình duy t thông dụng nh Netscape, IE, NetBeans, Jcreator đ u có JIT bên trong để tăng t c đ thực thi ch ng trình Java. Mục đích chính c a JIT là chuyển t p l nh bytecode thành mã máy cụ thể cho t ng lo i CPU. Các l nh này s đ c l u tr và s dụng m i khi gọi đ n. 5. B công c phát triển JDK (Java Development Kit) Sun Microsystem đ a ra ngôn ng l p trình Java qua s n phẩm có tên là Java Development Kit (JDK). Ba phiên b n chính là: Java S dụng lần đầu vơo năm Java 1.1 ậ ợ a ra năm 1997 v I nhi u u điểm h n phiên b n tr o JDK (Sparkler) 12 tháng 9, 1997 o JDK (Pumpkin) 3 tháng 12, 1997 c. Page 10

11 o JDK (Abigail) 24 tháng 4, 1998 o JDK (Brutus) 28 tháng 9, 1998 o JDK (Chelsea) 8 tháng 4, 1999 Java 2: o J2SE 1.2 (Playground) 4 tháng 12, 1998 o J2SE (không có) 30 tháng 3, 1999 o J2SE (Cricket) 8 tháng 7, 1999 o J2SE 1.3 (Kestrel) 8 tháng 5, 2000 o J2SE (Ladybird) 17 tháng 5, 2001 o J2SE (Merlin) 13 tháng 2, 2002 o J2SE (Hopper) 16 tháng 9, 2002 o J2SE (Mantis) 26 tháng 6, 2003 o J2SE 5 (1.5.0) (Tiger) 29 tháng 9, 2004 o Java SE 6 (còn gọi lơ Mustang), đ o JDK 6.18,2010 o Java SE 7 (còn gọi lơ Dolphin), đ b vơo năm c công b 11 tháng 12 năm 2006 c bắt đầu t tháng 8 năm 2006 vơ công JDK bao g m Java Plug-In, chúng cho phép ch y trực ti p Java Applet hay JavaBean bằng cách dùng JRE thay cho s dụng môi tr ng thực thi mặ c đ nh c a trình duy t. JDK ch a các công c sau: a) Trình biên dịch, 'javac' Cú pháp: javac [options] sourcecodename.java b) Trình thông dịch, 'java' Cú pháp: java [options] classname c) Trình dịch ngược, 'javap' ph javap d ch ng c bytecode và in ra thông tin v các thu c tính (các tr ng th c c a m t l p. ng), các Cú pháp: javap [options] classname d) Công cụ sinh tài liệu, 'javadoc' Page 11

12 Ti n ích này cho phép ta t o ra t p HTML dựa trên các l i gi i thích trong mã ch ng trình (phần nằm trong cặp d u /*... */). Cú pháp: javadoc [options] sourcecodename.java e) Chương trình tìm lỗi - Debug, 'jdb Cú pháp: jdb [options] sourcecodename.java hay jdb -host -password [options] sourcecodename.java f) Chương trình em Applet, 'appletviewer Cú pháp: appletviewer [options] url 6. Java Core API Nhơn Java API đ đ c thay th b i phiên b n JFC 1.1. M t s package thông dụng c: a) java.lang Ch a các l p quan trọng nh t c a ngôn ng Java. Chúng bao g m các kiểu d li u c b n nh ký tự, s nguyên, Chúng cũng ch a các l p làm nhi m vụ lý l i và các l p vào ra chuẩn. M t vài l p quan trọng khác nh String hay StringBuffer. b) java.applet Đơy là package nh nh t ch a m t mình l p Applet. Các Applet nhúng trong trang Web hay ch y trong appletviewer đ u th a k t l p này. c) java.awt Package nơy đ c gọi là Abstract Window Toolkit (AWT). Chúng ch a các l p dùng để t o giao di n đ họa. M t s l p bên trong là: Button, GridBagLayout, Graphics. d) java.io Cung c p th vi n vào ra chuẩn. Chúng cho phép t o và qu n lý dòng d li u theo nhi u cách. e) java.util Package này cung c p m t s công cụ h u ích. M t vài l p c a package này là: Date, Hashtable, Stack, Vector và StringTokenizer. Page 12

13 f) java.net Cung c p kh năng giao ti p v i máy t a. Cho phép t o và k t n i t i Socket hoặc URL. g) java.awt.event Ch a các l p, giao di n dùng để lý các sự ki n trong ch bàn phím. ng trình nh chu t, h) java.rmi Công cụ để gọi hàm t a. Chúng cho phép t o đ i t dụng các đ i t ng trên máy khác và s ng đó trên máy cục b. i) java.security Cung c p các công cụ cần thi t để mư hóa vơ đ m b o tính an toàn c a d li u truy n gi a máy tr m và máy ch. k) java.sql Package này ch a Java DataBase Connectivity (JDBC), dùng để truy u t c s d li u quan h nh Oracle, SQL Server, Ch ng trình Java đầu tiên 7.1 Cấu trúc chương trình Java - M i ng dụng Java bao g m m t hoặc nhi u đ n v biên d ch (m i đ n v biên d ch là m t t p tin có phần m r ng.java) - M i đ n v biên d ch bao g m m t hoặc nhi u l p - M i ng dụng đ c l p ph i có duy nh t m t ph ng th c main (điểm bắt đầu c a ng dụng) - M i đ n v biên d ch có nhi u nh t m t l p đ c khai báo là public, n u nh trong đ n v biên d ch có l p public thì tên c a đ n v biên d ch ph i trùng v i tên c a l p public (gi ng h t nhau c ký tự hoa l n ký tự th ng) Page 13

14 - Bên trong thân c a m i l p ta khai báo các thu c tính, ph Java là ngôn ng h đ uđ ng đ i t ng th c c a l p đó, ng, do v y mã l nh ph i nằm trong l p nơo đó. M i l nh c k t thúc bằng d u ch m ph y ;. Một đơn vị biên dịch là một tệp tin.java //Nhập khẩu các thư viện import thư_viện; //Xây dựng các lớp public class clsmain public static void main(string args[]) //điểm bắt đầu của chương trình - Trong ngôn ng Java, l p là m t đ n v m u có ch a d li u và mã l nh liên quan đ n m t thực thể nơo đó. Khi ây dựng một lớp, thực chất bạn đang tạo ra một một kiểu dữ liệu. Kiểu ớ d li u m i nơy đ c s dụng để ác đ nh các bi n mơ ta th ng gọi lơ đ i t ng. Đối tượng là các thể hiện (instance) c a lớp. T t c các đ i t ng đ u thu c v m t l p có chung đặc tính và hành vi. M i l p ác đ nh m t thực thể, trong khi đó m i đ i t ng là m t thể hi n thực sự. - Khi b n khai ớbáo m t l p, b n cần ác đ nh d li u vơ các ph đó. V c b n m t l p đ ng th c c a l p c khai báo nh sau: Cú pháp: class classname var_datatype variablename; : met_datatype methodname(parameter_list) : Trong đó: class - T khoá ác đ nh l p Page 14

15 classname - Tên c a l p var_datatype - kiểu d li u c a bi n variablename - Tên c a bi n met_datatype - Kiểu d li u tr v c a ph methodname - Tên c a ph ng th c ng th c parameter_list ậ Các tham s đ c c a ph ng th c - B n còn có thể đ nh nghĩa m t l p bên trong m t l p khác. Đơy lơ l p p l ng nhau, các thể hi n (instance) c a l p này t n t i bên trong thể hi n c a m t l p che ph chúng. Nó chi ph i vi c truy nh p đ n các thành phần c a l p bao ph chúng. Có hai lo i l p trong đó lơ l p trong tĩnh static vơ l p trong không tĩnh non static L p trong tĩnh (static)visual BASIC L p trong tĩnh đ c đ nh nghĩa v i t khoá static. L p trong tĩnh có thể truy nh p vào các thành phần tĩnh c a l p ph nó. L p trong không tĩnh (non static) L p bên trong (không ph i là l p trong tĩnh) có thể truy nh p t t c các thành phần c a l p bao nó, song không thể ng 7.2 Chương trình Java đầu tiên Ví d 1: HelloWorld.java public class HelloWorld c l i. Định nghĩa lớp có tên HelloWorld Bắt đầu đoạn lệnh Phương thức main public static void main(string[] args) System.out.println("Hello World!"); Xuất ra màn hình //end method //end class Kết thúc đoạn lệnh 7.3 Biên dịch và chạy chương trình Chuẩn bị môi trường: - JRE (Java Runtime Enviroment) môi tr ng thực thi c a java, nó bao g m: JVM (Java Virtual Machine) máy o java vì các ch ng trình java đ c thông d ch và ch y trên máy o java và t p các th vi n cần thi t để ch y các ng dụng java. - B công cụ biên d ch và thông d ch JDK c a Sun Microsystem Page 15

16 Sau khi cơi đặt JDK (gi s th mục cơi đặt là C:\Program files\java) ta s nh n đ c m t c u trúc th mục nh sau: Th mục ch a các file thực thi Th mục ch a các file liên quan đ n java Th mục ch a các file th vi n c a java - Để biên d ch ch ng trình Java sang mã bytecode ta dùng l nh sau: javac TenTep.java N u không có l i s t o ra file HelloWorld.class - Để thông d ch và ch y ch ng trình ta dùng l nh: java TenTep L u ý: Ph i khai báo đ ng d n ch đ n th mục cơi đặt java, và th mục ch a các class cần thực thi Ví d : C:\> set path=c:\java\jdk1.6.0_16\bin C:\> set classpath = D:\BTJava\ Page 16

17 CH Ch NG 2. L P TRỊNH H NG Đ I T NG TRONG JAVA ng nơy cung c p các n i dung sau: N n t ng l p trình Java. M t s khái ni m trong l p trình h Programming). ng Đ i t ng (Object-oriented Đ nh nghĩa m t L p (Class). Đ nh nghĩa m t Đ i t Nh n th c đ ng (Object). c sự khác bi t gi a L p vơ Đ i t Nh n th c đ c sự cần thi t đ i v i ph (Destruction). ng. ng th c Thi t l p (Construction) vơ H y Đ nh nghĩa v tính đóng gói d li u (Data Encapsulation) Hiểu bi t v tính Th a k (Inheritance). Đ nh nghĩa tính Đa hình (Polymorphism). Giao di n (Interface), l p trong BÀI 1. N N T NG L P TRÌNH JAVA 1. T khóa của Java M i ngôn ng l p trình có m t t p các t khoá, ng i l p trình ph i s dụng t khoá theo đúng nghĩa mơ ng i thi t k ngôn ng đư đ ra, ta không thể đ nh nghĩa l i nghĩa c a các t khoá, nh s dụng nó để đặt tên bi n, hơm.. Sau đây là một số từ khoá thường gặp: T khóa Mô t abstract S dụng để khai báo l p, ph boolean Kiểu d li u logic break Đ byte kiểu d li u s nguyên case đ cast Ch a đ catch đ char kiểu d li u ký tự ng th c tr u t ng c s dụng để k t thúc vòng lặp hoặc c u trúc switch c s dụng trong l n switch c s dụng (để dơnh cho t ng lai) c s dụng trong lý ngo i l Page 17

18 class Dùng để khai báo l p const Ch a đ continue đ c dùng trong vòng lặp để bắt đầu m t vòng lặp m i default đ c s dụng trong l nh switch do đ c dùng trong vòng lặp đi u ki n sau double kiểu d li u s thực else kh năng lựa chọn th hai trong câu l nh if etends ch rằng m t l p đự c k th a t m t l p khác false Gía tr logic final Dùng để khai báo hằng s, ph c dùng ng th c không thể ghi đè, hoặc l p không thể k th a finally phần cu i c a kh i lý ngo i l float kiểu s thực for Câu l nh lặp goto Ch a đ if Câu l nh lựa chọn c dùng implements ch rằng m t l p triển khai t m t giao di n import Khai báo s dụng th vi n instanceof kiểm tra m t đ i t interface s dụng để khai báo giao di n long kiểu s nguyên native Khai báo ph ng th c đ new t om tđ it ng m i null m tđ it package Dùng để khai báo m t gói private đặc t truy u t protected đặc t truy u t public đặc t truy u t ng có ph i là m t thể hi n c a l p hay không c vi t bằng ngôn ng biên d ch C++ ng không t n t i Page 18

19 return Quay t ph short kiểu s nguyên static Dùng để khai báo bi n, thu c tính tĩnh super Truy u t đ n l p cha switch l nh lựa chọn synchronized m t ph ng th c v ch gọi nó ng th c đ c quy n truy u t trên m t đ i t this Ám ch chính l p đó throw Ném ra ngo i l throws Khai báo ph true Giá tr logic try s dụng để bắt ngo i l void Dùng để khai báo m t ph while Dùng trong c u trúc lặp ng ng th c ném ra ngo i l ng th c không tr v giá tr Bảng 2.1 Danh mục các từ khóa trong java 2. Đ nh danh trong Java (tên) Tên dùng để ác đ nh duy nh t m t đ i l đ ng trong ch ng trình. Trong java tên c đặt theo quy tắc sau: - Không trùng v i t khoá - Không bắt đầu bằng m t s, tên ph i bắt đầu bằng kí tự hoặc bắt đầu bằng kí $,_ - Không ch a d u cách, các kí tự toán học nh +, -, *,/, %.. - Không trùng v i m t đ nh danh khác trong cùng m t ph m vi Chú ý: - Tên nên đặt sao cho có thể mô t đ cđ it ng trong thực t - Gi ng nh C/C++, java có phơn bi t ch hoa ch th ng - Trong java ta có thể đặt tên v i đ dài tuỳ ý - Ta có thể s dụng các kí tự ti ng vi t để đặt tên Quy ước về đặt tên trong java Ta nên đặt tên bi n, hằng, l p, ph ng th c sao cho nghĩa c a chúng rõ rơng, d hiểu, khoa học vơ mang tính c l qu c t. Do java có phơn bi t ch hoa, ch th ng nên ta ph i cẩn th n vơ chú ý. Page 19

20 Sau đơy lơ quy c đặt tên trong java (chú ý đơy ch lơ quy bắt bu c ph i tuơn theo quy c do v y không c nơy): - Đ i v i bi n và ph ng th c thì tên bao gi cũng bắt đầu bằng ký tự th ng, n u tên có nhi u t thì ghép l i thì: ghép t t c các t thành m t, ghi t đầu tiên ch th ng, vi t hoa kí tự đầu tiên c a m i t theo sau trong tên, ví dụ area, radius, readinteger - Đ i v i tên l p, giao di n ta vi t hoa các kí tự đầu tiên c a m i t trong tên, ví dụ l p WhileTest, Circle Tên hằng bao gi cũng vi t hoa, n u tên g m nhi u t thì chúng đ c n i v i hau b i kí tự gh ch d 3. Chú thích trong ch i _, ví dụ PI, MAX_VALUE ng trình Trong java ta có 3 cách để ghi chú thích - Cách 1: s dụng cặp /* và */ ý nghĩa c a cặp chú thích này gi ng nh c a C, C++ Cách 2: s dụng cặp // ý nghĩa c a cặp chú thích này gi ng nh c a C, C++ Cách 3: s dụng cặp /** và */, đơy lơ kiểu chú thích tài li u (không có trong C/C++), nó dùng để t o ra tài li u chú thích cho ch ng trình. V i cách th nh t và cách ba ta có thể vi t chú thích trên nhi u dòng, v i cách chú thích hai ta ch có thể chú thích trên m t dòng. đ Chú ý: trong java ta có thể đặt chú thích c m t d u cách thì đó có thể đặt chú thích. đơu?, cơu tr l i là: đơu có thể đặt 4. Kiểu d li u Các ng dụng luôn lý d li u đầu vơo vơ u t d li u k t qu đầu ra. Đầu vơo, đầu ra, vơ k t qu c a các quá trình tính toán đ u liên quan đ n d li u. Trong môi tr ng tính toán, d li u đ c phơn l p theo các tiêu chí khác nhau phụ thu c vơo b n ch t c a nó. m i tiêu chí, d li u có m t tính ch t ác đ nh vơ có m t kiểu thể hi n riêng bi t. Java cung c p m t vơi kiểu d li u. Chúng đ c h tr trên t t c các n n. Ví dụ, d li u lo i int (integer) c a Java đ c thể hi n bằng 4 bytes trong b nh c a t t c các lo i máy b t lu n đơu ch y ch ng trình Java. B i v y các ch cần ph i thay đ i khi ch y trên các n n khác nhau. Trong Java kiểu d li u đ ng trình Java không c chia thơnh hai lo i: Các kiểu d li u nguyên th y (primitive) Các kiểu d li u tham chi u (reference) 4.1. Dữ liệu kiểu nguyên thuỷ Page 20

21 T khoá Mô t Kích c T i đa T i thiểu L p bao (kiểu s nguyên) byte S nguyên 1 byte 8 bit Byte short s nguyên 2 byte 16 bit Short int s nguyên 4 byte 32 bit Integer long s nguyên 8 byte 64 bit Long (kiểu s thực) float kiểu thực v i đ chính 32 bit ác đ n 4 byte IEEE754 IEEE754 Float double d u ch m đ ng v i đ 64 bit chính ác đôi 8 byte IEEE754 IEEE754 Double 16 bit Unicode 0 Unicode Character boolean kiểu logic true/false - - Boolean void Void (kiểu khác) char kiểu kí tự 2 byte - Bảng 2.2. Kiểu dữ liệu nguyên thuỷ 4.2. Kiểu dữ liệu tham chiếu (reference) Kiểu d li u Mô t M ng (Array) T p h p các d li u cùng kiểu. Ví dụ : tên sinh viên L p (Class) T p h p các bi n vơ các ph ng th c.ví dụ : l p Sinhviên ch a toơn b các chi ti t c a m t sinh viên vơ các ph ng th c thực thi trên các chi ti t đó. Giao di n (Interface) Là m t l p tr u t trong Java. ng đ c t o ra cho phép cơi đặt đa th a k Bảng 2.3. Kiểu dữ liệu tham chiếu 4.3. Ép kiểu (Type casting) Có thể b n s gặp tình hu ng khi c ng m t bi n có d ng integer v i m t bi n có d ng float. Để lý tình hu ng nơy, Java s dụng tính năng ép kiểu (type casting) c a các phần m m tr c đó C, C++. Lúc nơy m t kiểu d li u s chuyển đ i sang kiểu khác. Khi s dụng tính ch t nơy, b n cần th n trọng vì khi đi u ch nh d li u có thể b sai giá tr. Đo n mư sau đơy thực hi n phép c ng m t giá tr d u phẩy đ ng (float) v i m t giá tr nguyên (integer). Page 21

22 float c= f; int b = (int)c +10; Đầu tiên giá tr d u ph y đ ng c đ c ng v i 10 vơ k t qu lơ giá tr 44 đ c đ i thơnh giá tr nguyên 34. Sau đó nó đ c c l u vơo b. Sự n i r ng (widening) ậ quá trình lơm tròn s theo h ng n i r ng không lơm m t thông tin v đ l n c a m i giá tr.bi n đ i theo h ng n i r ng chuyển m t giá tr sang m t d ng khác có đ r ng phù h p h n so v i nguyên b n. Bi n đ i theo h ng l i thu nh l i (narrowwing) lơm m t thông tin v đ l n c a giá tr đ c chuyển đ i. Chúng không đ c thực hi n khi thực hi n phép gán. ví dụ trên giá tr th p phơn sau d u ph y s b m t. 5. Bi n, m ng và hằng trong Java 5.1 Khai báo biến Các ng dụng s dụng các bi n để l u tr các d li u cần thi t hoặc các d li u đ c t o ra trong quá trình thực thi ch ng trình. Các bi n đ c ác đ nh b i m t tên bi n vơ có m t ph m vi tác đ ng. Ph m vi tác đ ng c a bi n đ c ác đ nh m t cách rõ rơng trong ch ng trình. M i bi n đ c khai báo trong m t kh i ch đ ng trong ph m vi kh i đó, không có ý nghĩa vơ không đ ng trình ch có tác c phép truy nh p t bên ngoơi kh i. Vi c khai báo m t bi n bao g m 3 thơnh phần: kiểu bi n, tên c a nó vơ giá tr ban đầu đ c gán cho bi n (không bắt bu c). Để khai báo nhi u bi n ta s dụng d u phẩy để phơn cách các bi n, Khi khai báo bi n, luôn nh rằng Java phơn bi t ch th in hoa (case -sensitive). ng vơ ch Cú pháp: Datatype indentifier [=value] [, indentifier[=value] ]; Để khai báo m t bi n nguyên (int) có tên lơ counter dùng để l u giá tr ban đầu lơ 1, ta có thể thực hi n phát biểu sau đơy: int counter = 1; Java có nh ng yêu cầu h n ch đặt tên bi n mơ b n có thể gán giá tr vơo. Nh ng h n ch nơy cũng gi ng các h n ch khi đặt tên cho các đ nh danh mơ ta đư th o lu n các phần tr c c a ch ng nơy Khai báo mảng Mảng một chiều a) Khai báo Page 22

23 Cú pháp khai báo: - KDL tên_mảng[];//khai báo m t con tr m ng - KDL []tên_mảng;//nh trên - KDL tên_mảng[] = new KDL[spt];//T o ra m t m ng có spt phần t Trong cú pháp trên thì: - KDL là m t kiểu d li u b t kỳ nh : kiểu nguyên th y, kiểu đ i t ng nó ác đ nh kiểu d li u c a t ng phần t c a m ng. - Spt là s phần t c a m ng. Chú ý: - M ng trong Java là m t đ i t - Cũng nh các đ i t ng ng khác, m ng ph i đ c t o ra bằng toán t new nh sau: Tên_mảng=new KDL[spt]; - Khi m ng đ c t o ra thì m i phần t c a m ng s nh n m t giá tr mặc đ nh, quy tắc kh i t o giá tr cho các phần t c a m ng cũng chính lơ quy tắc kh i đầu giá tr cho các thu c tính c a đ i t ng, t c là m i phần t c a m ng s nh n giá tr : 0 n u KDL là kiểu s \0 n u KDL là kí tự false n u KDL là boolean null n u KDL là m t l p nơo đó. Ví d 1. Khai báo m t m ng s nguyên g m 100 phần t Cách 1: int mangint[];//khai báo một con trỏ đến mảng các số nguyên mangint=new int[100];//tạo ra mảng Cách 2: int mangint[]=new int[100]; Ví d 2: Gi s ta có l p SinhVien đư đ đ it c đ nh nghĩa, hưy khai báo m t m ng g m 100 ng c a l p SinhVien SinhVien arraysinhvien[]=new SinhVien[100]; Chú ý: Lúc này m i phần t c a m ng arraysinhvien là m t con tr c a l p SinhVien và hi n gi m i phần t c a m ng đang tr đ n giá tr null. Để kh i t o t ng phần t c a m ng ta ph i lơm nh sau: Page 23

24 arraysinhvien[0]=new SinhVien( sv01, Nguyễn Văn An, Hưng Yên ); arraysinhvien[1]=new SinhVien( sv02, Nguyễn Thị Bình, Bắc Giang );. arraysinhvien[99]=new SinhVien( sv100, Đào Thị Mến, Hà Nam ); Ngoài cách khai báo trên Java còn cho phép ta k t h p c khai báo và kh i gán các phần t c a m ng theo cách sau: int[] mangint = 1, 3, 5, 7, 9; T o ra m t m ng g m 5 phần t, các phần t c a m ng lần l tr là: 1, 3, 5, 7, 9 tđ c gán các giá SinhVien[] mangsinhvien = new SinhVien( sv01, Nguyễn Văn A, HY ), new SinhVien( sv02, Nguyễn Thị B, HN ), new SinhVien( sv03, Đỗ Thị Q, BG ), null ; Khai báo m t m ng g m 4 phần t, giá tr c a các phần t lần l tđ c kh i gán nh sau: mangsinhvien [0]=new SinhVien( sv01, Nguyễn Văn A, HY ) mangsinhvien [1]=new SinhVien( sv02, Nguyễn Thị B, HN ) mangsinhvien [2]=new SinhVien( sv03, Đỗ Thị Q, BG ) mangsinhvien [3]=null b) Truy t đ n các phần t c a m ng m t chi u Để truy u t đ n phần t th ind c a m ng ta s dụng cú pháp nh sau: Tên_M ng[ind-1] Chú ý: Phần t đầu tiên c a m ng có ch s là 0. Ví d : int a[]=new int [3];//Khai báo và tạo ra mảng gồm 3 phần tử Lúc này các phần t c a m ng lần l - tđ c truy u t nh sau: Phần t đầu tiên c a m ng là a[0] Phần t th 2 c a m ng là a[1] Phần t th 3 đ ng th i là phần t cu i cùng c a m ng là a[2] c) L y v s phần t hi n t i c a m ng M ng trong Java là m t đ i t ng, do v y nó cũng có các thu c tính và các ph ng th c nh các đ i t ng khác. Để l y v s phần t c a m ng ta s dụng thu c tính length nh sau: Page 24

25 Tên_m ng.length Ví d 1: Nh p vào m t m ng và in ra màn hình class ArrayDemo public static void main(string[] args) Scanner sc = new Scanner(System.in); System.out.print("Nhập số phần tử của mảng:"); int n=sc.netint(); //Khai báo mảng với số phần tử bằng n int a[]=new int[n]; //Nhập dữ liệu cho mảng for(int i=0;i<a.length;i++) System.out.print("a[" + i + "]="); a[i]=sc.netint(); //In mảng ra màn hình System.out.println("Mảng vừa nhập là"); for (int i = 0; i < a.length; i++) System.out.print(a[i] + " "); Ví d 2: Nh p vào m t m ng s thực sau đó kiểm tra em m ng có ph i là m t dưy tăng hay không? class ArrayDemo2 public static void main(string[] args) Scanner sc= new Scanner(System.in); //Nhập số phần tử của mảng System.out.print("Nhập số phần tử của mảng:"); int n=sc.netint(); //Khai báo mảng với số phần tử bằng n int a[]=new int[n]; //Nhập dữ liệu cho mảng for(int i=0;i<a.length;i++) System.out.print("a[" + i + "]="); a[i]=sc.netint(); //Kiểm tra dãy tăng boolean kt=true; for (int i = 0; i < a.length-1; i++) if(a[i+1]-a[i]<0) kt=false;//thay đổi trạng thái cờ Page 25

26 break;//thoát khỏi vòng lặp if(kt) System.out.println("Dãy tăng dần"); else System.out.println("Dãy không phải tăng dần"); Mảng nhiều chiều a) Khai báo Khai báo m ng N chi u trong Java đ c ti n hơnh nh sau: KDL [][] [] tên_mảng; N lần hoặc KDL tên_mảng [][] [] ; N lần hoặc KDL tên_m ng [][] [] =new KDL[spt1][spt2] [sptn]; N lần Trong đó: - KDL là m t kiểu d li u b t kỳ: nguyên thuỷ hoặc l p - sp1, sp2,, sptn lần l t là s phần t trên chi u th 1, 2,.., N Ví d : - Khai báo m t con tr c a m ng 2 chi u int[][] a; hoặc int a[][]; - Khai báo và t o ra m ng 2 chi u: int[][] a = new int[2][3]; // Ma tr n g m 2 hàng, 3 c t - Khai báo và kh i gán giá tr cho các phần t c a m ng 2 chi u: int a[][]= 1, 2, 5. //Các phần tử trên hàng thứ nhất 2, 4, 7, 9. //Các phần tử trên hàng thứ hai 1, 7. //Các phần tử trên hàng thứ ba Page 26

27 Khai báo trên s t o ra m t m ng hai chi u g m: 3 hơng, nh ng trên m i hàng l i có s phần t khác nhau, cụ thể là: trên hàng th nh t có 3 phần t, h ng 2 g m 4 phần t và hàng th 3 g m 2 phần t. Chú ý: V i khai báo trên n u ta li t kê các phần t c a m ng theo trình tự t trái qua ph i và t trên u ng d i thì các phần t lần l t là: a[0][0], a[0][1], a[0][2], a[1][0], a[1][1], a[1][2], a[1][3], a[2][0], a[2][1] b) Truy u t đ n phần t m ng nhi u chi u tên_m ng[ind1][ind2] Ví d 1: Nh p vào m t ma tr n và in ra màn hình class MaTran public static void main(string[] args) Scanner cs = new Scanner(System.in); //Nhập số hàng và số cột System.out.print("Nhập số hàng:"); int sh = cs.netint(); System.out.print("Nhập số cột:"); int sc = cs.netint(); //Khai báo mảng hai chiều gồm sh hàng và sc cột float a[][] = new float[sh][sc]; //Nhập dữ liệu cho mảng hai chiều for (int i = 0; i < a.length; i++) for (int j = 0; j < a[i].length; j++) System.out.print("a[" + i + "," + j + "]="); //Nhập liệu cho phần tử hàng i, cột j a[i][j] = cs.netint(); //In mảng hai chiều ra màn hình for (int i = 0; i < a.length; i++) for (int j = 0; j < a[i].length; j++) System.out.print(a[i][j] + " "); System.out.println(); Ví d 2: Nh p vào ma tr n vuông sau đó tính t ng các phần t trên đ (sinh viên tự làm). ng chéo chính Page 27

28 5.3. Xâu ký tự Vi c lý các âu ký tự trong Java đ c h tr b i hai l p String và StringBuffer. Lớp String dùng cho những âu ký tự bất biến, nghĩa là nh ng âu ch đọc vơ sau khi đ c kh i t o giá tr thì n i dung bên trong âu không thể thay đ i đ c. L p StringBuffer đ c s dụng đ i v i nh ng âu ký tự đ ng, t c là có thể thay đ i đ c n i dung bên trong c a âu Lớp String Chu i lơ m t dưy các ký tự. L p String cung c p các ph các chu i. Nó cung c p các ph ng th c để thao tác v i ng th c kh i t o (constructor) khác nhau: String str1 = new String( ); //str1 ch a m t chu i r ng. String str2 = new String( Hello World ); //str2 ch a Hello World char ch[] = A, B, C, D, E ; String str3 = new String(ch); //str3 ch a ABCDE String str4 = new String(ch,0,2); //str4 ch a AB vì 0- tính t ký tự bắt đầu, 2- là s l ng ký tự kể t ký tự bắt đầu. Toán t + đ c s dụng để c ng chu i khác vơo chu i đang t n t i. Toán t + nơy đ c gọi nh lơ n i chu i. đơy, n i chu i đ c thực hi n thông qua l p StringBuffer. Chúng ta s th o lu n v l p nơy trong phần sau. Ph ng th c concat( ) c a l p String cũng có thể thực hi n vi c n i chu i. Không gi ng nh toán t +, ph ng th c nơy không th ng uyên n i hai chu i t i v trí cu i cùng c a chu i đầu tiên. Thay vơo đó, ph ng th c nơy tr v m t chu i m i, chu i m i đó s ch a giá tr c a c hai. Đi u nơy có thể đ c gán cho chu i đang t n t i. Ví dụ: String strfirst, strsecond, strfinal; StrFirst = Charlie ; StrSecond = Chaplin ; //.bằng cách sử dụng phương thức concat( ) để gán với một chuỗi đang tồn tại. StrFinal = strfirst.concat(strsecond);// Vi toi la phuong thuc Ph ng th c concat( ) ch lơm vi c v i hai chu i t i m t th i điểm. Các ph ng th c của l p String Trong phần nơy, chúng ta s em ét các ph ng th c c a l p String. Page 28

29 - char charat(int inde ) Phương thức này trả về một ký tự tại vị trí inde trong chuỗi. Ví dụ: String name = new String( Java Language ); char ch = name.charat(5); Bi n ch ch a giá tr L, t đó v trí các s bắt đầu t 0. - boolean startswith(string s ) Phương thức này trả về giá trị kiểu logic (Boolean), phụ thuộc vào chuỗi có bắt đầu với một chuỗi con cụ thể nào đó không. Ví dụ: String strname = Java Language ; boolean flag = strname.startswith( Java ); Bi n flag ch a giá tr true. - boolean endswith(string s ) Phương thức này trả về một giá trị kiểu logic (boolean), phụ thuộc vào chuỗi kết thúc bằng một chuỗi con nào đó không. Ví dụ: String strname = Java Language ; boolean flag = strname.endswith( Java ); Bi n flag ch a giá tr false. - String copyvalueof( ) Ph ng th c nơy tr v m t chu i đ c rút ra t m t m ng ký tự đ c truy n nh m t đ i s. Ph ng th c nơy cũng l y hai tham s nguyên. Tham s đầu tiên ch đ nh v trí t n i các ký tự ph i đ c rút ra, vơ tham s th hai ch đ nh s ký tự đ c rút ra t m ng. Ví dụ: char name[] = L, a, n, g, u, a, g, e ; String subname = String.copyValueOf(name,5,2); Bơy gi bi n subname ch a chu i ag. - char [] tochararray( ) Ph ng th c nơy chuyển chu i thơnh m t m ng ký tự. Ví dụ: String tet = new String( Hello World ); char tetarray[] = tet.tochararray( ); - int indeof(string sunstring ) Ph ng th c nơy tr v th tự c a m t ký tự nơo đó, hoặc m t chu i trong ph m vi m t chu i. Các cơu l nh sau biểu di n các cách khác nhau c a vi c s dụng hơm. String day = new String( Sunday ); Page 29

30 int inde1 = day.indeof( n ); //chứa 2 int inde2 = day.indeof( z,2); //chứa 1 nếu z không tìm thấy tại vị trí 2. int inde3 = day.indeof( Sun ); //chứa mục 0 - String touppercase( ) Ph ng th c nơy tr v ch hoa c a chu i. String lower = new String( good morning ); System.out.println( Uppercase: +lower.touppercase( )); - String tolowercase( ) Ph ng th c nơy tr v ch th ng c a chu i. String upper = new String( JAVA ); System.out.println( Lowercase: +upper.tolowercase( )); - String trim() Ph ng th c nơy cắt b kho ng trắng hai đầu chu i. Hưy th đo n mư sau để th y sự khác nhau tr c vơ sau khi cắt b kho ng trắng. String space = new String( Spaces ); System.out.println(space); System.out.println(space.trim()); //Sau khi cắt bỏ khoảng trắng - boolean equals(string s) Ph ng th c nơy so sánh n i dung c a hai đ i t ng chu i. String name1 = Java, name2 = JAVA ; boolean flag = name1.equals(name2); Bi n flag ch a giá tr false. - Các phương th c valueof đ c n p ch ng để cho phép chuyển m t giá tr thơnh ơu static String valueof(object obj)//chuyển một đối tượng thành âu, bẳng cách gọi đến phương thức tostring của đối tượng obj static String valueof(char[] characters)//chuyển m ng các ký tự thành âu. static String valueof(boolean b)//chuyển một giá trị logic thành âu, âu nhận được là true hoặc false tương ứng với giá trị true hoặc false của b static String valueof(char c)//chuyển kí tự thành âu static String valueof(int i)//chuyển một số nguyên thành âu Page 30

31 static String valueof(long l)//chuyển một giá trị long thành âu static String valueof(float f)//chuyển một giá trị float thành âu static String valueof(double d)//chuyển một giá trị double thành âu Lớp StringBuffer L p StringBuffer cung c p các ph ng th c khác nhau để thao tác m t đ i t ng d ng chu i. Các đ i t ng c a l p nơy r t m m dẻo, đó lơ các ký tự vơ các chu i có thể đ c chèn vơo gi a đ i t nơy cung c p nhi u ph ph ng StringBuffer, hoặc n i thêm d li u vơo t i v trí cu i. L p ng th c kh i t o. Ch ng trình sau minh ho cách s dụng các ng th c kh i t o khác nhau để t o ra các đ i t ng c a l p nơy. class StringBufferCons public static void main(string args[]) StringBuffer s1 = new StringBuffer(); StringBuffer s2 = new StringBuffer(20); StringBuffer s3 = new StringBuffer( StringBuffer ); System.out.println( s3 = + s3); System.out.println(s2.length()); //chứa 0 System.out.println(s3.length()); //chứa 12 System.out.println(s1.capacity()); //chứa 16 System.out.println(s2.capacity()); //chứa 20 System.out.println(s3.capacity()); //chứa 28 length() vơ capacity() c a StringBuffer lơ hai ph ng th c hoơn toơn khác nhau. Ph ng th c length() đ c p đ n s các ký tự mơ đ i t ng thực ch a, trong khi capacity() tr v t ng dung l ng c a m t đ i t ng (mặc đ nh lơ 16) vơ s ký tự trong đ it ng StringBuffer. Dung l ng c a StringBuffer có thể thay đ i v i ph ng th c ensurecapacity(). Đ i s int đư đ c truy n đ n ph ng th c nơy, vơ dung l ng m i đ c tính toán nh sau: NewCapacity = OldCapacity * 2 + 2(CONG THUC) Tr c khi dung l N u dung l ng c a StringBuffer đ ng(newcapacity) m i l n h n đ i s đ ensurecapacity(), thì dung l N u dung l c đặt l i, đi u ki n sau s đ ng m i nh ensurecapacity(), thì dung l c truy n cho ph ng m i (NewCapacity) đ h n đ i s ng đ đ c kiểm tra: ng th c c đặt. c truy n cho ph ng th c c đặt bằng giá tr tham s truy n vơo. Page 31

32 Ch ng trình sau minh ho dung l ng đ c tính toán vơ đ c đặt nh th nơo. class Test public static void main(string args[]) StringBuffer s1 = new StringBuffer(5); System.out.println( Dung lượng của bộ nhớ đệm = +s1.capacity()); //chứa 5 s1.ensurecapacity(8); System.out.println( Dung lượng của bộ nhớ đệm = +s1.capacity()); //chứa 12 s1.ensurecapacity(30); System.out.println( Dung lượng của bộ nhớ đệm = +s1.capacity()); //chứa 30 Trong đo n mư trên, dung l ng ban đầu c a s1 lơ 5. Cơu l nh: s1.ensurecapacity(8); Thi t l p dung l nh h n dung l ng đ ng c a s1 đ n 12 =(5*2+2) b i vì dung l ng truy n vơo lơ 8 c tính toán lơ 12. s1.ensurecapacity(30); Thi t l p dung l ng c a s1 đ n 30 b i vì dung l h n dung l ng đ c tính toán (12*2+2). Các ph ng truy n vơo lơ 30 thì l n ng th c l p StringBuffer Trong phần nơy, chúng ta s em ét các ph m t ch ng trình. ng th c c a l p StringBuffer v i - void append() t Ph ng th c nơy n i thêm m t chu i hoặc m t m ng ký tự vơo cu i cùng c a đ i ng StringBuffer. Ví dụ: StringBuffer s1 = new StringBuffer( Good ); s1.append( evening ); Giá tr trong s1 bơy gi lơ goodevening. - void insert() Ph ng th c nơy có hai tham s. Tham s đầu tiên lơ v trí chèn. Tham s th hai có thể lơ m t chu i, m t ký tự (char), m t giá tr nguyên (int), hay m t giá tr s thực Page 32

33 (float) đ c ađ it c chèn vơo. V trí chèn s l n h n hay bằng 0, vơ nh h n hay bằng chi u dơi ng StringBuffer. B t kỳ đ i s nơo, tr ký tự hoặc chu i, đ chu i vơ sau đó m i đ c chuyển sang c chèn vơo. Ví dụ: StringBuffer str = new StringBuffer( Java sion ); str.insert(1, b ); Bi n str ch a chu i Jbava sion. - char charat() Ph đ ng th c nơy tr v m t giá tr ký tự trong đ i t ng StringBuffer t i v trí c ch đ nh.ví dụ: StringBuffer str = new StringBuffer( James Gosling ); char letter = str.charat(6); //chứa G - void setcharat(int inde, char value) Ph ng th c nơy đ c s dụng để thay th ký tự trong m t StringBuffer bằng m t ký tự khác t i m t v trí đ c ch đ nh. StringBuffer name = new StringBuffer( Jawa ); name.setcharat(2, v ); Bi n name ch a Java. - void setlength() Ph ng th c nơy thi t l p chi u dơi c a đ i t ng StringBuffer. N u chi u dơi đ c ch đ nh nh h n chi u dơi d li u hi n t i c a nó, thì các ký tự th a s b cắt b t. N u chiểu dơi ch đ nh nhi u h n chi u dơi d li u thì các ký tự null đ c thêm vơo phần cu i c a StringBuffer StringBuffer str = new StringBuffer(10); str.setlength(str.length() +10); - char [] getchars() Ph ng th c nơy đ c s dụng để trích ra các ký tự t đ i t ng StringBuffer, vơ sao chép chúng vơo m t m ng. Ph ng th c getchars() có b n tham s sau: Ch s đầu: v trí bắt đầu, t n i mơ ký tự đ c l y ra. Ch s k t thúc: v trí k t thúc M ng: M ng đích, n i mơ các ký tự đ c sao chép. V trí bắt đầu trong m ng đích: Các ký tự đ này. c sao chép vơo m ng đích t v trí Ví d : Page 33

34 StringBuffer str = new StringBuffer( Leopard ); char ch[] = new char[10]; str.getchars(3,6,ch,0); Bơy gi bi n ch ch a par - void reverse() Ph ng th c nơy đ o ng c n i dung c a m t đ i t m t đ i t ng StringBuffer khác. Ví dụ: ng StringBuffer, vơ tr v StringBuffer str = new StringBuffer( devil ); StringBuffer strrev = str.reverse(); Bi n strrev ch a lived Lớp StringTokenizer M t l p StringTokenizer có thể s dụng để tách m t chu i thơnh các phần t (token) nh h n. Ví dụ, m i t trong m t cơu có thể coi nh lơ m t token. Tuy nhiên, l p StringTokenizer đư đi a h n vi c phơn tách các t trong cơu. Để tách ra các thơnh token ta có thể tuỳ bi n ch ra m t t p d u phơn cách các token khi kh i t o đ i t ng StringTokenizer. N u ta không ch ra t p d u phơn cách thì mặc đ nh lơ d u trắng (space, tab,...). Ta cũng có thể s dụng t p các toán t toán học (+, *, /, vơ -) trong khi phân tích m t biểu th c. Ph ng th c ây dựng ụ nghĩa StringTokenizer(String) T o ra m t đ i t ng StringTokenizer m i dựa trên chu i đ c ch đ nh. StringTokenizer(String, String) T o ra m t đ i t ng StringTokenizer m i dựa trên (String, String) chu i đ c ch đ nh và m t t p các d u phân cách. StringTokenizer(String, boolean) String, T o ra m t đ i t ng StringTokenizer dựa trên chu i đ c ch đ nh, m t t p các d u phân cách, và m t c hi u cho bi t n u các d u phân cách s đ c tr v nh các token hay không. Bảng 2.4. Tóm tắt 3 phương thức tạo dựng của lớp StringTokenizer Các ph ng th c t o dựng trên đ c minh họa trong các ví dụ sau: StringTokenizer st1 = new StringTokenizer( A Stream of words ); StringTokenizer st2 = new StringTokenizer( 4*3/2-1+4, +-*/, true); StringTokenizer st3 = new StringTokenizer( aaa,bbbb,ccc,, ); Page 34

35 Trong cơu l nh đầu tiên, StringTokenizer c a st1 s đ s dụng các chu i đ c ơy dựng bằng cách c cung c p vơ d u phơn cách mặc đ nh. D u phơn cách mặc đ nh lơ kho ng trắng, tab, các ký tự u ng dòng. Các d u phơn cách nơy thì ch s dụng khi phơn tách văn b n, nh v i st1. Cơu l nh th hai trong ví dụ trên ơy dựng m t đ i t ng StringTokenizer cho các biểu th c toán học bằng cách s dụng các ký hi u *, +, /, vơ -. Cơu l nh th 3, StringTokenizer c a st3 s dụng d u phẩy nh m t d u phơn cách. ph L p StringTokenizer cơi đặt giao di n Enumeration. Vì th, nó bao g m các ng th c hasmoreelements() vơ netelement(). Các ph ng th c có thể s dụng c a l p StringTokenizer đ Ph ng th c counttokens() c tóm tắt trong b ng sau: M c đích Tr v s các token còn l i. hasmoreelements() Tr v True n u còn có token đang đ c đánh d u trong chu i. Nó thì gi ng h t nh hasmoretokens. hasmoretokens() Tr v True n u còn có token đang đ c đánh d u trong chu i. Nó gi ng h t nh hasmoreelements. netelement() Tr v token k ti p trong chu i. Nó thì gi ng nh nettoken. ti p trong chu i. Nó thì gi ng nh nettoken() Tr v Token k netelement. nettoken(string) Thay đ i b d u phân cách bằng chu i đ đó tr v token k ti p trong chu i. c ch đ nh, và sau Bảng 2.5. Tóm tắt ác phương thức có thể sử dụng của lớp StringTokenizer Hưy em ét ch ng trình đư cho bên d i. Trong ví dụ nơy, hai đ i t ng StringTokenizer đư đ c t o ra. Đầu tiên, st1 đ c s dụng để phơn tách m t biểu th c toán học. Th hai, st2 phơn tách m t dòng c a các tr ng đ c phơn cách b i d u phẩy. C hai tokenizer, ph ng th c hasmoretokens() vơ nettoken() đ c s dụng đ duy t qua t p các token, vơ hiển th các token. import java.util.*; public class StringTokenizerImplementer public static void main(string args[]) // đặt một biểu thức toán học và tạo một tokenizer cho chuỗi đó. Page 35

36 String mathepr = 4*3+2/4 ; StringTokenizer st1 = new StringTokenizer(mathEpr, *+/-, true); //trong khi vẫn còn các token, hiển thị System.out.println( Tokens of mathepr: ); while(st1.hasmoretokens()) System.out.println(st1.netToken()); //tạo một chuỗi của các trường được phân cách bởi dấu phẩy và tạo //một tokenizer cho chuỗi. String commas = field1,field2,field3,and field4 ; StringTokenizer st2 = new StringTokenizer(commas,,,false); //trong khi vẫn còn token, hiển thị. System.out.println( Comma-delimited tokens : ); while (st2.hasmoretokens()) System.out.println(st2.netToken()); K t qu ch y ch ng trình đ c mô t nh hình d i. Page 36

37 BÀI 2. CÁC C U TRÚC L P TRÌNH Ch ng trình lơ m t dưy các l nh đ c b trí thực hi n theo m t trình tự nơo đó, nh ng đôi khi ta mu n đi u khiển lu ng thực hi n c a ch ng trình tuỳ thu c vơo đi u ki n gì đó. Ngôn ng l p trình java cung c p m t s phát biểu cho phép ta đi u khiển lu ng thực hi n c a ch ng trình, chúng đ c li t kê trong b ng sau: Kiểu l nh T khoá Lặp while, do-while, for Quy t đ nh if-else, switch-case X lý l i try-catch-finally, throw R nhánh break, continue, label:, return 1. C u trúc r nhánh 1.1. Phát biểu if a) Dạng khuyết Cú pháp S đ : đúng if(boolean-epression) statement; đi u ki n statement sai b) dạng đủ Cú pháp S đ : if(boolean-epression) sai đúng Statement 1 đi u ki n Statement2 statement1; else statement2; 1.2. Biểu th c điều kiện Toán t đi u ki n lơ m t lo i toán t đặc bi t vì nó g m ba thơnh phần c u thơnh biểu th c đi u ki n. hay nói cách khác toán t đi u ki n lơ toán t 3 ngôi. Cú pháp: biểu th c 1? biểu th c 2 : biểu th c 3; Page 37

38 Trong đó: - biểu th c 1: Biểu th c 1 lơ m t biểu th c logic. T c lơ nó tr tr v giá tr True hoặc False - biểu th c 2: Giá tr tr v n u biểu th c 1 nh n giá True. - biểu th c 3: Giá tr tr v n u biểu th c 1 nh n giá tr False Chú ý: Kiểu giá tr c a biểu th c 2 vơ biểu th c 3 ph i t ng thích v i nhau. Ví dụ: Đo n biểu th c đi u ki n sau tr v giá tr a lơ s chẵn n u nh giá tr c a bi n a lơ s chẵn, ng c l i tr v giá tr a lơ s lẻ n u nh giá tr c a bi n a lơ s lẻ. String result=a%2==0? a là số chẵn : a là số lẻ ; Ví dụ: int =2; int i = (>6)?1:2; K t qu thu đ ci= Cấu trúc switch a) Dạng khuyết S đ kh i: Cú pháp: switch(biểu_th c) case gt_1: l nh 1; [ break;] case gt_2: l nh 2; [ break;] biểu_th c bằng gt_1 Yes l nh 1 break; l nh 2 break; No biểu_th c bằng gt_2 Yes No... case gt_n: l nh n; [ break;] biểu_th c bằng gt_n Yes l nh n break; No Page 38

39 b) Dạng đủ S đ kh i: Cú pháp switch(biểu_th c) case gt_1: Yes biểu_th c bằng gt_1 L nh 1 l nh 1; [ break;] case gt_2: l nh 2; [ break;] Yes biểu_th c bằng gt_2 L nh 2 No... case gt_n: l nh n; [ break;] default: l nh n+1; Yes biểu_th c bằng gt_n L nh n No l nh n+1 Chú ý: - biểu_th c ph i là m t biểu th c có kiểu char, byte, short, int nh ng không thể là kiểu long, n u biểu_th c có kiểu khác v i các kiểu li t kê thông báo l i. trên thì java s đ a ra m t - N u biểu_th c bằng giá tr c a gt_i thì các l nh t l nh i cho đ n l nh n n u không có default (l nh n+1 n u có default) s đ c thực hi n. - Câu l nh break thoát ra kh i c u trúc switch. S đ kh i mô t sự ho t đ ng c a c u trúc switch trong tr ng h p có l nh break: 2. C u trúc lặp while và do-while 2.1. Lặp kiểm tra điều kiện trước Ta có thể s dụng c u trúc while để thực thi lặp đi lặp l i m t l nh hoặc m t kh i l nh trong khi đi u ki n đúng. Cú pháp: while (BooleanEpression) statement; Đi u ki n lặp S đ kh i sau: sai đúng L nh Page 39

40 Tr c tiên phát biểu while s tính giá tr c a biểu th c logic, n u giá tr c a biểu th c logic lơ đúng thì cơu l nh trong thân c a while s đ c thực hi n, sau khi thực hi n ong nó tính l i giá tr c a biểu th c logic, n u giá tr đúng nó l i ti p tục thực hi n l nh trong thơn while cho đ n khi giá tr c a biểu th c sai. Ví d : public class WhileDemo public static void main(string[] args) String copyfromme = "Copy this string until you " + "encounter the letter 'g'."; StringBuffer copytome = new StringBuffer(); int i = 0; char c = copyfromme.charat(i); while (c! = 'g') copytome.append(c); c = copyfromme.charat(++i); System.out.println(copyToMe); Chú ý: - Biểu th c bên trong cặp ngoặc tròn ph i là m t biểu th c logic ( biểu th c tr v giá tr true hoặc false) - Biểu th c đi u ki n ph i nằm trong cặp ngoặc tròn - Sau t khoá while ta ch có thể đặt đ c duy nh t m t l nh, do v y để có thể thực hi n nhi u tác vụ sau while ta ph i bao chúng trong m t kh i l nh - Bên trong thân c a vòng lặp while ta nên có l nh lơm thay đ i giá tr c a biểu th c logic, n u không chúng ta s r i vơo vòng lặp vô h n - Câu l nh trong thân c u trúc while có thể không đ lôgic ban đầu có giá tr false ) c thực hi n lần nào (do biểu th c 2.2. Lặp kiểm tra điều kiện sau L nh Cú pháp: do đúng Đi u ki n lặp statement(s); sai while (epression); Sự ho t đ ng c a c u trúc nơy đ c thể hi n qua s đ sau: Page 40

41 Nhìn vơo s đ này ta th y sự ho t đ ng c a nó nh sau: b1) thực hi n l nh b2) sau khi thực hi n l nh ong nó tính giá tr c a biểu th c logic b3) n u biểu th c logic đúng nó quay tr l i b1, n u sai thì b4 b4) k t thúc vòng lặp và thực hi n l nh sau do-while Ví d : public class DoWhileDemo public static void main(string[] args) String copyfromme = "Copy this string until you " + "encounter the letter 'g'."; StringBuffer copytome = new StringBuffer(); int i = 0; char c = copyfromme.charat(i); do copytome.append(c); c = copyfromme.charat(++i); while (c! = 'g'); System.out.println(copyToMe); Chú ý: - Biểu th c bên trong cặp ngoặc tròn ph i là m t biểu th c logic ( biểu th c tr v giá tr true hoặc false ) - Biểu th c đi u ki n ph i nằm trong cặp ngoặc tròn: + Sau t khoá do ta có thể đặt đ c nhi u l nh + Bên trong thân c a vòng lặp do-while ta nên có l nh lơm thay đ i giá tr c a biểu th c logic, n u không chúng ta s r i vơo vòng lặp vô h n. + Câu l nh trong thân c u trúc do-while đ 3. C u trúc for c thực hi n ít nh t m t lần Đây là c u trúc lặp ph bi n nh t trong các ngôn ng l p trình, mà n i dung cu vòng lặp cần ph i lặp đi lặp l i m t s lần bi t tr c, cú pháp c a nó nh sau: for (initialization; termination; increment) statement Trong đó: Page 41

42 - initialization là giá trị khởi tạo trước khi vòng lặp bắt đầu, nó chỉ được thực hiện duy nh t m t lơn tr c khi vòng lặp bắt đầu - termination là điều kiện dùng để kết thúc quá trình lặp - increment là câu lệnh dùng để điều khiển quá trình lặp - statement là câu lệnh mà ta cần phải thực hiện lặp đi lặp lại. initialization termination đúng sai statement increment S đ kh i di n gi i sự ho t đ ng c a c u trúc for sau: Nhận ét: - Thân c a c u trúc lặp for ta ch có thể đặt đ c duy nh t m t l nh, do v y để có thể thực hi n nhi u tác vụ trong thân for ta ph i bao chúng trong kh i l nh - Thân vòng lặp for có thể không đ c thực hi n lần nào - Các phần initialization, termination, increment có thể khuy t tuy nhiên d y phẩy dành cho nó v n ph i có: + s lần thực hi n initialization=1 + s lần thực hi n termination = s lần lặp +1 + s lần thực hi n increment = s lần lặp - Ta có thể đặt m t vài khai báo bi n trong phần initialization, nh ví dụ sau - Ta có thể mô t c u trúc while thông qua c u trúc for nh sau for(; Boolean_Epression;) statement; Ví d : ki t kê ra 128 các kí tự asciii đầu tiên public class ListCharacters public static void main(string[] args) for( char c = 0; c < 128; c++) Page 42

43 if (c! = 26 )// ANSI Clear screen System.out.println( "value: " + (int)c + " character: " + c); // /:~ Toán tử dẫy và vòng lặp for đ Trong bơi tr c ta đư nhắc đ n toán t d y (toán t d y là m t d y các l nh đ n c cách nhau b i d u phẩy), trong java ch duy nh t mà ta có thể đặt toán t d y đó lơ bên trong c u trúc lặp for, ta có thể đặt toán t d y c trong phần initialization l n phần increment: Ví d v toán t d y: public class CommaOperator public static void main(string[] args) for(int i = 1, j = i + 10; i < 5; i++, j = i * 2) System.out.println("i= " + i + " j= " + j); K t qu ch y ch ng trình sau: i= 1 j= 11 i= 2 j= 4 i= 3 j= 6 i= 4 j= 8 4. L nh break và continue Bên trong thân c a các c u trúc lặp ta có thể đi u khiển lu ng thực hi n bằng cách s dụng l nh break và continue, l nh break s ch m d t quá trình lặp mà không thực hi n n t phân còn l i c a c u trúc lặp, continue s ng ng thực thi phần còn l i c a thân vòng lặp và chuyển đi u khiển v điểm bắt đầu c a vòng lặp, để thực hi n lần lặp ti p theo, ví dụ sau ch ra cách s dụng break và continue bên trong c u trúc lặp for và while public class BreakAndContinue public static void main(string[] args) for(int i = 0; i < 100; i++) if(i == 74) break;// Out of for loop if(i % 9! = 0) continue;// Net iteration System.out.println(i); Page 43

44 int i = 0; // An "infinite loop": while(true) i++; int j = i * 27; if(j == 1269) break;// Out of loop if(i % 10! = 0) continue;// Top of loop System.out.println(i); k t qu ch y ch ng trình sau: Bên trong c u trúc lặp for giá tr c a i không thể đ t đ c giá tr 100 vì phát biểu break s k t thúc vòng lặp khi i=74 Chú ý: Java không có lệnh nhẩy goto, tuy nhiên trong java vẫn có một vài vết tích c a l nh nhẩy goto ( khét ti ng vơ đ c coi là ngu n sinh các l i ) đó lơ l nh break và continue Nhãn c a vòng lặp Trong thực t các vòng lặp có thể l ng vào nhau, m c đ l ng nhau không h n ch, th thì câu h i đặt ra là l nh break s thoát ra kh i vòng lặp nào, câu tr l i là nó Page 44

45 thoát ra kh i vòng lặp mà l nh break đ c đặt, th thì làm cách nào ta có thể cho nó thoát ra kh i m t vòng lặp tuỳ ý nơo đó, cơu tr l i lơ java đư h tr cho ta m t công cụ đó lơ nhãn c a vòng lặp. Nhãn là m t cái tên sau đó có 2 d u ch m Ví dụ LabelName: Ch duy nh t mơ nhưn có ý nghĩa đó lơ ngay tr c l nh lặp, ta không thể có b t c m t l nh nào nằm gi a nhãn và l nh lặp, ta mô t sự ho t đ ng, cách s dụng nhãn c a vòng lặp thông qua ví dụ sau: public class LabeledFor public static void (String[] args) int i = 0; outer:// Can't have statements here for(; true; ) // infinite loop inner:// Can't have statements here for(; i < 10; i++) prt("i = " + i); if(i == 2) prt("continue"); continue; if(i == 3) prt("break"); i++;// Otherwise i never // gets incremented. break; if(i == 7) prt("continue outer"); i++;// Otherwise i never // gets incremented. continue outer; if(i == 8) prt("break outer"); break outer; for(int k = 0; k < 5; k++) if(k == 3) prt("continue inner"); continue inner; Page 45

46 // Can't break or continue // to labels here static void prt(string s) System.out.println(s); K t qu ch y ch ng trình nh sau: i=0 continue inner i=1 continue inner i=2 continue i=3 break i=4 continue inner i=5 continue inner i=6 continue inner i=7 continue outer i=8 break outer BÀI 3. L P TRỊNH H NG Đ I T NG TRONG JAVA L p là khái ni m trọng tâm c a l p trình h ng đ i t ng, java là ngôn ng l p trình h ng đ i t ng, m t ch ng trình java g m m t t p các đ i t ng, các đ i t ng này ph i h p v i nhau để t o thành m t ng dụng hoàn ch nh. Các đ i t ng đ c mô t qua khái ni m l p, l p là sự m r ng khái ni m RECORD trong pascal, hay struct c a C, ngoài các thành phần d li u, l p còn có các hàm ( ph ng th c, hành vi ), ta có thể em l p là m t kiểu d li u, vì v y ng i ta còn gọi l p là kiểu d li u đ i t ng. Sau khi đ nh nghĩa l p ta có thể t o ra các đ i t ng ( bằng cách khai báo bi n ) c a l p v a t o, do v y có thể quan ni m l p là t p h p các đ i t ng cùng kiểu. Page 46

47 1. Đ nh nghĩa l p 1.1. Khai báo lớp M tl pđ c đ nh nghĩa theo m u sau: [public][<abstract><final>][ class <Tên l p> [etends <Tên l p cha>] [implements <Tên giao di n>] <Các thành phần c a l p, bao g m: thu c tính và ph ng th c> Trong đó: (1) B i mặc đ nh m t l p ch có thể s dụng b i m t l p khác trong cùng m t gói v i l p đó, n u mu n gói khác có thể s dụng l p này thì l p này ph i đ public. (2) abstract là b t cho java bi t đơy lơ m t l p tr u t m t thể hi n c a l p này. c khai báo là l p ng, do v y ta không thể t o ra (3) final là b t cho java bi t đơy lơ m t l p không thể k th a. (4) class là t khoá cho ch NameOfClass. ng trình bi t ta đang khai báo m t l p, l p này có tên là (5) etends là t khoá cho java bi t l p nơy nơy đ c k th a t l p super. (6) implements là t khoá cho java bi t l p này s triển khai giao di n Interfaces, đơy lơ m t d ng t ng tự nh k th a b i c a java. Page 47

48 Sau đơu lơ ví dụ đ n gi n đ nh nghĩa l p ngăn p: Chú ý: (1) Thu c tính c a l p là m t bi n có kiểu d li u b t kỳ, nó có thể l i là m t bi n có kiểu là chính l p đó. (2) Khi khai báo các thành phần c a l p (thu c tính vơ ph ng th c) có thể dùng m t trong các t khoá private, public, protected để gi i h n sự truy c p đ n thành phần đó: ậ Các thành phần private ch có thể s dụng đ c p vào các thành phần private t bên ngoài l p ậ Các thành phần public có thể truy c p đ c bên trong l p, ta không thể truy c c bên trong l p l n bên ngoài l p. ậ các thành phần protected t ng tự nh các thơnh phần private, nh ng có thể truy c p đ c t b t c l p con nào k th a t nó. ậ N u m t thành phần c a l p khi khai báo mà không s dụng m t trong 3 b t protected, private, public thì sự truy c p là b n bè, t c là thành phần này có thể truy c p đ c t b t c l p nào trong cùng gói v i l p đó. (3) Các thu c tính nên để m c truy c p private để đ m b o tính d u kín vơ lúc đó để bên ngoài ph m vi c a l p có thể truy c p đ ph ng th c ph (4) Các ph c đ n thành phần private này ta ph i t o ra các ng th c get và set. ng th c th ng khai báo lơ public, để chúng có thể truy c p t b t c đơu. Page 48

49 (5) Trong m t t p ch ng trình (hay còn gọi là m t đ n v biên d ch) ch có m t l p đ c khai báo là public, và tên l p public này ph i trùng v i tên c a t p kể c ch hoa, ch th ng Khai báo thuộc tính Tr l i l p Stack public class Stack private Vector items; // a method with same name as a member variable public Vector items()... Trong l p Stack trên ta có m t thu c tính đ c đ nh nghĩa nh sau: private Vector items; Vi c khai báo nh trên đ c gọi là khai báo thu c tính hay còn gọi là bi n thành viên l p. T ng quát vi c khai báo m t thu c tính đ c vi t theo m u sau: Trong đó: (1) accesslevel có thể là một trong các từ public, private, protected hoặc có thể bỏ trống, ý nghĩa c a các b t nơy đ c mô t phần trên (2) static là từ khoá báo rằng đây là một thuộc tính lớp, nó là một thuộc tính sử dụng chung cho c l p, nó không là c a riêng m t đ i t ng nào, (chính vì th, thu c tính này s đ c gọi trực ti p b i tên l p mà không ph i gọi b i đ i t ng nào c ). (3) transient và volatile ch a đ c dùng (4) type là m t kiểu d li u nơo đó (5) name là tên c a thu c tính Chú ý: Ta ph i phân bi t đ c vi c khai báo nh th nào là khai báo thu c tính, khai báo th nào là khai báo bi n thông th ng? Câu tr l i là t t c các khai báo bên trong thân c a m t l p và bên ngoài t t c các ph khai báo ng th c và hàm t o thì đó lơ khai báo thu c tính, nh ng ch khác s cho ta bi n. Page 49

50 Nh ng thu c tính đ c khai báo v i t khoá static gọi là thu c tính tĩnh, ta ét ví dụ: class Static static int i = 10;// Đây là thuộc tính tĩnh int j = 10;// Đây là thuộc tính thường Đặc điểm của thu c tính tĩnh: - Các thu c tính tĩnh đ c c p phát m t vùng b nh c đ nh, trong java b nh dành cho các thu c tính tĩnh ch đ c c p phát khi lần đầu tiên ta truy c p đ n nó. - Thành phần tĩnh lơ chung c a c l p, nó không là c a riêng m t đ i t ng nào c. - Để truy u t đ n thu c tính tĩnh ta có thể dùng m t trong 2 cách sau: o tên_l p.tên_thu c_tính_tĩnh; o tên_đ i_t ng.tên_thu c_tính_tĩnh; c 2 cách truy u t trên đ u có tác dụng nh nhau. - Kh i gán giá tr cho thu c tính tĩnh bằng m t trong 2 cách sau: o S dụng kh i kh i đầu tĩnh (s nói trong phần sau) o S dụng kh i đầu trực ti p khi khai báo nh ví dụ trên Chú ý: ta không thể s dụng hàm t o để kh i đầu các thu c tính tĩnh, b i vì hàm t o không ph i là ph ng th c tĩnh Khai báo phương thức Trong l p Stack trên ta có ph ng th c push dùng để đẩy m t đ i t ngăn p, nó đ c đ nh nghĩa nh sau: Cũng gi ng nh m t l p, m t ph ng vơo đ nh ng th c cũng g m có 2 phần: phần khai báo và phần thân - Phần khai báo g m có nh ng phần sau( chi ti t c a khai báo đ c mô t sau): Page 50

51 - Phần thân c a ph vi nơy đ ng th c g m các l nh để mô t hành vi c a ph ng th c, các hành c vi t bằng các l nh c a java. M t ph ng th c đ c khai báo lơ static đ c gọi là ph ng th c tĩnh, ta ét ví dụ: class Static static int i;// Đây là thuộc tính tĩnh // phương thức tĩnh static void println() System.out.println ( i ); - Ph ng th c tĩnh lơ chung cho c l p, nó không l thu c vào m t đ i t nào - L i gọi ph ng th c tĩnh u t phát t : o tên c a l p: tên_l p.tên_ph ng cụ thể ng_th c_tĩnh(tham s ); o tên c a đ i t ng: tên_đ i_t ng. tên_ph ng_th c_tĩnh(tham s ); - Vì ph ng th c tĩnh lơ đ c l p v i đ i t ng do v y bên trong ph ng th c tĩnh ta không thể truy c p các thơnh viên không tĩnh c a l p đó, t c là bên trong ph ng th c tĩnh ta ch có thể truy c p đ n các thơnh viên tĩnh mơ thôi. - Ta không thể s dụng t khoá this bên trong ph ng th c tĩnh 1.2 Chi tiết về khai báo một phương th c Tổng quát một phương thức được khai báo như sau accesslevel //mô t m c đ truy c p đ n ph static //đơy lơ ph ng th c l p abstract //đơy lơ ph final //ph ng th c này không thể ghi đè native //ph ng th c nơy đ synchronized ng th c ng th c không có cơi đặt c vi t trong m t ngôn ng khác //đơy lơ ph ng th c đ ng b returntype //giá tr tr v c a ph ng th c MethodName //tên c a ph ng th c throws eception //khai báo các ngo i l có thể đ c nem ra t ph ng th c Trong đó: Page 51

52 - accesslevel có thể là m t trong các t khoá public, private, protected hoặc b tr ng, ý nghĩa c a các b t nơy đ c mô t trong phần khai báo l p - static là t khoá báo cho java bi t đơy lơ m t ph ng th c l p - abstract t khoá cho bi t đơy lơ m t l p tr u t ng, nó không có cơi đặt. - final đơy lơ t khoá báo cho java bi t đơy lơ ph ng th c không thể ghi đè t l p con - native đơy lơ t khoá báo cho java bi t ph l p trình nơo đó không ph i lơ java ( th - synchronized đơy lơ m t ph ng đ ng th c nơy đ c vi t bằng m t ngôn ng c vi t bằng C/C++) ng th c đ ng b, nó r t h u ích khi nhi u ph ng th c cùng truy c p đ ng th i vào tài nguyên mi n găng - returntype là m t kiểu d li u, đơy lơ kiểu tr v c a ph ng th c, khi ph ng th c không tr v d li u thì ph i dùng t khoá void - MethodName là tên c a ph ng th c, tên c a ph ng th c đ c đặt theo quy tắc đặt tên c a java - throws là t khoá dùng để khai báo các ngo i l có thể đ c ném ra t ph theo sau t khoá này là danh sách các ngo i l có thể đ ng th c này ném ra c ph ng th c, Chú ý: (1) N u trong l p có ít nh t m t ph (2) Không có thu c tính tr u t (3) Ta không thể t o đ i t ng th c tr u t ng thì l p đó ph i là l p tr u t ng ng ng c a l p tr u t ng (4) Khác v i ngôn ng C/C++, java bắt bu c b n ph i khai báo giá tr tr v cho ph ng th c, n u ph ng th c không tr v d li u thi dùng t khoá void (trong C/C++ khi ta không khai báo giá tr tr v thì mặc đ nh giá tr tr v là int) Nhận giá trị trả về từ phương thức ph Ta khai báo kiểu giá tr tr v t lúc ta khai báo ph ng th c, bên trong thân c a ng th c ta ph i s dụng phát biểu return value; để nh n v k t qu, n u hơm đ c khai báo kiểu void thì ta ch s dụng phát biểu return; m nh đ return đôi khi còn đ c dùng để k t thúc m t ph ng th c Truyền tham số cho phương thức Khi ta vi t các ph ng th c, m t s ph ng th c yêu cầu ph i có m t s tham s, các tham s c a m t ph ng th c đ c khai báo trong l i khai báo ph ng th c, chúng ph i đ c khai báo chi ti t có bao nhiêu tham s, m i tham s cần ph i cung c p cho chúng m t cái tên và kiểu d li u c a chúng. Page 52

53 Ví dụ: ta có m t ph ng th c dùng để tính t ng c a hai s, ph ng th c nơy đ c khai báo nh sau: public double tonghaiso(double a, double b) return (a + b); a) Kiểu tham s Trong java ta có thể truy n vơo ph ng th c m t tham s có kiểu b t kỳ, t kiểu d li u nguyên thuỷ cho đ n tham chi u đ i t ng. b) Tên tham s Khi b n khai báo m t tham s để truy n vơo ph ng th c thì b n ph i cung c p cho nó m t cái tên, tên nay đ c s dụng bên trong thân c a ph ng th c để tham chi u đ n tham s đ c truy n vào. Chú ý: Tên c a tham s có thể trùng v i tên c a thu c tính, khi đó tên c a tham s s che đi tên c a ph ng th c, b i v y bên trong thân c a ph ng th c mà có tham s có tên trùng v i tên c a thu c tính, thì khi nhắc đ n cái tên đó có nghĩa lơ nhắc đ n tham s. c) Truy n tham s theo tr Khi gọi m t ph ng th c mà tham s c a ph ng th c có kiểu nguyên thuỷ, thì b n sao giá tr c a tham s thực sự s đ c chuyển đ n ph ng th c, đơy lơ đặc tính truy n theo tr ( pass- by ậ value ), nghĩa lơ ph ng th c không thể thay đ i giá tr c a các tham s truy n vào. Ta kiểm tra đi u này qua ví dụ sau: public class TestPassByValue public static void test(int t) t++; System.out.println("Gia tri của t bi?n trong ham sau khi tang len 1 la " + t); public static void main(string[] args) int t = 10; System.out.println("Gia tri của t tru?c khi gọi ham = " + t); test(t); System.out.println("Gia tri của t truoc khi gọi ham = " + t); ta s nh n đ c k t qu ra nh sau: Page 53

54 Gia tri c a t truoc khi gọi ham = 10 Gia tri c a t bên trong ham sau khi tang len 1 la 11 Gia tri c a t truoc khi gọi ham = Thân của phương thức Trong ví dụ sau thân c a ph và có mầu đ ng th c isempty vơ ph ng th c pop đ c in đ m class Stack static final int STACK_EMPTY = -1; Object[] stackelements; int topelement = STACK_EMPTY;... boolean isempty() if (topelement == STACK_EMPTY) return true; else return false; Object pop() if (topelement == STACK_EMPTY) return null; else return stackelements[topelement--]; 2. S d ng l p Sau khi khai báo m t m t l p ta có thể em l p nh lơ m t kiểu d li u, nên ta có thể t o ra các bi n, m ng các đ i t ng, vi c khai báo m t bi n, m ng các đ i t t ng tự nh khai báo m t bi n, m ng c a kiểu d li u nguyên thuỷ ng cũng 2.1 Khai báo một biến, mảng đối tượng Cú pháp: Tên_L p tên_bi n; Tên_L p tên_mang[kích th Tên_L p[kích th c m ng]; c m ng] tên_mang; Tên_L p[] tên_mang = new Tên_L p[kích th c m ng]; Ví dụ: // Trong phần khai báo l p phía trên ta có m t l p Stack, có thể khai báo đ i t ng Page 54

55 // Stack nh sau: Stack s1; // khai báo một đối tượng kiểu Stack Stack s2[5]; // khai báo mảng đối tượng gồm 5 phần tử s2[0], s2[1],, s2[4] Stack[] s3 = new Stack[5] // khai báo và cấp phát bộ nhớ cho mảng đối tượng gồm // 5 phần tử V b n ch t m i đ i t ng trong java là m t con tr t i m t vùng nh, vùng nh này chính là vùng nh dùng để l u tr các thu c tính, vùng nh dành cho con tr này thì đ c c p phát trên stack, còn vùng nh dành cho các thu c tính c a đ i t ng này thì đ c c p phát trên heap. 2.2 Truy uất tới các thành phần c a lớp Để truy u t đ n các thành phần c a m t l p(các thành phần public ậ ch y u là ph ng th c) t bên ngoài ta ph i s dụng đ i t ng kiểu l p v a đ c khai báo. Cú pháp: Tên_Đ i_t ng.tên_thành_phần Ví dụ: bool b = s1.isempty(); 3. Ph ng th c t o dựng (constructor) 3.1. Công dụng Ph ng th c t o dựng là m t ph ng th c c a l p (nh ng khá đặc bi t ) th ng dùng để kh i t o m t đ i t ng m i. Thông th ng ng i ta th ng s dụng hàm t o để kh i gán giá tr cho các thu c tính c a đ i t ng và có thể thực hi n m t s công vi c cần thi t khác nhằm chuẩn b cho đ i t ng m i Cách viết hàm tạo Đặc điểm của phương thức tạo dựng - hàm t o có tên trùng v i tên c a l p - hàm t o không bao gi tr v k t qu - nó đ c java gọi tự đ ng khi m t đ i t ng c a l p đ - hàm t o có thể có đ i s nh các ph ng th c thông th - trong m t l p có thể có nhi u hàm t o c t o ra ng khác Ví d : Ví dụ 1: s dụng hàm t o để in ra mơn hình ơu Creating Rock class Rock Rock() // This is the constructor Page 55

56 System.out.println("Creating Rock"); public class SimpleConstructor public static void main(string[] args) for(int i = 0; i < 10; i++) new Rock();// call constructor Ví dụ 2: s dụng hàm t o có đ i class Rock2 Rock2(int i) System.out.println( "Creating Rock number " + i); public class SimpleConstructor2 public static void main(string[] args) for(int i = 0; i < 10; i++) new Rock2(i);// gọi hàm tạo có đối // /:~ Hàm tạo mặc định Khi ây dựng m t l p mà không ây dựng hàm t o th thì java s cung c p cho ta m t hàm t o không đ i mặc đ nh, hàm t o này thực ch t không làm gì c, n u trong l p đư có ít nh t m t hàm t o thì hàm t o mặc đ nh s không đ c t o ra, khi ta t o ra m t đ it ng thì s có m t hàm t o nào đó đ c gọi, n u trình biên d ch không tìm th y hàm t o t ng ng nó s thông báo l i, đi u nơy th ng ẩy ra khi chúng ta không ây dựng hàm t o không đ i nh ng khi t o dựng đ i t ng ta l i không truy n vào tham s, nh đ c ch ra trong ví dụ sau: public class TestPassByValue public TestPassByValue(String s) System.out.println(s); public static void main(string[] args) TestPassByValue thu = new TestPassByValue(); // lỗi vì lớp này không có hàm tạo không đối TestPassByValue thu1 = new TestPassByValue("Hello World"); Page 56

57 // không vấn đề gì Gọi hàm tạo từ hàm tạo Khi b n vi t nhi u hàm t o cho l p, có đôi lúc b n mu n gọi m t hàm t o này t bên trong m t hàm t o khác để tránh ph i vi t lặp mư. Để có thể gọi đ n hàm t o ta s dụng t khoá this. Cú pháp: this(danh sách đ i s ); Ví d : public class Test public Test () System.out.println("hàm tạo không đối"); public Test ( int i) this();// gọi đến hàm tạo không đối của chính lớp này public static void main(string[] args) TestPassByValue thu=new TestPassByValue(10); Chú ý: (1) Bên trong m t hàm t o ta ch có thể gọi đ ta không thể gọi đ c t i đa m t hàm t o, đi u nơy có nghĩa lơ c t 2 c u t tr lên bên trong m t c u t khác nh đ c ch ra trong ví dụ sau: public class TestPassByValue public TestPassByValue() System.out.println("Day la ham tao khong doi"); public TestPassByValue(int i) System.out.println("Day la ham tao doi so nguyen"); public TestPassByValue(String s) this();// không thể gọi hai hàm tạo trở lên bên trong một hàm tạo this(10); System.out.println("Day la ham tao doi so au"); Page 57

58 public static void main(string[] args) TestPassByValue thu = new TestPassByValue();// TestPassByValue thu1 = new TestPassByValue("Hello World");// (2) Khi gọi m t hàm t o bên trong m t hàm t o khác thì l i gọi hàm t o ph i là l nh đầu tiên trong thơn ph ng th c, nên ví dụ sau s b báo l i public class Test public Test () System.out.println("Day la ham tao khong doi"); public Test (String s) System.out.println("Day la ham tao doi so au"); this();// gọi đến cấu tử phải là lệnh đầu tiên public static void main(string[] args) Test thu = new Test ( Hello World ); n u cho d ch ví dụ trên trình biên d ch s phàn nàn "Test.java": call to this must be first statement in constructor at line 7, column Khối khởi đầu vô danh và khối khởi đầu tĩnh Khối vô danh Trong java ta có thể đặt m t kh i l nh không thu c m t ph ng th c nơo, nghĩa lơ kh i này không thu c b t c ph ng th c nào kể c hàm t o. Khi đó kh i l nh nơy đ c gọi là kh i vô danh, kh i vô danh nơy đ c java gọi thực thi khi m t đ i t ng đ c t o ra, các kh i vô danh đ c gọi tr c c hàm t o, thông th ng ta hay s dụng kh i vô danh để kh i đầu các thu c tính c a l p hoặc đ c s dụng để kh i t o cho các th c tính c a m t l p vô danh(vì l p vô danh không có tên do v y ta không thể vi t hàm t o cho l p nơy, trong tr Ví d : ng h p này kh i vô danh là gi i pháp duy nh t ) ví dụ này ta có 3 kh i vô danh, khi ch y java cho thực thi các kh i vô danh này theo th tự t trên u ng d i public class Untitled1 // hàm tạo public Untitled1 () System.out.println ( "Day la ham tao" ); Page 58

59 // bắt đầu khối vô danh System.out.println ( "khoi khoi dau thu 3 "); // kết thúc khối vô danh //bắt đầu khối vô danh System.out.println ( "khoi khoi dau thu 1 "); //kết thúc khối vô danh // bắt đầu khối vô danh System.out.println ( "khoi khoi dau thu 2 "); //kết thúc khối vô danh public static void main ( String[] args ) Untitled1 dt1 = new Untitled1 (); Untitled1 dt2 = new Untitled1 (); khi ch y ch ng trình s cho k t qu sau: khoi khoi dau thu 3 khoi khoi dau thu 1 khoi khoi dau thu 2 Day la ham tao khoi khoi dau thu 3 khoi khoi dau thu 1 khoi khoi dau thu 2 Day la ham tao Khối khởi đầu tĩnh Kh i kh i đầu tĩnh lơ m t kh i l nh bên ngoài t t c các ph ng th c, kể c hàm t o, tr c kh i l nh nơy ta đặt t khoá static, t khoá này báo cho java bi t đơy lơ kh i kh i đầu tĩnh, kh i này ch đ c gọi 1 lần khi đ i t ng đầu tiên c a l p nơy đ c t o ra, kh i kh i đầu tĩnh nơy cũng đ c java gọi tự đ ng tr c b t c hàm t o nào, thông th ng ta s dụng kh i kh i đầu tĩnh để kh i đầu các thu c tính tĩnh ( static ), sau đơy lơ Page 59

60 m t ví dụ có 1 kh i kh i đầu tĩnh vơ m t kh i vô danh, để b n th y đ c sự khác nhau gi a kh i kh i đầu tĩnh vơ kh i vô danh. public class Untitled1 public Untitled1 () System.out.println ( "Đây là hàm tạo" ); static // đây là khối khởi đầu tĩnh System.out.println ( "Đây là khối khởi đầu tĩnh"); System.out.println("Khối này chỉ được gọi 1 lần khi thể hiện đầu tiên của lớp được tạo ra"); //đây là khối vô danh System.out.println ( "Đây là khối vô danh "); public static void main ( String[] args ) Untitled1 dt1 = new Untitled1 ();/ / tạo ra thể hiện thứ nhất của lớp Untitled1 dt2 = new Untitled1 ();/ / tạo tiếp thể hiện thư 2 của lớp khi cho ch y ch ng trình ta s đ c k t qu ra nh sau: Đơy là kh i kh i đầu tĩnh Kh i này ch đ c gọi 1 lần khi thể hi n đầu tiên c a l p đ c t o ra Đơy là kh i vô danh Đơy là hàm t o Đơy là kh i vô danh Đơy là hàm t o Nhìn vào k t qu ra ta th y kh i kh i đầu tĩnh ch đ c java gọi thực hi n 1 lần khi đ i t ng đầu tiên c a l p nơy đ c t o, còn kh i vô danh đ c gọi m i khi m t đ i t ng m i đ c t o ra 4. Dọn dẹp: k t thúc và thu rác 4.1. Phương th c finalize Page 60

61 Java không có ph ng th c h y b. Ph ng th c finalize t th c h y b c a C++, tuy nhiên nó không ph i lơ ph ng tự nh ph ng ng th c h y b. S dĩ nó không ph i lơ ph ng th c h y b vì khi đ i t ng đ c h y b thì ph ng th c nơy ch a chắc đư đ c gọi đ n. Ph ng th c nơy đ c gọi đ n ch khi b thu rác c a Java đ c kh i đ ng vơ lúc đó đ i t ng không còn đ c s dụng n a. Do v y ph ng th c finalize có thể không đ c gọi đ n Cơ chế gom rác c a java Ng i l p trình C++ th ng s dụng toán t new để c p phát đ ng m t đ i t ng, nh ng l i th ng quên gọi toán t delete để gi i phóng vùng nh này khi không còn dùng đ n n a, đi u này làm rò r b nh đôi khi d n đ n ch ng trình ph i k t thúc m t cách b t th ng, qu th t đơy lơ m t đi u t i t. Trong java ta không cần quan tơm đ n đi u đó, java có m t c ch thu rác tự đ ng, nó đ thông minh để bi t đ i t không dùng n a, r i nó tự đ ng thu h i vùng nh dơnh cho đ i t ng đó. Trong ngôn ng C++ khi m t đ i t ng t ng b phá huỷ, s có m t hơm đ ng nào c gọi tự đ ng, hơm nơy đ c gọi là huỷ t hay còn gọi là hàm huỷ, thông th ng hàm hàm huỷ mặc đ nh lơ đ để dọn dẹp, tuy nhiên trong m t s tr ng h p thì hàm huỷ mặc đ nh l i không thể đáp ng đ c, do v y ng i l p trình C++, ph i vi t ra hàm huỷ riêng để làm vi c đó, tuy nhiên java l i không có khái ni m hàm huỷ hay m t cái gì đó t ng tự. 5. T khóa this Thông th ng bên trong thân c a m t ph ng th c ta có thể tham chi u đ n các thu c tính c a đ i t ng đó, tuy nhiên trong m t s tình hu ng đặc bi t nh tên c a tham s trùng v i tên c a thu c tính, lúc đó để ch các thành viên c a đ i t ng đó ta dùng t khoá this, t khoá this dùng để ch đ i t ng này. Ví dụ sau ch ra cho ta th y trong tình hu ng này bắt bu c ph i dùng t khoá this vì tên tham s c a ph ng th c t o dựng l i trùng v i tên c a thu c tính: class HSBColor int hue, saturation, brightness; HSBColor (int hue, int saturation, int brightness) this.hue = hue; this.saturation = saturation; this.brightness = brightness; 6. Đi u khiển vi c truy c p đ n các thành viên của m t l p Khi ơy dựng m t l p ta có thể h n ch sự truy c p đ n các thơnh viên c a l p, t m t đ i t ng khác. Page 61

62 Ta tóm tắt qua b ng sau: T khoá Truy c p Truy c p Truy c p Truy c p Truy trong chính trong l p trong l p con trong l p khác trong l p đó con cùng gói khác gói cùng gói khác gói private X protected X X X X - public X X X X X default X X - X - c p l p khác Bảng 2.7. Các mức độ truy cập Trong b ng trên thì X thể hi n cho sự truy c p h p l còn ậ thể hi n không thể truy c p vào thành phần này Các thành phần private Các thành viên private ch có thể s dụng bên trong l p, ta không thể truy c p các thành viên private từ bên ngoài lớp này. Ví dụ class Alpha private int iamprivate; private void privatemethod() System.out.println("privateMethod"); class Beta void accessmethod() Alpha a = new Alpha(); a.iamprivate = 10;// không hợp lệ a.privatemethod();// không hợp lệ 6.2. Các thành thành phần protected T khoá protected báo cho java bi t đơy lơ thơnh phần riêng t đ i v i bên ngoài nh ng l i sẵn sàng v i các con cháu. Page 62

63 6.3. Các thành phần public Các thành viên public có thể truy c p t b t c đơu, ta se em ví dụ sau: public class Alpha public int iampublic; public void publicmethod() System.out.println("publicMethod"); import Greek.*; class Beta void accessmethod() Alpha a = new Alpha(); a.iampublic = 10;// hợp lệ a.publicmethod();// hợp lệ 6.4. Các thành phần có m c truy uất gói Khi ta khai báo các thành viên mà không s dụng m t trong các t public, private, protected thì java mặc đ nh thơnh viên đó có m c truy c p gói. Ví d : class Alpha int iampackage; void packagemethod() System.out.println("packageMethod"); class Beta void accessmethod() Alpha a = new Alpha(); a.iampackage = 10;// legal a.packagemethod();// legal 7. N p ch ng ph ng th c 7.1. Khái niệm về phương th c bội tải Page 63

64 Java cho phép ta ây dựng nhi u ph hi n t ng các ph ng th c trùng tên nhau, trong cùng m t l p, ng th c trong m t l p có tên gi ng nhau đ c gọi là b i t i ph ng th c Yêu cầu c a các phương th c bội tải Do s dụng chung m t cái tên cho nhi u ph ng th c, nên ta ph i cho java bi t cần ph i gọi ph ng th c nơo để thực hi n, java dựa vào sự khác nhau v s l ng đ i cũng nh kiểu d li u c a các đ i nơy để phân bi t các ph ng th c trùng tên đó. Ví d : public class OverloadingOrder static void print(string s, int i) System.out.println( "String: " + s + ", int: " + i); static void print(int i, String s) System.out.println( "int: " + i + ", String: " + s); public static void main(string[] args) print("string first", 11); print(99, "Int first"); // /:~ Chú ý: (1) N u n u java không tìm th y m t hàm t o thích h p thì nó s đ a ra m t thông báo l i (2) Ta không thể s dụng giá tr tr v c a hơm để phân bi t sự khác nhau gi a 2 ph ng th c t o (3) Không nên quá l m dụng các hàm t o vì trình biên d ch ph i m t th i gian phán đoán để tìm ra hàm thích h p, đi u nơy đôi khi còn d n đ n sai sót (4) Khi gọi các hàm n p ch ng ta nên có l nh chuyển kiểu t ng minh để trình biên d ch tìm ra hàm phù h p m t cách nhanh nh t (5) Trong java không thể đ nh nghĩa ch ng toán t nh trong ngôn ng C++, có thể đơy là m t khuy t điểm, nh ng nh ng ng i thi t k java cho rằng đi u này là không cần thi t, vì nó quá ph c t p. Page 64

65 BÀI 4 K TH A (INHERITANCE), ĐA HỊNH 1. L p c s và l p d n u t M t l p đ c ây dựng thông qua k th a t m t l p khác gọi là l p d n u t (hay còn gọi là l p con, l p h u du ), l p dùng để ây dựng l p d n u t đ c gọi là l p c s ( hay còn gọi là l p cha, hoặc l p t tiên ) M t l p d n u t ngoài các thành phần c a riêng nó, nó còn đ các thành phần c a l p cha. c k th a t t c 2. Cách ây dựng l p d n u t Để nói l p b là d n u t c a l p a ta dùng t khoá etends, cú pháp nh sau: class b etends a // phần thân của lớp b 3. Th a k các thu c tính Thu c tính c a l p c s đ c th a k trong l p d n u t, nh v y t p thu c tính c a l p d n u t s g m: các thu c tính khai báo trong l p d n u t và các thu c tính c a l p c s, tuy nhiên trong l p d n u t ta không thể truy c p vào các thành phần private, package c a l p c s 4. Th a k ph ng th c L p d n u t k th a t t c các ph - Ph - Ph 5. Ph ng th c c a l p c s tr : ng th c t o dựng ng th c finalize ng th c kh i t o của l p c s L p d n u t k th a mọi thành phần c a l p c s, đi u này d n ta đ n m t hình dung, là l p d n u t có cùng giao di n v i l p c s và có thể có các thành phần m i b sung thêm, nh ng thực t không ph i v y, k th a không ch là sao chép giao di n c a l p c a l p c s. Khi ta t o ra m t đ i t ng c a l p suy d n, thì nó ch a bên trong nó m t sự v t con c a l p co s, sự v t con này nh thể ta đư t o ra m t sự v t t c a l p c s, th thì l p c s ph i đ ng minh c b o đ m kh i đầu đúng, để thực hi n đi u đó trọng java ta làm nh sau: Thực hi n kh i đầu cho l p c s bằng cách gọi hàm t o c a l p c s bên trong hàm t o c a l p d n u t, n u b n không lơm đi u này thì java s làm giúp b n, nghĩa lơ java luôn tự đ ng thêm l i gọi hàm t o c a l p c s vào hàm t o c a l p d n u t n u nh ta quên lơm đi u đó, để có thể gọi hàm t o c a l p c s ta s dụng t khoá super. Page 65

66 Ví d 1: ví dụ này không gọi c u t c a l p c s m t cách t ng minh class B public B () System.out.println ( "Ham tao của lop co so" ); public class A etends B public A () // không gọi hàm tạo của lớp cơ sở tường minh System.out.println ( "Ham tao của lop dan uat" ); public static void main ( String arg[] ) A thu = new A (); K t qu ch y ch ng trình nh sau: Ham tao c a lop co so Ham tao c a lop dan uat Ví d 2: ví dụ này s dụng t khoá super để gọi hàm t o c a l p c s m t cách t minh: ng class B public B () System.out.println ( "Ham tao của lop co so" ); public class A etends B public A () super();// gọi tạo của lớp cơ sở một cách tường minh System.out.println ( "Ham tao của lop dan uat" ); public static void main ( String arg[] ) Page 66

67 A thu = new A (); khi ch y ch ng trình ta th y k t qu gi ng h t nh ví dụ trên Chú ý 1: n u gọi t ng minh hàm t o c a l p c s, thì l i gọi này ph i là l nh đầu tiên, n u ví dụ trên đ i thành class B public B () System.out.println ( "Ham tao của lop co so" ); public class A etends B public A () // Lời gọi cấu tử của lớp cơ sở không phải là lệnh đầu tiên System.out.println ("Ham tao của lop dan uat"); super (); public static void main ( String arg[] ) A thu = new A (); n u biên d ch đo n mã này ta s nhơn đ c m t thông báo l i nh sau: "A.java": call to super must be first statement in constructor at line 15, column 15 Chú ý 2: Ta ch có thể gọi đ n m t hàm t o c a l p c s bên trong hàm t o c a l p d n u t, ví dụ ch ra sau đư b báo l i class B public B () System.out.println ( "Ham tao của lop co so" ); public B ( int i ) Page 67

68 System.out.println ( "Ham tao của lop co so" ); public class A etends B public A () super (); super ( 10 );/ / không thể gọi nhiều hơn 1 hàm tạo của lớp cơ sở System.out.println ( "Ham tao của lop dan uat" ); public static void main ( String arg[] ) A thu = new A (); 5.1. Trật tự khởi đầu Tr t tự kh i đầu trong java đ c thực hi n theo nguyên tắc sau: java s gọi hàm t o c a l p c s tr c sau đó m i đ n c u t c a l p suy d n, đi u nơy có nghĩa lơ trong cơy ph h thì các c u t s đ c gọi theo tr t tự t g c u ng dần đ n lá 5.2. Trật tự dọn dẹp Mặc dù java không có khái ni m huỷ t nh c a C++, tuy nhiên b thu rác c a java v n ho t đ ng theo nguyên tắc làm vi c c a c u t C++, t c là tr t tự thu rác thì ng c l i so v i tr t tự kh i đầu. 6. Ghi đè ph ng th c (Override) Khi m t l p đ c k th a t l p cha trong cả lớp cha và lớp con đều có một phương thức trùng tên nhau, hi n t ng đó gọi lơ ghi đè ph ng th c. V y thì làm th nào có thể gọi ph ng th c trùng tên đó c a l p cha, java cung c p cho ta t khoá super dùng để ch đ i t ng c a l p cha v i cú pháp nh sau: super.overriddenmethodname(); Ta ét ví d sau: class ASillyClass boolean avariable; void amethod() avariable = true; Page 68

69 class ASillierClass etends ASillyClass boolean avariable; void amethod() avariable = false; super.amethod(); System.out.println(aVariable); System.out.println(super.aVariable); trong ví dụ trên ta th y trong l p cha có ph ng th c tên là amethod trong l p con cũng có m t ph ng th c cùng tên, ta còn th y c hai l p này cùng có m t thu c tính tên avariable để có thể truy c p vào các thành viên c a l p cha ta ph i dùng t khoá super. Chú ý: Ta không thể dùng nhi u t khoá nơy để ch l p ông, l p cụ chẳng h n vi t nh sau là sai: super.super.add(1,4); N u m t ph ng th c c a l p c s b b i t i ( Overload ), thì nó không thể b ghi đè ( Override ) l p d n u t. 7. T khoá final T khoá final trong java có nhi u nghĩa khác nhau, nghĩa c a nó tuỳ thu c vào ng c nh cụ thể, nh ng nói chung nó mu n nói cái nơy không thể thay đ i đ c Thuộc tính final Trong java cách duy nh t để t o ra m t hằng là khai báo thu c tính là final Ví dụ: public class A // định nghĩa hằng tên MAX_VALUE giá trị 100 static final int MAX_VALUE = 100; public static void main ( String arg[] ) A thu = new A (); System.out.println("MAX_VALUE= " +thu.max_value); Chú ý: (1) Khi đư khai báo m t thu c tính là final thì thu c tính này là hằng, do v y ta không thể thay đ i giá tr c a nó. Page 69

70 (2) Khi khai báo m t thu c tính là final thì ta ph i cung c p giá tr ban đầu cho nó. (3) N u m t thu c tính v a là final v a là static thì nó ch có m t vùng nh chung duy nh t cho c l p 7.2. Đối số final Java cho phép ta t o ra các đ i final bằng vi c khai báo chúng nh v y bên trong danh sách đ i, nghĩa lơ bên trong thơn c a ph ng pháp này, b t c c gắng nơo để thay đ i giá tr c a đ i đ u gây ra l i lúc d ch Ví dụ sau b báo l i lúc d ch vì nó c gắng thay đ i giá tr c a đ i final: public class A static public void thu ( final int i ) i=i+1;//không cho phép thay đổi giá trị của tham số final System.out.println ( i );; public static void main ( String arg[] ) int i = 100; thu ( i ); ch ng trình này s b báo l i: "A.java": variable i might already have been assigned to at line 5, column Phương th c final M t ph ng th c bình th ng có thể b ghi đè l p d n u t, đôi khi ta không mu n ph ng th c c a ta b ghi đè l p d n u t vì lý do gì đó, mục đích ch y u c a các ph ng th c final lơ tránh ghi đè, tuy nhiên ta th y rằng các ph ng th c private s tự đ ng là final vì chúng không thể th y đ c trong l p d n u t nên chúng không thể b ghi đè, nên cho dù b n có cho m t ph ng th c private là final thì b n cũng không th y m t hi u ng nào Lớp final N u b n không mu n ng i khác k th a t l p c a b n, thì b n hãy dùng t khoá final để ngăn c n b t c ai mu n k th a t l p này. Page 70

71 Chú ý: do m t l p là final (t c không thể k th a )do v y ta không thể nơo ghi đè các ph ng th c c a l p này, do v y đ ng c gắng cho m t ph ng th c c a l p final là final. 8. L p c s tr u t ng M t l p c s tr u t ng là m t l p ch đ c dùng làm c s cho các l p khác, ta không thể t o ra thể hi n c a l p này, b i vì nó đ c dùng để đ nh nghĩa m t giao di n chung cho các l p khác. Để khai báo m t l p là tr u t ng ta s dụng t khóa abstract: public class abstract classname // t M t l p tr u t ng có thể ch a m t vài ph ng th c tr u t ng, do l p tr u ng ch làm l p c s cho các l p khác, do v y các ph ng th c tr u t ng cũng không đ con c cơi đặt cụ thể, chúng ch g m có khai báo, vi c cơi đặt cụ thể s dành cho l p Chú ý: 1) N u trong l p có ph ng th c tr u t ng thì l p đó ph i đ c khai báo là tr u t 2) N u m t l p k th a t l p tr u t ng thì: hoặc chúng ph i ghi đè t t c các ph th c o c a l p cha, hoặc l p đó ph i là l p tr u t ng 3) Không thể t o ra đ i t ng c a l p tr u t ng ng ng 9. Đa hình thái Đa hình thái trong l p trình h lúc thi hành (runtime) mã nào s đ nh ng ng đ i t ng đ c p đ n kh năng quy t đ nh trong c ch y, khi có nhi u ph ng th c trùng tên nhau các l p có c p b c khác nhau. Chú ý: kh năng đa hình thái trong l p trình h ng đ i t tên khác nhau nh : t ng ng b i, k t ghép đ ng,.. ng còn đ Đa hình thái cho phép các v n đ khác nhau, các đ i t th c khác nhau, các cách gi i quy t khác nhau theo cùng m t l Các b c gọi v i nhi u cái ng khác nhau, các ph ng c đ chung. c để t o đa hình thái: 1. Xây dựng l p c s ( th ng là l p c s tr u t s đ c các l p con m r ng( đ i v i l p th chi ti t ( đ i v i giao di n ). ng, hoặc là m t giao di n), l p này ng, hoặc l p tr u t ng), hoặc triển khai Page 71

72 2. Xây dựng các l p d n u t t l p c s v a t o. Trong l p d n u t này ta s ghi đè các ph ng th c c a l p c s ( đ i v i l p c s th v i l p c s tr u t ng), hoặc triển khai chi ti t nó ( đ i ng hoặc giao di n). 3. Thực hi n vi c t o khuôn u ng, thông qua l p c s, để thực hi n hơnh vi đa hình thái. Khái ni m v t o khuôn lên, t o khuôn u ng: - Hi n t ng m t đ i t ng c a l p cha tham tr đ n m t đ i t ng c a l p con thì đ c gọi là t o khuôn u ng, vi c t o khuôn u ng luôn đ c java ch p thu n, do v y khi t o khuôn u ng ta không cần ph i ép kiểu t ng minh. - Hi n t ng m t đ i t ng c a l p con tham tr t i m t đ i t ng c a l p cha thì đ c gọi là t o khuôn lên, vi c t o khuôn lên là an toàn, vì m t đ i t ng c a l p con cũng có đầy đ các thành phần c a l p cha, tuy nhiên vi c t o khuôn lên s b báo l i n u nh ta không ép kiểu m t cách t ng minh. Page 72

73 BÀI 5. GIAO DI N, L P TRONG, GÓI Giao di n là m t khái ni m đ c java đ a ra v i 2 mục đích chính: - Để t o ra m t l p c s thuần o, m t l p không có b t c hơm nơo đ c cơi đặt - Thực hi n hành vi t ng tự nh k th a b i, b i trong java không có khái ni m k th a b i, nh c a C++ L p trong cho ta m t cách th c tinh vi để che gi u mã m t cách t i đa, trong java ta có thể đ nh nghĩa m t l p bên trong m t l p khác, th m chí ta còn có thể t o l p trong, bên trong thân c a m t ph ng th c, đi u này cho phép ta có thể t o ra các l p cục b, ch đ c s dụng n i b bên trong m t đ n v đó. Ta không thể t o ra m t l p trong, trong ngôn ng C++ 1. Giao di n (Interface) T khoá interface đư đ a khái ni m abstract đi a thêm m t b c n a. Ta có thể nghĩ nó nh là m t l p abstract thuần tuý, nó cho phép ta t o ra m t l p thuần o, l p này ch g m t p các giao di n cho các l p mu n d n u t t nó, m t interface cũng có thể có các tr ng, tuy nhiên java tự đ ng làm các tr ng này thành static và final Để t o ra m t interface, ta dùng t khoá interface thay vì t khoá class. M t interface g m có 2 phần: phần khai báo và phần thân, phần khai báo cho bi t m t s thông tin nh : tên c a interface, nó có k th a t m t giao di n khác hay không. Phần thân ch a các khai báo hằng, khai báo ph ng th c ( nh ng không có cơi đặt). Gi ng nh m t l p ta cũng có thể thêm b t public vào tr hình nh c a m t interface. c đ nh nghĩa c a interface. Sau đơy lơ Nh ng do java tự đ ng làm các tr ng thành final nên ta không cần thêm b t này, do v y ta có thể đ nh nghĩa l i giao di n nh sau: public interface StockWatcher final String sunticker = "SUNW"; final String oracleticker = "ORCL"; final String ciscoticker = "CSCO"; void valuechanged(string tickersymbol, double newvalue); 1.1. Phần khai báo c a giao diện Page 73

74 T ng quát phần khai báo c a m t giao di n có c u trúc t ng quát nh sau: public //giao diện này là công cộng interface InterfaceName //tên của giao diện Etends SuperInterface //giao diện này là mở rộng của 1 giao diện khác InterfaceBody Trong c u trúc trên có 2 phần bắt bu c ph i có đó lơ phần interface và InterfaceName, các phần khác là tuỳ chọn Phần thân ph Phần thân khai báo các các hằng, các ph ng th c r ng ( không có cơi đặt ), các ng th c này ph i k t thúc v i d u ch m phẩy ;, b i vì chúng không có phần cơi đặt Chú ý: (1) T t c các thành phần c a m t giao di n tự đ ng là public do v y ta không cần ph i cho b t này vào. (2) Java yêu cầu t t c các thành phần c a giao di n ph i là public, n u ta thêm các b t khác nh private, protected tr (3) T t c các tr c các khai báo thì ta s nh n đ c m t l i lúc d ch ng tự đ ng là final và static, nên ta không cần ph i cho b t này vào Triển khai giao diện B i m t giao di n ch g m các mô t chúng không có phần cơi đặt, các giao di n đ c đ nh nghĩa để cho các l p d n u t triển khai, do v y các l p d n u t t l p này ph i triển khai đầy đ t t c các khai báo bên trong giao di n, để triển khai m t giao di n b n bao g m t khoá implements vào phần khai báo l p, l p c a b n có thể triển khai m t hoặc nhi u giao di n ( hình th c này t ng tự nh k th a b i c a C++) Ví dụ public class StockApplet etends Applet implements StockWatcher... public void valuechanged(string tickersymbol, double newvalue) if (tickersymbol.equals(sunticker))... else if (tickersymbol.equals(oracleticker))... else if (tickersymbol.equals(ciscoticker))... Page 74

75 Chú ý: (1) N u m t l p triển khai nhi u giao di n thì các giao di n nơy đ b i d u phẩy, (2) L p triển khai giao di n ph i thực thi t t c các ph ng th c đ c li t kê cách nhau c khai báo trong giao di n, n u nh l p đó không triển khai, hoặc triển khai không h t thì nó ph i đ báo là abstract (3) Do giao di n cũng lơ m t l p tr u t c khai ng do v y ta không thể t o thể hi n c a giao di n (4) M t l p có thể triển khai nhi u giao di n, do v y ta có l i dụng đi u nơy để thực hi n hành vi k th a b i, v n không đ c java h tr (5) M t giao di n có thể m r ng m t giao di n khác, bằng hình th c k th a 2. L p trong Có thể đặt m t đ nh nghĩa l p này vào bên trong m t l p khác, đi u nơy đ c gọi là l p trong. L p trong là m t tính năng có giá tr vì nó cho phép b n g p nhóm các l p v mặt logic thu c v nhau vơ để kiểm soát tính th y đ c c a các l p này bên trong l p khác. Tuy nhiên b n ph i hiểu rằng l p trong không ph i là là h p thành Ví d : public class Stack private Vector items;...//code for Stack's methods and constructors not shown... public Enumeration enumerator() return new StackEnum(); class StackEnum implements Enumeration int currentitem = items.size() - 1; public boolean hasmoreelements() return (currentitem >= 0); public Object netelement() if (!hasmoreelements()) throw new NoSuchElementEception(); else return items.elementat(currentitem--); Page 75

76 L p trong r t h u hi u khi b n b n mu n t o ra các l p đi u h p ( đ nói v thi t k giao di n ng i dùng) c bàn kỹ khi Page 76

77 CH NG 3. L P TRỊNH ĐA TUY N(MULTITHREAD) L P TRÌNH SOCKET BÀI 1. L P TRỊNH ĐA TUY N 1. Các ki n th c liên quan 1.1. Tiến trình ( process) Ti n trình là m t thể hi n c a m t ch ng trình đang lý. S h u m t con tr l nh, t p các thanh ghi và các bi n. Để hoàn thành tác vụ c a mình, m t ti n trình còn cần đ n m t s tài nguyên khác nh : CPU, b nh, các t p tin, các thi t b ngo i vi.. Cần phân bi t đ c gi a ti n trình và ch ng trình. M t ch ng trình là m t thể hi n thụ đ ng, ch a các ch th đi u khiển máy tính để thực hi n mục đích gì đó; khi cho thực thi ch th này thì ch ng trình s bi n thành ti n trình. Có thể nói tóm tắt ti n trình là m t ch ng trình ch y trên h đi u hơnh vơ đ c qu n lý thông qua m t s hi u gọi là thẻ Tiểu trình ( thread ) M t tiểu trình là m t đ n v lý c b n trong h th ng. M i tiểu trình lý tuần tự các đo n code c a nó, s h u m t con tr l nh, m t t p các thanh ghi và m t vùng nh stack riêng, các tiểu trình chia sẻ CPU v i nhau gi ng nh cách chia sẻ gi a các ti n trình. M t ti n trình s h u nhi u tiểu trình, tuy nhiên m t tiểu trình ch có thể thu c v m t ti n trình, các tiểu trình bên trong cùng m t ti n trình chia sẻ nhau không gian đ a ch chung, đi u nơy có nghĩa lơ các tiểu trình có thể chia sẻ nhau các bi n toàn cục c a ti n trình. M t tiểu trình cũng có thể có các tr ng thái gi ng nh các tr ng thái c a m t ti n trình Hệ điều hành đơn nhiệm, đa nhiệm - HĐH đ n nhi m lơ HĐH ch cho phép 1 ti n trình ch y t i m t th i điểm, ví dụ HĐH DOS lơ HĐH đ n nhi m. - HĐH đa nhi m cho phép nhi u ti n trình ch y t i m t th i điểm, ví dụ HĐH windows, Uni, Linu lơ các HĐH đa nhi m. - HĐH đa nhi m u tiên: các ti n trình đ c c p phát th i gian s dụng CPU theo m c u tiên khác nhau. - HĐH đa nhi m không u tiên: các ti n trình không có m c u tiên nào c, chúng tự giác nh quy n kiểm soát CPUsau khi k t thúc phần công vi c. Chú ý: trong thực t m i máy th ng ch có 1 CPU, nên không thể có nhi u ti n trình ch y t i m t th i điểm. Nên thông th ng sự đa ch ng ch là gi l p. Chúng đ c gi Page 77

78 l p bằng cách l u tr nhi u ti n trình trong b nh t i m t th i điểm, vơ đi u ph i CPU qua l i gi a các ti n trình Các trạng thái c a tiến trình Tr ng thái c a m t ti n trình t i m t th i điểm đ c ác đ nh b i ho t đ ng hi n th i c a ti n trình đó. Trong quá trình s ng m t ti n trình thay đ i tr ng thái do nhi u nguyên nhân nh : h t th i gian s dụng CPU, ph i ch m t sự ki n nơo đó y ra, hay đ i m t thao tác nh p/u t hoàn t t T i m t th i điểm m t ti n trình có thể nh n m t trong các tr ng thái sau đơy: - T o m i: ti n trình đang đ c thành l p. - Running: các ch th c a ti n trình đang đ đang s h u CPU. c lý, hay nói cách khác ti n trình - Blocked: ti n trình đang ch đ c c p tài nguyên, hay ch m t sự ki n nơo đó ẩy ra. - Ready: ti n trình đang ch c p CPU để lý. - K t thúc: ti n trình đư hoơn t t vi c lý Miền găng ( Critical Section ) a) Vấn đề tranh chấp tài nguyên Ta ét tình hu ng sau: - gi s A có 500$ trong tài kho n ngân hàng - A quy t đ nh rút ra 100$ t tài kho n ngân hàng, thao tác c a A g m 2 b c: 1) l y ra 100$ 2) gi m s tài kho n đi 100$ - Tình hu ng gi a 2 thao tác 1 và 2, B tr A 300$, do v y B c p nh t vào trong tài kho n c a A lơ 800$ ( =500$ +300$), sau đó A ti p tục công vi c 2, nó c p nh t l i trong tài kho n là 400$, nh v y B đư tr A 300$, nh ng A không nh n đ c. b) Miền găng (Critical Section) Đo n ch dụng chung đ ng trình trong đó có thể ẩy ra các mâu thu n truy u t trên tài nguyên c gọi là mi n găng ( Critical Section ) 1.6. Khoá chết (deadlock) M t t p các ti n trình đ c đ nh nghĩa lơ trong tình tr ng khoá ch t n u nh, m i ti n trình trong t p h p đ u đ u ch đ i m t s tơi nguyên đang b nắm gi b i các ti n trình khác, nh v y không có ti n trình nào có thể ti p tục lý, cũng nh gi i phóng Page 78

79 tài nguyên cho các ti n trình khác s dụng, t t c các ti n trình trong t p h p đểu b khoá vĩnh vi n!. 2. L p trình đa tuy n trong Java V i Java ta có thể ây dựng các ch ong trình đa lu ng. M t ng dụng có thể bao g m nhi u lu ng. M i lu ng đ th i v i các lu ng khác. c gán m t công vi c cụ thể, chúng đ c thực thi đ ng Có hai cách để t o ra lu ng: Cách 1: T o ra m t l p k th a t l p Thread vơ ghi đè ph ng th c run c a l p Thread nh sau: class MyThread etends Thread public void run() //Mã lệnh của tuyến Cách 2: T o ra m t l p triển khai t giao di n Runnable, ghi đè ph ng th c run class MyThread implements Runnable public void run() //Mã lệnh của tuyến 2.1. Lớp Thread L p Thread ch a ph ng th c t o dựng Thread() cũng nh nhi u ph ng th c h u ích có ch c năng ch y, kh i đ ng, t m ng ng, ti p tục, gián đo n và ng ng tuy n. Để t o ra và ch y m t tuy n ta cần làm 2 b c: - M r ng l p Thread vơ Ghi đè ph ng th c run() - Gọi ph ng th c start() để bắt đầu thực thi tuy n L p Thread không có nhi u ph h u dụng đ - ng th c lắm, chúng ch có m t vài ph ng th c c li t kê sau: public void run() Đ c java gọi để thực thi tuy n thi hành, b n ph i ghi đè ph ng th c nơy để thực thi nhi m vụ c a tuy n, b i vì ph ng th c run()c a l p Thread ch là ph ng th c r ng - public void start() Khi ta t o ra tuy n nó ch a thực sự ch y cho đ n khi, ph ng th c start() đ gọi, khi start() đ c gọi thì ph ng th c run() cũng đ c kích ho t c Page 79

80 - public void stop() Có ch c năng ng ng tuy n thi hành, ph ng th c này không an toàn, b n nên gán null vào bi n Thread để để d ng tuy n, thay vì s dụng ph ng th c stop() - public void suspend() Có ch c năng t m ng ng tuy n, trong java 2, ph ng th c nơy ít đ c s dụng, b i vì ph ng th c này không nh tài nguyên mà nó lắm gi, do v y có thể nguy c d n đ n deadlock ( khoá ch t ), b n nên dùng ph ng th c wait(), để t m ng ng tuy n thay vì s dụng ph ph ph ng th c suspend() public void resume() Ti p tục v n hành tuy n n u nh nó đang b ng ng, n u tuy n đang thi hơnh thì ng th c này b b qua, thông th ng ph ng th c nơy đ c dùng k t h p v i ng th c suspend(), kể t java 2 ph ng th c này cùng v i ph ng th c suspend()b t ch i, do v y b n nên dùng ph resume() - ng th c notify () thay vì s dụng ph ng th c public static void sleep( long millis) Threadows InterruptedEception Đặt tuy n thi hành vào tr ng thái ng, trong kho ng th i gian ác đ nh bằng mili giây. chú ý sleep() là ph - ng th c tĩnh. public void interrupt() LƠm gián đo n tuy n thi hành - public static boolean isinterrupt() Kiểm tra em tuy n có b ngắt không - public void setpriority( int p) n đ nh đ thu c đo n [1,10] - u tiên cho tuy n thi hơnh, đ u tiên đ c ác đ nh là m t s nguyên public final void wait() throws InterruptEception Đặt tuy n vào tr ng thái ch m t tuy n khác, cho đ n khi có m t tuy n khác thông báo thì nó l i ti p tục, đơy lơ ph ng th c c a l p c s Object - public final void notify () Đánh th c tuy n đang ch, trên đ i t - ng này public final void notifyall() Đánh th c t t c các tuy n đang ch trên đ i t ng này Page 80

81 - isalive() Tr v True, n u lu ng là v n còn t n t i (s ng) - getpriority() Tr v m c u tiên c a lu ng - join() Đ i cho đ n khi lu ng k t thúc - isdaemon() Kiểm tra n u lu ng là lu ng m t lu ng ch y ngầm (deamon) - setdeamon(boolean on) Đánh d u lu ng nh là lu ng ch y ngầm Ví d : ta t o ra 2 tuy n thi hành song song, m t tuy n thực hi n vi c in 200 dòng Đ i học s ph m kỹ thu t H ng Yên, trong khi tuy n này đang thực thi thì có m t tuy n khác v n ti p tục in 200 dòng ch chơo m ng b n đ n v i java public class Hello public static void main ( String[] args ) new ChaoDH ().start (); new ChaoJV ().start (); class ChaoDH etends Thread public void run () for ( int i = 1; i <= 200; i++ ) System.out.println ( "Đại học sư phạm kỹ thuật Hưng Yên" ); class ChaoJV etends Thread public void run () for ( int i = 1; i <= 200; i++ ) System.out.println ( "chào mừng bạn đến với java" ); khi ta ch y ch ng trình th y k t qu en k nhau nh.. Đ i học s ph m kỹ thu t H ng Yên Đ i học s ph m kỹ thu t H ng Yên chào m ng b n đ n v i java Page 81

82 Đ i học s ph m kỹ thu t H ng Yên chào m ng b n đ n v i java Đ i học s ph m kỹ thu t H ng Yên chào m ng b n đ n v i java chào m ng b n đ n v i java 2.2. Vòng đời c a Thread Hình sau thể hi n tr ng thái c a tuy n trong vòng đ i c a chúng: 2.3. Luồng chạy ngầm (deamon) M t ch ng trình Java k t thúc ch sau khi t t c các lu ng thực thi ong. Trong Java có hai lo i lu ng: - Lu ng ng i s dụng - Lu ng ch y ngầm (deamon) Ng i s dụng t o ra các lu ng ng i s dụng, trong khi các lu ng deamon là các lu ng ch y n n. Lu ng deamon cung c p các d ch vụ cho các lu ng khác. Máy o Java thực hi n ti n trình thoát, khi đó ch còn duy nh t lu ng deamon v n còn s ng. Máy o Java có ít nh t m t lu ng deamon là lu ng garbage collection (thu l m tài nguyên dọn rác). Lu ng dọn rác thực thi ch khi h th ng không có tác vụ nào. Nó là m t lu ng có quy n u tiên th p. L p lu ng có hai ph ng th c để làm vi c v i lu ng deamon: - public void setdaemon(boolean on) - public boolean isdaemon() 2.4. Giao diện Runnable mục tr c b n đư t o ra các lu ng thực hi n song song v i nhau, trong java ta còn có thể t o ra các tuy n thi hành song song bằng cách triển khai giao di n Runnable. Chắc b n s tự h i, đư có l p Thread r i t i sao l i còn có giao di n Runnable n a, chúng Page 82

83 khác gì nhau?, câu tr l i ch, java không h tr k th a b i, n u ch ng trình c a b n v a mu n k th a t m t l p nơo đó, l i v a mu n đa tuy n thì b n bắt bu c ph i dùng giao di n Runnable, chẳng h n nh b n vi t các Applet, b n v a mu n nó là Applet, l i v a mu n thực thi nhi u tuy n, thì b n v a ph i k th a t l p Applet, nh ng n u đư k th a t l p Applet r i, thì b n không thể k th a t l p Thread n a. Ta vi t l i ví dụ trên, nh ng lần này ta không k th a l p Thread, mà ta triển khai giao di n Runnable public class Hello public static void main ( String[] args ) Thread t = new Thread ( new ChaoDH () ); t.start (); Thread t1 = new Thread ( new ChaoJV () ); t1.start (); class ChaoDH implements Runnable public void run () ChaoDH thu = new ChaoDH (); for ( int i = 1; i <= 200; i++ ) System.out.println("Đại học sư phạm kỹ thuật Hưng Yên"); class ChaoJV implements Runnable public void run () for ( int i = 1; i <= 200; i++ ) System.out.println ( "chào mừng bạn đến với java" ); Cho ch y ví dụ này ta th y k t qu ra không khác gì v i ví dụ tr c Thiết lập độ ưu tiên cho tuyến Khi m t tuy n đ c t o ra, nó nh n m t đ u tiên mặc đ nh, đôi khi ta mu n đi u ch nh đ u tiên c a tuy n để đ t đ c mục đích c a ta, th t đ n gi n, để đặt đ u tiên cho m t tuy n ta ch cần gọi ph ng th c setpriority() và truy n cho nó m t s nguyên, s nơy chính lơ đ u tiên mà b n cần đặt. Ta vi t l i ví dụ trên nh sau: Thêm vào ph ng th c main() 2 dòng l nh: Page 83

84 t.setpriority(1); //Tuyến này có độ ưu tiên là 1 t1.setpriority(10); // Tuyến này có độ ưu tiên là 10 Ch y l i ch ng trình này sau khi s a và tr c khi s a ta th y tuy n t1 đ th i gian s dụng CPU nhi u h n tuy n t, lý do lơ ta đư đặt đ h n đ u tiên c a tuy n t. cc p u tiên c a tuy n t1 l n Chú ý: (1) Đ u tiên c a m t tuy n biểu th b i m t s nguyên nằm trong đo n t 1 đ n 10, m t l i s phát sinh n u ta gán cho nó đ u tiên, nằm ngoài kho ng này (2) N u m t tuy n không đ c đặt đ u tiên thì nó s nh n đ u tiên mặc đ nh ( bằng 5 ), ta có thể kiểm tra đi u này bằng cách gọi ph ng th c getpriority() 2.6. Nhóm tuyến (Thread Group) Nhóm tuy n là m t t p h p g m nhi u tuy n, khi ta tác đ ng đ n nhóm tuy n ( chẳng h n nh t m ng ng, ) thì t t c các tuy n trong nhóm đ u nh n đ c cùng tác đ ng đó, đi u này là ti n l i khi ta mu n qu n lý nhi u tuy n thực hi n các tác vụ t tự nhau. ng Để t o m t nhóm tuy n ta cần: - T o ra m t nhóm tuy n bằng cách s dụng ph ng th c t o dựng c a l p ThreadGroup(): ThreadGroup g= new ThreadGroup( ThreadGroupName ); ThreadGroup g= new ThreadGroup(ParentThreadGroup, ThreadGroupName ); Dòng l nh trên t o ra m t nhóm tuy n g có tên lơ ThreadGroupName, tên c a tuy n là m t chu i và không trùng v i tên c a m t nhóm khác. - Đ a các tuy n vào nhóm tuy n dùng ph ng th c t o dựng c a l p Thread() : Thread =new Thread (g, new ThreadClass(), ThisThread ); 2.7. Đồng bộ các tuyến thi hành Khi nhi u tuy n truy c p đ ng th i vào tài nguyên dùng chung, mà tài nguyên này l i không thể chia sẻ, cho nhi u tuy n, khi đó tơi nguyên dùng chung có thể b h ng. Ví dụ, m t lu ng có thể c gắng đọc d li u, trong khi lu ng khác c gắng thay đ i d li u. Trong tr ng h p này, d li u có thể b sai. Trong nh ng tr ng h p này, b n cần cho phép m t lu ng hoàn thành trọn vẹn tác vụ c a nó, và r i thì m i cho phép các lu ng k ti p thực thi. Khi hai hoặc nhi u h n m t lu ng cần thâm nh p đ n m t tơi nguyên đ c chia sẻ, b n cần chắc chắn rằng tài nguyên đó s đ c s dụng ch b i m t lu ng t i m t th i điểm. Page 84

85 B i trong java không có bi n toàn cục, chúng ta ch có thu c tính c a đ i t t t c các thao tác có thể d n đ n h ng hóc đ u thực hi n qua ph ng, ng th c, do v y java cung c p t khoá synchronized, t khoá nơy đ c thêm vơo đ nh nghĩa c a ph ng th c báo cho java bi t đơy lơ m t ph ng th c đ ng b, m i đ i t ng s có m t b qu n lý khoá, b qu n lý khoá này ch cho 1 ph ng th c synchronized c a đ i t ng đó ch y t i m t th i điểm M u ch t c a sự đ ng b hóa là khái ni m monitor (giám sát), hay còn gọi semaphore (c hi u). M t monitor lơ m t đ i t ng mơ đ c khóa đ c quy n. Ch m t lu ng có thể có monitor t i m i th i điểm. T t c các lu ng khác c gắng thâm nh p vào monitor s b trì hoưn, cho đ n khi lu ng đầu tiên thoát kh i monitor. Các lu ng khác đ c báo ch đ i monitor. M t lu ng có thể monitor m t đ i t ng nhi u lần. Page 85

86 BÀI 2. L P TRÌNH SOCKET 1. Các ki n th c liên quan Tr c khi bắt đầu học bài này các b n cần đọc l i các ki n th c liên quan sau: - Giao th c, yêu cầu t i thiểu các b n ph i nắm đ c 3 giao th c : IP, TPC, UDP - Cách đánh đ a ch IP, đ a ch d ng tên mi n, giao th c chuyển đ i đ a ch IP thành đ a ch tên mi n, vơ ng cl i - M t s đ a ch đặc bi t: đ a ch lặp, đ a ch broadcash, multicash - C ng giao th c - Phân bi t đ c sự khác nhau, gi ng nhau gi a 2 giao th c TCP và UDP 1.1. Giới thiệu Socket Socket là m t giao di n l p trình ng (API - Application Program Interface) dụng m ng, thông qua giao di n này ta có thể l p trình đi u khiển vi c truy n thông gi a 2 máy s dụng các giao th c m c th p nh TCP, UDP, Socket lơ m t sự tr u t ng hoá m c cao, có thể t ng t ng, nó nh lơ m t thi t b truy n thông 2 chi u t ng tự nh t p tin, chúng ta g i/ nh n d li u gi a 2 máy, t ng tự nh vi c đọc/ ghi trên t p tin. Để liên l c thông qua Socket, ta cần ti n hành các thao tác: - T o l p hay m m t Socket - Gắn m t Socket v i m t đ a ch, đ a ch nơy chính lơ đ a ch c a máy mà nó cần liên l c - Thực hi n vi c liên l c, có 2 kiểu liên l c tuỳ thu c vào ch đ k t n i: a) Liên lạc trong chế độ không kết nối: Hai ti n trình liên l c v i nhau không k t n i trực ti p m i thông đi p g i đi ph i kèm theo đ a ch c a ng - Ng i nh n. Hình th c liên l c nơy có đặc điểm: i g i không chắc chắn thông đi p c a họ có đ n tay ng i nh n không - M t thông đi p có thể g i nhi u lần - Thông đi p g i sau có thể đ n đích tr c thông đi p g i tr c đó b) Liên lạc trong chế độ kết nối: đ Có m t đ ng k t n i o đ c thành l p gi a 2 ti n trình, tr c khi m t k t n i c thành l p thì m t trong 2 ti n trình ph i đ i ti n trình kia yêu cầu k t n i, có thể s dụng Socket để liên l c theo mô hình Client/Server. Trong mô hình này server s dụng l i gọi listen vơ accept để lắng nghe và ch p nh n m t yêu cầu k t n i Page 86

87 1.2. Lập trình Socket trong java Java cung c p m t s l p cho phép các ng dụng m ng có thể trao đ i v i nhau qua c ch Socket, cụ thể l p Socket cung c p cho ta c ch liên l c trong ch đ k t n i (s dụng giao th c TCP) và l p DatagramSocket cho phép các ng dụng m ng liên l c v i nhau trong ch đ không k t n i (s dụng giao th c UDP), t t c các l p liên quan đ n vi c l p trình Socket đ c java nhóm l i vơ để trong gói java.net 2. Kh o sát m t s l p trong gói java.net 2.1. Lớp InetAddress M i m t máy khi tham gia truy n thông cần ph i có m t đ nh danh, đ nh danh này ph i là duy nh t, đ nh danh này đ c thể hi n bằng đ a ch IP hoặc đ a ch d i d ng tên mi n. L p InetAddress biểu th cho m t đ a ch c a m t máy nơo đó, khi ta mu n liên l c v i m t máy a, ta ph i bi t đ c đ a ch IP c a máy a, tuy nhiên đ a ch IP thì r t khó nh, đôi khi ta không thể bi t chính ác đ a ch IP c a máy đó, b i vì nhi u nguyên nhơn khác nhau nh : máy đó kh i đ ng t a hoặc đ c n i vào nhà cung c p d ch vụ Internet, do v y m i lần k t n i vào nhà cung c p d ch vụ ISP ta l i có 1 đ a ch IP khác nhau. V y th thì làm th nơo để ta có thể liên l c v i máy a khi ta ch bi t đ a ch máy đó d i d ng tên mi n?, câu tr l i là l p InetAddress đư lơm đi u đó cho ta, l p này tự đ ng chuyển đ a ch d ng tên mi n thơnh đ a ch IP vơ ng c l i. L p InetAddress cung c p m t s ph ng th c tĩnh (static) dùng để chuyển đ i d a ch d i d ng tên mi n thơnh đ a ch IP vơ ng b n cần quan tâm: Ph- ng ph p c l i. Có m t s ph ng th c sau mà M«t Public void equals( Object So s nh 2 èi t-îng obj) Public byte[] getaddress() LÊy vò Þa chø IP d-íi d¹ng m ng byte vò m ng èi t-îng static Tr InetAddress, v mét m y cã thó getallbyname(string ho cã nhiòu Þa chø IP (do cã nhiòu card m¹ng), nªn ph- ng st) thøc nµy tr vò mét m ng chøa throws têt c c c Þa chø t- ng øng UnknownHostEception víi tªn miòn. public InetAddress[] public static InetAddress getbyname(string host) throws UnknownHostEception Tr l¹i èi t-îng InetAddress cã tªn -îc chø ra, tªn nµy lµ mét u ký tù d-íi d¹ng tªn miòn hoæc Þa chø IP Page 87

88 public gethostaddress() String Tr vò Þa chø IP cña m y chñ public gethostname() String Tr vò tªn cña m y chñ public static InetAddress getlocalhost() Tr vò èi t-îng InetAddress kõt hîp víi chýnh m y ã throws UnknownHostEception public boolean KiÓm tra em Þa chø nµy cã ph i lµ Þa chø Multicast ismulticastaddress() kh«ng Bảng 3.1. Các phương thức của lớp Address Chú ý: - Trong gói java.net còn l p Inet4Address và l p Inet6Address hai l p này thể hi n cho các đ a ch IP version 4 và IP version 6, nó g m t t c các thành phần c a l p InetAddress - Ta cần thêm m nh đ import l p java.net.inetaddress tr c khi có thể s dụng nó. - Ph ng th c getbyname s có gắng phân gi i tên mi n thơnh đ a ch IP t ng ng bằng cách: Tr c tiên nó đi tìm trong cache, n u không tìm th y nó tìm ti p trong t p host, n u v n không tìm th y nó s c gắng k t n i đ n máy ch DNS để yêu cầu phân gi i tên nơy thơnh đ a ch IP, n u không thể phân gi i đ c tên này thì nó s sinh ra m t ngo i l UnknownHostEception, th nên b n cần đặt chúng vào m t kh i try..catch. Ví d 1: Minh ho cách s dụng các ph ng th c getbyname để t o ra m t InetAddress import java.net.*; class InetAddress1 public static void main(string[] args) try InetAddress address = InetAddress.getByName(" System.out.println(address); catch (UnknownHostEception e) System.out.println("Could not find Page 88

89 K t qu ch y ch ng trình nh sau: cách truy n vơo ph ng th c getbyname m t âu ký tự thể hi n tên máy b n ta thể truy n vào m t âu thể hi n đ a ch IP c a máy nh sau: InetAddress address = InetAddress.getByName(" "); Ví d 2: T o ra m t InetAddress t ng ng v i máy cục b : import java.net.*; class MyAddress public static void main(string[] args) try InetAddress address = InetAddress.getLocalHost(); System.out.println(address); catch (UnknownHostEception e) System.out.println("Could not find this computer's address."); K t qu ch y ch ng trình nh sau: cvauni1/ ví dụ 3: N u máy b n có cài nhi u card m ng b n có thể l y v m t m ng các InetAddess t ng ng v i đ a ch IP cho t ng card m ng đó: import java.net.*; class AllAddressesOfCva public static void main(string[] args) try InetAddress[] addresses = InetAddress.getAllByName(" for (int i = 0; i < addresses.length; i++) System.out.println(addresses[i]); catch (UnknownHostEception e) System.out.println("Could not find K t qu ch y ch ng trình nh sau: Page 89

90 s dĩ cho k t qu nh trên lơ do máy có cơi 4 card m ng, t tôi đặt m t d a ch IP cho nó. ng ng v i m i card m ng N u máy c a b n có n i m ng Internet b n có thể kiểm tra em máy ch c a Microsoft đ c cài bao nhiêu b giao ti p m ng bằng cách thayinetaddress.getallbyname(" b i InetAddress.getAllByName(" Ví d 4: L y v tên máy khi bi t đ a ch IP c a nó, để l y v tên c a máy ta s dụng ph ng th c gethostname nh sau: import java.net.*; class ReverseTest public static void main(string[] args) try InetAddress ia = InetAddress.getByName(" "); System.out.println(ia.getHostName()); catch (Eception e) System.err.println(e); K t qu ra nh sau: dieunguyencva Ví d 5: L y v đi ch IP c a máy khi bi t tên c a máy, để l y v đ a ch IP c a máy ta s dụng ph ng th c gethostaddress nh sau: import java.net.*; class GetHostAddress public static void main(string[] args) try InetAddress me = InetAddress.getLocalHost(); String dottedquad = me.gethostaddress(); System.out.println("My address is " + dottedquad); catch (UnknownHostEception e) System.out.println("I'm sorry. I don't know my own address."); Page 90

91 K t qu in ra nh sau: My address is Ta có thể l y v đ a ch IP t ng ng v i m t tên mi n b t kỳ không nh t thi t là máy cục b nh trên, chẳng h n b n có thể l y v đi ch IP c a máy hoặc nh sau: import java.net.*; class GetHostAddress1 public static void main(string[] args) try InetAddress me = InetAddress.getByName(" String dottedquad = me.gethostaddress(); System.out.println("Address is " + dottedquad); catch (UnknownHostEception e) System.out.println("I'm sorry. I don't know my own address."); K t qu in ra nh sau: Address is Ví d 6: Kiểm tra em hai đ a ch tên mi n có cùng m t đ a ch IP hay không. để kiểm tra đi u này ta s dụng ph n th c equals nh sau: import java.net.*; class Equal public static void main(string args[]) try InetAddress add1 = InetAddress.getByName(" InetAddress add2 = InetAddress.getByName(" if (add1.equals(add2)) System.out.println("Hai dia chi nay co cung IP"); else System.out.println("Hai dia chi nay khac IP"); Page 91

92 catch (UnknownHostEception e) System.out.println("Khong the tim thay host."); K t qu cho nh sau: Hai dia chi nay khac nhau Ví d 7: Xây dựng ch ng trình HostLookup t ng tự nh ch ng trình NSLookup c a Windows, ch ng trình nơy có nhi m vụ khi b n gõ vơo đ a ch IP thì nó s tr v đ a ch tên mi n vơ ng c lai: import java.net.*; import java.io.*; public class HostLookup public static void main(string[] args) if (args.length > 0) // Su dung tham so dong lenh for (int i = 0; i < args.length; i++) System.out.println(lookup(args[i])); else BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); System.out.println( "Enter names and IP addresses.enter \"eit\" or \"quit\" to quit."); try while (true) String host = in.readline(); if (host.equalsignorecase("eit") host.equalsignorecase("quit")) break; System.out.println(lookup(host)); catch (IOEception e) System.err.println(e); Page 92

93 private static String lookup(string host) InetAddress node; try node = InetAddress.getByName(host); catch (UnknownHostEception e) return "Cannot find host " + host; if (ishostname(host)) //Dia chi nay duoi dang ten mien return node.gethostaddress(); else // Dia chi nay duoi dang IP return node.gethostname(); //Hàm kiểm tra em địa chỉ host dưới dạng tên miền hay địa chỉ IP private static boolean ishostname(string host) char[] ca = host.tochararray(); for (int i = 0; i < ca.length; i++) if (!Character.isDigit(ca[i])) if (ca[i]!= '.')return true; return false; 2.2. Lớp URL và URI L p URL là m t l p r t đ n gi n giúp b n trong vi c đ nh v và l y v d li u t m ng, mà b n không cần ph i quan tơm đ n giao th c đ c s dụng, đ nh d ng c a d li u hoặc không cần quan tơm đ n cách giao ti p v i máy ch. T o ra m t URL: Không gi ng nh đ i t ng InetAddress b n có thể s dụng hàm t o c a l p URL để t o ra m t đ i t ng URL m i. Có 6 hàm t o khác nhau c a l p URL cho phép b n t o ra các URL v i các yêu cầu khác nhau. T t c các hàm t o nơy đ u ném ra ngo i l MalformedURLEception n u b n t o ra m t URL t m t giao th c không đ c h tr Page 93

94 hoặc các thông tin cung c p trong URL không chính ác thì b n s nh n đự c m t ngo i l MalformedURLEception a) Tạo ra một URL từ một âu public URL(String url) throws MalformedURLEception Gi ng nh các hơm t o khác b n ch cần dùng toán t new vơ cũng gi ng các hàm t o khác c a l p nó ném ra ngo i l MalformedURLEception. Ví d 1: T o ra m t URL t m t âu và bắt ngo i l sinh ra try URL u = new URL(" catch (MalformedURLEception e) System.err.println(e); Ví d 2: Ví dụ này t o ra m t s URL và kiểm tra em giao th c t có đ c h tr trong virtual machine c a b n hay không ng ng v i các URL /* Which protocols does a virtual machine support? */ import java.net.*; class ProtocolTester public static void main(string[] args) // hypertet transfer protocol testprotocol(" // secure http testprotocol(" // file transfer protocol testprotocol("ftp://metalab.unc.edu/pub/languages/java/javafaq/"); // Simple Mail Transfer Protocol testprotocol("mailto:elharo@metalab.unc.edu"); // telnet testprotocol("telnet://dibner.poly.edu/"); // local file access testprotocol("file:///etc/passwd"); // gopher testprotocol("gopher://gopher.anc.org.za/"); // Lightweight Directory Access Protocol testprotocol( "ldap://ldap.itd.umich.edu/o=university%20of%20michigan,c=us?postaladdress"); Page 94

95 // JAR testprotocol( "jar: + "/com/macfaq/io/streamcopier.class"); // NFS, Network File System testprotocol("nfs://utopia.poly.edu/usr/tmp/"); // a custom protocol for JDBC testprotocol("jdbc:mysql://luna.metalab.unc.edu:3306/news"); // rmi, a custom protocol for remote method invocation testprotocol("rmi://metalab.unc.edu/renderengine"); // custom protocols for HotJava testprotocol("doc:/usersguide/release.html"); testprotocol("netdoc:/usersguide/release.html"); testprotocol("systemresource:// testprotocol("verbatim: private static void testprotocol(string url) try URL u = new URL(url); System.out.println(u.getProtocol() + " is supported"); catch (MalformedURLEception e) String protocol = url.substring(0, url.indeof(':')); System.out.println(protocol + " is not supported"); K t qu ch y trên máy c a tôi nh sau: http is supported https is supported ftp is supported mailto is supported telnet is not supported file is supported gopher is supported ldap is not supported Page 95

96 jar is supported nfs is not supported jdbc is not supported rmi is not supported doc is supported netdoc is supported systemresource is supported verbatim is supported b) Tạo ra một URL từ các phần riêng lẻ Hàm t o này cho g m ba phần riêng bi t, chúng cho bi t: Giao th c, tên máy ch, t p tin mà URL này s dụng. public URL(String protocol, String hostname, String file) throws MalformedURLEception Hàm t o này s tự đ ng đặt port là giá tr mặc đ nh, tuỳ theo giao th c mà b n ch đ nh nó s s dụng mà giá tr mặc đ nh này là khác nhau: Ví dụ nh : http thì port=80, ftp=23... Ví d : try URL u = new URL("http", " "/inde.html"); catch (MalformedURLEception e) // All VMs should recognize http Đo n ch ng trình trên t o ra m t URL đ n ch c ng mặc đ nh là 80 Để t o ra m t URL v i m t c ng ch đ nh b n s dụng hàm t o sau: public URL(String protocol, String host, int port, String file) throws MalformedURLEception Ví d : T o ra m t URL gán v i máy localhost trên c ng 8080 try URL u = new URL("http", "localhost", 8080, "/inde.html"); catch (MalformedURLEception e) Page 96

97 System.err.println(e); Ví dụ này t o ra m t URL tr đ n /inde.html c) Tạo ra một URL từ một URL khác Hàm t o này cho phép b n t o ra m t URL t m t URL khác, cú pháp nh sau: public URL(URL base, String relative) throws MalformedURLEception Ví d : try URL u1 = new URL(" URL u2 = new URL (u1, "mailinglists.html"); catch (MalformedURLEception e) System.err.println(e); Trong ví dụ nơy thì u1 đang tr đ n còn u2 thì đang tr đ n mailinglists.html. M t vơi ph ng th c c a l p URL - public String gethost( ) trả về tên của máy chủ - public int getport( ) trả về cổng được sử dụng - public int getdefaultport( ) trả về cổng mặc định của giao thức được sử dụng. Ví dụ như : http=80, =25, ftp= public String getfile( ) trả về tên tệp tin - public String getpath( ) // Java 1.3 trả về đường dẫn đến file, đường dẫn này thường là một query string. - public String getref( ), trong ví dụ sau thì getref sẽ trả về tocid URL u = new URL( " System.out.println("The fragment ID of " + u + " is " + u.getref( )); - public String getquery( ) // Java 1.3 trả về một query string trong URL Ví d : Trong ví dụ này thì getquery s tr v category=piano URL u = new URL( " System.out.println("The query string of " + u + " is " + u.getquery( )); Page 97

98 - public String getuserinfo( ) // Java 1.3 trả về user name - public String getauthority( ) // Java 1.3 Ví dụ sau minh ho các ph ng th c trên: import java.net.*; class URLSplitter public static void main(string args[]) try URL u = new URL(" System.out.println("The URL is " + u); System.out.println("The scheme is " + u.getprotocol()); System.out.println("The user info is " + u.getuserinfo()); String host = u.gethost(); if (host!= null) int atsign = host.indeof('@'); if (atsign!= -1) host = host.substring(atsign + 1); System.out.println("The host is " + host); else System.out.println("The host is null."); System.out.println("The port is " + u.getport()); System.out.println("The path is " + u.getpath()); System.out.println("The ref is " + u.getref()); System.out.println("The query string is " + u.getquery()); // end try catch (MalformedURLEception e) System.err.println("is not a URL I understand."); System.out.println(); // end main // end URLSplitter K t qu ch y ch ng trình nh sau: The URL is The scheme is http The user info is null The host is java.sun.com Page 98

99 The port is -1 The path is The ref is null The query string is null c) Nhận về dữ liệu từ URL ph B n có thể nh n v d li u đ n th c sau: c ch đ nh trong URL bằng cách s dụng cách public InputStream openstream( ) throws IOEception public URLConnection openconnection( ) throws IOEception public URLConnection openconnection(proy proy) throws IOEception // 1.5 public Object getcontent( ) throws IOEception public Object getcontent(class[] classes) throws IOEception // 1.3 public final InputStream openstream( ) throws IOEception Ph ng th c này s k t n i đ n máy ch và yêu cầu l y v m t InputStream gắn v i tơi nguyên đ c ch đ nh trong URL. Ví dụ sau l y v n i dung c a trang web đ c ch đ nh và in ra màn hình import java.net.*; import java.io.*; class SourceViewer public static void main(string[] args) try //Open the URL for reading URL u = new URL(" InputStream in = u.openstream(); // buffer the input to increase performance in = new BufferedInputStream(in); // chain the InputStream to a Reader Reader r = new InputStreamReader(in); int c; while ( (c = r.read())!= -1) System.out.print( (char) c); catch (MalformedURLEception e) System.err.println( is not a parseable URL"); Page 99

100 catch (IOEception e) System.err.println(e); // end main // end SourceViewer K t qu ch y nh sau: <html> <head> <meta http-equiv="content-type"content="tet/html; charset=iso "> <title> Web Posting Information </title> </head> <body> <p><font face=".vntime">xin chào các b n</font></p> </body> </html> - Ph ng th c public URLConnection openconnection( ) throws IOEception Ph ng th c này m m t socket k t n i đ n máy ch. N u ph b i nó ném ra ngo i l IOEception. ng th c này th t Ví d : try URL u = new URL(" try URLConnection uc = u.openconnection( ); InputStream in = uc.getinputstream( ); // read from the connection... // end try catch (IOEception e) System.err.println(e); // end try catch (MalformedURLEception e) System.err.println(e); Page 100

101 Trong java 1.5 còn m t ph ng th c đ c n p ch ng nh sau: public URLConnection openconnection(proy proy) throws IOEception Ph ng th c này r t h u dụng khi trong m ng c a b n có s dụng proy - Ph ng th c public final Object getcontent( ) throws IOEception Ví d : import java.net.*; import java.io.*; class ContentGetter public static void main(string[] args) //Open the URL for reading try URL u = new URL(" try Object o = u.getcontent(); System.out.println("I got a " + o.getclass().getname()); // end try catch (IOEception e) System.err.println(e); // end try catch (MalformedURLEception e) System.err.println("is not a parseable URL"); // end main // end ContentGetter K t qu ch y nh sau: I got a sun.net. N u thay URL u = new URL(" b i URL(" k t qu thu đ c nh sau: URL u = new I got a sun.awt.image.urlimagesource 2.3. Lớp Socket L p nơy đ c dùng cho c máy ch vơ máy khách. Đ i v i máy khách nó th dùng để k t n i đ n máy ch, còn đ i v i máy ch nó th máy khách. ng ng dùng để đáp l i k t n i t Page 101

102 Thông th ng ta t o ra m t Socket bằng cách s dụng hàm t o c a l p Socket. Sau đơy lơ m t s hàm t o c a l p Socket Một số hàm tạo của lớp Socket a) public Socket(String host, int port) throws UnknownHostEception, IOEception Ta th ng s c a máy là m t âu không t n t i máy Socket không thể m dụng hàm t o nơy để k t n i đ n máy ch. Trong hàm t o này tên ký tự, tên c a máy ch có thể là tên mìên hoặc đ a ch IP. N u nh này thì nó s ném ra m t ngo i l UnknownHostEception. N u vì b t c lý do nào thì nó ném ra ngo i l IOEception. Ví d : K t n i đ n web server try Socket tocvauni= new Socket(" 80); //~ Socket tocvauni= new Socket(" ", 80); // send and receive data... catch (UnknownHostEception e) System.err.println(e); catch (IOEception e) System.err.println(e); - public Socket(InetAddress host, int port) throws IOEception Ta th gắn v i nó. ng s dụng hàm t o nơy để k t n i đ n máy ch khi bi t m t InetAddress Ví dụ sau cũng k t n i đ n máy ch trên c ng 80: try InetAddress cvauni = InetAddress.getByName(" //~ InetAddress cvauni = InetAddress.getByName(" "); Socket cvaunisocket = new Socket(cvauni, 80); // send and receive data... catch (UnknownHostEception e) System.err.println(e); catch (IOEception e) System.err.println(e); Page 102

103 - public Socket(String host, int port, InetAddress interface, int localport) throws IOEception, UnknownHostEception N u máy c a b n có nhi u b giao ti p m ng thì khi k t n i đ n máy ch ta cần ch ra k t n i đ c thi t l p thông qua giao di n m ng nào. N u tham s port nh n giá tr 0 thi java runtime s chọn ng u nhiên m t c ng nơo đó ch a đ c s dụng trong kho ng Ví d : try InetAddress inward = InetAddress.getByName("cvauni"); Socket socket = new Socket(" 80, inward, 0); // work with the sockets... catch (UnknownHostEception e) System.err.println(e); catch (IOEception e) System.err.println(e); - public Socket(InetAddress host, int port, InetAddress interface, int localport) throws IOEception Hàm t o nơy cũng t ng tự nh hơm t o trên. Ví d : try InetAddress inward = InetAddress.getByName("cvauni"); InetAddress http= InetAddress.getByName(" Socket socket = new Socket(http, 80, inward, 0); // work with the sockets... catch (UnknownHostEception e) System.err.println(e); catch (IOEception e) System.err.println(e); Lấy về thông tin gắn với Socket - Ph ng th c public InetAddress getinetaddress() dùng để l y v InetAddress t đ i t ng ng ng v i máy remote. Page 103

104 try Socket thesocket = new Socket("java.sun.com", 80); InetAddress host = thesocket.getinetaddress( ); System.out.println("Connected to remote host " + host); // end try catch (UnknownHostEception e) System.err.println(e); catch (IOEception e) System.err.println(e); - Ph ng th c public int getport( ) dùng để l y v c ng c a máy remote. Ví d : try Socket thesocket = new Socket("java.sun.com", 80); int port = thesocket.getport( ); System.out.println("Connected on remote port " + port); // end try catch (UnknownHostEception e) System.err.println(e); catch (IOEception e) System.err.println(e); - Ph ng th c public int getlocalport() dùng để l y v c ng c a máy cục b dùng để giao ti p v i máy a. Ví d : try Socket thesocket = new Socket("java.sun.com", 80); int localport = thesocket.getlocalport( ); System.out.println("Connecting from local port " + localport); // end try catch (UnknownHostEception e) System.err.println(e); catch (IOEception e) System.err.println(e); Page 104

105 - Ph ng th c public InetAddress getlocaladdress() dùng để l y v đ i t ng InetAddress gán v i card m ng dùng để giao ti p. Ví d : try Socket thesocket = new Socket(hostname, 80); InetAddress localaddress = thesocket.getlocaladdress( ); System.out.println("Connecting from local address " + localaddress); // end try catch (UnknownHostEception e) System.err.println(e); catch (IOEception e) System.err.println(e); Ví dụ sau in ra màn hình m t s thông tin gắn v i Socket import java.net.*; import java.io.*; public class SocketInfo public static void main(string[] args) try Socket thesocket = new Socket(" 80); System.out.println("Connected to " + thesocket.getinetaddress() + " on port " + thesocket.getport() + " from port " + thesocket.getlocalport() + " of " + thesocket.getlocaladdress()); // end try catch (UnknownHostEception e) System.err.println("I can't find host"); catch (SocketEception e) System.err.println("Could not connect to host"); catch (IOEception e) System.err.println(e); // end main // end SocketInfo Page 105

106 - Ph ng th c public OutputStream getoutputstream() throws IOEception dùng để l y v m t OutputStream. Vi c g i d li u đ n máy remote đ c thông qua OutputStream này. - Ph ng th c public InputStream getinputstream() throws IOEception ph ng th c nơy dùng để nh n v m t InputStream. Vi c nh n d li u t máy remote đ c thực hi n thông qua InputStream này Đóng Socket Khi k t n i không còn đ c s dụng n a b n cần gọi ph ng th c close() m t cách t ng minh để đóng Socket l i. Khi gọi đ n ph ng th c close java s tự đ ng đóng hai lu n nh p u t gắn v i nó. Vi c đóng Socket l i s gi i phóng m t s tài nguyên c a h th ng. public void close( ) throws IOEception M t Socket s tự đ ng đóng l i n u ẩy ra m t trong các tính hu ng sau: - C hai lu ng nh p u t gắn v i Socket đ u đ - Khi ch c đóng l i. ng trình k t thúc. - Hoặc khi b thu rác c a java đ c ti n hành. Tuy các Socket cũng tự đ ng đóng l i khi cần thi t, nh ng m t thói quen thực hành t t là nên gọi đ n ph ng th c close() khi không còn dùng đ n nó n a. Để đ m b o Socket luôn đ c đóng l i cho dù có ngo i l ẩy ra hay không. thì ch h p lý nh t để đóng Socket l i là trong kh i finally. Ví dụ sau thể hi n đi u đó: ocket connection = null; try connection = new Socket(" 80); // interact with the socket... // end try catch (UnknownHostEception e) System.err.println(e); catch (IOEception e) System.err.println(e); finally // Đóng Socket lại if (connection!= null) connection.close( ); Page 106

107 - Ph ng th c public boolean isclosed() (ch có trong java 1.4 tr lên) ph ng th c này tr v true n u nh Socket đư đ c đóng l i, nh n v false trong tr ng h p ng c l i. Th nên để đẳm b o các thao tác nh p u t không ẩy ra l i b n nên s dụng m u ch ng trình sau: if (socket.isclosed( )) // do something... else // do something else... Tuy nhiên n u Socket ch a bao gi đ c m thì ph ng th c này tr v false. - Ph ng th c public boolean isconnected( ) (Ch có trong java 1.4 tr lên) ph ng th c này tr v true n u b n đư t ng k t n i đ n máy a hay ch a vơ nh n v false trong tr ng h p ng c l i. Th nên để kiểm tra em Socket có đang m hay không b n cần s dụng đo n ch ng trình sau: boolean connected = socket.isconnected( ) &&! socket.isclosed( ); - Ph ng th c public boolean isbound() (ch có trong java 1.4 tr lên) ph tr v true n u nh Socket đ c liên k t v i m t c ng cục b nơo đó. ng th c này Truyền trong chế độ haft duple Kể t phiên b n java 1.3 có thêm hai ph ng th c: public void shutdowninput( ) throws IOEception public void shutdownoutput( ) throws IOEception Hai ph ng th c này cho phép b n đóng lu ng nh p hoặc u t gắn v i Socket l i. khi này b n ch có thể truy n hoặc nh n m t chi u (haft duple). Ví dụ nh khi b n k t n i đ n web server để yêu cầu m t trang b t kỳ sau khi yêu cầu ong thì lu ng u t là không còn cần thi t n a. do v y ta nên đóng l i để gi i phóng tài nguyên. ocket connection = null; try connection = new Socket(" 80); Writer out = new OutputStreamWriter(connection.getOutputStream( )); Page 107

108 out.write("get / HTTP 1.0\r\n\r\n"); out.flush( ); /* Đóng lu ng u t l i. Sau khi đóng lu ng u t b n v n có thể s dụng lu ng nh p m t cách bình th ng */ connection.shutdownoutput( ); // read the response... catch (IOEception e) finally try if (connection!= null) connection.close( ); catch (IOEception e) 2.4. Lớp ServerSocket L p này ch dùng cho phía máy ch. Nó th ng đ c s dụng để lắng nghe m t k t n i đ n Một số hàm tạo của lớp ServerSocket public ServerSocket(int port) throws BindEception, IOEception public ServerSocket(int port, int queuelength) throws BindEception, IOEception public ServerSocket(int port, int queuelength, InetAddress bindaddress) throws IOEception public ServerSocket( ) throws IOEception // Java 1.4 Các hàm t o nơy ác đ nh c ng, đ dài c a hơng đ i để l u tr các yêu cầu k t n i đ n và giao di n m ng đ c s dụng. Bây gi ta ét cụ thể t ng hàm t o: - Hàm t o public ServerSocket(int port) throws BindEception, IOEception Hàm t o này s t o ra m t ServerSocket lắng nghe trên c ng port. N u nh port =0 thì h th ng s chọn m t giá tr c ng còn r i ti p theo. Tuy nhiên trong tr ng h p Page 108

109 này máy khách khó có thể k t n i đ n nó vì không bi t rõ c ng. Tuy nhiên trong m t s tr ng h p nó r t h u dụng. Ví d : T o m t ServerSocket lắng nghe trên c ng 80. try ServerSocket httpd = new ServerSocket(80); catch (IOEception e) System.err.println(e); Chú ý: - N u không thể t o ra m t ServerSocket thì nó s ném ra ngo i l IOEception - N u port đư đ c s dụng cho m t ch ng trình khác r i thì ngo i l BindEception s đ c ném ra. Ví dụ tìm em các c ng trên máy c a b n đư đ c s dụng hay ch a package inetaddress; import java.net.*; import java.io.*; class LocalPortScanner public static void main(string[] args) for (int port = 1; port <= 65535; port++) try // the net line will fail and drop into the catch block if // there is already a server running on the port ServerSocket server = new ServerSocket(port); catch (IOEception e) System.out.println("There is a server on port " + port + "."); // end catch // end for - Hàm t o public ServerSocket(int port, int queuelength) throws IOEception, BindEception Hàm t o này s t o ra m t ServerSocket lắng nghe trên c ng port và t o ra m t hơng đ i cho phép queuelength k t n i nằm trong hàng ch. Page 109

110 Ví d : T o ra m t ServerSocket lắng nghe trên c ng 3456 và cho phép t i đa 100 yêu cầu k t n i đ ng th i. try ServerSocket httpd = new ServerSocket(3456, 100); catch (IOEception e) System.err.println(e); - Hàm t o public ServerSocket(int port, int queuelength, InetAddress bindaddress) throws BindEception, IOEception Hàm t o này có nhi m vụ t ng tự hàm t o tr c đó. Tuy nhiên ServerSocket ch lắng nghe trên b giao ti p m ng đ c ch ra trong tham s th 3. N u máy c a b n có nhi u b giao ti p m ng thì b n cần ph i ch ra ServerSocket này s lắng nghe trên b giao ti p nào. Ví d : Gi s rằng máy c a b n có hai b giao ti p m ng, m t b giao ti p m ng có đ a ch và m t b giao ti p m ng khác có đ a ch Để t o ra m t ServerSocket lắng nghe trên c ng 3456, b giao ti p m ng (ch không ph i là ) và cho phép 100 yêu cầu k t n i. try ServerSocket httpd = new ServerSocket(3456, 100, InetAddress.getByName(" ")); catch (IOEception e) System.err.println(e); - Hàm t o public ServerSocket( ) throws IOEception // Java 1.4 Hàm t o này t o ra m t ServerSocket, tuy nhiên nó ch a thực sự lắng nghe trên c ng nào c. Th nên b n cũng ch a thể gọi ph ng th c accept để ch p nh n các k t n i. Để thực sự liên k t v i m t c ng nơo đó b n cần gọi ph ng th c bind(), đơy lơ ph ng th c ch có trong java 1.4 tr lên. public void bind(socketaddress endpoint) throws IOEception // Java 1.4 public void bind(socketaddress endpoint, int queuelength) // Java 1.4 throws IOEception Hàm t o nơy cũng r t h u dụng khi b n cần đặt m t s ServerSocket tr Thông th thu c tính cho c khi nó thực sự ch p nh n các k t n i. ng b n s dụng m u sau: //Tạo ra một ServerSocket chưa thực sự liên kết với một cổng nào đó. Page 110

111 ServerSocket ss = new ServerSocket( ); // Thiết đặt một số thuộc tính cho Socket... //Tạo ra một đối tượng SocketAddress để liên kết SocketAddress http = new InetSocketAddress(80); //Liên kết ServerSocket với cổng 80 ss.bind(http); Chấp nhận và đóng kết nối a) Ch p nh n k t n i Vi c t o ra m t ServerSocket ch a thực sự ch p nh n các k t n i đ n. Để ch p nh n k t n i đ n ta cần gọi đ n ph ng th c accept() ph ng th c này s t m ng ng tuy n thi hành hi n t i cho đ n khi có m t yêu cầu k t n i đ n. Khi có yêu cầu k t n i đ n thì tuy n đ c ti p tục và hàm này tr v cho ta m t đ i t ng Socket. Vi c giao ti p v i máy khách đ c ti n hành thông qua Socket này. Chú ý: Ph ng th c accept() ch ch p nh n m t k t n i đ n mà thôi. do v y để có thể ch p nh n nhi u k t n i đ n b n cần ph i lặp l i vi c gọi đ n ph ng th c accept() bằng cách đ a chúng vơo m t vòng lặp nh sau: Ví du: Ch ng trình trên máy ch //Server.java import java.net.*; import java.io.*; class Server public static void main(string[] args) throws IOEception ServerSocket server = new ServerSocket(3456); while (true) Socket connection = server.accept(); OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream()); out.write("you've connected to this server. Bye-bye now.\r\n"); out.flush(); connection.close(); Ch ng trình trên máy khách Page 111

112 //Client.java import java.net.*; import java.io.*; class Client public static void main(string[] args) throws IOEception Socket sk = new Socket(); SocketAddress sv = new InetSocketAddress("cvauni1", 3456); sk.connect(sv); InputStream in = sk.getinputstream(); int c; do c = in.read(); if (c == -1)break; System.out.print( (char) c); while (true); ch V i ch ng trình trên b n ch y Server m t lần sau đó b n có thể ch y nhi u ng trình máy khách. b) Đóng k t n i Khi k t n i không còn đ c s dụng đ n n a thì ta cần đóng l i để gi i phóng các tài nguyên. K t n i cũng tự đ ng đ c đóng l i trong m t s tr ng h p nh : Ch ng trình k t thúc, b thu rác đ c ti n hành..., Tuy nhiên m t phong cách l p trình t t là luôn đóng l i m t cách t ng minh khi không còn s dụng đ n nó n a. Ví d : ServerSocket server = new ServerSocket(port); //Làm một số việc server.close( ); Trong java 1.4 b sung thêm hai ph ng th c: - public boolean isclosed() //N u k t n i đang m thì tr v true vơ ng n u k t n i ch a đ c l i, tuy nhiên c m thì nó cũng tr v false - public boolean isbound() // Tr v true n u nó đư t ng đ đó. c liên k t v i m t c ng nào Page 112

113 Th nên để kiểm tra em ServerSocket có đang m hay không ta ph i lơm nh sau: public static boolean isopen(serversocket ss) return ss.isbound( ) &&! ss.isclosed( ); 2.5. Lớp DatagramSocket L p nơy dùng để t o ra m t Socket để liên l c bằng giao th c UDP Lớp DatagramPacket L p này thể hi n cho m t gói d li u đ s dụng v i l p DatagramSocket. c g i đi bằng giao th c UPD. Nó đ c 3. TCP Socket - Liên l c trong ch đ k t n i s có m t đ ng k t n i o đ c thành l p gi a 2 ti n trình, tr c khi m t k t n i đ c thành l p thì m t trong 2 ti n trình ph i đ i ti n trình kia yêu cầu k t n i. Trong mô hình này server ph i lắng nghe và ch p nh n m t yêu cầu k t n i đ n t Client - Để vi t các ch ng trình liên l c v i nhau trong ch đ k t n i ta cần ph i vi t 2 ch ng trình: m t cho server, m t cho client, ch ng trình server có nhi m vụ lắng nghe và ph n h i k t n i m i, còn ch ng trình phía client thì kh i ng yêu cầu k t n i - Liên l c trong ch đ k t n i s s dụng giao th c TCP, để g i và nh n d li u Vi t ch ng trình phía server B c 1) t o ra m t đ i t ng ServerSocket và liên k t nó v i m t c ng, ta có thể làm vi c này thông qua hàm t o hoặc kh i gán trực ti p cho các tr ng Ví d : ServerSocket s=new ServerSocket(port [, sequellength]); Hoặc ServerSocket s=new ServerSocket(); s.bind(inetaddress addr, port); B c 2) ch p nh n k t n i bằng cách gọi ph ng th c accept() c a đ i t ng ServerSocket, sau khi goi ph ng th c, tuy n này s b phong to cho đ n khi có m t k t n i đ n, ph ng th c này tr v m t đ i t giao ti p v i máy khách ng Socket, ta s s dụng đ i t ng nơy để Socket connecttoclient=s.accept(); Page 113

114 B c 3) nh n v các đ i t t ph ng th c accept ng outputstream và inputstream t đ i t b c 2, các đ i t ng Socket nh n v ng này s giúp ta g i/nh n d li u t máy client, đ i t ng outputstream cho phép ta g i d li u đ n client, để nh n đ c các đ i t ng này ta gọi ph ng th c getoutputstream() trên đ i t ng Socket, để nh n tham chi u đ n đ i t ng outputstream v n liên k t v i đ i t ng này, và gọi ph ng th c getinputstream() để nh n m t tham chi u đ n đ i t t ng inputstream v n liên k t v i đ i ng Socket này. Chúng ta có thể s dụng đ i t ng inputstream vơ outputstream để nh n/g i d li u d i d ng thô, hoặc ta có thể n i nó v i m t lu ng nh p/u t khác để nh n v d li u mong mu n. B c 4) X lý d li u g i đ n t client và g i g i tr d li u. Vi t ch ng trình phía máy khách B c 1) t o ra m t Socket để k t n i đ n máy ch, n i k t đ n máy ch đ c thực hi n thông qua hàm t o c a l p Socket, thông th ng ta s dụng hàm t o 2 đ i nh sau: Socket connecttoserver=new Socket(serverName,port); Hàm t o nơy có 2 đ i: đ i th nh t cho bi t tên c a máy ch ( tên này có thể là tên mi n hoặc đ a ch IP hoặc có thể là m t đ i t ng InetAddress k t h p v i máy ch ) còn đ i th 2 cho bi t s hi u c ng mà server đang lắng nghe B c 2) Nh n v các đ i t ng inputstream và outputstream k t h p v i đ i t ng Socket connecttoserver, b c nơy t ng tự nh b c 3 trong phần vi t ch ng trình cho server B c 3) lý d li u nh n v / g i đi thông qua 2 đ i t ng outputstream và inputstream B c 4) đóng k t n i để gi i phóng tơi nguyên, thông th kh i ng vi c đóng k t n i đ c ng t phía máy khách Ví d 1: Nh n v trang inde.html tr máy ch web và in ra màn hình import java.net.*; import java.io.*; class SocketClient public static void main(string[] args) PrintWriter out = null; try Socket http = new Socket(" 80); OutputStream raw = http.getoutputstream(); Page 114

115 OutputStream buffered = new BufferedOutputStream(raw); out = new PrintWriter(buffered); out.write("get /inde.html HTTP/1.0\r\n\r\n"); out.flush(); InputStream in = http.getinputstream(); int c; do c = in.read(); if (c == -1)break; System.out.print( (char) c); while (true); catch (Eception e) e.printstacktrace(); finally try out.close(); catch (Eception e) Ví d 2: Xây dựng ch Xây dựng ch ng trình EchoClient vơ EchoServer. ng trình phía máy chủ import java.net.*; import java.io.*; public class EchoServer public static void main(string args[]) try ServerSocket server = new ServerSocket(3456); int localport = server.getlocalport(); System.out.println("Echo Server is listening on port"+localport+"."); Socket client = server.accept(); String destname =client.getinetaddress().gethostname(); int destport = client.getport(); System.out.println("Accepted connection to "+destname +" on port "+destport+"."); Page 115

116 BufferedReader instream = new BufferedReader( new InputStreamReader(client.getInputStream())); DataOutputStream outstream = new DataOutputStream(client.getOutputStream()); boolean finished = false; do String inline = instream.readline(); System.out.println("Received: "+inline); if(inline.equalsignorecase("quit")) finished=true; String outline=new StringBuffer(inLine.trim()).reverse().toString(); outstream.write(outline.getbytes()); outstream.write(13); outstream.write(10); outstream.flush(); System.out.println("Sent: "+outline); while(!finished); instream.close(); outstream.close(); client.close(); server.close(); catch (IOEception e) System.out.println(e); Xây dựng ch ng trình phía máy khách import java.net.*; import java.io.*; public class EchoClient public static void main(string args[]) ClientConnect client = new ClientConnect(" 3456); client.requestserver(); client.shutdown(); class ClientConnect Socket connection; DataOutputStream out; BufferedReader in; Page 116

117 public ClientConnect(String destination, int port) try connection = new Socket(destination, port); in = new InputStreamReader(connection.getInputStream())); BufferedReader(new out = new DataOutputStream(connection.getOutputStream()); System.out.println("Connected to server at port 3456."); catch (Eception e) System.out.println(e); public void requestserver() BufferedReader keyboardinput = new BufferedReader( new InputStreamReader(System.in)); boolean finished = false; do try System.out.print("Send, receive, or quit (S/R/Q): "); System.out.flush(); String line = keyboardinput.readline(); if (line.length() > 0) line = line.touppercase(); switch (line.charat(0)) case 'S': String sendline = keyboardinput.readline(); out.writebytes(sendline); out.write(13); out.write(10); out.flush(); break; case 'R': int inbyte; System.out.print(">>>>"); while ( (inbyte = in.read())!= '\n') System.out.write(inByte); System.out.println(); break; case 'Q': Page 117

118 finished = true; break; default: break; catch (Eception e) System.out.println(e); while (!finished); public void shutdown() try connection.close(); catch (IOEception e) System.out.println("IO error closing socket"); Ví d 3: ta vi t m t ví dụ đ n gi n nh sau: * Ch ng trình phía client có giao di n sau: Khi ta kích chu t vào nút K t n i ch ng trình c a ta s k t n i v i máy ch, sau khi nh p chi u dài, chi u r ng và kích chu t vào nút Tính, d li u g m có chi u dài và chi u r ng s đ c g i đ n máy ch, máy ch thực hi n vi c tính di n tích và g i k t qu tr l i cho máy khách, d li u nh n v t máy ch đ chu t nút Đóng, ch c hiển th trong ô k t qu, khi ta kích ng trình c a ta s đóng k t n i và k t thúc ch ng trình * Ch ng trình trên máy ch ch có nhi m vụ, lắng nghe k t n i và tính toán di n tích c a hình nh n đ c Mã ngu n phía máy chủ: Page 118

119 package net.cvauni; import java.io.*; import java.net.*; public class Server public Server() double a = 0, b = 0, kq = 0; try ServerSocket s = new ServerSocket(2004); // nam Giap Than Socket connecttoclient = s.accept();// chấp nhận kết nối // lấy về đối tượng nhập/uất DataInputStream in = new DataInputStream(connectToClient.getInputStream()); DataOutputStream out = new DataOutputStream(connectToClient. getoutputstream()); //Vòng lặp vô tận để phục vụ yêu cầu while (true) a = in.readdouble();// lấy chiều dài b = in.readdouble();// lấy chiêu rộng kq = a * b;// tính kết quả out.writedouble(kq);// trả về kết quả cho máy khách out.flush();// dôn hết DL ra catch (IOEception e) public static void main(string[] args) Server server1 = new Server(); Mã ngu n phía máy khách: package net.cvauni; import java.swing.*; Page 119

120 import java.awt.*; import java.io.*; import java.net.*; import java.awt.event.*; public class Frame1 etends JFrame // Khai báo các thành phần Socket connecttoserver; DataInputStream in; // luồng nhập DataOutputStream out; //luồng uất boolean isconnect = false; //biến kiểm tra em đã kết nối chưa // Hàm main public static void main(string[] args) Frame1 frame1 = new Frame1(); frame1.setbounds(100, 100, 350, 130); frame1.show(); // Xử lý sự kiện void jtfconnect_actionperformed(actionevent e) if (isconnect == false) // nếu chưa kết nối thì kết nối try // lắng nghe kết nối đến máy chủ trên cổng 2004 connecttoserver = new Socket("localhost", 2004); isconnect = true; in = new DataInputStream(connectToServer.getInputStream()); out = new DataOutputStream(connectToServer.getOutputStream()); catch (UnknownHostEception e) JOptionPane.showMessageDialog(this, "khong tim thay may chu", "loi", JOptionPane.ERROR_MESSAGE); catch (IOEception e) JOptionPane.showMessageDialog(this, "co loi ve nhap uat", "loi", JOptionPane.ERROR_MESSAGE); Page 120

121 void jtfcompute_actionperformed(actionevent e) if ( (in == null) (out == null)) // nếu chưa kết nối thì báo lỗi JOptionPane.showMessageDialog(this, "Ban phai ket noi truoc khi tinh", "loi", JOptionPane.ERROR_MESSAGE); try out.writedouble(double.parsedouble(jtfdai.gettet())); // gửi chuều dài out.writedouble(double.parsedouble(jtfrong.gettet())); //gửi chiều rộng out.flush(); // đẩy hết dữ liệu ra jtfketqua.settet(string.valueof(in.readdouble())); // nhận về kết quả và // hiển thị trong ô kết quả catch (NumberFormatEception e) // nếu nhập sai thi báo lỗi JOptionPane.showMessageDialog(this, "Ban nhap sai, Ban phai nhap so", "loi", JOptionPane.ERROR_MESSAGE); catch (IOEception e) JOptionPane.showMessageDialog(this, "khong the guu/nhan du lieu\nco the do ban chua ket noi", "loi", JOptionPane.ERROR_MESSAGE); // thủ tục đáp ứng biến cố khi kích chuột vào nút đóng void jtfclose_actionperformed(actionevent e) try connecttoserver.close(); // đóng kết nối catch (IOEception e) Page 121

122 System.eit(0); // thoát khỏi chương trình // tạo ra lớp điều hợp, để đáp ứng sự kiện kích chuột vào nút kết nối class Frame1_jtfConnect_actionAdapter implements java.awt.event.actionlistener Frame1 adaptee; Frame1_jtfConnect_actionAdapter(Frame1 adaptee) this.adaptee = adaptee; public void actionperformed(actionevent e) adaptee.jtfconnect_actionperformed(e); // tạo ra lớp điều hợp, để đáp ứng sự kiện kích chuột vào nút tính class Frame1_jtfCompute_actionAdapter implements java.awt.event.actionlistener Frame1 adaptee; Frame1_jtfCompute_actionAdapter(Frame1 adaptee) this.adaptee = adaptee; public void actionperformed(actionevent e) adaptee.jtfcompute_actionperformed(e); // tạo ra lớp điều hợp, để đáp ứng sự kiện kích chuột vào nút đóng class Frame1_jtfClose_actionAdapter implements java.awt.event.actionlistener Frame1 adaptee; Frame1_jtfClose_actionAdapter(Frame1 adaptee) this.adaptee = adaptee; public void actionperformed(actionevent e) Page 122

123 adaptee.jtfclose_actionperformed(e); V n đ m t ngu n nhi u khách: Trong ví dụ trên ta nh n th y, máy ch ch có thể phục vụ duy nh t m t khách. Trong thực t đ i v i m t s bài toán yêu cầu m t máy ch ph i phục vụ nhi u máy khách t i m t th i điểm, ví dụ nh Web server, Database server, các máy ch này cho phép nhi u máy nhi u máy khách k t n i đ ng th i, ta có thể lơm đ c vi c này bằng kỹ thu t đa lu ng. Th t đ n gi n, b n ch cần t o ra m t lu ng phục vụ cho m i khách, và đ a thêm vơo đo n mã tựa nh sau: ServerSocket s = new ServerSocket(port); while (true) Socket connecttoclient = s.accept(); new HandleClient(connectToClient); Ta s a l i ví dụ trên để có thể phục vụ đ máy khách v n gi nguyên, ta ch thay đ i ch c nhi u máy khách, ch ng trình phía ng trình trên máy ch nh sau: package net.cvauni; import java.io.*; import java.net.*; public class Server public static void main(string[] args) try //lắng nghe kết nối trên cổng 2004 ServerSocket s = new ServerSocket(2004); while (true) Socket connecttoclient = s.accept(); // chấp nhận kết nối new HandleClient(connectToClient);//chạy một luồng phục vụ catch (IOEception e) Page 123

124 class HandleClient etends Thread private Socket s; private double a = 0, b = 0, kq; public HandleClient(Socket s) this.s = s; this.start(); public void run() DataInputStream in = null; DataOutputStream out = null; try in = new DataInputStream(s.getInputStream()); out = new DataOutputStream(s.getOutputStream()); catch (IOEception e) //Vòng lặp vô tận để phục vụ yêu cầu while (true) try a = in.readdouble(); // lấy chiều dài b = in.readdouble(); // lấy chiêu rộng kq = a * b; // tính kết quả out.writedouble(kq); // trả về kết quả cho máy khách out.flush(); // dôn hết DL ra catch (IOEception e1) Page 124

125 sau khi s a l i b n cho kh i đ ng server, sau đó cho ch y 2 ti n trình client, b n s thu đ c màn hình k t qu nh sau: Liên l c trong ch đ phi k t n i Vi c liên l c trong ch đ không k t n i, không yêu cầu ph i có 1 server luôn lắng nghe k t n i, khi liên l c trong ch đ không k t n i java s dụng giao th c UDP trong vi c đi u khiển truy n và nh n d li u. Do v y không có ác nh n v d li u g i, không thể bi t đ c d li u g i đi có đ n đ c đích không, không thể bi t đ c d li u nh n v có b trùng lặp không B n lơ ng i l p trình, b n ph i gi i quy t đi u đó, ch không ph i l p giao th c m ng hay java, Trong thực t họ mặc k cho l i sẩy ra, b i họ không đ năng lực để lơm đi u đó, th nên gi i pháp an toàn cho b n là Socket dòng, b i l Socket dòng s dụng giao th c TCP, nên nh ng đi u lo lắng đó không bao gi sẩy ra. Để liên l c trong ch đ không k t n i ta s dụng l p DatagramSocket và l p DatagramPacket, l p DatagramSocket cho phép ta g i/ nh n v các gói d li u t máy a, l p DatagramPacket cho cung c p cho ta công cụ đóng gói d li u UDP, để đ i t ng DatagramSocket g i đi hoặc nh n v. Ta gi i thích thông qua ch ng trình chat, ch hai ch ng trình nơy lơ ngang hơng không có ch thi t để liên l c đ c trong ch đ không k t n i đ ng trình g m có 2 ch ng trình, ng trình nơo lơ ch c, các l nh cần c in đ m Mã chương trình th nhất: package net.cvauni; import java.swing.*; import java.awt.event.*; import java.awt.*; import java.io.*; import java.net.*; public class Frame2 etends JFrame // khai báo các biến cần thiết private DatagramSocket s; private DatagramPacket sen,rev; private boolean isfirstline=true; //user code try // tạo ra đối tượng DatagramSocket đối tượng này sẽ nhận dữ //liệu từ cổng 2004 s = new DatagramSocket(2004); Page 125

126 catch (SocketEception e) private void nhan() while (true) // vùng đệm để nhận dữ liệu byte[] dat = new byte[100]; // tạo ra đối tượng DatagramPacket để nhận gói dữ liệu rev = new DatagramPacket(dat, dat.length); try s.receive(rev);// nhận về dữ liệu if (isfirstline == true) jtarev.append(new String(rev.getData(), 0, rev.getlength())); isfirstline = false; else jtarev.append("\n" + new String(rev.getData(), 0, rev.getlength())); catch (IOEception e) private void dong() try s.close();// đóng kết nối catch (Eception e) System.eit(0); public static void main(string[] args) Page 126

127 Frame2 frame2 = new Frame2(); frame2.setbounds(100, 100, 400, 280); frame2.show(); frame2.nhan(); // Xử lý cho nút Gửi void jbtsend_actionperformed(actionevent e) byte dat[] = jtasend.gettet().getbytes(); InetAddress local = null; try local = InetAddress.getLocalHost(); catch (UnknownHostEception e) // tạo ra đối tượng DatagramPacket để gửi gói dữ liệu sen = new DatagramPacket(dat, dat.length, local, 4002); try s.send(sen);// gửi dữ liệu đi catch (IOEception e1) JOptionPane.showMessageDialog(this, "khong the guu duoc"); void jbteit_actionperformed(actionevent e) dong(); System.eit(0); void this_windowclosing(windowevent e) dong(); class Frame2_jbtSend_actionAdapter implements java.awt.event.actionlistener Page 127

128 private Frame2 adaptee; Frame2_jbtSend_actionAdapter(Frame2 adaptee) this.adaptee = adaptee; public void actionperformed(actionevent e) adaptee.jbtsend_actionperformed(e); class Frame2_jbtEit_actionAdapter implements java.awt.event.actionlistener private Frame2 adaptee; Frame2_jbtEit_actionAdapter(Frame2 adaptee) this.adaptee = adaptee; public void actionperformed(actionevent e) adaptee.jbteit_actionperformed(e); class Frame2_this_windowAdapter etends java.awt.event.windowadapter private Frame2 adaptee; Frame2_this_windowAdapter(Frame2 adaptee) this.adaptee = adaptee; public void windowclosing(windowevent e) adaptee.this_windowclosing(e); Chương trình th hai: package net.cvauni; import java.swing.*; import java.awt.*; Page 128

129 import java.awt.event.*; import java.io.*; import java.net.*; public class Frame3 etends JFrame // Khai báo private DatagramSocket s; private DatagramPacket sen, rev; private boolean isfirstline = true; //user code try s = new DatagramSocket(4002); catch (SocketEception e) jscrollpane2.getviewport().add(jtasend, null); private void nhan() while (true) byte[] dat = new byte[100]; rev = new DatagramPacket(dat, dat.length); try s.receive(rev); if (isfirstline == true) jtarev.append(new String(rev.getData(), 0, rev.getlength())); isfirstline = false; else jtarev.append("\n" + new String(rev.getData(), 0, rev.getlength())); catch (IOEception e) Page 129

130 private void dong() try s.close(); catch (Eception e) System.eit(0); public static void main(string[] args) Frame3 frame3 = new Frame3(); frame3.setbounds(100, 100, 400, 280); frame3.show(); frame3.nhan(); void jbtsend_actionperformed(actionevent e) byte dat[] = jtasend.gettet().getbytes(); InetAddress local = null; try local = InetAddress.getLocalHost(); catch (UnknownHostEception e) sen = new DatagramPacket(dat, dat.length, local, 2004); try s.send(sen); catch (IOEception e1) JOptionPane.showMessageDialog(this, "khong the guu duoc"); Page 130

131 void jbteit_actionperformed(actionevent e) dong(); void this_windowclosing(windowevent e) dong(); class Frame3_jbtSend_actionAdapter implements java.awt.event.actionlistener private Frame3 adaptee; Frame3_jbtSend_actionAdapter(Frame3 adaptee) this.adaptee = adaptee; public void actionperformed(actionevent e) adaptee.jbtsend_actionperformed(e); class Frame3_jbtEit_actionAdapter implements java.awt.event.actionlistener private Frame3 adaptee; Frame3_jbtEit_actionAdapter(Frame3 adaptee) this.adaptee = adaptee; public void actionperformed(actionevent e) adaptee.jbteit_actionperformed(e); class Frame3_this_windowAdapter etends java.awt.event.windowadapter private Frame3 adaptee; Frame3_this_windowAdapter(Frame3 adaptee) Page 131

132 this.adaptee = adaptee; public void windowclosing(windowevent e) adaptee.this_windowclosing(e); Tóm l i để liên l c trong ch đ không k t n i ta cần vi t trên m i máy các l nh cần thi t sau: - T o ra đ i t sau: ng DatagramSocket để nh n và g i d li u, bằng hàm t o c a nó nh s = new DatagramSocket(port); Hàm t o này s t o ra đ i t ng DatagramSocket ho t đ ng trên c ng đ c ch ra. - T o các đ i t ng DatagramPacket dùng để làm gói d li u trong vi c g i/nh n d li u, bằng cách s dụng ham t o c a l p DatagramPacket o DatagramPacket(byte[]buf, intlength) th ng dùng hàm t o này khi nh n d li u o length.datagrampacket(byte[]buf, intlength, InetAddressaddress, intport) hàm t o nơy th ng dùng khi đọc d li u t máy tính và c ng đ c ch ra o DatagramPacket(byte[]buf, intoffset, intlength) hàm t o nơy th ng dùng trong vi c nh n d li u có đ dài length, bắt đầu t điểm offset o DatagramPacket(byte[]buf, intoffset, intlength, InetAddressaddress, intport) nh n v d li u trên máy, c ng đ c ch ra, và c t vơo trong vùng đ m buf g i d li u bằng ph ng th c send, c a l p DatagramSocket datagramsocket.send(datagramsocket) nh n d li u bằng ph ng th c receive, c a l p DatagramSocket datagramsocket.receive(datagramsocket) Page 132

133 CH NG 4 CÔNG NGH JSP/SERVLET VÀ L P TRÌNH K T N I C S D LI U TRONG JAVA 1. Công ngh Jsp/Servlet Servlet là kỹ thu t l p trình phía máy ch web c a java, nó đự c s dụng khá ph bi n, do có các u điểm v t tr i, ch ng nơy s giúp b n hiểu đ c các khái ni m c b n v l p trình web, s dụng java để vi t các ng dụng web cho phía máy ch Giới thiệu Internet đư phát triển, bơnh tr ng nhanh chóng, đặc bi t là web, các web server cần ph i đ c thi t k để có thể đáp ng đ c nhi u kiểu yêu cầu h n, web server ph i có kh năng t ng tác v i trình khách, lý d li u do trình khách g i đ n, tr k t qu đ ng tuỳ theo d li u c a trình khách g i đ n, Các trang web v i n i dung tĩnh gi đơy không còn đáp ng đ c n a, nhu cầu ph i đ a các ng dụng vào ch y trong môi tr ng web đ a ra vơ cho đ n gi có r t nhi u công ngh để cho phép ta đ a ng dụng vào ch y trong môi tr ng web nh : CGI, ASP, ISAPI, JSP, Servlet trong s đó có JSP/Servlet là công ngh c a Java So sánh JSP/Servlet và CGI, ASP, ISAPI Nh c điểm c a CGI là t c đ, b nh. M i lần trình CGI đ c gọi để thực thi m t yêu cầu là m i lần web server n p và gi i phóng trình CGI kh i b nh, h n th n a n u có nhi u yêu cầu đ ng th i t trình khách thì web s ph i n p nhi u thể hi n c a trình CGI vào trong b nh, d n đ n máy ch có thể b quá t i do có quá nhi u yêu cầu đ ng th i, công ngh web đư đ a ra nhi u gi i pháp khác nhau nhằm gi i quy t các h n ch c a công ngh CGI. Các ch ng trình CGI có thể đ c vi t bằng b t c ch ng trình biên d ch nào nh pascal, C/C++, VB, Page 133

134 Microsoft đ a ra m t gi i pháp khác phục nh ngh này c a Windows đ c điểm c a các trình CGI, công c gọi là công ngh ISAPI, các ch ng trình ISAPI cũng t ng tự các trình CGI, các trình ISAPI d ng th vi n liên k t đ ng DLL, các trình ISAPI ch ph i n p m t lần vào b nh khi lần đầu tiên web server tri u gọi ng dụng. Do không ph i n p nhi u lần nên v n đ t c đ c a CGI đ c gi i quy t tri t để. H n n a ISAPI phục vụ web server hi u qu và t n ít tơi nguyên h n các trình CGI. Tuy ISAPI đư khác phục đ c nh c điểm c a CGI tuy nhiên để có thể vi t các trình ISAPI yêu cầu ng i l p trình ph i có ki n th c t ng đ i t t v l p trình, khi n ng i ta cần đ a ra các gi i pháp khác, Microsoft đư đ a ra công ngh m i đó lơ ASP, v i công ngh m i nơy ng i l p trình có thể t o ra ng dụng web nhanh chóng mà không cần đòi h i ng i l p trình có trình đ cao siêu v chuyên môn, Sun System cũng không đ ng ngoài cu c để ASP phát triển nhanh chóng, Sun đ a ra công ngh SJP, công ngh nơy t ng tự nh ASP, tuy nhiên các công ngh nh SJP, ASP l i không ph i là l p trình h ng đ i t ng, do v y nh ng ng i l p trình h ng đ i t ng c m th y không phù h p, java còn có m t công ngh khác đó lơ Servlet, công ngh nơy t ISAPI, tuy nhiên nó đ c vi t bằng mã java. JSP/servlets là công ngh c a Java đ ng tự nh c t o ra nhằm mục đích gi i quy t nhi u v n đ trong CGI và nh ng trình ch server API khác Servlet là gì Quay v nh ng năm 90 ban đầu, khi mà web ch m i bắt đầu chi m lĩnh. Common Gateway Interface (CGI) đư đ nh nghĩa cho phép các Web server lý nh ng gì mà ng i dùng nh p vào và làm vi c v i n i dung đ ng. Các ch ng trình CGI có thể đ c phát triển trên b t kỳ m t ngôn ng l p trình hay ngôn ng script nào, tuy nhiên Perl là ngôn ng đ c s dụng ph bi n nh t. Th t sự t t c các Web server đ u h tr CGI và nhi u module Perl có sẵn nh nh ng phần m m mi n phí hay phần m m chia sẻ để lý hầu h t nh ng nhi m vụ. Tuy nhiên CGI không ph i không có tr ng i. Vi c thực thi và tính hi u qu là nh ng v n đ l n khi m t lý m i đ c t o ra cho m i yêu cầu, làm cho tài nguyên server nhanh chóng b b n. Vi c chia sẻ tơi nguyên cũng nh các k t n i d li u gi a các script hay vi c gọi cùng m t script nhi u lần, d n đ n lặp l i nhi u lần nh ng công vi c thực thi. B o m t là sự lo lắng l n v i CGI. Hầu h t các script Perl dùng shell để thực thi các l nh h đi u hành v i d li u cung c p b i ng i dùng, nh ng thực thể để g i mail, tìm ki m m t file, hay ch là nh ng l nh h đi u hành t ng quát. Vi c s dụng shell theo cách này s m ra nhi u c h i cho m t hacker s a l i m t script nhằm óa đi t t c các file trên m t server, g i file m t khẩu c a server đ n m t account bí m t hoặc làm nh ng hơnh đ ng không đ c phép khác mà m t máy ch không mong đ i. Page 134

135 Nh ng nhà cung c p Web server đư đ nh nghĩa nh ng API để gi i quy t m t vài v n đ này, cụ thể là ISAPI c a Microsoft và NSAPI c a Netscape. Nh ng m t ng dụng đ c vi t trên nh ng trình ch API này l i k t h p v i m t nhà cung c p Web server cụ thể. N u b n cần di chuyển m t ng dụng sang m t Web server khác c a m t nhà cung c p phần m m khác, b n ph i bắt đầu l i t đầu. V n đ khác v i h ng đi nơy lơ đáng tin c y. Các API thông th ng h tr mã thực thi C/C++ trong lý c a các Web server. N u m t ng dụng b l i, ví dụ nh con tr b l i hoặc chia cho 0, thì toàn b Web server s b sụp đ cùng v i nó Giải pháp với Servlet Servlet API đ c phát triển dựa trên nh ng điểm m nh c a Java platform nhằm gi i quy t v n đ c a CGI và trình ch server API. Nó là m t API đ n gi n h tr t t c các Web server và th m chí các ng dụng máy ch dùng để kiểm tra và qu n lý các công vi c trên server (load -balancing). Nó gi i quy t v n đ thực thi bằng vi c thực hi n t t c các yêu cầu nh nh ng thread trong m t lý, hoặc trên m t h th ng load-balancing s là m i lý trên m t server trong k t chùm cluster. Các servlet d dàng chia s tài nguyên. Trong đ nh nghĩa servlet, b o m t đ c c i ti n theo nhi u cách. Tr c h t, b n hi m khi thực thi l nh trên shell v i d li u cung c p b i ng i dùng khi Java API đư cung c p truy c p đ n t t c nh ng hàm s dụng thông dụng. B n có thể s dụng JavaMail để đọc và g i mail, Java DataBase Connect (JDBC) để truy c p các database, l p File và nh ng l p quan h để truy c p h th ng file, RMI, CORBA, Enterprise Java Beans (EJB) để truy c p các h th ng k th a Mô hình b o m t Java t o cho nó kh năng b sung các đi u khiển truy c p t t h n, cho thực thể ch cho phép truy c p đ n m t phần đ c ác đ nh t t h n trong h th ng file. Vi c lý các ngo i l c a Java cũng lơm cho m t servlet chắc chắn h n các trình ch API C/C++ - m t phép chia cho 0 đ c thông báo nh m t l i thay vì làm sụp đ c m t h th ng Web server Môi trường runtime của servlet M t servlet là m t l p Java và vì th cần đ c thực thi trên m t máy o Java (JVM) bằng m t d ch vụ gọi là servlet engine. Servlet engine t i l p servlet lần đầu tiên servlet đ c yêu cầu, hoặc ngay khi servlet engine đ c bắt đầu. Servlet ng ng t i để lý nhi u yêu cầu khi servlet engine b tắt hoặc nó b d ng l i. M t vơi Web server nh Java Web Server c a Sun, JigSaw c a W3C, hoặc LiteWebServer c a Gefion có m t servlet engine đ c ây dựng trên Java. Nh ng Web server khác nh Enterprise Server c a Netscape, IIS c a Microsoft hoặc Apache c a Page 135

136 Apache yêu cầu m t module servlet engine add-on. Trình add-on này chuyển t t c các yêu cầu cho các servlet, thực thi chúng và tr v tr l i cho trình duy t thông qua Web server. Ví dụ các servlet engine add-on nh WAICoolRunner c a Gefion, WebSphere c a IBM, Jrun c a Live. T t c các l p servlet API và m t Web server cho phép servlet đ n gi n đ c tích h p v i J2SDK có sẳn để download t i site servlet c a Sun. Để bắt đầu v i servlet, tôi yêu cầu b n download J2SDK và ch y nh ng ví dụ servlet đ n gi n Giao tiếp và vòng đời của servlet Hãy b sung servlet đầu tiên c a chúng ta. M t servlet là m t l p Java b sung giao ti p servlet. Giao ti p này b sung ba ph ng th c đ nh nghĩa vòng đ i c a servlet: public void init(servletconfig config) throws ServletEception: ph ng th c nơy đ c gọi m t lần khi servlet đ c t i vơo trong servlet engine, tr c khi servlet đ c yêu cầu lý yêu cầu đầu tiên c a nó. public void service(servletrequest request, ServletResponse response) throws ServletEception, IOEception: ph ng th c nơy đ c gọi để lý m t yêu cầu. Nó có thể không gọi, gọi m t lần hay nhi u lần cho đ n khi servlet đ c ng ng t i. Nhi u thread (m i yêu cầu) có thể thực thi ph toàn. public void detroy(): ph đ ng th c này song song, vì th nó tr nên an ng th c này ch đ c gọi m t lần tr c khi servlet c ng ng t i và g b d ch vụ. Ph ng th c init có m t thu c tính ServletConfig, servlet có thể đọc các đ i s kh i t o c a nó thông qua đ i t ng ServletConfig. Chúng th ng đ c đ nh nghĩa trong m t file c u hình. M t ví dụ thông th ng c a m t đ i s kh i t o lơ đ nh danh database... private String databaseurl; public void init(servletconfig config) throws ServletEception super.init(config); databaseurl = config.getinitparameter("database"); Servlet API có c u trúc để servlet có thể cho phép b sung m t giao th c khác HTTP. Gói java.servlet ch a các l p và các giao ti p đ c k th a để giao ti p m t cách đ c l p. Gói java.servlet.http ch a các l p và giao ti p HTTP cụ thể. Đơy ch là m t sự gi i thi u v servlet, tôi s b qua sự phân bi t này đơy và ch t p trung vào HTTP servlet. Servlet đầu tiên c a chúng ta tên là ReqInfoServlet k th a m t l p tên HTTPServlet. HTTPServlet là m t phần c a JSDK vơ đ c b sung giao ti p Servlet Page 136

137 c ng v i m t s các ph ng th c h u dụng khác. Chúng ta đ nh nghĩa l p c a chúng ta nh sau: import java.servlet.*; import java.servlet.http.*; public class ReqInfoServlet etends HttpServlet... M t t p các ph ng th c trong HTTPServlet là nh ng ph ng th c ác đ nh d ch vụ trong giao ti p servlet. Vi c b sung d ch vụ trong HTTPServlet gi ng nh m t kiểu c a các yêu cầu đ c lý (GET, POST, HEAD ) vơ gọi m t ph ng th c cụ thể cho m i kiểu. Bằng vi c làm này, các nhà phát triển servlet an tâm khi lý chi ti t nh ng yêu cầu nh HEAD, TRACE, OPTIONS vơ có thể t p trung vào nh ng yêu cầu thông dụng h n nh GET vơ POST. Trong ví dụ đầu tiên, chúng ta s b sung ph doget ng th c protected void doget(httpservletrequest request,httpservletresponse response) throws ServletEception, IOEception Các đối tượng request và response Ph ng th c doget có hai tham s HTTPServletRequest và HTTPServletResponse. Hai đ i t ng này cho phép chúng ta truy c p đầy đ t t c các thông tin v yêu cầu và cho phép chúng ta g i lu ng u t cho client nh lơ tr l i cho yêu cầu. V i CGI b n đọc các bi n môi tr nhiên vi c đặt tên các bi n môi tr không đ ng có thể khác nhau gi a các CGI, và m t vài bi n c cung c p b i t t c các Web server. Đ i t tr ng vơ stdin để nh n thông tin v yêu cầu, tuy ng HTTPServletRequest cũng cung c p thông tin gi ng nh ng c a CGI theo m t h ng chuẩn. Nó cũng cung c p nh ng ph bi n môi ng th c để m ra các tham s HTTP t chu i truy v n hoặc thân c a yêu cầu phụ thu c vào kiểu yêu cầu (GET hay POST). Là m t nhà phát triển servlet, b n truy c p các tham s theo cùng m t cách cho c hai kiểu yêu cầu. Nh ng ph ng th c khác cho b n truy c p đ n t t c nh ng header c a yêu cầu và giúp b n phân tích các header ngày và cookie. t Thay vì vi t tr l i nh stdout gi ng nh b n làm v i CGI, b n nh n m t đ i ng OutputStream hoặc PrintWriter t HTTPServletResponse. OutputStream đ c dành cho d li u nh phơn nh các nh GIF hoặc JPEG, và PrintWriter dành cho vi c Page 137

138 u t văn b n tet. B n cũng có thể n đ nh t t c các header tr l i và mã tr ng thái mà không ph i phụ thu c vào các c u hình cụ thể c a Web server CGI nơo. Đi u này làm cho servlet c a b n d dơng cơi đặt. Hãy b sung vào thân c a ph ng th c doget và em chúng ta s dụng nh ng ph ng th c nơy nh th nào. Chúng ta có thể đọc hầu h t các thông tin chúng ta có đ c t HTTPServletRequest (l u nh ng ph ng th c này vào ví dụ k ti p) và g i nh ng giá tr nơy để tr l i cho yêu cầu protected void doget(httpservletrequest request, HttpServletResponse response) throws ServletEception, OEception response.setcontenttype("tet/html"); PrintWriter out = response.getwriter(); // in ra HTML header out.println("<html><head><title>"); out.println("request info"); out.println("</title></head>"); // in ra than HTML out.println("<body><h1>request info</h1><pre>"); out.println("getcharacterencoding: " + request.getcharacterencoding()); out.println("getcontentlength: " + request.getcontentlength()); out.println("getcontenttype: " + request.getcontenttype()); out.println("getprotocol: " + request.getprotocol()); out.println("getremoteaddr: " + request.getremoteaddr()); out.println("getremotehost: " + request.getremotehost()); out.println("getscheme: " + request.getscheme()); out.println("getservername: " + request.getservername()); out.println("getserverport: " + request.getserverport()); out.println("getauthtype: " + request.getauthtype()); out.println("getmethod: " + request.getmethod()); out.println("getpathinfo: " + request.getpathinfo()); out.println("getpathtranslated: " + request.getpathtranslated()); out.println("getquerystring: " + request.getquerystring()); out.println("getremoteuser: " + request.getremoteuser()); out.println("getrequesturi: " + request.getrequesturi()); out.println("getservletpath: " + request.getservletpath()); out.println(); out.println("parameters:"); Enumeration paramnames = request.getparameternames(); While (paramnames.hasmoreelements()) String name = (String) paramnames.netelement(); Page 138

139 String[] values = request.getparametervalues(name); out.println(" " + name + ":"); for (int i = 0; i < values.length; i++) out.println(" " + values[i]); out.println(); out.println("request headers:"); Enumeration headernames = request.getheadernames(); while (headernames.hasmoreelements()) String name = (String) headernames.netelement(); String value = request.getheader(name); out.println(" " + name + " : " + value); out.println(); out.println("cookies:"); Cookie[] cookies = request.getcookies(); for (int i = 0; i < cookies.length; i++) String name = cookies[i].getname(); String value = cookies[i].getvalue(); out.println(" " + name + " : " + value); // in ra footer HTML out.println("</pre></body></html>"); out.close(); Ph ng th c doget trên s dụng hầu h t các ph ng th c trong HTTPServletRequest nhằm cung c p thông tin v yêu cầu. B n có thể đọc chúng trong tài li u servlet API, vì th đơy chúng ta ch tìm ki m nh ng gì đáng chú ý nh t. Ph ng th c getparameternames và getparametervalues giúp b n truy c p nh ng tham s HTTP n u servlet đ c yêu cầu v i ph ng th c GET hay post. - getparametervalues tr v m t dãy String b i vì m t tham s có thể có nhi u giá tr. Ví dụ n u b n yêu cầu servlet v i m t chu i URL thì b n s th y tham s foo có hai giá tr bar và baz. Đi u nơy đúng n u nh b n s dụng chung m t tên đ nh danh cho nhi u thành phần c a form HTML và s dụng ph ng th c POST trong thẻ ACTION. N u nh b n chắc chắn rằng m t tham s HTTP ch có thể có m t giá tr thì b n có thể s dụng Page 139

140 ph ng th c getparameter thay vì getparametervalues. Nó tr v m t chu i String và n u có nhi u giá tr nó s tr v giá tr đầu tiên nh n đ c t yêu cầu. B n truy c p đ n t t c header c a yêu cầu HTTP v i các ph ng th c getheadernames và getheader. getheader tr v m t chu i String c a header. N u nh b n bi t header có ch a giá tr ngày hay m t giá tr integer b n có thể nh n đ c sự giúp đ chuyển đ i header sang m t đ nh d ng t ng thích. getdateheader tr v m t ngày là s mili giây bắt đầu t 00:00:00 GMT. ngơy 1/1/1970. Đơy là sự thay th s chuẩn cho th i gian trong Java (t ng tự nh Uni). B n có thể s dụng nó để kh i dựng m t đ i t ng ngày. getintheader tr v header giá tr kiểu int. - getcookie s phân tích Cookie và tr v t t c cookie trong m t dưy các đ i t Cookie. Để thêm m t cookie vào tr l i, HTTPServletResponse cung c p ph addcookie đặt m t đ i t ng Cookie nh lơ m t đ i s. ng ng th c N u nh b n biên d ch ReqInfoServlet vơ cơi đặt nó trên servlet engine c a b n và gọi nó thông qua trình duy t v i m t URL gi ng nh vơ mọi th đ u đúng theo sau thì rong trình duy t s hiển th Request info getcharacterencoding: getcontentlength: -1 getcontenttype: null getprotocol: HTTP/1.0 getremoteaddr: getremotehost: localhost getscheme: http getservername: thangnc getserverport: 8080 getauthtype: null getmethod: GET getpathinfo: /foo/bar getpathtranslated: D:\PROGRA~1\jsdk2.1\httproot\servlet\ReqInfoServlet\foo\bar getquerystring: fee=baz getremoteuser: null getrequesturi: /servlet/reqinfoservlet/foo/bar getservletpath: /servlet/reqinfoservlet Parameters: fee: baz Page 140

141 Request headers: Connection : Keep-Alive User-Agent : Mozilla/4.5 [en] (WinNT; I) Host : thangnc Accept : image/gif, image/-bitmap, image/jpeg, image/pjpeg, image/png, */* Accept-Encoding : gzip Accept-Language : en Accept-Charset : iso ,*,utf-8 Cookie : TOMCATID=TO MC1010AT Cookies: TOMCATID : TO MC1010AT N u b n mu n servlet này lý c yêu cầu GET và POST? Vi c b sung mặc đ nh doget và dopost tr v m t thông đi p thông báo rằng ph ng th c nơy ch a đ c b sung. Vì th chúng ta ch ph i cung c p m t b sung m i c a doget. Để có thể lý m t yêu cầu POST theo cùng m t cách, chúng ta ch cần gọi doget t dopost protected void dopost(httpservletrequest request, HttpServletResponse response) throws ServletEception, IOEception doget(request, response); M t trong nh ng đặc điểm thú v c a Servlet API là h tr persistent data. Khi m t servlet đư đ c t i theo các request vơ các servlet đư đ c t i vào trong cùng m t lý, đi u đó d dàng nh thông tin t m t request nơy đ n m t request khác vơ đ n nh ng servlet chia sẻ d li u khác nhau Dữ liệu chia sẻ và cố định (Persistent and shared data) M t trong nh ng đặc điểm thú v c a Servlet API là h tr persistent data. Khi m t servlet đư đ c t i theo các request vơ các servlet đư đ c t i vào trong cùng m t lý, đi u đó d dàng nh thông tin t m t request nơy đ n m t request khác vơ đ n nh ng servlet chia sẻ d li u khác nhau. Servlet API ch a m t s các kỹ thu t để h tr đi u này m t cách trực ti p. Chúng ta s em ét v chúng m t cách chi ti t d i đơy. M t cách h u hi u khác lý d li u đ c chia sẻ bằng cách s dụng m t đ i t ng singleton. M t l p HttpSession đư đ c gi i thi u trong phiên b n 2.0 c a Servlet API. Các thực thể c a l p này có thể nắm gi thông tin v m t session c a ng i dùng gi a nh ng yêu cầu khác nhau. B n bắt đầu m t session m i bằng vi c yêu cầu m t đ i t ng HttpSession t l p HttpServletRequest trong ph ng th c doget hay dopost c a b n: HttpSession session = request.getsession(true); Page 141

142 Ph ng th c nơy đặt vào m t đ i s kiểu boolean. N u đ i s đ thì s có m t session m i đ c đặt vào là true c t o ra n u nó ch a t n t i. N u đ i s đ c đặt vào là false thì ch có m t session t n t i đ c tr v. Servlet API h tr hai cách để t p h p nhi u request vào m t session: cookie vơ ghi đè vơo URL (URL rewriting). N u cookie đ c s dụng, m t cookie v i đ nh danh session ID duy nh t đ c g i đ n client khi m t session đ c t o ra. Khi đó, client bao g m cookie v i t t c request liên tục để servlet engine có thể tính toán session nơo thì request đ c đi kèm. URL rewriting đ c thi t k cho các client không h tr cookie hoặc khi ng i dùng không cho phép cookie. V i URL rewriting, cookie s đ c mư hóa trong các URL để servlet c a b n g i đ n cho client. Khi ng i dùng click vào m t URL đư đ c mã hóa, session ID s đ c g i đ n server, n i nó đ c gi i mã và ph i t p h p request c a client v i session đúng. Để s dụng URL rewriting, b n ph i chắc chắn rằng t t c các session đ c g i đ n client ph i đ c mã hóa v i ph ng th c encodeurl hoặc encoderedirecturl trong HttpServletResponse. M t HttpSession có thể l u tr b t kỳ m t kiểu đ i t ng nào. M t ví dụ thông dụng là m t k t n i database cho phép nhi u request đ c đặt trong cùng m t chuyển đ i database, hoặc là thông tin v s n phẩm đư đ c mua trong m t ng dụng Shopping cart cho phép ng i dùng có thể thêm vào m t mặt hàng trong gi hàng c a họ trong khi v n duy t qua site. Để l u m t đ i t ng trong m t HttpSession, b n dùng ph ng th c putvalue Connection con = driver.getconnection(databaseurl, user, password); session.putvalue( myapp.connection, con); Trong m t servlet khác hoặc trong cùng m t servlet nh ng lý m t request khác, b n có thể l y đ i t ng v i ph ng th c getvalue HttpSession session = request.getsession(true); Connection con = (Connection) session.getvalue( myapp.connection ); if(con!= null) // Thực thi những chuyển đổi dữ liệu B n có thể ng ng t ng đ i (làm m t hi u lực) m t session bằng m t ph ng th c vô hi u hóa hoặc để nó k t thúc (time-out) m t cách tự đ ng bằng servlet engine. Session Page 142

143 k t thúc n u không có m t request nơo đi kèm v i session trong m t kho ng th i gian ác đ nh. Hầu h t các servlet engine đ u cho phép b n ác đ nh đ dài c a kho ng th i gian đó thông qua m t lựa chọn c u hình. Trong phiên b n 2.1 c a Servlet API cũng kèm theo m t ph ng th c setmainactiveinterval vì th cho phép b n ch nh s a th i gian để t ng thích v i các yêu cầu c a m i ng dụng cụ thể. T t c các servlet thu c v m t ng c nh (contet) servlet. Trong phiên b n 1.0 và 2.0 c a Servlet API, t t c các servlet trên m t host thu c v m t contet, nh ng v i phiên b n 2.1 c a API, contet tr nên h u dụng h n vơ có thể đ c em nh u t phát điểm c a m t khái ni m ng dụng. Các phiên b n t ng lai c a API s lơm cho đi u này th m chí tr nên rõ rơng h n Các thuộc tính ServletContet T t c các servlet thu c v m t ng c nh (contet) servlet. Trong phiên b n 1.0 và 2.0 c a Servlet API, t t c các servlet trên m t host thu c v m t contet, nh ng v i phiên b n 2.1 c a API, contet tr nên h u dụng h n vơ có thể đ c em nh u t phát điểm c a m t khái ni m ng dụng. Các phiên b n t th m chí tr nên rõ rơng h n. ng lai c a API s lơm cho đi u này Nhi u servlet engine b sung Servlet API 2.1 giúp cho b n nhóm m t t p các servlet vào trong m t contet và h tr nhi u contet trong cùng m t host. ServletContet trong API 2.1 có thể phụ thu c vào tr ng thái c a các servlet c a nó và sự phân bi t các tài nguyên (resource) và thu c tính (attribute) có sẵn cho các servlet trong contet. đơy, chúng ta s ch em ét các attribute c a ServletContet có thể đ c dùng để chia sẻ thông tin gi a m t nhóm các servlet nh th nào. Có ba ph ng th c ServletContet t ng ng v i các attribute: getattribute, setattribute vơ removeattribute. Thêm vơo đó, servlet engine có thể cung c p nhi u cách để c u hình servlet contet v i các giá tr attribute kh i t o. Vi c qu n lý này gi ng nh m t sự ch p nh n thêm vơo các đ i s kh i t o servlet cho vi c c u hình thông tin s dụng b i m t nhóm các servlet, cho thực thể c a đ nh danh database mơ chúng ta đư đ c p phần tr server c, m t b ng kiểu (style sheet) URL cho m t ng dụng, tên c a m t mail M t server nh n m t tham chi u đ n đ i t ng ServletContet c a nó thông qua đ i t ng ServletConfig. HttpServlet th t sự cung c p m t ph ng th c thu n l i (thông qua siêu l p c a nó GenericServlet) mang tên getservletcontet làm cho nó th t sự d dàng ServletContet contet = getservletcontet(); Page 143

144 String stylesheet = contet.getparameter( stylesheet ); If(styleSheet!= null) //Xác định một style sheet mới cho ứng dụng Contet.setAttribute( stylesheet, stylesheet); Đo n mã trên có thể là m t phần c a m t ng dụng c u hình servlet, lý request t m t HTML FORM có m t style sheet ác đ nh cho ng dụng. T t c các servlet trong ng dụng t o ra HTML có thể s dụng attribute style sheet nh sau: ServletContet contet = getservletcontet(); String stylesheet = contet.getattribute( stylesheet ); out.println( <HTML><HEAD> ); out.println( <LINK HREF= + stylesheet + TYPE=tet/css REL=STYLESHEET> ); Các thuộc tính và tài nguyên yêu cầu (Request attributes and resources) Phiên b n 2.1 c a API thêm vào hai kỹ thu t để chia s d li u gi a các servlet: request attibute và resource. Các ph ng th c getattribute, getattributenames vơ setattribute đ c thêm vào cho l p HttpServletRequest (hoặc chính ác h n là cho siêu l p ServletRequest). Chúng đ c ác đ nh để s dụng v i RequestDispatcher, m t đ i t ng đ c s dụng để chuyển ti p (forward) m t request t m t servlet nơy đ n m t servlet khác vơ để ch a m t lu ng u t t m t servlet trong lu ng u t t servlet chính. Các ph ng th c getresourcev và getresourceasstream c a l p ServletContet cho phép b n truy c p đ n nh ng tài nguyên bên ngoài, chẳng h n nh m t file c u hình ng dụng. B n có thể đư thơn thu c v i nh ng ph ng th c chia sẻ cùng m t tên gi ng nh nh ng ph ng th c trong l p ClassLoader. Tuy nhiên, nh ng ph ng th c c a l p ServletContet có thể cung c p cách truy c p đ n nh ng tài nguyên không th t sự là file. M t tài nguyên có thể đ c l u tr trong m t database, có sẵn thông qua m t LDAP server, trong tr ng h p này tài nguyên là mọi th mà servlet engine quy t đ nh h tr. Servlet engine cung c p m t lựa chọn c u hình contet để b n ác đ nh đ c g c c a c s tơi nguyên, đó lơ m t đ ng d n th mục, m t HTTP URL, m t JDBC URL Các ví dụ v cách s dụng nh ng ph article t ng th c có thể là m t ch đ trong m t ng lai. Cho đ n sau khi b n có thể đọc chúng trong Servlet 2.1 Nh b n đư th y phần tr c, các request song song đ cách chia nh thơnh các thread để thực thi t ng ng v i ph c m t servlet lý bằng ng th c lý request (ví Page 144

145 dụ doget hoặc dopost). Đi u này vì th tr nên quan trọng b i vì nh ng ph ng th c này là nh ng thread an toàn Đa tuyến (Multithreading) Nh b n đư th y phần tr c, các request song song đ c m t servlet lý bằng cách chia nh thơnh các thread để thực thi t ng ng v i ph ng th c lý request (ví dụ doget hoặc dopost). Đi u này vì th tr nên quan trọng b i vì nh ng ph ng th c này là nh ng thread an toàn. Cách d dàng nh t để chắc chắn rằng đo n mã an toàn là tránh k t thúc các bi n thực thể (instance variable) vơ thay vơo đó hưy đặt toàn b thông tin cần thi t vào m t ph ng th c nh nh ng tham s. Ví dụ: private String someparam; protected void doget(httpservletrequest request, HttpServletResponse response) throws ServletEception, IOEception someparam = request.getparameter( someparam ); processparam(); private void processparam() // Xử lý với someparam là không an toàn. N u ph ng th c doget thực thi hai ph là giá tr c a instance variable someparam s đ đầu tiên v n còn s dụng nó. ng th c. Đi u nơy có nghĩa c đặt vào thread th hai trong khi thread Chuyển sang m t thread an toơn nh sau: private String someparam; protected void doget(httpservletrequest request, HttpServletResponse response) throws ServletEception, IOEception someparam = request.getparameter( someparam ); processparam(someparam); private void processparam(string someparam) //Xử lý với someparam đơy, ph ng th c processparam nh n vào t t c d li u nó cần nh nh ng tham s thay vì ph i phụ thu c vào các instance variable. M t lý do khác để tránh instance variable, đó lơ trong m t h th ng đa server (multi-server), có thể có m t instance cho servlet cho m i server và các request cho cùng servlet có thể đ c phân chia gi a các server. Vi c gi các thông tin đ c phân chia Page 145

146 trong các instance variable trong tr này thay vì s dụng đ i t ng h p không làm vi c v i t t c, trong tr ng h p ng HttpSession, các attribute ServletContet hoặc m t d li u l u tr bên ngoài là m t database hoặc m t d ch vụ RMI/CORBA để s a ch a tr ng thái ng dụng. Th m chí n u b n bắt đầu v i m t h th ng đ n server (single-server), đó v n là m t ý t t để vi t các servlet c a b n vì chúng có thể đ c phát triển thành m t h th ng multi-server l n h n. K t thúc Article này ch mô t ngắn gọn v Servlet API và t t c nh ng đi u mà b n có thể làm v i servlet. B n có thể học đ c nhi u h n bằng vi c đọc nh ng cu n sách hoặc vi ng thăm nh ng trang web v Servlet. 2. Truy c p c s d li u trong java 2.1. Tổng quan M t h a hẹn l n c a java là kh năng ơy dựng các ng dụng CSDL đ c l p v i h n n, công ngh nơy đ c bi t đ n v i cái tên JDBC (Java Database Connectivity), JDBC đ c thi t k t ng đ i đ n gi n. Mô hình JDBC đ a ra m t t p các l p vơ các ph ng th c để giao ti p v i ng n d li u. JDBC API đ c tích h p vào ngay n n java nên b n không cần ph i cơi đặt gì thêm khi truy c p CSDL Các lớp trong JDBC API dùng để truy cập CSDL JDBC API bao g m các l p và các giao di n đ c ch a trong hai gói: java.sql và java.sql. Gói java.sql ch a các giao di n và gói cho phép ta thực hi n các thao tác c b n đ i v i CSDL, gói java.sql ch a các l p và giao di n giúp ta thực hi n các tính năng cao c p Một số giao diện và lớp trong gói java.sql a) M t s giao di n Tªn giao diön M«t ý nghýa CallableStatement Giao diön chøa c c ph- ng thøc cho phðp ta lµm viöc víi thñ tôc l-u tr néi DatabaseMetaData Cho phðp ta em c c th«ng tin vò CSDL PreparedStatement Giao diön nµy cho phðp ta thùc thi c c c u lönh SQL chøa tham sè Page 146

147 ResultSetMetaData Connection ThÓ hiön mét kõt nèi Õn CSDL Driver Giao diön mµ mçi tr nh iòu khión ph i cµi Æt ResultSet ThÓ hiön mét tëp c c b n ghi lêy vò tõ CSDL Statement Giao diön cho phðp ta thùc hiön c c ph t bióu SQL Bảng 4.1. Một số giao diện trong gói java.sql b) M t s l p Tªn líp ý nghýa Date Líp bióu diôn kióu DATE DriverPropertyInfo Chøa c c thuéc týnh cña tr nh iòu khión n¹p Timestamp Líp bióu diôn cho SQL TimeTemp DriverManager Líp qu n lý c c tr nh iòu khøªn Time Líp bióu diôn kióu DATE Types Líp Þnh nghüa c c h»ng t- ng øng víi c c kióu d liöu SQL, hay cßn gäi lµ kióu d liöu JDBC Bảng 4.2. Một số lớp trong giao diện java.sql Một số giao diện và lớp trong gói java.sql Tham kh o tài li u v JDBC 2.3. Kết nối CSDL với JDBC Để có thể làm vi c v i CSDL, m t ch bằng ngôn ng nào khác) ph i tuơn theo các b ng trình java (hay b t c ch ng trình vi t c sau: 1. M k t n i đ n CSDL. 2. Thực hi n các l nh làm vi c v i CSDL nh : truy v n, c p nh t 3. Đóng k t n i, gi i phóng tài nguyên. Page 147

148 Các b c để ây dựng m t ng d ng CSDL v i JDBC: 1. Chuẩn b a) CƠi đặt JDBC vơ trình đi u khiển: M t ng java ch có thể k t n i và làm vi c đ c v i d li u trong CSDL thông qua các trình đi u khiển vơ các th vi n JDBC API. Tr c khi truy c p vào h CSDL nào b n ph i có trong tay trình đi u khiển t ng ng v i h CSDL đó. B n có thể download các trình đi u khiển cho m t s h CSDL quen thu c t đ a ch java.sun.com/jdbc b) CƠi đặt CSDL B n cần lựa chọn vơ cơi đặt m t h qu n tr CSDL, để qu n tr phần d li u c a ch ng trình. Đơy lơ lựa chọn c a b n tuỳ theo tính ch t c a d li u trong ch ng trình cũng nh m c ti n b n có để có thể mua đự c h qu n tr đó. Sau khi b n lựa chọn đ c h qu n tr CSDL phù h p b n ti n hơnh cơi đặt CSDL: t o b ng, view, th tục l u tr.. Chú ý: Để có thể truy c p vào CSDL c a h qu n tr CSDL nào thì b n ph i có trong tay trình đi u kh ên t ng ng. 2. Thi t l p k t n i Đơy lơ b c quan trọng nh t bao g m hai b c: a) N p trình đi u khiển JDBC s dụng m t b trình qu n lý đi u kiển (DiverManager), m i trình đi u khiển (Driver) cho phép ta làm vi c v i m t CSDL cụ thể, cho nên n u b n có 3 CSDL do 3 nhà cung c p khác nhau cung c p thì b n cần ph i có 3 trình đi u khiển khác nhau. Để n p vơ đăng ký trình đi u khiển b n s dụng l nh Class.forName(URL). Trong đó URL lơ m t chu i mô t các thông tin v tên c a trình đi u khiển dùng k t n i v i c s d li u. Ví d : Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); dùng để n p trình đi u khiển JDBC-ODBC Chú ý: V i m i trình đi u khiển khác nhau thì URL c a ph ng th c Class.forName() s khác nhau. Nên để có thể n p đúng trình đi u khiển b n nên thao kh o tài li u đi kèm c a các trình đi u khiển, để bi t đ c URL t ng ng. b) T o m t k t n i Page 148

149 B v an p c ti p theo b n t o m t k t n i đ n CSDL thông qua trình đi u khiển mà b n b c trên. Đo n mư dùng để t o m t k t n i thông th ng nh sau: Connection con = DriverManager.getConnection(url, "mylogin", "mypassword"); Trong đó : - url là chu i ch a thông tin k t n i đ n CSDL, n u b n s dụng cầu n i JDBC-ODBC thì url lơ jdbc:odbc:datasourcename, chẳng h n tôi đư t o m t DNS tên là TestDB v i tên truy c p là theht, m t khẩu truy c p là theht thì câu l nh k t n i đ n CSDL là Connection con = DriverManager.getConnection( jdbc:odbc:testdb,"admin", "admin"); - mylogin là tên truy c p, n u m t không có m t khẩu b n có thể truy n cho nó m t âu r ng - mypassword là m t khẩu truy c p, n u m t không có m t khẩu b n có thể truy n cho nó m t âu r ng Chú ý: Thông th ng chu i URL có đ nh d ng nh sau: jdbc:subprotocol:subname Trong đó: - subprotocol là giao th c con t ng ng v i lo i CSDL - subname là tên c a ngu n d li u (Thông th ng nó là tên c a CSDL) M t vài ví du: Ví d 1: N p trình đi u kh ên và k t n i đ n CSDL c a MySQL Trình đi u kh ên để tury c p vào CSDL c a MySQL, b n có thể download t i đ a ch MySQL.com, sau khi download b n có m t t p tin duy nh t đư đ c nén theo chuẩn jar, đặt classpath tr đ n t p tin này - N p tình đi u khiển c a MySQL Class.forName("com.mysql.jdbc.Driver"); - K t n i đ n CSDL Connection conn = DriverManager.getConnection( "jdbc:mysql://servrname/dbname?user=username&password=pass"); đơy: - ServerName: là tên c a máy ch CSDL - DBName: là tên c a CSDL - UserName: là tên truy c p CSDL Page 149

150 - Pass: là m t khẩu truy c p Ví d 2: N p trình đi u kh ên và k t n i đ n CSDL c a SQL Server 7.0, 2000 Có r t nhi u trình đi u khiển cho MS SQL Server, đa phần các trình đi u khiển đ u là các s n phẩm th ng m i, có m t trình đi u khiển mà ta nên s dụng đó lơ trình đi u khiển do chính hãng Microsoft cung c p, trình đi u khiển này hoàn toàn Free và h tr đầy đ các tính năng c a Sql Server. - Đ a ch download - Sau khi download và ti n hơnh cơi đặt b n s có 3 t p tin trong th mục cơi đặt: install_dir/lib/msbase.jar install_dir/lib/msutil.jar install_dir/lib/mssqlserver.jar install_dir: lơ th mục cơi đặt - Đặt classpath tr đ n 3 t p tin trên - N p trình đi u khiển Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); - K t n i đ n CSDL Connection conn = DriverManager.getConnection ("jdbc:microsoft:sqlserver://servername:serverport;databasename=dbname", "UserName","Password"); hoặc Connection conn = DriverManager.getConnection ("jdbc:microsoft:sqlserver://servername:serverport;user=username;password=password; DatabaseName=DBName"); V i: + ServerName: Là tên c a máy ch SQL + ServerPort: S hi u c ng c a SQL, n u trong quá trình cơi đặt mà b n không đặt l i thì giá tr này là UserName: Tài kho n đăng nh p vào SQL + Password: M t khẩu t ng ng v i tài kho n đăng nh p - Chuyển CSDL làm vi c conn.setcatalog("dbname"); Page 150

151 V i: + DBName: là tên CSDL Source code import java.sql.*; class Test public static void main(string[] args) try Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); Connection conn = DriverManager.getConnection("jdbc:microsoft:sqlserver://theht:1433; DatabaseName=AA;user=sa;password="); Statement st=conn.createstatement(); ResultSet rs=st.eecutequery("select * from t"); while(rs.net()) System.out.println(rs.getString("a")+ rs.getstring("b")); catch (SQLEception e) catch (ClassNotFoundEception e) Ví d 3: N p trình đi u kh ên và k t n i đ n CSDL c a Access v i cầu n i JDBC-ODBC c a Sun System Để truy c p vào CSDL c a Access ta không cần ph i t i u ng vơ cơi đặt vào máy driver nào c vì nó đ c tích h p vơo Java, trình đi u khiển này do sun cung c p nó có tên là cầu n i JDBC-ODBC - N p trình đi u khiển Class.forName("sun.jdbc.odbc. JdbcOdbcDriver "); // Vào control panel ch y ch ng trình ODBC DataSource 32 bit, để t o m t // DataSource Name có tên là MyDB // L y v k t n i đ n CSDL Connection conn = DriverManager.getConnection(" jdbc:odbc:mydb", "",""); đơy: - MyDB là tên c a DataSource Name mà b n đư t o Ví d 4: N p trình đi u kh ên và k t n i đ n CSDL c a Oracle 8i, 9i Page 151

152 // Trình đi u kh ên để tury c p vào CSDL c a Oracle, b n có thể tìm th y nó trong th mục %ORACLE_HOME%/JDBC/lib Class.forName("oracle.jdbc.OracleDriver "); // Lấy về kết nối đến CSDL Connection conn = DriverManager.getConnection( " jdbc:oracle:oci8:@admin", "admin","abc"); đơy: là tên c a máy ch CSDL - admin là tên truy c p CSDL - abc là m t khẩu truy c p 2.4 Tương tác với CSDL T t c các l nh mơ ta dùng để tác đ ng lên CSDL đ u có thể thực hi n thông qua m t trong ba đ i t ng sau: èi t-îng Satement M«t Dïng Ó thùc thi c c lönh SQL kh«ng cã tham sè PreparedStatement Dïng Ó thùc thi c c lönh SQL cã tham sè chøa CallableStatement Dïng Ó lµm viöc víi thñ tôc l-u tr néi Bảng 4.3. Một số lớp đối tượng tương tác với CSDL Tạo ra một JDBC Statements M t đ i t ng Statements s giúp b n g i m t l nh SQL đ n h qu n tr CSDL, sau khi t o đ i t ng Statements b n có thể thực hi n các l nh SQL nh SELECT để l y v d li u hay UPDATE để c p nh t d li u, để t o đ i t ng Statements b n s dụng ph ng th c createstatement c a đ i t ng connection mà b n v a t o ra trong b c II. Statement stmt = con.createstatement(); T i th i điểm này b n ch a có phát biểu SQL nơo để truy n đ n CSDL, bây gi chúng ta s s dụng ph ng th c eecute c a đ i t chẳng h n nh đo n l nh sau s dụng ph l nh truy v n c p nh t: ng nơy để thực thi m t l nh SQL, ng th c eecuteupdate để thực thi m t câu stmt.eecuteupdate("create TABLE COFFEES"+"(COF_NAME VARCHAR(32), INTEGER, PRICE FLOAT, " + "SALES INTEGER, TOTAL INTEGER)"); SUP_ID Page 152

153 Trong java 2 b n có thể t o ra các t p k t qu có thể c p nh t và có thể cu n con tr theo c hai chi u, để t o ra t p k t qu có thể c p nh t đ c và cho phép cu n c hai chi u b n s dụng m u sau: Statement stmt = con.createstatement(resultsettype, ConcurencyType); Trong đó : - Tham s ResultSetType cho bi t t p k t qu (ResultSet) nh n đ c khi thực thi câu l nh eecutequery() có cu n đ c hay không. - Tham s ConcurencyType tính ch t c a t p k t qu (ResultSet) nh n đ c khi thực thi câu l nh eecutequery() có cho phép c p nh t hay không. Thực ra vi c có c p nh t đ c hay không còn phụ thu c vơo trình đi u kh ên và h qu n tr có h tr c p nh t hay không. Sau đơy lơ b ng các giá tr mà tham s ResultSetType có thể nh n: KiÓu ResultSet TYPE_FORWARD_ONLY Cho biõt ResultSet nhën -îc chø cã thó duyöt theo mét chiòu tõ BOF Õn EOF TYPE_SCROLL_INSENSITIVE Cho phðp duyöt theo c hai chiòu nh-ng kh«ng thêy -îc sù thay æi d liöu cña ng-êi dïng kh c TYPE_SCROLL_SENSITIVE Cho phðp duyöt t`heo c hai chiòu nh-ng thêy -îc sù thay æi d liöu cña ng-êi dïng kh c Bảng 4.4. Bảng các giá trị mà tham số ResultSetType Sau đơy lơ b ng các giá tr mà tham s ConcurencyType có thể nh n KiÓu ConcurencyType CONCUR_READ_ONLY Cho biõt ResultSet kh«ng thó cëp nhët -îc, hay chø äc CONCUR_UPDATEABLE Cho biõt ResultSet cã thó cëp nhët -îc Bảng 4.5. Bảng các giá trị mà tham số ConcurencyType a) Thực hi n các l nh DDL (Data Difinetion Language) t Để thực thi các l nh DDL b n s dụng ph ng Statement theo m u: ng th c eecuteupdate c a đ i stmt.eecuteupdate(ddl_sql_string); Trong đó: Page 153

154 - stmt là m t đ i t ng thu c l p Statement - DDL_SQL_STRING là m t câu l nh DDL Chú ý: Ph ng th c eecuteupdate tr v giá tr 0 n u câu l nh mà nó thực thi là m t câu l nh DDL b) Thực thi các l nh c p nh t CSDL Để thực thi các l nh c p nh t nh : INSERT, UPDATE, DELETE b n s dụng ph ng th c eecuteupdate() c a đ i t ng Statement theo m u: stmt.eecuteupdate(dml_sql_string); Trong đó: - stmt là m t đ i t ng thu c l p Statement - DML_SQL_STRING là m t câu l nh c p nh t Chú ý: Ph ng th c eecuteupdate tr v m t s nguyên thể hi n s b n ghi đ h ng sau l nh nơy, để bi t đ m u sau: c s b n ghi đ c nh h c nh ng b n có thể thực hi n theo [int recordeffect=] stmt.eecuteupdate(dml_sql_string); Ví d 1: Thêm m t b n ghi vào b ng sinhvien stmt.eecuteupdate( INSERT INTO sinhvien(masv, tensv) values (\ 01\, \ Nguyễn văn An ); Ví d 2: Xoá các b n ghi c a b ng sinhvien có masv=01 stmt.eecuteupdate( DELETE sinhvien WHERE masv=01 ); Ví d 3: S a l i tên c a sinh viên có masv=01 thành Nguy n Văn B stmt.eecuteupdate( UPDATE sinhvien SET tensv=\ Nguyễn Văn B\ WHERE masv=01 ); C p nh t l i d li u Để c p nh t l i d li u b n s dụng m nh đ UPDATE SQL, thực thi chúng thông qua ph ng th c eecuteupdate Ví d : b n mu n c ng thêm phụ c p cho t t c các ng b n làm i có trình đ đ i học lên 10 đ ng stmt.eecuteupdate( "UPDATE COFFEES " + "SET CP=PC+10 WHERE td=dh ); Thêm b n ghi vào b ng CSDL Page 154

155 Để chèn d li u vào b ng b n s dụng ph ng th c eecuteupdate c a đ i t ng Statement, ví dụ b n mu n chèn thêm m t b n ghi vào b ng COFFEES b n làm sau: Statement stmt = con.createstatement(); stmt.eecuteupdate( "INSERT INTO COFFEES " + "VALUES ('Colombian', 101, 7.99, 0, 0)"); Xoá b n ghi trong CSDL Để oá d li u t b ng CSDL b n s dụng ph t ng th c eecuteupdate c a đ i ng Statement. Ví dụ b n mu n t t c các b n ghi c a b ng COFFEES b n làm sau: Statement stmt = con.createstatement(); stmt.eecuteupdate( "DELETE FROM COFFEES"); c) Thực thi câu l nh truy v n (Query Language) t Để thực thi câu l nh truy v n b n s dụng ph ng Statement theo m u sau: ng th c eecutequery() c a đ i ResultSet rs=stmt.eecutequery(query_sql_string); Trong đó: - stmt là m t đ i t ng thu c l p Statement - QUERY_SQL_STRING là m t câu l nh truy v n d li u - rs là m t đ i t ng c a l p ResultSet Chú ý: Ph ng th c eecutequery tr v m t t p k t qu t CSDL đ c ch a trong đ i t ng ResultSet, nên thông th ng b n s l y v tham chi u đ n k t t p qu bằng cách: ResultSet rs=stmt.eecutequery(query_sql_string); Ví d sau l y v t t c các b n ghi c a b ng SinhVien và hiển th ra màn hình: ResultSet rs=stmt.eecutequery( SELECT * FROM SinhVien ); While(rs.net()) //.. Xử lý tập kết quả d) X lý t p k t qu ResultSet Các ph ng th c dùng để di chuyển con tr : Ph- ng thøc net ý nghüa Di chuyón con trá sang b n ghi kõ trong tëp b n ghi, ph- ng thøc tr vò true nõu viöc di Page 155

156 chuyón lµ thµnh c«ng ng-îc l¹i cho false previous Di chuyón con trá vò b n ghi tr-íc b n ghi hiön t¹i, ph- ng thøc tr vò true nõu viöc di chuyón lµ thµnh c«ng ng-îc l¹i cho false last Di chuyón con trá vò b n ghi cuèi cïng trong tëp b n ghi, ph- ng thøc tr vò true nõu viöc di chuyón lµ thµnh c«ng ng-îc l¹i cho false first Di chuyón con trá vò b n ghi Çu tiªn trong tëp b n ghi, ph- ng thøc tr vò true nõu viöc di chuyón lµ thµnh c«ng ng-îc l¹i cho false afterlast Di chuyón con trá vò tr-íc b n ghi Çu tiªn trong tëp b n ghi beforefirst Di chuyón con trá vò sau b n ghi cuèi cïng trong tëp b n ghi absolute(int Di chuyón con trá vò b n ghi thø pos týnh tõ pos) b n ghi Çu tiªn nõu pos lµ sè d- ng, hoæc di chuyón vò b n ghi thø pos týnh tõ b n ghi cuèi cïng nõu pos lµ sè relative(int Di chuyón con trá vò tr-íc b n ghi hiön t¹i pos) pos b n ghi nõu pos lµ sè m, hoæc di chuyón vò phýa sau pos b n ghi so víi b n ghi hiön t¹i nõu pos lµ sè d- ng Bảng 4.6. Các phương thức dùng để di chuyển con trỏ S dụng các ph ng th c getxxx Ta s dụng ph ng th c getxxx để nh n v giá tr hi n t i c a m t c t t ng ng, tuỳ theo kiểu d li u c a c t mà b n s dụng ph ng th c getxxx t ng ng, ví dụ n u c t có kiểu là VARCHAR thì b n s dụng ph ng th getstring Ví d : li t kê t t c các b n ghi c a b ng COFFEES String query = "SELECT COF_NAME, PRICE FROM COFFEES"; ResultSet rs = stmt.eecutequery(query); while (rs.net()) // sử dụng phương thức getstring vì cột //COF_NAME có kiểu VARCHAR Page 156

157 String s = rs.getstring("cof_name"); // Sử dụng phương thức getfloat vì cột PRICE có // kiểu float float n = rs.getfloat("price"); System.out.println(s + " " + n); Chú ý: B n có thể s dụng th tự c t khi l y v d li u thay cho tên c t String s = rs.getstring("cof_name"); bởi String s = rs.getstring(1); Và float n = rs.getfloat("price"); bởi float n = rs.getfloat(2) Sau dây là b ng các ph ng th c t ng ng v i kiểu d li u SQL S I B R F D D N B C V L B V L D T T I M N I E L O E U I H A O I A O A I I N A T G A O U C M T A R N N R N T M M Y L E I L A B I E R C G A B G E E E I L G N T L M R H V R I V S N I E T E A I A A Y N A T T N R L C R R A R A C R B M H Y I P T T A N R A R Y getbyte X getshort X getint X getlong X getfloat X Page 157

158 getdouble X X getbigdecima l X X getboolean X getstring X X getbytes X X getdate gettime gettimestamp getasciistre am X getunicodest ream X X getbinarystr eam getobject X X X Bảng 4.7. Các phương thức tương ứng với kiểu dữ liệu SQL Trong b ng trên v trí đ c đánh trên hơng c a ph ng th c getxxx, thì ta có thể s dụng ph ng th c nơy để nh n v giá tr c a c t có kiểu d li u t ng ng, v trí đánh X thì ph ng th c đó lơ ph ng th c s dụng thích h p nh t C p nh t t p ResultSet Trong phần tr c ta dùng các l nh SQL- DML để c p nh t trực ti p vào b ng c a CSDL. Trong phần này ta s dụng các ph công vi c đó. ng th c trong JDBC 2.0 để thực hi n cũng Đi u b n cần ph i chú ý là ta c p nh t d li u c a b ng thông qua các ResultSet, th nên các ResultSet này cần ph i là các ResultSet c p nh t đ c. Ta có các ph ng th c updatexxx() khác nhau ng v i các kiểu d li u mà JDBC h tr. T ng tự nh ph ng th c getxxx() khi ta nh n thông tin t b ng. Nh updatefloat(),updateint(),updatestring(), Sau khi gán gía tr cho các tr b n ác nh n vi c c p nh t bằng ph ng bằng các ph ng th c updatexxx() t ng th c updaterow(). Ph ng ng, ng th c này ho t đ ng t ng tự nh ph ng th c commit(), ph ng th c updaterow() có nhi m vụ ghi l i sự thay đ i đ i v i v i hàng hi n t i (đang s a) vào trong b ng CSDL trên đĩa. Page 158

159 Nh v y khác v i các l nh SQL-DML, c ch c p nh t này ch có tác dụng đ i v i b n ghi hi n hành. Th nên để s a l i b n ghi nào b n ph i di chuyển con tr b n ghi vào b n ghi cần s a bằng m t trong các ph ng th c đư li t trong phần tr c. Ta cũng có m t ph ng th c t ng tự nh ph ng th c rollback() lơ ph ng th c cancelrowupdate(). Khi gọi ph ng th c nơy các thay đ i do gọi ph ng th c updatexxx() kể t sau câu l nh updatexxx() lần tr c s b vô hi u hoá. Ví d : C p nh t ResultSet // Nhảy đến bản ghi đầu tiên rs.first(); // gán gía trị mới cho cột tensv rs.updatestring( tensv, Nguyễn Van Hưng ); // Xác nhận sự thay đổi rs.updaterow(); // Nhảy đến bản ghi cuối cùng rs.last(); // gán gía trị mới cho cột tensv rs.updatestring( tensv, Nguyễn Van Đạt ); // Huỷ bỏ việc cập nhật trên rs.cancelrowupdate(); Thêm b n ghi m i Ngoài vi c s dụng các l nh SQL-DML để thêm các b n ghi trong b ng. ta còn có thể thêm chúng bằng cách thông qua các ph đ c. M t ResultSet c p nh t đ ng th c c a đ i t ng ResultSet c p nh t c luôn t n t i m t b n ghi đặc bi t gọi lơ insertrow để dùng cho vi c thêm m t b n ghi m i. B n ghi này không là m t thành phần c a ResultSet. Thực ch t nó ch là m t vùng đ m để thêm m t b n ghi m i. Các b c để thêm m t b n ghi m i vào t p ResultSet: đ n b n ghi t m insertrow bằng ph ng th c 1. Di chuyển con tr movetoinsertrow(). 2. Thực hi n vi c đi n các giá tr vào các c t t ng ng bằng các ph ng th c 3. updatexxx(). Sau khi chắc chắn rằng các giá tr thêm vơo lơ đúng. Ta gọi ph ng th c insertrow() để ác nh n vi c thêm m i b n ghi vào b ng và ResultSet. Ví d : thêm b n ghi vào ResultSet // Nạp trình điều khỉên Page 159

160 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // Lấy về kết nối Connection cn=drivermanager.getconnection("jdbc:odbc:t"); //Tập ResultSet có thể cập nhật được Statement st=cn.createstatement(resultset.type_scroll_sensitive, ResultSet.CONCUR_UPDATABLE); //Lấy về tập ResultSet ResultSet rs=st.eecutequery("select * FROM sinhvien"); //Bước 1: Di chuyển con trỏ đến bản ghi tạm để thêm mới rs.movetocurrentrow(); //Bước 2: Gán gía trị cho các cột bằng phương updatexxx() tương ứng rs.updatestring("masv","005"); rs.updatestring("tensv","nguyễn Tự Hào"); rs.updatedate("namsinh",new Date(2004,5,30)); //Bước 3: Xác nhận sự thêm mới rs.insertrow(); Chú ý: - N u khi gán giá tr cho các c t mà ta b sót m t s c t không gán giá tr khi đó các c t đó s nh n các giá tr NULL. Khi đó n u c t đó có thu c tính không cho phép nh n gía tr NULL thì b n s nh n đ c m t ngo i l SQLEception. - Không có ph ng th c để ta huỷ b vi c thêm m i b n ghi. Tuy nhiên để huỷ b vi c thêm m i b n ch cần di chuyển con tr b n ghi ra kh i b n ghi t m bằng m t trong các ph ng th c di chuyển chuỷên con tr. Xoá b n ghi Để oá m t b n ghi b n có thể s dụng các l nh SQL-DML, b n có thể thực hi n vi c này bằng các ph Các b ng th c c a đ i t ng ResultSet. c để oá m t b n ghi kh i ResultSet - Di chuyển con tr đ n b n ghi cần oá - Gọi ph ng th c deleterow(); Chú ý: Tuỳ vơo trình đi u kh ên mà vi c oá đ c thực hi n ngay hay ch lơ đánh d u oá. để bi t chắc chắn b n nên tham kh o tài li u đi kèm v i Driver b n s dụng. Ví d : Xoá b n ghi // Xóa bản ghi đầu tiên rs.first(); rs.deleterow(); // Xoá bản ghi thứ 3 Page 160

161 rs.absolute(3); rs.deleterow(); // Xoá bản ghi cuối cùng rs.last(); rs.deleterow(); Sử dụng đối tượng Prepared Statements Khi nào s dụng đ i t ng Prepared Statements?, câu tr l i đ c phân tích sau: M i khi thực thi m t l nh SQL thì DBMS l i ph i phân tích l i cú pháp c a l nh, sau đó t i u l nh SQL, công vi c này m t r t nhi u th i gian, n u b n cần chèn 100 dòng vào CSDL, th thì b n ph i s dụng 100 l nh eecuteupdate để chèn 100 dòng, do v y ph i m t 100 lần phân tích l nh, 100 lần t i u hoá l nh, b n s đặt câu h i có các nào mà ch cần phân tích l nh, t i u l nh ch m t lần mơ thôi, vơng cách đó chính lơ đ i t ng Prepared Statements. Đôi khi b n mu n thực hi n m t l nh SQL mà các thông s cụ thể l i ch a bi t, trong tr ng h p này bắt bu c b n ph i s dụng truy v n tham s hoá, tuy nhiên đ i t ng Statement l i không h tr truy v n tham s hoá Ví d : sau c p nh t m t s dòng c a b ng COFFEES s dụng đ i t ng Prepared Statements PreparedStatement updatesales; String updatestring = "update COFFEES " + "set SALES =? where COF_NAME like?"; updatesales = con.preparestatement(updatestring); int [] salesforweek = 175, 150, 60, 155, 90; String [] coffees = "Colombian", "French_Roast", "Espresso", "Colombian_Decaf", "French_Roast_Decaf"; int len = coffees.length; for(int i = 0; i < len; i++) updatesales.setint(1, salesforweek[i]); updatesales.setstring(2, coffees[i]); updatesales.eecuteupdate(); Nh b n th y qua ví dụ trên để: - L yv đ it ng PreparedStatement b n s dụng ph ng th c preparestatement c a đ i t ng Connection và truy n vào m t câu l nh SQL ch a tham s - Gán giá tr cho các tham s b n s dụng ph ng th c setxxx(inde, value) - Thực thi truy v n v i các tham s v a cung c p b n gọi ph eecuteupdate() c a đ i t ng preparestatement. ng th c Page 161

162 2.5. Gọi th tục lưu trữ bằng JDBC JDBC cho phép b n gọi m t th tục l u tr trong CSDL, t trong ng dụng vi t bằng java, để có thể gọi m t th tục l u tr tr c tiên b n t o ra m t đ i t ng CallableStatement đ i t ng nơy có ph ng th c preparecall giúp b n có thể gọi th tục l u tr n i Các b c: 1. CallableStatement cs = con.preparecall("call tên_th _tục_l u_tr "); 2. Gọi th tục eecutexxx() t ng ng để thực thi th tục l u tr Quản lý giao dịch Khi m t k t n i đ c t o, nó đ c đặt trong tr ng thái auto- commit, t c là nó tự đ ng commit sau khi thực thi thành công m t l nh đ n, tuy nhiên b n có thể đặt l i ch đ auto- commit để b n có thể quy t đ nh commit hay rollback l i m t nhóm l nh. Nh đo n mã sau: con.setautocommit(false); Ví d : // Tắt chế độ auto-commit con.setautocommit(false); // tác động lên CSDL PreparedStatement updatesales = con.preparestatement( "UPDATE COFFEES SET SALES =? WHERE COF_NAME LIKE?"); updatesales.setint(1, 50); updatesales.setstring(2, "Colombian"); updatesales.eecuteupdate(); PreparedStatement updatetotal = con.preparestatement( "UPDATE COFFEES SET TOTAL = TOTAL +? WHERE COF_NAME LIKE?"); updatetotal.setint(1, 50); updatetotal.setstring(2, "Colombian"); updatetotal.eecuteupdate(); // Xác nhận commit con.commit(); // đặt lại chế độ auto-commit con.setautocommit(true); Page 162

163 CH NG 5. L P TRÌNH THI T B DI Đ NG V I J2ME 1. Gi i thi u v J2ME và l p trình cho thi t b di đ ng J2ME đ c phát triển t ki n trúc JavaCard, EmbededJava và PersonalJava c a phiên b n Java 1.1. Đ n dự ra đ i c a phiên b n Java 2 thì Sun quy t đ nh thay th PersonalJava bằng m t phiên b n m i có tên Java 2 Micro Edition, vi t tắt là J2ME. J2ME đ c s dụng cho các thi t b nh gọn v i dung l ng b nh bé và kh năng lý th p. Mục tiêu c a Java lơ cho phép ng i l p trình vi t các ng dụng đ c l p v i thi t b di đ ng, không cần quan tơm đ n phần c ng th t sự. Để lơm đ c nh th, J2ME đ c ây dựng bằng các tầng khác nhau để che gi u đi vi c t ng tác trực ti p v i phần c ng c a thi t b. Các tầng c u J2ME đ c ây dựng trên CLDC (Connected Limited Device Configuration): Tầng d i cùng là tầng Phần c ng thi t b - đơy lơ tầng v t lý bao g m phần c ng c a thi t b di đ ng. Các tầng bên trên tầng Phần c ng thi t b là các tầng tr u t ng, chúng cung câp cho l p trình viên nhi u giao di n l p trình thân thi n và d dơng h n mơ không cần quan tơm đ n phần c ng. Nói các khác chúng đóng vai trò trung gian giúp cho l p trình viên t ng tác đ c v i phần c ng mà không cần quan tơm đ n các chi ti t thực sự c a phần c ng c a thi t b. Tầng Phần c ng thi t b (Device Hardware Layer): đơy lơ thi t b di đ ng th t sự v i b nh và t c đ lý cụ thể. Các thi t b di đ ng khác nhau có thể có b vi lý và các t p l nh r t khác nhau. Mục tiêu c a J2ME là cung c p cho l p trình viên kh năng giao ti p gi ng nhau v i t t c các lo i thi t b di đ ng khác nhau. Tầng máy o Java (Java Virtual Machine Layer): đơy lơ tầng đóng vai trò thông ngôn gi a ch ng trình vơ thi t b. Nó s thông d ch các mư bytecode (mư có đ c sau khi biên d ch mã ngu n ch ng trình) thơnh mư máy c a các thi t b di đ ng. Tầng này bao g m KVM (K Virtual Machine) là b biên d ch mã bytecode thành mã máy. Nó Page 163

164 cung c p m t sự chuẩn hóa cho các thi t b di đ ng để ng dụng J2ME sau khi biên d ch có thể ch y đ c trên b t kỳ thi t b di đ ng nào h tr KVM. Tầng c u hình (Configuration Layer): Tầng này cung c p các hơm API c b n là nhân c a J2ME. L p trình viên có thể s dụng các l p vơ các ph ng th c c a các API này tuy nhiên nó không thực sự phong phú bằng t p API c a tầng hi n tr ng. Tầng hi n tr ng (Profile Layer): Tầng này cung c p các hàm API h u dụng h n cho vi c l p trình. Mục đích c a tầng này ây dựng nên l p c u hình và cung c p nhi u th vi n ng dụng h n. 2. Ki n trúc của J2ME Phần này s trình bày ki n trúc t ng quát c a n n t ng Java 2.1. Giới thiệu các thành phần trong nền tảng J2ME Đ nh nghĩa v Configuration (C u hình): lơ đặc t đ nh nghĩa m t môi tr ng phần m m cho m t dòng các thi t b đ c phân lo i b i t p h p các đặc tính, ví dụ nh : Kiểu và s l ng b nh Kiểu và t c đ b vi lý Kiểu m ng k t n i Do đơy lơ đặc t nên các nhà s n u t thi t b nh Samsung, Nokia bắt bu c ph i thực thi đầy đ các đặc t do Sun qui đ nh để các l p trình viên có thể dựa vào môi tr ng l p trình nh t quán và thông qua sự nh t quán này, các ng dụng đ c t o ra có thể mang tính đ c l p thi t b cao nh t có thể. Ví dụ nh m t l p trình viên vi t ch ng trình game cho đi n tho i Samsung thì có thể s a đ i ch ng trình c a mình m t cách t i thiểu nh t để có thể ch y trên đi n thọai Nokia.. Hi n nay Sun đư đ a ra 2 d ng Configuration: CLDC (Connected Limited Device Configuration-C u hình thi t b k t n i gi i h n): đ c thi t k để nhắm vào th tr ng các thi t b c p th p (low-end), các thi t b nơy thông th ng lơ máy đi n thọai di đ ng và PDA v i kho ng 512 Page 164

165 KB b nh. Vì tài nguyên b nh h n ch nên CLDC đ c gắn v i Java không dây (Java Wireless ), d ng nh cho phép ng i s dụng mua và t i v các ng dụng Java, ví dụ nh lơ Midlet. CDC- Connected Device Configuration (C u hình thi t b k t n i): CDC đ c đ a ra nhắm đ n các thi t b có tính năng m nh h n dòng thi t b thu c CLDC nh ng v n y u h n các h th ng máy để bàn s dụng J2SE. Nh ng thi t b này có nhi u b nh h n (thông th ng là trên 2Mb) và có b lý m nh h n. Các s n phẩm này có thể kểđ n nh các máy PDA c p cao, đi n tho i web, các thi t b gia dụng trong gia đình C 2 d ng C u hình kể trên đ u ch a máy o Java (Java Virtual Machine) và t p h p các l p (class) Java c b n để cung c p m t môi tr ng cho các ng dụng J2ME. Tuy nhiên, b n chú ý rằng đ i v i các thi t b c p th p, do h n ch v tài nguyên nh b nh và b lý nên không thể yêu cầu máy o h tr t t c các tính năng nh v i máy o c a J2SE, ví dụ, các thi t b thu c CLDC không có phần c ng yêu cầu các phép tính toán d u phẩy đ ng, nên máy o thu c CLDC không đ c yêu cầu h tr kiểu float và double. Hình 5.1. So sánh giữa CDC và CLDC Bảng 5.1. So sánh các thông số kỹ thuật của CDC và CLDC 2.2. Định nghĩa về Profile Page 165

166 Profile m r ng Configuration bằng cách thêm vơo các class để b tr các tính năng cho t ng thi t b chuyên bi t. C 2 Configuration đ u có nh ng profile liên quan và t nh ng profile này có thể dùng các class l n nhau. Đ n đơy ta có thể nh n th y do m i profile đ nh nghĩa m t t p h p các class khác nhau, nên th ng ta không thể chuyển m t ng dụng Java vi t cho m t profile này và ch y trên m t máy h tr m t profile khác. Cũng v i lý do đó, b n không thể l y m t ng dụng vi t trên J2SE hay J2EE và ch y trên các máy h tr J2ME. Sau đơy lơ các profile tiêu biểu: Mobile Information Device Profile (MIDP): profile này s b sung các tính năng nh h tr k t n i, các thành phần h tr giao di n ng i dùng vơo CLDC. Profile nơy đ c thi t k ch y u để nhắm vơo đi n thọai di đ ng v i đặc tính là màn hình hiển th h n ch, dung l ng ch a có h n. Do đó MIDP s cung c p m t giao di n ng i dùng đ n gi n vơ các tính năng m ng đ n gi n dựa trên HTTP. Có thể nói MIDP là profile n i ti ng nh t b i vì nó là ki n th c c b n cho l p trình Java trên các máy di đ ng (Wireless Java) PDA Profile: t và b nh l n h n ng tự MIDP, nh ng v i th tr ng là các máy PDA v i màn hình Foundation Profile: cho phép m r ng các tính năng c a CDC v i phần l n các th vi n c a b Core Java2 1.3 Ngoài ra còn có Personal Basis Profile, Personal Profile, RMI Profile, Game Profile. Configuration Profile Hình 5.2. So sánh configuration và profile 3. L p trình v i J2ME 3.1. MIDlet Vòng đời c a một MIDlet Page 166

167 N u ng i nơo đư vi t Applet thì chắc hẳn th y hai cái tên này na ná nhau. Th t v y: MIDlet là vi t tắt c a Mobile Information Device applet,.hầu h t các ng dụng mà ta th y trên đi n tho i di đ ng đ u là MIDlet. M t MIDlet k th a t l p java.microedition.midlet.midlet và thực thi ít nh t các ph ng th c c b n sau: startapp(), pauseapp(), và destroyapp(). Trong m t ng dụng c a b n g m có nhi u l p thì có thể ch cần m t l p k th a MIDlet. Ta s đi vơo phân tích t ng đo n nh m t trong đo n code hoàn ch nh c a m t MIDlet. import java.microedition.lcdui.*; import java.microedition.midlet.*; public class test etends MIDlet implements CommandListener private Form mainform; public test() mainform = new Form("Lap trinh tren nen J2ME"); mainform.append(new StringItem(null,"Hello J2ME")); mainform.addcommand(new Command("Eit",Command.EXIT,0)); mainform.setcommandlistener(this); public void startapp() Display.getDisplay(this).setCurrent(mainForm); public void pauseapp() public void destroyapp(boolean un) public void commandaction(command c, Displayable s) notifydestroyed(); Page 167

168 Hình 5.3. Vòng đời của Midlet Phân tích các phương th c trong vòng đời c a Midlet: startapp(): Ph ng th c startapp() đ c gọi khi MIDlet đ c kh i t o, và m i khi MIDlet tr v t tr ng thái t m d ng (pause). Các bi n toàn cục s đ c kh i t o l i tr hàm t o b i vì các bi n đư đ c gi i phóng trong hàm pauseapp(). N u không thì chúng s không đ c kh i t o l i b i ng dụng. pauseapp(): Ph ng th c pauseapp() đ c gọi m i khi ng dụng cần đ c t m d ng (ví dụ, trong tr ng h p có cu c gọi hoặc tin nhắn đ n). Cách thích h p để s dụng pauseapp() là gi i phóng tài nguyên và các bi n để dành cho các ch c năng khác trong đi n tho i trong khi MIDlet đ c t m d ng. Cần chú ý rằng khi nh n cu c gọi đ n, h đi u hơnh trên đi n tho i di đ ng có thể d ng KVM thay vì d ng MIDlet. Vi c này do nhà s n u t thi t b quy t đ nh s chọn cách nào. destroyapp(boolean un): Ph ng th c destroyapp() đ c gọi khi thoát MIDlet. (ví dụ khi nh n nút eit trong ng dụng). Nó ch đ n thuần là thoát MIDlet.. Ph ng th c destroyapp() ch nh n m t tham s Boolean. N u tham s này là true, MIDlet đ c tắt vô đi u ki n. N u tham s là false, MIDlet có thêm tùy chọn t ch i thoát bằng cách ném ra m t ngo i l MIDletStateChangeEception. Ngoài ra còn thêm 3 ph ng th c n a, đó lơ: resumerequest(), notifypaused(), notifydestroyed(). T s đ kh i trên, ta th y: MIDlet đang t tr ng thái PAUSED chuyển đ n thực thi ph ng th c startapp() thông qua ph ng th c resumerequest(): ph ng th c này yêu cầu MIDlet chuyển vào ch đ ho t đ ng. Page 168

169 MIDlet đang thông qua ph tr ng thái ho t đ ng chuyển đ n thực thi ph ng th c notifypaused(): ph ng th c pauseapp() ng th c này cho bi t MIDlet tự nguy n chuyển sang tr ng thái d ng. MIDlet đang tr ng thái nơo đó chuyển đ n thực thi ph ng th c destroyapp() thông qua ph ng th c notifydestroyed(): ph ng th c này cho bi t MIDlet đư sắn sàng để h y. T đó chúng ta có thể th y 3 ph gian gi a các tr ng thái khác. ng th c m i nơy đặt MIDlet vào tr ng thái trung 3.2. Đối tượng Display M i MIDlet có m t tham chi u đ n m t đ i t ng Display. Đ i t ng này cung c p các thông tin v mơn hình cũng nh m t s ph ng th c cần cho vi c hiển th các đ i t ng khác trên màn hình. Có thể em Display lơ đ i t ng có nhi m vụ qu n lý vi c hienẻ th c a màn hình. Ch c năng c a nó là quy t đ nh danh sách các thành phần cần u t hi n trên mơn hình cũng nh th i điểm phù h p để hiển th chúng Đối tượng Displayable Mặc dù m i MIDlet ch có duy nh t m t đ i t ng Display nh ng nó l i có thể có r t nhi u đ i t ng Displayable. Đi u đó có nghĩa lơ m t đ i t ng Display có thể hiển th bao nhiêu đ i t ng Displayable tùy ý. Đ i t ng Displayable lơ đ i t ng có thể nhìn th y đ c m t cách trực quan trên màn hình. B n thân MIDP có ch a 2 l p con c a Displayable là Screen và Canvas: public abstract class Displayable public abstract class Canvas etends Displayable public abstract class Screen etends Displayable 3.4. Giao diện người dùng cấp cao Đối tượng Display, Displayable và Screens M t ng dụng MIDlet ch có 1 đ i t ng thể hi n Display. Đ i t ng nơy dùng để l y thông tin v đ i t ng trình bày, ví dụ mơu đ c h tr, và bao g m các ph ng th c đểyêu cầu các đ i t ng đ c trình bơy. Đ i t ng Display cần thi t cho b qu n lý vi c trình bày trên thi t b đi u khiển thành phần nào s đ c hiển th lên trên thi t b Mặc dù ch có m t đ i t ng Display ng v i m i MIDlet, nh ng nhi u đ i t ng trong m t MIDlet có thểđ đ it c hiển th ra trên thi t b nh Forms, TetBoes, ChoiceGroups,.. M t ng Displayable là m t thành phần đ c hiển th trên m t thi t b. MIDP ch a 2 l p con c a l p Displayable lơ Screen vơ Canvas. Hình d i đơy mô t m i quan h trên: Page 169

170 M t đ i t ng Screen không ph i là m t cái gì đó hi n ra trên thi t b, mà l p Screen này s đ c th a k b i các thành phần hiển th m c cao, chính các thành phần này s đ c hiển th ra trên mơn hình. Hình d Screen và các thành phần thể hi n m c cao. i đơy s mô t m i quan h c a l p Hình 5.4. Giao diện người dùng Tóm l i, phần này ch gi i thi u h th ng phân c p đ i t giao di n ng i dùng trong MIDP. ng dùng để thể hi n Thành phần Form và Items Trong phần này s gi i thi u các thành phần đ c hiển th ra trên m t Form. M t Form ch đ n gi n là m t khung ch a các thành phần, mà m i thành phần đ c th a k t l p Item. Chúng ta s em qua các thành phần hiển th trên thi t b : DateField Gauge StringItem TetField Page 170

171 ChoiceGroup Spacer CustomItem Image and ImageItem Thành phần List, Tetbo, Alert, và Ticker Trong phần này chúng ta s em ét các đ i t ng ListBo, TetBo, Alert, và Ticker trong các thành phần giao di n c p cao c a ng dụng MIDP. Chúng ta hưy cũng em l i cây phân c p các thành phần trình bày trên thi t b m t cách hoàn ch nh h n Hình 5.5. Các điều khiển cơ bản trên gia diện người dùng 4. Ch ng trình J2ME đầu tiên 4.1. Thiết lập môi trường lập trình Đ l p trình J2ME trên IDE NetBean chúng ta cần b NetBeans Mobility Pack và cần l u ý lơ version c a b Mobiliy ph i t ng ng v i version c a NetBean đang s dụng (cũng cần l u ý lơ NetBeans Mobility Pack không thể ch y trên NetBeans IDE 5.5, n u mu n chúng ta ph i s dụng NetBeans IDE tr lên). Page 171

172 Chúng ta cũng cần WTK: M t b gi l p máy di đ ng trên máy tính, đơy mình s dùng Sun Wireless Toolkit (WTK), nó s t o ra m t cái máy di đ ng o trong máy tính, và các ng dụng s ch y trên cái máy o Tạo project Sau khi đư cơi đặt ong 2 phần đó, chúng ta bắt đầu vi t ng dụng J2ME trên NetBeans. NetBeans h tr chúng ta t o ng dụng MIDP bằng 2 cách là bằng Visual Mobile Designer (VMD) hay bằng Source Code Editor. Có thể hiểu: Visual Mobile Designer (VMD): h tr giao di n kéo th m t cách trực quan để thi t k ng dụng. Source Code Editor: mọi vi c đ u vi t code th công Tạo ứng dụng MIDP Using Source Editor Chọn File/New Projects, trong h p tho i New Project chọn Mobility trong Categories và MIDP Application trong Projects, sau đó chọn Net; Nh p tên Project trong phần Project Name, thay đ i n i l u tr Project Location; Click chọn Set as Main Project và b chọn Create Hello MIDlet (đ Project trong c chọn mặc đ nh). Chọn Net; Chọn Sun Java Wireless Toolkit for CLDC trong Emulator Platform (mặc đ nh). Chọn Net; M r ng th mục Configuration templates provided by installed CLDC platforms" vơ"sun Java Wireless Toolkit 2.52 for CLDC. Check chọn các configurations. Click Finish; Right click vào <Tên Project> trong c a s Eplorer và chọn New/MIDlet Nh p HelloMIDlet trong MIDlet name. Chọn Finish; Double click vào file HelloMIDlet.java trong c a s Eplorer để hiển th source code trong b ng Editor. Trong c a s so n th o gõ vơo đo n code sau: import java.microedition.midlet.*; import java.microedition.lcdui.*; public class HelloMIDlet etends MIDlet implements CommandListener private Form mmainform; private Display display; private Command cmdeit; private StringItem str; public HelloMIDlet() display = Display.getDisplay(this); Page 172

173 mmainform = new Form("Chuong trinh so 2"); str = new StringItem(null,"Chao mung cac ban den voi MIDP"); cmdeit = new Command("Eit",Command.EXIT,0); mmainform.append(str); mmainform.addcommand(cmdeit); mmainform.setcommandlistener(this); public void startapp() display.setcurrent(mmainform); public void pauseapp() public void destroyapp(boolean unconditional) public void commandaction(command c, Displayable s) notifydestroyed(); Tạo ứng dụng MIDP Using the Visual Mobile Designer Chọn File/New Projects, trong h p tho i New Project chọn Mobility trong Categories vơ MIDP Application trong Projects, sau đó chọn Net; Nh p tên Project trong phần Project Name, thay đ i n i l u tr Project Location; Project trong M r ng th mục Configuration templates provided by installed CLDC platforms" vơ"sun Java Wireless Toolkit 2.52 for CLDC. Check chọn các configurations. Click Finish; Click chọn Set as Main Project và Create Hello MIDlet (c hai đư đ đ nh). Chọn Net; c chọn mặc Chọn Sun Java Wireless Toolkit for CLDC trong Emulator Platform (mặc đ nh). Chọn Net; Page 173

174 M r ng th mục Configuration templates provided by installed CLDC platforms" vơ"sun Java Wireless Toolkit 2.52 for CLDC. Check chọn các configurations. Chọn Finish; Sau khi đư t o ong Project, chúng ta bắt đầu vi t code. o Click chọn vào nút Screen o Trong c a s Properties, chọn vào Tet và nh p tet mu n hiển th (VD: Hello World ) Đóng gói và tải ng dụng j2me vào điện thoại Đóng gói ứng dụng Để đóng gói ng dụng j2me đư vi t trên và t i vơo đi n tho i di đ ng b n cần cài đặt công cụ Sun Wireless Toolkit, màn hình kh i đ ng c a Sun Wireless Toolkit nh sau: Trên thanh công cụ, b n chọn nút Open Project để m l i ng dụng HelloMIDlet c a b n. M t c a s Open Project s hi n lên và b n hãy chọn dự án mà b n đư t o: Theo mặc đ nh thì ng dụng c a b n s s dụng MIDP 2.0 và CLDC 1.0, mặc dù hầu h t các đi n tho i đ i m i trên th tr ng hi n nay đ u h tr MIDP 2.0, tuy nhiên n u b n s dụng đi n tho i cũ h n thì có thể nó ch h tr MIDP 1.0. Để bi t chính ác Page 174

175 đi n tho i c a b n có h tr Java hay không và n u h tr thì h tr MIDP 1.0 hay MIDP 2.0, b n có thể em l i tài li u kèm theo khi b n mua đi n tho i hoặc lên trang web c a nhà s n u t để kiểm tra. Tôi gi s đi n tho i c a b n ch h tr MIDP 1.0, vì v y chúng ta cần c u hình l i tuỳ chọn này c a dự án. Trong c a s KToolbar, trên thanh thực đ n b n hãy chọn Project -> Setting..., m t c a s Setting for project HelloSuite s hi n ra. Trong tuỳ chọn Target Platform, b n hưy đ i t JTWI thơnh MIDP 1.0 nh hình sau: Cũng trong c a s này, b n chọn tab th 2 có tên lơ Required. Đơy lơ tab cho phép b n thay đ i các thông s chính c a ng dụng c a b n. Nh ng thông s này giúp cho phần m m qu n lý ng dụng c a đi n tho i bi t đ c các thông tin v ng dụng c a b n. Trong tab này b n s th y 2 thông tin quan trọng mà b n có thể thay đ i, đó lơ MIDletVendor và MIDlet-Version: MIDlet-Vendor là thông tin v nhà s n u t ng dụng, các b n có thể s a l i thành tên c a các b n. Còn MIDlet-Version là thông tin v phiên b n v i giá tr mặc đ nh là 1.0, và n u b n nâng c p ng dụng c a b n, b n cũng nên nơng s phiên b n lên thành các giá tr l n h n nh 1.1 hay 2.0. Sau khi thay đ i các tuỳ chọn này, b n nh n nút OK để l u l i thông s c u hình này: Page 175

176 K ti p, b n đóng gói ng dụng c a b n bằng cách chọn thực đ n Project Package Create Package nh hình sau: Sau khi ch y ong, trên màn hình thông tin c a KToolbar s hi n lên thông tin báo thơnh công nh sau: Wrote C:\soft\WTK22\apps\HelloSuite\bin\HelloSuite.jar Wrote C:\soft\WTK22\apps\HelloSuite\bin\HelloSuite.jad Build complete Nh v y là b n đư hoơn t t vi c t o ra 2 t p tin HelloSuite.jar và HelloSuite.jad để sẵn sàng cho vi c chuyển vơo trong đi n tho i th t. Bây gi b n hãy dùng Windows Eplorer để em 2 t p tin nơy đ c t o ra trên đĩa c ng c a b n. Page 176

177 Tải ứng dụng vào thiết bị di động qua Internet Có 2 cách để làm vi c này: Cách th nh t là thông qua k t n i m ng gi a máy vi tính c a b n vơ máy đi n tho i, và k t n i này có thể thông qua cáp USB, c ng h ng ngo i hoặc bluetooth. Tuy nhiên cách th nh t này phụ thu c vào kh năng c a đi n tho i c a b n và không ph i t t c các đi n tho i đ u h tr cách th nh t này. Cách th hai là cách t ng quát và có thể áp dụng cho hầu h t các đi n tho i h tr Java, đó lơ thông qua k t n i Internet. Cách th 2 nơy cũng lơ cách giúp cho n n công nghi p game và ng dụng trên đi n tho i di đ ng phát triển m nh vì thông qua cách này nhà s n u t và nhà phân ph i có thể thu đ c ti n c a ng i dùng cu i. T t nhiên lơ cách nơy đòi h i đi n tho i c a b n đư đ c c u hình để k t n i Internet thông qua trình duy t WAP có sẳn bên trong máy. Để cơi đặt ng dụng MIDlet c a b n qua Internet, b n cần có m t máy ch web (web server) ch y trên m t đ a ch IP thực (là IP mà b t kỳ ai trên th gi i có thể truy c p đ c) hoặc thông qua m t tên mi n (domain, ví dụ B n cũng cần có quy n qu n tr máy ch nơy để có thể thay đ i thông s c u hình để có thể thêm vào kiểu MIME (Multipurpose Internet Mail Echange) cho các t p tin có phần m r ng là.jad và.jar. N u máy ch c a b n ch y trên phần m m Tomcat (download t i thì b n không cần ph i c u hình gì thêm vì mặc đ nh Tomcat đư h tr các t p tin có phần m r ng này. N u máy ch c a b n là Apache thì b n hãy thay đ i t p tin mime.types và thêm vào các kiểu m r ng sau: tet/vnd.sun.j2me.app-descriptor jad application/java-archive jar Bằng cách c u hình này b n đư thông báo cho trình duy t web hoặc b t kỳ ch ng trình nào truy c p vào máy ch web bi t cách lý các t p tin này khi t i chúng v t máy ch web. Page 177

Google Apps Premier Edition

Google Apps Premier Edition Google Apps Premier Edition THÔNG TIN LIÊN H www.google.com/a/enterprise Email: apps-enterprise@google.com Nh ng gi i pháp m nh. i m i c a Google. Chi phí th p. i Google Apps Premier Edition, b n có th

More information

PH NG PH P D¹Y HäC TÝCH CùC TRONG GI O DôC MÇM NON

PH NG PH P D¹Y HäC TÝCH CùC TRONG GI O DôC MÇM NON NGUYỄN THỊ CẨM BÍCH MODULE mn 20 PH NG PH P D¹Y HäC TÝCH CùC TRONG GI O DôC MÇM NON 69 A. GIỚI THIỆU TỔNG QUAN Ph ng pháp d y h c là m t trong nh ng y u t quan tr ng c a quá trình d y h c. quá trình d

More information

KHI X L T SÔNG H NG VÀO SÔNG ÁY

KHI X L T SÔNG H NG VÀO SÔNG ÁY XÂY D NG B N NG P L T KHU V C H DU TÓM T T T KHI X L T SÔNG H NG VÀO SÔNG ÁY Lê Vi t S n 1 Bài báo này trình bày k t qu nghiên c u, ánh giá r i ro ng p l vùng h du sông áy khi x l t sông H ng vào sông

More information

Ngô Nh Khoa và cs T p chí KHOA H C & CÔNG NGH 58(10): 35-40

Ngô Nh Khoa và cs T p chí KHOA H C & CÔNG NGH 58(10): 35-40 XÂY DỰNG PHƯƠNG THỨC TRUYỀN THÔNG TRỰC TIẾP GIỮA PC VÀ PLC ỨNG DỤNG TRONG HỆ ĐIỀU KHIỂN GIÁM SÁT TRẠM TRỘN BÊ TÔNG Ngô Như Khoa 1*, Nguyễn Văn Huy 2 1 Đại học Thái Nguyên, 2 Trường Đại học KTCN - Đại học

More information

CHƯƠNG TRÌNH DỊCH BÀI 14: THUẬT TOÁN PHÂN TÍCH EARLEY

CHƯƠNG TRÌNH DỊCH BÀI 14: THUẬT TOÁN PHÂN TÍCH EARLEY CHƯƠNG TRÌNH DỊCH BÀI 14: THUẬT TOÁN PHÂN TÍCH EARLEY Nội dung 1. Giới thiệu 2. Ý tưởng cơ bản 3. Mã minh họa 4. Ví dụ 5. Đánh giá thuật toán 6. Bài tập TRƯƠNG XUÂN NAM 2 Phần 1 Giới thiệu TRƯƠNG XUÂN

More information

PHÂN TÍCH DỮ LIỆU BẰNG PHẦN MỀM SPSS 12.0 * PHẦN 4

PHÂN TÍCH DỮ LIỆU BẰNG PHẦN MỀM SPSS 12.0 * PHẦN 4 PHÂN TÍCH DỮ LIỆU BẰNG PHẦN MỀM SPSS 12.0 * PHẦN 4 Nội dung chính trong phần này: 1. Khai báo các thông số của biến 2. Tạo biến giả 3. Hồi quy OLS kết hợp với phương pháp Stepwise * SPSS 12.0 là sản phẩm

More information

log23 (log 3)/(log 2) (ln 3)/(ln2) Attenuation = 10.log C = 2.B.log2M SNR db = 10.log10(SNR) = 10.log10 (db) C = B.log2(1+SNR) = B.

log23 (log 3)/(log 2) (ln 3)/(ln2) Attenuation = 10.log C = 2.B.log2M SNR db = 10.log10(SNR) = 10.log10 (db) C = B.log2(1+SNR) = B. Tính log 2 3, thì sẽ bấm như sau (log 3)/(log 2) hoặc (ln 3)/(ln2) Độ suy giảm tính hiệu: Attenuation = 10.log 10 ( ) (db) với - P signal là công suất tín hiệu nhận - công suất đầu vào (input signal power)

More information

Th vi n Trung Tâm HQG-HCM s u t m

Th vi n Trung Tâm HQG-HCM s u t m U N XIN VI C B NG TI NG VI T NG HÒA XÃ H I CH NGH A VI T NAM c l p T do H nh phúc N XIN VI C Kính g i:...... Tôi tên là:... Sinh ngày... tháng...n m...t i... Gi y ch ng minh nhân dân s :... p ngày... tháng...n

More information

KH O SÁT D L NG THU C TR SÂU LÂN H U C TRONG M T S CH PH M TRÀ ACTISÔ

KH O SÁT D L NG THU C TR SÂU LÂN H U C TRONG M T S CH PH M TRÀ ACTISÔ TÓM T T KH O SÁT D L NG THU C TR SÂU LÂN H U C TRONG M T S CH PH M TRÀ ACTISÔ Nguy n Th Minh Thu n*, Tr n Thanh Nhãn*, Nguy n ng Ti n ** t v n : Thu c b o v th c v t làm ô nhi m môi tr ng và c bi t là

More information

Các Phương Pháp Phân Tích Định Lượng

Các Phương Pháp Phân Tích Định Lượng Năm học 013-014 Chương Trình Giảng Dạy Kinh tế Fulbright Học kỳ Thu năm 013 Các Phương Pháp Phân Tích Định Lượng Gợi ý giải Bài tập 7 HỒI QUY ĐƠN BIẾN (TIẾP THEO Ngày Phát: Thứ ba 6/11/013 Ngày Nộp: Thứ

More information

NG S VIÊN TRONG CH M SÓC

NG S VIÊN TRONG CH M SÓC Information Sheet INSERT HEADING / SPECIALTY If you have any English language difficulties, please ask staff to book an interpreter. From home contact the Telephone Interpreter Service on 9605 3056. Services

More information

Bài 3: Mô phỏng Monte Carlo. Under construction.

Bài 3: Mô phỏng Monte Carlo. Under construction. Bài 3: Mô phỏng Monte Carlo Under contruction. Giới thiệu Monte Carlo (MC) là phương pháp dùng ố ngẫu nhiên để lấy mẫu (ampling) trong một tập hợp Thuật ngữ Monte Carlo được ử dụng lần đầu bởi Metropoli

More information

Why does the motion of the Pioneer Satellite differ from theory?

Why does the motion of the Pioneer Satellite differ from theory? Why does the motion of the Pioneer Satellite differ from theory? Le Van Cuong cuong_le_van@yahoo.com Information from Science journal shows that the motion of the Pioneer satellite, which was launched

More information

5 Dùng R cho các phép tính đơn giản và ma trận

5 Dùng R cho các phép tính đơn giản và ma trận 5 Dùng R cho các phép tính đơn giản và ma trận Một trong những lợi thế của R là có thể sử dụng như một máy tính cầm tay. Thật ra, hơn thế nữa, R có thể sử dụng cho các phép tính ma trận và lập chương.

More information

BÁO CÁO THỰC HÀNH KINH TẾ LƯỢNG

BÁO CÁO THỰC HÀNH KINH TẾ LƯỢNG BÁO CÁO THỰC HÀNH KINH TẾ LƯỢNG THÀNH VIÊN : 1. Nguyễn Ngọc Linh Kha 08066K. Nguyễn Thị Hải Yến 080710K. Hồ Nữ Cẩm Thy 08069K 4. Phan Thị Ngọc Linh 080647K 5. Trần Mỹ Linh 080648K L p 08TT1D_KHOÁ 1 Page

More information

À N. á trong giáo d. Mã s HÀ N NGHIÊN C ÊN NGÀNH TÓM T

À N. á trong giáo d. Mã s HÀ N NGHIÊN C ÊN NGÀNH TÓM T VI À N C K NGHIÊN C ÊN NGÀNH Mã s á trong giáo d TÓM T HÀ N - 2016 Công trình àn thành t Ph Ph Vi HQGHN c: 1. PGS.TS. Ngô Doãn ãi 2. TS. Nguy... Ph... Lu...... ti... vào h Có th ìm - - Trung tâm Thông

More information

Đánh giá: ❶ Bài tập (Quiz, In-Class) : 20% - Quiz (15-30 phút): chiếm 80%; 5 bài chọn 4 max TB - In-Class : chiếm 20% ; gọi lên bảng TB

Đánh giá: ❶ Bài tập (Quiz, In-Class) : 20% - Quiz (15-30 phút): chiếm 80%; 5 bài chọn 4 max TB - In-Class : chiếm 20% ; gọi lên bảng TB 404001 - Tín hiệu và hệ thống CBGD: Trần Quang Việt Liên hệ : Bộ môn CSKTĐ P.104 nhà B3 Email : tqviethcmut@gmail.com ; tqviet@hcmut.edu.vn Tài liệu tham khảo [1] B. P. Lathi, Signal Processing and Linear

More information

Năm 2015 O A O OB O MA MB = NA

Năm 2015 O A O OB O MA MB = NA hép vị tự quay Nguyễn Văn Linh Năm 2015 1 Giới thiệu hép vị tự và phép quay là những phép biến hình quen thuộc. Tuy nhiên phép vị tự quay còn ít được đề cập tới. Vì vậy trong bài viết này xin giới thiệu

More information

Thông tin mang tính a lý trên m t vùng lãnh th bao g m r t nhi u l p d li u khác nhau (thu c n v hành chánh nào, trên lo i t nào, hi n tr ng s d ng

Thông tin mang tính a lý trên m t vùng lãnh th bao g m r t nhi u l p d li u khác nhau (thu c n v hành chánh nào, trên lo i t nào, hi n tr ng s d ng Ch ng 3 PHÁT TRI N D LI U Thông tin mang tính a lý trên m t vùng lãnh th bao g m r t nhi u l p d li u khác nhau (thu c n v hành chánh nào, trên lo i t nào, hi n tr ng s d ng t là gì,... ) và m i d li u

More information

Chapter#2 Tính chất của vật chất (Properties of Substances)

Chapter#2 Tính chất của vật chất (Properties of Substances) Chapter#2 Tính chất của vật chất (Properties o Substances) Mục đích của chương Làm quen với một số khái niệm về tính chất của vật chất, chất tinh khiết. Làm quen với các dạng năng lượng và sự biến đổi

More information

VÔ TUYẾN ĐIỆN ĐẠI CƯƠNG. TS. Ngô Văn Thanh Viện Vật Lý

VÔ TUYẾN ĐIỆN ĐẠI CƯƠNG. TS. Ngô Văn Thanh Viện Vật Lý Ô TUYẾN ĐỆN ĐẠ CƯƠNG TS. Ngô ăn Thanh iện ật Lý Hà Nội 2016 2 Tài liệu tham khảo [1] David B. Rutledge, The Electronics of Radio (Cambridge University Press 1999). [2] Dennis L. Eggleston, Basic Electronics

More information

Mục tiêu. Hiểu được. Tại sao cần phải định thời Các tiêu chí định thời Một số giải thuật định thời

Mục tiêu. Hiểu được. Tại sao cần phải định thời Các tiêu chí định thời Một số giải thuật định thời ĐỊNH THỜI CPU Mục tiêu Hiểu được Tại sao cần phải định thời Các tiêu chí định thời Một số giải thuật định thời Ghi chú: những slide có dấu * ở tiêu đề là những slide dùng để diễn giải thêm Định thời CPU

More information

Luâ t Chăm So c Sư c Kho e Mơ i va Medicare

Luâ t Chăm So c Sư c Kho e Mơ i va Medicare Luâ t Chăm So c Sư c Kho e Mơ i va Medicare Nê u quy vi cu ng như nhiê u ngươ i kha c co Medicare, quy vi co thê thă c mă c luâ t chăm so c sư c kho e mơ i co y nghi a gi vơ i quy vi. Mô t sô ca c thay

More information

KHÁI niệm chữ ký số mù lần đầu được đề xuất bởi D. Chaum [1] vào năm 1983, đây là

KHÁI niệm chữ ký số mù lần đầu được đề xuất bởi D. Chaum [1] vào năm 1983, đây là LƯỢC ĐỒ CHỮ KÝ SỐ MÙ XÂY DỰNG TRÊN BÀI TOÁN KHAI CĂN Nguyễn Tiền Giang 1, Nguyễn Vĩnh Thái 2, Lưu Hồng Dũng 3 Tóm tắt Bài báo đề xuất một lược đồ chữ ký số mù phát triển từ một dạng lược đồ chữ ký số được

More information

hoctoancapba.com Kho đ ề thi THPT quốc gia, đ ề kiểm tra có đáp án, tài liệu ôn thi đại học môn toán

hoctoancapba.com Kho đ ề thi THPT quốc gia, đ ề kiểm tra có đáp án, tài liệu ôn thi đại học môn toán hoctoncpb.com xin giới thiệu Tuyển chọn các bài ÌN Ọ KÔNG GIN trong 1 Đ Ề TI T Ử TÂY NIN 15 y vọng tài liệu này s ẽ giúp các em học sinh ôn tập tốt hơn chuyên đề ÌN Ọ KÔNG GIN trong k ỳ thi TPT QG sắp

More information

GIÁO H I PH T GIÁO VI T NAM TH NG NH T

GIÁO H I PH T GIÁO VI T NAM TH NG NH T BUREAU INTERNATIONAL D'INFORMATION BOUDDHISTE INTERNATIONAL BUDDHIST INFORMATION BUREAU PHÒNG THÔNG TIN PH T GIÁO QU C T C quan Thông tin và Phát ngôn c a Vi n Hóa Ð o, Giáo h i Ph t giáo Vi t Nam Th ng

More information

1. chapter G4 BA O CA O PHA T TRIÊ N BÊ N VƯ NG

1. chapter G4 BA O CA O PHA T TRIÊ N BÊ N VƯ NG 1. chapter G4 HƯƠ NG DÂ N BA O CA O PHA T TRIÊ N BÊ N VƯ NG 1 MU C LU C 1. GIƠ I THIÊ U 4 2. CA CH SƯ DU NG SA CH HƯƠ NG DÂ N THƯ C HIÊ N 6 3. NGUYÊN TĂ C BA O CA O 8 3.1 Nguyên tă c Xa c đi nh Nô i dung

More information

15 tháng 06 năm 2014.

15 tháng 06 năm 2014. BỘ GIÁO DỤC VÀ ĐÀO TẠO ĐẠI HỌC ĐÀ NẴNG NGUYỄN THỊ HOÀI THANH MỘT SỐ PHƯƠNG PHÁP GIẢI BÀI TOÁN BẤT ĐẲNG THỨC BIẾN PHÂN Chuyên ngành : Phương pháp Toán sơ cấp Mã số : 60 46 0113 TÓM TẮT LUẬN VĂN THẠC SĨ

More information

Đầu Nối Cáp T 630A 93-EE9X5-4-Exp-A-3/C Series Đầu Nối T : 24 kv 125 kv BIL Đáp ứng các tiêu chuẩn : IEC 502-4, VDE 0278 Hướng Dẫn Sử Dụng

Đầu Nối Cáp T 630A 93-EE9X5-4-Exp-A-3/C Series Đầu Nối T : 24 kv 125 kv BIL Đáp ứng các tiêu chuẩn : IEC 502-4, VDE 0278 Hướng Dẫn Sử Dụng Đầu Nối Cáp T 630A 93-EE9X5-4-Exp-A-3/C Series Đầu Nối T : 24 kv 125 kv BIL Đáp ứng các tiêu chuẩn : IEC 502-4, VDE 0278 Hướng Dẫn Sử Dụng Mã hiệu sản phẩm Đường kính lõi cách điện cáp (mm) Cỡ cáp (mm2)

More information

HƯỚNG DẪN SỬ DỤNG PHẦN MỀM DIỆT VIRUS AVIRA

HƯỚNG DẪN SỬ DỤNG PHẦN MỀM DIỆT VIRUS AVIRA HƯỚNG DẪN SỬ DỤNG PHẦN MỀM DIỆT VIRUS AVIRA A V I R A A N T O À N H Ơ N Trang 1 Mục lục 1. Mở chương trình... 3 2. Giao Diện Chính Của Chương Trình... 4 3. Quét Virus... 7 4. Theo dõi bảo mật cho kết nối

More information

CH NG IV TH C HI N PH NG PHÁP T NG H P CHO QUY HO CH S D NG B N V NG NGU N TÀI NGUYÊN T AI

CH NG IV TH C HI N PH NG PHÁP T NG H P CHO QUY HO CH S D NG B N V NG NGU N TÀI NGUYÊN T AI CH NG IV TH C HI N PH NG PHÁP T NG H P CHO QUY HO CH S D NG B N V NG NGU N TÀI NGUYÊN T AI I. M C ÍCH - Rà soát và phát tri n chính sách h tr cho nh ng s d ng t ai t t nh t và qu n lý b n v ng ngu n tài

More information

NGHIÊN C U XU T XÂY D NG H H TR RA QUY T NH KHÔNG GIAN CHO THOÁT N C Ô TH B NG CÁC GI I PHÁP CÔNG TRÌNH

NGHIÊN C U XU T XÂY D NG H H TR RA QUY T NH KHÔNG GIAN CHO THOÁT N C Ô TH B NG CÁC GI I PHÁP CÔNG TRÌNH NGHIÊN C U XU T XÂY D NG H H TR RA QUY T NH KHÔNG GIAN CHO THOÁT N C Ô TH B NG CÁC GI I PHÁP CÔNG TRÌNH Lê Trung Ch n 1, Kh u Minh C nh 1 TÓM T T T Vi c nâng ng/ ào kênh s nh h ng n tích l y dòng ch y.

More information

LÝ LỊCH KHOA HỌC. CỘNG HOÀ XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập - Tự do - Hạnh phúc BỘ Y TẾ TRƯỜNG ĐẠI HỌC DƯỢC HÀ NỘI. 1. Họ và tên: Vũ Đặng Hoàng

LÝ LỊCH KHOA HỌC. CỘNG HOÀ XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập - Tự do - Hạnh phúc BỘ Y TẾ TRƯỜNG ĐẠI HỌC DƯỢC HÀ NỘI. 1. Họ và tên: Vũ Đặng Hoàng BỘ Y TẾ TRƯỜNG ĐẠI HỌC DƯỢC HÀ NỘI CỘNG HOÀ XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập - Tự do - Hạnh phúc 1. Họ và tên: Vũ Đặng Hoàng LÝ LỊCH KHOA HỌC 2. Ngày tháng năm sinh: 07/01/1976 Nam Dân tộc: Kinh 3. Quê

More information

Phâ n thông tin ba o ha nh cu a ASUS

Phâ n thông tin ba o ha nh cu a ASUS Phâ n thông tin ba o ha nh cu a ASUS VN13459 v7 Ông/ Bà: Sô điê n thoa i: Đi a chi : Address: E-mail: Nga y mua: / / (nga y/tha ng/năm) Tên đa i ly : Sô điê n thoa i đa i ly : Đi a chi đa i ly : Sô seri

More information

sao cho a n 0 và lr(a n ) = Ra n X a n với X a n R R. Trong bài báo này, chúng Z r (R) (t.ư., Z l (R)).

sao cho a n 0 và lr(a n ) = Ra n X a n với X a n R R. Trong bài báo này, chúng Z r (R) (t.ư., Z l (R)). TẠP CHÍ KHOA HỌC, Đại học Huế, Tập 74B, Số 5, (2012), 33-42 VỀ VÀNH HẦU NIL-NỘI XẠ YẾU Trương Công Quỳnh 1, Hoàng Thị Hà 2 1 Trường Đại học Sư phạm, Đại học Đà Nẵng 2 Trường THPT chuyên Lê Quý Đôn, Quảng

More information

PHÂN TÍCH T & CÂN BẰNG B

PHÂN TÍCH T & CÂN BẰNG B Chương VI PHÂN TÍCH T TRỌNG LƯỢNG & CÂN BẰNG B TẠO T O TỦAT (Gravimetric analysis & Precipitation Equilibria) Ts. Phạm Trần Nguyên Nguyên ptnnguyen@hcmus.edu.vn A. Đặc điểm chung của phân tích trọng lượng.

More information

KHÁM PHÁ CHI C CHEVROLET COLORADO DÀNH RIÊNG CHO NH NG CH NHÂN KHÔNG NG I B T PHÁ

KHÁM PHÁ CHI C CHEVROLET COLORADO DÀNH RIÊNG CHO NH NG CH NHÂN KHÔNG NG I B T PHÁ COLORADO M I KHÁM PHÁ CHI C CHEVROLET COLORADO DÀNH RIÊNG CHO NH NG CH NHÂN KHÔNG NG I B T PHÁ h danh bi u t ng bán t i M, Chevrolet Colorado m i v i đ ng c VGT Turbo diesel Duramax m nh m b t phá lên

More information

GIÁO TRÌNH Mô phỏng và mô hình hóa (Bản nháp) Trịnh Xuân Hoàng Viện Vật lý, Viện Hàn lâm KHCN VN Hà Nội 2015

GIÁO TRÌNH Mô phỏng và mô hình hóa (Bản nháp) Trịnh Xuân Hoàng Viện Vật lý, Viện Hàn lâm KHCN VN Hà Nội 2015 GIÁO TRÌNH Mô phỏng và mô hình hóa (Bản nháp) Trịnh Xuân Hoàng Viện Vật lý, Viện Hàn lâm KHCN VN Hà Nội 2015 Mục lục 1 Giới thiệu 2 1.1 Một số khái niệm................................. 2 1.2 Phân loại

More information

NGHIÊN CỨU TIÊU CHUẨN VÀ PHƯƠNG PHÁP TỐI ƯU CÔNG SUẤT PHÁT CỦA HỆ THỐNG ĐIỆN MẶT TRỜI NỐI LƯỚI: XÉT CHO TRƯỜNG HỢP LƯỚI ĐIỆN HẠ THẾ 1 PHA

NGHIÊN CỨU TIÊU CHUẨN VÀ PHƯƠNG PHÁP TỐI ƯU CÔNG SUẤT PHÁT CỦA HỆ THỐNG ĐIỆN MẶT TRỜI NỐI LƯỚI: XÉT CHO TRƯỜNG HỢP LƯỚI ĐIỆN HẠ THẾ 1 PHA NGHIÊN CỨU TIÊU CHUẨN VÀ PHƯƠNG PHÁP TỐI ƯU CÔNG SUẤT PHÁT CỦA HỆ THỐNG ĐIỆN MẶT TRỜI NỐI ƯỚI: XÉT CHO TRƯỜNG HỢP ƯỚI ĐIỆN HẠ THẾ 1 PHA Xuan Truong Nguyen, Dinh Quang Nguyen, Tung Tran To cite this version:

More information

C M NANG AN TOÀN SINH H C PHÒNG THÍ NGHI M

C M NANG AN TOÀN SINH H C PHÒNG THÍ NGHI M C M NANG AN TOÀN SINH H C PHÒNG THÍ NGHI M Xu t b n l n th 3 T ch c Y t Th gi i Geneva 2004 Hi u ính Th c s Ph m V n H u, Vi n V sinh D ch t Tây Nguyên Th c s Nguy n Th Thu H ng, i h c Qu c gia Hà N i

More information

TỐI ƯU HÓA ĐA MỤC TIÊU ỨNG DỤNG XÁC LẬP CHẾ ĐỘ CÔNG NGHỆ SẤY THĂNG HOA (STH) TÔM THẺ

TỐI ƯU HÓA ĐA MỤC TIÊU ỨNG DỤNG XÁC LẬP CHẾ ĐỘ CÔNG NGHỆ SẤY THĂNG HOA (STH) TÔM THẺ THOÂNG BAÙO KHOA HOÏC TỐI ƯU HÓA ĐA MỤC TIÊU ỨNG DỤNG XÁC LẬP CHẾ ĐỘ CÔNG NGHỆ SẤY THĂNG HOA (STH) TÔM THẺ MULTI-OBJECTIVE OPTIMIZATION APPLIED TO DETERMINE REGIME TECHNOLOGICAL FREEZE DRYING OF PENAEUS

More information

TH TR NG HÀNG KHÔNG, KHÔNG GIAN VI T NAM

TH TR NG HÀNG KHÔNG, KHÔNG GIAN VI T NAM TH TR NG HÀNG KHÔNG, KHÔNG GIAN VI T NAM Tr n B ng, (X2000-Supaéro 2004), Eurocopter. Th tr ng v n t i hàng không Vi t Nam N n kinh t Vi t Nam ã t c nh ng thành t u áng k sau khi chuy n sang n n kinh t

More information

GIÁO TRÌNH LÝ THUY T C B N V M NG LAN

GIÁO TRÌNH LÝ THUY T C B N V M NG LAN GIÁO TRÌNH LÝ THUY T C B N V M NG LAN C L C Ch ng I: GI I THI U CHUNG... 1 I. M NG TRUY N THÔNG VÀ CÔNG NGH M NG...1 1. Gi i thi u chung...1 2 Th nào là m t m ng máy tính...3 2.1. Các thành ph n m ng:

More information

DỰ BÁO TƯỚNG THẠCH HỌC VÀ MÔI TRƯỜNG TRẦM TÍCH CHO ĐÁ CHỨA CARBONATE PHÍA NAM BỂ SÔNG HỒNG, VIỆT NAM

DỰ BÁO TƯỚNG THẠCH HỌC VÀ MÔI TRƯỜNG TRẦM TÍCH CHO ĐÁ CHỨA CARBONATE PHÍA NAM BỂ SÔNG HỒNG, VIỆT NAM DỰ BÁO TƯỚNG THẠCH HỌC VÀ MÔI TRƯỜNG TRẦM TÍCH CHO ĐÁ CHỨA CARBONATE PHÍA NAM BỂ SÔNG HỒNG, VIỆT NAM Tóm tắt ThS. Đỗ Thế Hoàng, TS. Nguyễn Hải An, ThS. Trần Huy Dư Tổng công ty Thăm dò Khai thác Dầu khí

More information

System AR.12_13VI 01/ with people in mind

System AR.12_13VI 01/ with people in mind System 2000 H ng d n S d ng 04.AR.12_13VI 01/2018...with people in mind C NH BÁO tránh th ng tích, hãy luôn c H ng d n S d ng này và các tài li u kèm theo tr c khi s d ng s n ph m. B t bu c ph i c H ng

More information

NGUỒN THÔNG TIN MIỄN PHÍ TRÊN INTERNET : ĐÁNH GIÁ VÀ SỬ DỤNG DƯƠNG THÚY HƯƠNG Phòng Tham khảo Thư viện ĐH Khoa học Tự nhiên TP.

NGUỒN THÔNG TIN MIỄN PHÍ TRÊN INTERNET : ĐÁNH GIÁ VÀ SỬ DỤNG DƯƠNG THÚY HƯƠNG Phòng Tham khảo Thư viện ĐH Khoa học Tự nhiên TP. NGUỒN THÔNG TIN MIỄN PHÍ TRÊN INTERNET : ĐÁNH GIÁ VÀ SỬ DỤNG DƯƠNG THÚY HƯƠNG Phòng Tham khảo Thư viện ĐH Khoa học Tự nhiên TP. HCM M ột trong những chức năng quan trọng hiện nay của thư viện đại học là

More information

SỞ GD & ĐT BẮC NINH ĐÊ TẬP HUẤN THI THPT QUỐC GIA NĂM Đề bài y x m 2 x 4. C. m 2. có bảng biến thiên như hình dưới đây:

SỞ GD & ĐT BẮC NINH ĐÊ TẬP HUẤN THI THPT QUỐC GIA NĂM Đề bài y x m 2 x 4. C. m 2. có bảng biến thiên như hình dưới đây: SỞ GD & ĐT BẮC NINH ĐÊ TẬP HUẤN THI THPT QUỐC GIA NĂM 08 Môn: Toán Đề bài 4 y m 4 Câu : Tìm tất cả các giá trị của tham số m để hàm số cực trị. m m Câu : Gọi M là giao điểm của đồ thị hàm số tuyến với

More information

NHẬP MÔN HIỆN ĐẠI XÁC SUẤT & THỐNG KÊ

NHẬP MÔN HIỆN ĐẠI XÁC SUẤT & THỐNG KÊ Hanoi Center for Financial and Industrial Mathematics Trung Tâm Toán Tài Chính và Công Nghiệp Hà Nội NHẬP MÔN HIỆN ĐẠI XÁC SUẤT & THỐNG KÊ Đỗ Đức Thái và Nguyễn Tiến Dũng Hà Nội Toulouse, 2010 ii Bản thảo

More information

NHẬT BÁO THẲNG TIẾN 11

NHẬT BÁO THẲNG TIẾN 11 NHẬT BÁO THẲNG TIẾN 11 Thứ Hai, ngày 02, Tháng Bẩy, Năm 2018 H i ng Trung ng / H ng o Vi t Nam và Soát Viên tài chánh, 2018 T Các c : T : Nhánh T T : -2018 H Sau p T / T 2018-2022 Soát Viên Tài chánh:

More information

Hà Nội, ngày 22 tháng 1 năm 2012 (ngày Tất niên năm Nhâm Thìn) Đại diện nhóm biên soạn Chủ biên Hoàng Minh Quân Phan Đức Minh

Hà Nội, ngày 22 tháng 1 năm 2012 (ngày Tất niên năm Nhâm Thìn) Đại diện nhóm biên soạn Chủ biên Hoàng Minh Quân Phan Đức Minh LỜI NÓI ĐẦU Ngay từ năm 1736, nhà toán học Euler đã giải quyết thành công bài toán tổ hợp về bảy cây cầu ở thành phố Königsberg, Đức (nay là Kaliningrad, Nga) nằm trên sông Pregel, bao gồm hai hòn đảo

More information

TÓM TẮT ĐỀ TÀI NGHIÊN CỨU

TÓM TẮT ĐỀ TÀI NGHIÊN CỨU ĐẠI HỌC QUỐC GIA TP.HCM TRƯỜNG ĐH KHOA HỌC TỰ NHIÊN TÓM TẮT ĐỀ TÀI NGHIÊN CỨU Họ và tên nghiên cứu sinh: Họ và tên cán bộ hướng dẫn chính: Họ và tên cán bộ hướng dẫn phụ: Huỳnh Trần Mỹ Hòa PGS-TS Trần

More information

ĐƠN KHIÊ U NA I/THAN PHIỀN CU A HÔ I VIÊN. Đi a chi Tha nh phô Tiê u bang Ma zip

ĐƠN KHIÊ U NA I/THAN PHIỀN CU A HÔ I VIÊN. Đi a chi Tha nh phô Tiê u bang Ma zip ĐƠN KHIÊ U NA I/THAN PHIỀN CU A HÔ I VIÊN Ngày: Xin vui lo ng viết in tâ t ca thông tin. Thông tin về người nộp đơn than phiền: ( ) ( ) Tên Sô điê n thoa i nơi la m viê c Sô điê n thoa i nha riêng Đi a

More information

Mã khối không thời gian trực giao và điều chế lưới

Mã khối không thời gian trực giao và điều chế lưới Mã khối không thời gian trực giao và điều chế lưới Nguyễn Thị Hương Trường Đại học Công nghệ Chuyên ngành: Kỹ thuật Điện tử; Mã số: 60 5 70 Cán bộ hướng dẫn khoa học: PGS.TS. Trịnh Anh Vũ Năm bảo vệ: 01

More information

Tạp chí Tin học và Điều khiển học, T.29, S.3 (2013), 221 231 ĐỒNG BỘ THÍCH NGHI MẠNG CNN HỖN LOẠN VÀ ỨNG DỤNG TRONG BẢO MẬT TRUYỀN THÔNG ĐÀM THANH PHƯƠNG 1, PHẠM THƯỢNG CÁT 2 1 Trường Đại học Công nghệ

More information

AMERICAN INTERNATIONAL SCHOOL IS A LIFE-LONG COMPANION IN YOUR POSITIVE FUTURE AND WE ALL BEGIN WITH A YES

AMERICAN INTERNATIONAL SCHOOL IS A LIFE-LONG COMPANION IN YOUR POSITIVE FUTURE AND WE ALL BEGIN WITH A YES AMERICAN INTERNATIONAL SCHOOL IS A LIFE-LONG COMPANION IN YOUR POSITIVE FUTURE AND WE ALL BEGIN WITH A YES HIGH SCHOOL A Quick Overview of the American International School 850 students, Pre-Kindergarten

More information

PHÂN TÍCH PHÂN BỐ NHIỆT HYDRAT VÀ ỨNG SUẤT TRONG CẤU TRÚC BÊ TÔNG ĐỂ KIỂM SOÁT SỰ GÂY NỨT CỦA CÔNG TRÌNH BÊ TÔNG CỐT THÉP

PHÂN TÍCH PHÂN BỐ NHIỆT HYDRAT VÀ ỨNG SUẤT TRONG CẤU TRÚC BÊ TÔNG ĐỂ KIỂM SOÁT SỰ GÂY NỨT CỦA CÔNG TRÌNH BÊ TÔNG CỐT THÉP PHÂN TÍCH PHÂN BỐ NHIỆT HYDRAT VÀ ỨNG SUẤT TRONG CẤU TRÚC BÊ TÔNG ĐỂ KIỂM SOÁT SỰ GÂY NỨT CỦA CÔNG TRÌNH BÊ TÔNG CỐT THÉP THERMAL STRESS ANALYSIS OF EARLY- AGE CONCRETE STRUCTURES FOR CRACKING CONTROL

More information

TẠO PAN ĐỘNG CƠ Ô TÔ ĐIỀU KHIỂN BẰNG MÁY TÍNH

TẠO PAN ĐỘNG CƠ Ô TÔ ĐIỀU KHIỂN BẰNG MÁY TÍNH Kỷ yếu Hội nghị Khoa học Quốc gia lần thứ IX Nghiên cứu cơ bản và ứng dụng Công nghệ thông tin (FAIR'9) ; Cần Thơ, ngày 4-5/8/2016 DOI: 10.15625/vap.2016.00087 TẠO PAN ĐỘNG CƠ Ô TÔ ĐIỀU KHIỂN BẰNG MÁY

More information

CƠ SỞ VẬT LÝ HẠT NHÂN

CƠ SỞ VẬT LÝ HẠT NHÂN NGUYỄN AN SƠN CƠ SỞ VẬT LÝ HẠT NHÂN NHÀ XUẤT BẢN ĐẠI HỌC QUỐC GIA TP HỒ CHÍ MINH Lời mở đầu Kỹ thuật hạt nhân là ngành học sử dụng chùm bức xạ trong đời sống theo hai hình thức: phi năng lượng và năng

More information

Nguồn điện một chiều E mắc trong mạch làm cho diode phân cực thuận. Gọi I D là dòng điện thuận chạy qua diode và V D là hiệu thế 2 đầu diode, ta có:

Nguồn điện một chiều E mắc trong mạch làm cho diode phân cực thuận. Gọi I D là dòng điện thuận chạy qua diode và V D là hiệu thế 2 đầu diode, ta có: Chương 1: Mạch Diode CHƯƠNG I MẠCH DIODE Trong chương này, chúng ta khảo sát một số mạch ứng dụng căn bản của diode bán dẫn (giới hạn ở diode chỉnh lưu và diode zener - Các diode đặc biệt khác sẽ được

More information

Phiên bản thử nghiệm Lưu hành nội bộ - Microsoft Vietnam

Phiên bản thử nghiệm Lưu hành nội bộ - Microsoft Vietnam 0 Mục lục Word 2010 I. Những điểm mới trong Microsoft Word 2010... 4 1. Tối ưu Ribbons... 4 2. H thống menu mới l... 5 3. Chức năng Backstage View... 6 4. Chức năng Paster Preview... 7 5. Chức năng Text

More information

VieTeX (21) Nguy ên Hũ, u Ðiê, n Khoa Toán - Co, - Tin học

VieTeX (21) Nguy ên Hũ, u Ðiê, n Khoa Toán - Co, - Tin học Câu h, oi và tr, a lò, i về s, u, dụng LaTeX và VieTeX (21) Nguy ên Hũ, u Ðiê, n Khoa Toán - Co, - Tin học ÐHKHTN Hà Nội, ÐHQGHN Mục lục 21.1. Lệnh nào trong LaTeX làm khô i công thú, c có thê, ng ăt dôi

More information

T i tr ng t p trung (tr t i tr ng t p trung trên Frame). riêng c a nút. Nút có các lo i h to riêng cho: liên k t, b c t do, l c t p trung, kh i

T i tr ng t p trung (tr t i tr ng t p trung trên Frame). riêng c a nút. Nút có các lo i h to riêng cho: liên k t, b c t do, l c t p trung, kh i TH C HÀNH PH N M M SAP 2000 A. CÁC V N C B N 1. Nh ng khái ni m c b n 1.1. S k t c u - s tính 1.1.1. Nút (Node) a/ V trí c a nút: i m liên k t các ph n t. i m thay i v c tr ng v t li u. i m c n xác nh

More information

Nhiễu và tương thích trường điện từ

Nhiễu và tương thích trường điện từ Nhiễu và tương thích trường điện từ TS. NGUYỄN Việt Sơn BM Kỹ thuật đo và Tin học công nghiệp Viện Điện Departement 3I Instrumentation and Idustrial Informatics C1-108 Hanoi University of Science and Technology

More information

BẢNG GIÁ THIẾT BỊ SELEC

BẢNG GIÁ THIẾT BỊ SELEC Hình ảnh BẢNG GIÁ THIẾT BỊ SELEC ÁP DỤNG TỪ NGÀY 01/10/2015 Mã hàng Mô tả Giá (VNĐ) (Có VAT) ĐỒNG HỒ TỦ ĐIỆN DẠNG SỐ HIỂN THỊ DẠNG LED MA12 MA202 (72x72) MA302 - Đồng hồ đo Dòng điện AC gián tiếp qua CT

More information

THÔNG TIN LUẬN ÁN TIẾN SĨ

THÔNG TIN LUẬN ÁN TIẾN SĨ THÔNG TIN LUẬN ÁN TIẾN SĨ 1. Họ và tên nghiên cứu sinh: Trần Thanh Hà 2.Giới tính: Nữ 3. Ngày sinh: 20/02/1987 4. Nơi sinh: Thái Bình 5. Quyết định công nhận nghiên cứu sinh: 4050/QĐ-KHTN-CTSV ngày 19/09/2013

More information

- Cài đặt hệ số CT: 1/5-999 KA. - Nguồn cấp: AC: 240V AC ±20%, (50 / 60Hz) - 110V AC ±20%, (50 / 60Hz) - Mạng kết nối: 1 pha 2 dây hoặc 3 pha 3/4 dây

- Cài đặt hệ số CT: 1/5-999 KA. - Nguồn cấp: AC: 240V AC ±20%, (50 / 60Hz) - 110V AC ±20%, (50 / 60Hz) - Mạng kết nối: 1 pha 2 dây hoặc 3 pha 3/4 dây BẢNG GIÁ THIẾT BỊ SELEC ĐỒNG HỒ TỦ ĐIỆN DẠNG SỐ HIỂN THỊ DẠNG LED ÁP DỤNG TỪ NGÀY 01/10/2015 MA12 MA202 MA302 MA335 MV15 MV205 MV305 MV334 MF16 MF216 MF316 - Đồng hồ đo Dòng điện AC gián tiếp qua CT -

More information

SỬ DỤNG PHƯƠNG PHÁP ĐO SÂU ĐIỆN XÁC ĐỊNH CẤU TRÚC ĐỊA CHẤT VÀ QUY MÔ PHÂN BỐ CỦA THAN TRONG TRẦM TÍCH ĐỆ TAM VÙNG TRŨNG AN NHƠN - BÌNH ĐỊNH

SỬ DỤNG PHƯƠNG PHÁP ĐO SÂU ĐIỆN XÁC ĐỊNH CẤU TRÚC ĐỊA CHẤT VÀ QUY MÔ PHÂN BỐ CỦA THAN TRONG TRẦM TÍCH ĐỆ TAM VÙNG TRŨNG AN NHƠN - BÌNH ĐỊNH PETROVIETNAM Tóm tắt SỬ DỤNG PHƯƠNG PHÁP ĐO SÂU ĐIỆN XÁC ĐỊNH CẤU TRÚC ĐỊA CHẤT VÀ QUY MÔ PHÂN BỐ CỦA THAN TRONG TRẦM TÍCH ĐỆ TAM VÙNG TRŨNG AN NHƠN - BÌNH ĐỊNH ThS. Hoàng Anh Tuấn, TS. Trịnh Xuân Cường,

More information

Thông Tin An Toàn V n Ph m AAM704 INTERGARD 345 DUSTY GREY PART A. 1.2 Cách dùng ng nh t có liên quan c a các ch t ho c h n h p và cách dùng ng c l i

Thông Tin An Toàn V n Ph m AAM704 INTERGARD 345 DUSTY GREY PART A. 1.2 Cách dùng ng nh t có liên quan c a các ch t ho c h n h p và cách dùng ng c l i International Paint Pte Ltd. Thông Tin An Toàn V n Ph m AAM704 INTERGARD 345 DUSTY GREY PART A S n d ch 2 S n hi u ch nh 04/08/15 1. Chi ti t v n ph m và công ty 1.1. Tên S n Ph m INTERGARD 345 DUSTY GREY

More information

HÀM BĂM HASH FUNCTIONS. Giáo viên: Phạm Nguyên Khang

HÀM BĂM HASH FUNCTIONS. Giáo viên: Phạm Nguyên Khang HÀM BĂM HASH FUNCTIONS Giáo viên: Phạm Nguyên Khang pnkhang@cit.ctu.edu.vn Tổng quan Mục tiêu: các hàm băm (H) tạo ra bản nhận dạng (fingerprint) cho một tập tin, thông điệp hay một khối dữ liệu truyền

More information

ĐẠI HỌC QUỐC GIA HÀ NỘI TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN NGUYỄN HÀ MY

ĐẠI HỌC QUỐC GIA HÀ NỘI TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN NGUYỄN HÀ MY ĐẠI HỌC QUỐC GIA HÀ NỘI TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN --------------------- NGUYỄN HÀ MY KHẢO SÁT MỘT SỐ DẪN XUẤT HALOGEN, ANCOL, PHENOL VÀ AXIT CACBOXYLIC BẰNG PHƯƠNG PHÁP HÓA HỌC LƯỢNG TỬ LUẬN VĂN

More information

TÍNH TOÁN ĐỊNH HƯỚNG CHẾ TẠO CẤU TRÚC UVLED CHO BƯỚC SÓNG PHÁT XẠ 330nm

TÍNH TOÁN ĐỊNH HƯỚNG CHẾ TẠO CẤU TRÚC UVLED CHO BƯỚC SÓNG PHÁT XẠ 330nm TÍNH TOÁN ĐỊNH HƯỚNG CHẾ TẠO CẤU TRÚC UVLED CHO BƯỚC SÓNG PHÁT XẠ 330nm Huỳnh Hoàng Trung Trường Đại học Sư phạm Kỹ thuật Tp.HCM, Việt Nam ABSTRACT: High-efficiency Ultraviolet Light Emitting Diodes (UVLEDs)

More information

DANH T NG VI T NAM TI U S DANH T NG VI T NAM TH K XX - T P II

DANH T NG VI T NAM TI U S DANH T NG VI T NAM TH K XX - T P II Giáo H i Ph t Giáo Vi t Nam Ph t L ch 2546 2002 DANH T NG VI T NAM TI U S DANH T NG VI T NAM TH K XX - T P II - Nhà Xu t B n Tôn Giáo - Hà N i Ch biên: Thích ng B n (Word and PDF creator http://tuvienhuequang.com)

More information

NGUYỄN THỊ VIỆT HƢƠNG

NGUYỄN THỊ VIỆT HƢƠNG BỘ GIÁO DỤC VÀ ĐÀO TẠO ĐẠI HỌC THÁI NGUYÊN -----------------***----------------- NGUYỄN THỊ VIỆT HƢƠNG NGHIÊN CỨU XÂY DỰNG PHƢƠNG PHÁP ĐIỀU KHIỂN THÍCH NGHI, BỀN VỮNG HỆ EULER - LAGRANGE THIẾU CƠ CẤU CHẤP

More information

Nguyễn Thị Huyền Trang*, Lê Thị Thủy Tiên Trường Đại học bách khoa, ĐHQG tp Hồ Chí Minh,

Nguyễn Thị Huyền Trang*, Lê Thị Thủy Tiên Trường Đại học bách khoa, ĐHQG tp Hồ Chí Minh, TẠP CHÍ SINH HỌC, 2012, 34(3SE): 219-226 TĂNG HỆ SỐ NHÂN NHANH CHỒI CÂY HOA SALEM TÍM (Limonium sinuatum L. Mill) BẰNG CÁCH SỬ DỤNG KẾT HỢP CÁC CHẤT ĐIỀU HÒA SINH TRƯỞNG THỰC VẬT VÀ ADENINE TRONG NUÔI

More information

M C L C. Thông tin chung. Ho t ng doanh nghi p. Báo cáo & ánh giá BÁO CÁO THƯỜNG NIÊN Thông tin công ty. 3 Quá trình phát tri n c a INVESTCO

M C L C. Thông tin chung. Ho t ng doanh nghi p. Báo cáo & ánh giá BÁO CÁO THƯỜNG NIÊN Thông tin công ty. 3 Quá trình phát tri n c a INVESTCO M C L C Thông tin chung 2 Thông tin công ty 3 Quá trình phát tri n c a INVESTCO Ho t ng doanh nghi p 4 C c u c ông & qu n tr INVESTCO 6 Công ty con & Công ty liên doanh, liên k t Báo cáo & ánh giá 14 Báo

More information

MÔN KINH TẾ LƯỢNG (Econometric)

MÔN KINH TẾ LƯỢNG (Econometric) TRƯỜNG ĐẠI HỌC TÀI CHÍNH - MARKETING BỘ MÔN TOÁN THỐNG KÊ Slide bài giảng và bài tập MÔN KINH TẾ LƯỢNG (Econometric) Giảng viên : ThS. Nguyễn Trung Đông Tp. Hồ Chí Minh, 0-0 - 014 TRƯỜNG ĐẠI HỌC TÀI CHÍNH

More information

Saigon Oi Vinh Biet (Vietnamese Edition) By Duong Hieu Nghia chuyen dich READ ONLINE

Saigon Oi Vinh Biet (Vietnamese Edition) By Duong Hieu Nghia chuyen dich READ ONLINE Saigon Oi Vinh Biet (Vietnamese Edition) By Duong Hieu Nghia chuyen dich READ ONLINE If you are searching for the book Saigon oi Vinh Biet (Vietnamese Edition) by Duong Hieu Nghia chuyen dich in pdf format,

More information

SỔ TAY HƯỚNG DẪN SỬ DỤNG MÁY CHIẾU HITACHI CP-X3021WN

SỔ TAY HƯỚNG DẪN SỬ DỤNG MÁY CHIẾU HITACHI CP-X3021WN SỔ TAY HƯỚNG DẪN SỬ DỤNG MÁY CHIẾU HITACHI CP-X3021WN 1 MỤC LỤC I. Mô tả t h à n h p h ầ n t h iết bị..3 II. K ế t n ố i 6 III.Hướng d ẫ n s ử d ụ n g m á y c h iế u 9 I V. H ư ớ n g d ẫ n s ử d ụ n g

More information

SÁNG TH T, NGÀY

SÁNG TH T, NGÀY 4 SÁNG TH T, NGÀY 23.4.2008 07h00 08h30 Xe a i bi u t Vi n Toán h c lên Ba Vì 8h30 09h00 ón ti p i bi u t i Ba Vì 09h00 09h15 Khai m c H i th o 09h15 10h15 Ch t a: Hoàng Xuân Phú Hoàng T y (Bài gi ng m

More information

L i m. v m ng, lá có hai th : m t lo i ph t lo i thô nhám. C hai lo u dài 4,5 t u nh ng

L i m. v m ng, lá có hai th : m t lo i ph t lo i thô nhám. C hai lo u dài 4,5 t u nh ng L i m Hoa u i hoa hi m, l không thu c lo i hoa qu, m c nh (Himalaya), cao nguyên Delcan thu c hay c Tích Lan v.v S i c c Ph t Thích Ca Mâu Ni c t i cung thành Ca T La v i chân dãy Hy Mã L c C ng Hòa Nepal.

More information

(Analytical Chemistry)

(Analytical Chemistry) HÓA A PHÂN TÍCHT (Analytical Chemistry) Ts. Phạm Trần Nguyên Nguyên ptnnguyen@hcmus.edu.vn (Dành cho sinh viên Khoa Hóa, Đại Học Lạc Hồng) Nămhọc 2008-2009 HọcKỳ 2 THÔNG TIN TỔNG T QUÁT Thời lượng: 48

More information

H íng DÉN Sö DôNG MéT Sè PHÇN MÒM VUI CH I, HäC TËP TH NG DôNG CHO TRÎ MÇM NON MODULE MN HOÀNG CÔNG DỤNG

H íng DÉN Sö DôNG MéT Sè PHÇN MÒM VUI CH I, HäC TËP TH NG DôNG CHO TRÎ MÇM NON MODULE MN HOÀNG CÔNG DỤNG HOÀNG CÔNG DỤNG MODULE MN 31 H íng DÉN Sö DôNG MéT Sè PHÇN MÒM VUI CH I, HäC TËP TH NG DôNG CHO TRÎ MÇM NON LÀ M Đ Ồ DÙN G D Ạ Y HỌ C, ĐỒ C HƠI TỰ T ẠO 163 A. GIỚI THIỆU TỔNG QUAN y m nh ng d ng công ngh

More information

Ban Tô Chư c ĐH6 không ngưng ơ đo ma đa đăng pho ng a nh Passport cu a Tha i Văn Dung lên trang ma ng cu a ĐH6.

Ban Tô Chư c ĐH6 không ngưng ơ đo ma đa đăng pho ng a nh Passport cu a Tha i Văn Dung lên trang ma ng cu a ĐH6. Thông tin ma tôi nhâ n đươ c cho thâ y ră ng VOICE la tha nh phâ n chu lư c đư ng ra tô chư c Đa i Hô i Ky 6 cu a Ma ng Lươ i Tuô i Tre Lên Đươ ng. Ban tô chư c qua ng ca o râ m rô 3 yê u nhân ngươ i Viê

More information

Xuân Hòa, ngày 29 tháng 9, 2018

Xuân Hòa, ngày 29 tháng 9, 2018 VIỆN TOÁN HỌC & ĐẠI HỌC SƯ PHẠM HÀ NỘI 2 HỘI THẢO MỘT NGÀY HỆ ĐỘNG LỰC VÀ PHƯƠNG TRÌNH ĐẠO HÀM RIÊNG Xuân Hòa, ngày 29 tháng 9, 2018 CHƯƠNG TRÌNH & TÓM TẮT BÁO CÁO XUÂN HÒA, 2018 Ban tổ chức Trần Văn

More information

QCVN 19: 2009/BTNMT QUY CHUN K THUT QUC GIA V KHÍ THI CÔNG NGHIP I V I BI VÀ CÁC CHT VÔ C

QCVN 19: 2009/BTNMT QUY CHUN K THUT QUC GIA V KHÍ THI CÔNG NGHIP I V I BI VÀ CÁC CHT VÔ C CNG HÒA XÃ HI CH NGHA VIT NAM QUY CHUN K THUT QUC GIA V KHÍ THI CÔNG NGHIP I V I BI VÀ CÁC CHT VÔ C National Technical Regulation on Industrial Emission of Inorganic Substances and Dusts HÀ NI - 2009 Li

More information

Trí Tuệ Nhân Tạo. Nguyễn Nhật Quang. Viện Công nghệ Thông tin và Truyền thông Trường Đại học Bách Khoa Hà Nội

Trí Tuệ Nhân Tạo. Nguyễn Nhật Quang. Viện Công nghệ Thông tin và Truyền thông Trường Đại học Bách Khoa Hà Nội Nguyễn Nhật Quang quangnn-fit@mail.hut.edu.vn Viện Công nghệ Thông tin và Truyền thông Trường Đại học Bách Khoa Hà Nội Năm học 2009-2010 Nội dung môn học: Giới thiệu về Trí tuệ nhân tạo Tác tử Giải quyết

More information

On Approximating Solution of Boundary Value Problems

On Approximating Solution of Boundary Value Problems On Approximting Solution of Boundry Vlue Problems Nguyễn Quản Bá Hồng Đoàn Trần Nguyên Tùng Students t Fculty of Mth nd Computer Science, Ho Chi Minh University of Science, Vietnm emil. dtrngtung@live.com

More information

AIR SLEEP MODE With the air sleep sensor, the air conditioner can monitor the activity/movement level in a room and adjust the temperature and humidit

AIR SLEEP MODE With the air sleep sensor, the air conditioner can monitor the activity/movement level in a room and adjust the temperature and humidit AIR SLEEP MODE With the air sleep sensor, the air conditioner can monitor the activity/movement level in a room and adjust the temperature and humidity automatically, thus achieving the purpose of comfortable

More information

VnDoc - Tải tài liệu, văn bản pháp luật, biểu mẫu miễn phí Tóm tắt Ngữ pháp tiếng Anh lớp 6 (Cả năm)

VnDoc - Tải tài liệu, văn bản pháp luật, biểu mẫu miễn phí Tóm tắt Ngữ pháp tiếng Anh lớp 6 (Cả năm) Tóm tắt Ngữ pháp tiếng Anh lớp 6 (Cả năm) 1. Để đưa ra lời gợi ý ai đó làm việc gì với mình chúng ta sử dụng các mẫu câu sau đây: 1.1 Let s + bare infinitive - Let s go to the cinema tonight. - Let s help

More information

THÔNG TIN VỀ LUẬN ÁN TIẾN SĨ

THÔNG TIN VỀ LUẬN ÁN TIẾN SĨ THÔNG TIN VỀ LUẬN ÁN TIẾN SĨ 1. Họ và tên nghiên cứu sinh: Nguyễn Thị Kim Giang 2.Giới tính: Nữ 3. Ngày sinh: 20/7/1983 4. Nơi sinh: Hà Nội 5. Quyết định công nhận nghiên cứu sinh: số 3201/QĐ-SĐH ngày

More information

ĐỀ CƯƠNG CHI TIẾT BÀI GIẢNG (Dùng cho tiết giảng) Học phần: CHƯƠNG TRÌNH DỊCH Nhóm môn học:... Bộ môn: Khoa học máy tính Khoa (Viện): CNTT

ĐỀ CƯƠNG CHI TIẾT BÀI GIẢNG (Dùng cho tiết giảng) Học phần: CHƯƠNG TRÌNH DỊCH Nhóm môn học:... Bộ môn: Khoa học máy tính Khoa (Viện): CNTT BỘ MÔN DUYỆT Chủ nhiệm Bộ môn Ngô Hữu Phúc ĐỀ CƯƠNG CHI TIẾT BÀI GIẢNG (Dùng cho tiết giảng) Học phần: CHƯƠNG TRÌNH DỊCH Nhóm môn học:... Bộ môn: Khoa học máy tính Khoa (Viện): CNTT Thay mặt nhóm môn học

More information

NH NGH A C C THU T NG 4 PH N I NHI M HUẨN ỆNH VIỆN V VỆ SINH TAY 6 PH N II TH C H NH HU N UYỆN V GI M S T VỆ SINH TAY 9

NH NGH A C C THU T NG 4 PH N I NHI M HUẨN ỆNH VIỆN V VỆ SINH TAY 6 PH N II TH C H NH HU N UYỆN V GI M S T VỆ SINH TAY 9 Ẩ AG ƯỚG DẪ Ệ I AY G A U G 4 I I UẨ Ệ IỆ Ệ I AY 6 I.1 6 I.2 6 I.3? 6 I.4 6 I.5 7 I.5.1 8 II U UYỆ GI Ệ I AY 9 II.1 9 II.1.1 9 II.1.2 9 II.1.3 10 II.2 10 II.3 10 II.4 10 II.5 11 II.5.1 ( ) 1: 11 II.5.2

More information

Thông Tin An Toàn V n Ph m

Thông Tin An Toàn V n Ph m 1. Chi ti t v n ph m và công ty Chi Nhánh T i TP.H Chí Minh c a CTY TNHH Akzo Nobel Coating Thông Tin An Toàn V n Ph m BEA774 INTERSMOOTH 7465HS SPC BROWN S n d ch 3 S n hi u ch nh 01/10/17 1.1. Tên S

More information

Thông Tin An Toàn V n Ph m

Thông Tin An Toàn V n Ph m International Paint Pte Ltd. Thông Tin An Toàn V n Ph m BEA754 INTERSMOOTH 7460HS SPC BROWN S n d ch 3 S n hi u ch nh 04/08/15 1. Chi ti t v n ph m và công ty 1.1. Tên S n Ph m INTERSMOOTH 7460HS SPC BROWN

More information

cách kết hợp thuật toán Fuzzy C-Means (FCM) với giải thuật di truyền (GA). Sau đó, HaT2-FLS

cách kết hợp thuật toán Fuzzy C-Means (FCM) với giải thuật di truyền (GA). Sau đó, HaT2-FLS Tạp chí Tin học và Điều khiển học, T.27, S.2 (2011), 119 130 XÂY DỰNG HỆ LÔGIC MỜ LOẠI HAI ĐẠI SỐ GIA TỬ PHAN ANH PHONG 1, ĐINH KHẮC ĐÔNG 2, TRẦN ĐÌNH KHANG 2 1 Khoa Công nghệ thông tin, trường Đại học

More information

BÀI TOÁN CỰC TRỊ VỀ HÌNH HỌC TRONG MẶT PHẲNG

BÀI TOÁN CỰC TRỊ VỀ HÌNH HỌC TRONG MẶT PHẲNG 1 TRƯỜNG ĐẠI HOC SƯ PHẠM HÀ NỘI 2. KHOA TOÁN HỌC PHẠM THỊ HIỀN BÀI TOÁN CỰC TRỊ VỀ HÌNH HỌC TRONG MẶT PHẲNG KHOÁ LUẬN TỐT NGHIỆP CHUYÊN NGÀNH : HÌNH HỌC Người hướng dẫn khoa học T.S PHAN HỒNG TRƯỜNG Hà

More information

On Approximating Solution Of One Dimensional Boundary Value Problems With Dirichlet Conditions By Using Finite Element Methods

On Approximating Solution Of One Dimensional Boundary Value Problems With Dirichlet Conditions By Using Finite Element Methods On Approximting Solution Of One Dimensionl Boundry Vlue Problems With Dirichlet Conditions By Using Finite Element Methods Nguyen Qun B Hong Don Trn Nguyen Tung Students t Fculty of Mth nd Computer Science,

More information

NGHIÊN CỨU CHẾ TẠO MÀNG MỎNG SẮT ĐIỆN - ÁP ĐIỆN PZT BẰNG PHƯƠNG PHÁP SOL - GEL ĐỊNH HƯỚNG ỨNG DỤNG TRONG CẢM BIẾN SINH HỌC

NGHIÊN CỨU CHẾ TẠO MÀNG MỎNG SẮT ĐIỆN - ÁP ĐIỆN PZT BẰNG PHƯƠNG PHÁP SOL - GEL ĐỊNH HƯỚNG ỨNG DỤNG TRONG CẢM BIẾN SINH HỌC NGHIÊN CỨU CHẾ TẠO MÀNG MỎNG SẮT ĐIỆN - ÁP ĐIỆN PZT BẰNG PHƯƠNG PHÁP SOL - GEL ĐỊNH HƯỚNG ỨNG DỤNG TRONG CẢM BIẾN SINH HỌC Nguyễn Thị Quỳnh Chi 1, Nguyễn Vũ Cẩm Bình 1, Nguyễn Đức Minh 2, Vũ Ngọc Hùng

More information

XU HƯỚNG HỢP ĐỒNG HOÁN ĐỔI LÃI SUẤT TẠI VIỆT NAM

XU HƯỚNG HỢP ĐỒNG HOÁN ĐỔI LÃI SUẤT TẠI VIỆT NAM XU HƯỚNG HỢP ĐỒNG HOÁN ĐỔI LÃI SUẤT TẠI VIỆT NAM Đỗ Thu Hằng, Nguyễn Thị Thu Trang Khoa Ngân hàng- Học viện Ngân hàng Thực hiện các cam kết hội nhập quốc tế, Việt Nam đang dần mở cửa thị trường, áp dụng

More information

BỒI DƯỠNG HỌC SINH GIỎI

BỒI DƯỠNG HỌC SINH GIỎI SỞ GIÁO DỤC VÀ ĐÀO TẠO HÀ NỘI VÀ HỘI TOÁN HỌC HÀ NỘI ========================== NGUYỄN VĂN MẬU, NGUYỄN HỮU ĐỘ (Chủ biên) CÁC CHUYÊN ĐỀ TOÁN HỌC BỒI DƯỠNG HỌC SINH GIỎI (Tóm tắt báo cáo Hội nghị khoa học)

More information