m è c l è ccvauni.edu.vn/imgupload_dinhkem/file/java/giao trinh java 2013.pdf · bài gi§ng...

179
Bài giҧng Ngôn ngӳ lұp trình Java Biên soҥn: NguyӉn Thӏ u Page 1 MӨC LӨC CHѬѪNG 1. GIӞI THIӊU TӘNG QUAN Vӄ NGÔN NGӲ LҰP TRÌNH JAVA ........... 6 1. Lӏch sӱ ra đӡi và phát trin cӫa Java ........................................................................ 6 2. Mӝt sӕ đặc trѭng cӫa Java ........................................................................................ 6 2.1. ѫn giҧn ............................................................................................................. 7 2.2. Hѭӟng đӕi tѭӧng ................................................................................................ 7 2.3. ӝc lұp vӟi hӋ nӅn.............................................................................................. 7 2.4. Mҥnh mӁ ............................................................................................................. 7 2.5. Hӛ trӧ lұp trình đa tuyӃn .................................................................................... 8 2.6. Phân tán .............................................................................................................. 8 2.7. Hӛ trӧ Internet .................................................................................................... 8 2.8. Thông dӏch .......................................................................................................... 8 3. Các kiu ӭng dng Java ............................................................................................ 8 3.1. Ӭng dng Applets .............................................................................................. 8 3.2. Ӭng dng dòng lӋnh (console) ........................................................................... 9 3.3. Ӭng dụng đӗ ha(Window form) ....................................................................... 9 3.4 JSP/Servlet ........................................................................................................... 9 3.5. Ӭng dụng cѫ sӣ dӳ liӋu ...................................................................................... 9 3.6. Ӭng dng mҥng .................................................................................................. 9 3.7. Ӭng dng nhiӅu tng(multi-tier) ....................................................................... 9 3.8. Ӭng dng cho các thiӃt bӏ di đӝng ..................................................................... 9 4. Máy ҧo Java (JVM-Java Virtual Machine) ............................................................... 9 5. Bӝ công cphát trin JDK (Java Development Kit) .............................................. 10 6. Java Core API ......................................................................................................... 12 7. Chѭѫng trình Java đầu tiên ..................................................................................... 13 7.1 Cҩu trúc chѭѫng trình Java................................................................................ 13 7.2 Chѭѫng trình Java đầu tiên................................................................................ 15 7.3 Biên dӏch và chҥy chѭѫng trình......................................................................... 15 CHѬѪNG 2. LҰP TRỊNH HѬӞNG ӔI TѬӦNG TRONG JAVA ............................... 17 BÀI 1. NӄN TҦNG LҰP TRÌNH JAVA ...................................................................... 17 1. Tӯ khóa cӫa Java .................................................................................................... 17 2. ӏnh danh trong Java (tên) ..................................................................................... 19 3. Chú thích trong chѭѫng trình.................................................................................. 20 4. Kiu dӳ liӋu ............................................................................................................ 20 4.1. Dӳ liӋu kiu nguyên thu................................................................................. 20 4.2. Kiu dӳ liӋu tham chiӃu (reference) ................................................................. 21 4.3. Ép kiu (Type casting) ..................................................................................... 21 5. BiӃn, mҧng và hng trong Java ............................................................................... 22 5.1 Khai báo biӃn..................................................................................................... 22 5.2. Khai báo mҧng.................................................................................................. 22

Upload: others

Post on 31-Oct-2019

7 views

Category:

Documents


0 download

TRANSCRIPT

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

Biên so n: Nguy n Th Đi u Page 1

M C L C

CH NG 1. GI I THI U T NG QUAN V NGÔN NG L P TRÌNH JAVA ........... 6

1. L ch s ra đ i và phát triển c a Java ........................................................................ 6 2. M t s đặc tr ng c a Java ........................................................................................ 6

2.1. Đ n gi n ............................................................................................................. 7 2.2. H ng đ i t ng ................................................................................................ 7

2.3. Đ c l p v i h n n .............................................................................................. 7 2.4. M nh m ............................................................................................................. 7

2.5. H tr l p trình đa tuy n .................................................................................... 8 2.6. Phân tán .............................................................................................................. 8

2.7. H tr Internet .................................................................................................... 8 2.8. Thông d ch .......................................................................................................... 8

3. Các kiểu ng dụng Java ............................................................................................ 8

3.1. ng dụng Applets .............................................................................................. 8 3.2. ng dụng dòng l nh (console) ........................................................................... 9

3.3. ng dụng đ họa(Window form) ....................................................................... 9 3.4 JSP/Servlet ........................................................................................................... 9

3.5. ng dụng c s d li u ...................................................................................... 9 3.6. ng dụng m ng .................................................................................................. 9

3.7. ng dụng nhi u tầng(multi-tier) ....................................................................... 9 3.8. ng dụng cho các thi t b di đ ng ..................................................................... 9

4. Máy o Java (JVM-Java Virtual Machine) ............................................................... 9 5. B công cụ phát triển JDK (Java Development Kit) .............................................. 10

6. Java Core API ......................................................................................................... 12 7. Ch ng trình Java đầu tiên ..................................................................................... 13

7.1 C u trúc ch ng trình Java................................................................................ 13 7.2 Ch ng trình Java đầu tiên................................................................................ 15

7.3 Biên d ch và ch y ch ng trình......................................................................... 15 CH NG 2. L P TRỊNH H NG Đ I T NG TRONG JAVA ............................... 17

BÀI 1. N N T NG L P TRÌNH JAVA ...................................................................... 17 1. T khóa c a Java .................................................................................................... 17

2. Đ nh danh trong Java (tên) ..................................................................................... 19 3. Chú thích trong ch ng trình .................................................................................. 20

4. Kiểu d li u ............................................................................................................ 20 4.1. D li u kiểu nguyên thuỷ ................................................................................. 20

4.2. Kiểu d li u tham chi u (reference) ................................................................. 21 4.3. Ép kiểu (Type casting) ..................................................................................... 21

5. Bi n, m ng và hằng trong Java ............................................................................... 22 5.1 Khai báo bi n ..................................................................................................... 22

5.2. Khai báo m ng .................................................................................................. 22

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

Biên so n: Nguy n Th Đi u Page 2

5.2.1 M ng m t chi u .......................................................................................... 22

5.2.2 M ng nhi u chi u ........................................................................................ 26 5.3. Xâu ký tự .......................................................................................................... 28

5.3.1. L p String .................................................................................................. 28 5.3.2. L p StringBuffer ........................................................................................ 31

5.3.3. L p StringTokenizer .................................................................................. 34 BÀI 2. CÁC C U TRÚC L P TRÌNH ......................................................................... 37

1. C u trúc r nhánh .................................................................................................... 37 1.1. Phát biểu if ........................................................................................................ 37

1.2. Biểu th c đi u ki n ........................................................................................... 37 1.3. C u trúc switch ................................................................................................. 38

2. C u trúc lặp while và do-while ............................................................................... 39 2.1. Lặp kiểm tra đi u ki n tr c ............................................................................ 39

2.2. Lặp kiểm tra đi u ki n sau ............................................................................... 40 3. C u trúc for ............................................................................................................. 41

4. L nh break và continue ....................................................................................... 43 BÀI 3. L P TRỊNH H NG Đ I T NG TRONG JAVA ...................................... 46

1. Đ nh nghĩa l p ........................................................................................................ 47 1.1. Khai báo l p ..................................................................................................... 47

1.1.1 Khai báo thu c tính ..................................................................................... 49 1.1.2 Khai báo ph ng th c ................................................................................. 50

1.2 Chi ti t v khai báo m t ph ng th c ............................................................... 51 1.2.1. T ng quát m t ph ng th c đ c khai báo nh sau ................................. 51

1.2.2 Nh n giá tr tr v t ph ng th c .............................................................. 52 1.2.3 Truy n tham s cho ph ng th c ............................................................... 52

1.2.4. Thân c a ph ng th c ............................................................................... 54 2. S dụng l p ............................................................................................................. 54

2.1 Khai báo m t bi n, m ng đ i t ng .................................................................. 54 2.2 Truy xu t t i các thành phần c a l p ................................................................ 55

3. Ph ng th c t o dựng (constructor) ....................................................................... 55 3.1. Công dụng ........................................................................................................ 55

3.2. Cách vi t hàm t o ............................................................................................. 55 3.2.1 Đặc điểm c a ph ng th c t o dựng .......................................................... 55

3.2.2. Hàm t o mặc đ nh ...................................................................................... 56 3.2.3. Gọi hàm t o t hàm t o .............................................................................. 57

3.3. Kh i kh i đầu vô danh và kh i kh i đầu tĩnh .................................................. 58 3.3.1. Kh i vô danh .............................................................................................. 58

3.3.2. Kh i kh i đầu tĩnh ..................................................................................... 59 4. Dọn dẹp: k t thúc và thu rác ................................................................................... 60

4.1. Ph ng th c finalize ........................................................................................ 60

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

Biên so n: Nguy n Th Đi u Page 3

4.2. C ch gom rác c a java .................................................................................. 61

5. T khóa this ............................................................................................................ 61 6. Đi u khiển vi c truy c p đ n các thành viên c a m t l p ...................................... 61

6.1. Các thành phần private ..................................................................................... 62 6.2. Các thành thành phần protected ....................................................................... 62

6.3. Các thành phần public ...................................................................................... 63 6.4. Các thành phần có m c truy xu t gói ............................................................... 63

7. N p ch ng ph ng th c .......................................................................................... 63 7.1. Khái ni m v ph ng th c b i t i .................................................................... 63

7.2. Yêu cầu c a các ph ng th c b i t i ............................................................... 64 BÀI 4 K TH A (INHERITANCE), ĐA HỊNH .......................................................... 65

1. L p c s và l p d n xu t ....................................................................................... 65 2. Cách xây dựng l p d n xu t ................................................................................... 65

3. Th a k các thu c tính ............................................................................................ 65 4. Th a k ph ng th c .............................................................................................. 65

5. Ph ng th c kh i t o c a l p c s ....................................................................... 65 5.1. Tr t tự kh i đầu ................................................................................................ 68

5.2. Tr t tự dọn dẹp ................................................................................................. 68 6. Ghi đè ph ng th c (Override) .............................................................................. 68

7. T khoá final ........................................................................................................... 69 7.1. Thu c tính final ................................................................................................ 69

7.2. Đ i s final ....................................................................................................... 70 7.3. Ph ng th c final ............................................................................................. 70

7.4. L p final ........................................................................................................... 70 8. L p c s tr u t ng .............................................................................................. 71

9. Đa hình thái ............................................................................................................. 71 BÀI 5. GIAO DI N, L P TRONG, GÓI ...................................................................... 73

1. Giao di n (Interface) ............................................................................................... 73 1.1. Phần khai báo c a giao di n ............................................................................. 73

1.2. Phần thân .......................................................................................................... 74 1.3. Triển khai giao di n .......................................................................................... 74

2. L p trong ................................................................................................................ 75 CH NG 3. L P TRỊNH ĐA TUY N(MULTITHREAD) ........................................... 77

L P TRÌNH SOCKET ...................................................................................................... 77 BÀI 1. L P TRỊNH ĐA TUY N .................................................................................. 77

1. Các ki n th c liên quan .......................................................................................... 77 1.1. Ti n trình ( process) ......................................................................................... 77

1.2. Tiểu trình ( thread ) .......................................................................................... 77 1.3. H đi u hƠnh đ n nhi m, đa nhi m .................................................................. 77

1.4. Các tr ng thái c a ti n trình ............................................................................. 78

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

Biên so n: Nguy n Th Đi u Page 4

1.5. Mi n găng ( Critical Section ) .......................................................................... 78

1.6. Khoá ch t (deadlock)........................................................................................ 78 2. L p trình đa tuy n trong Java ................................................................................. 79

2.1. L p Thread ....................................................................................................... 79 2.2. Vòng đ i c a Thread ........................................................................................ 82

2.3. Lu ng ch y ngầm (deamon) ............................................................................. 82 2.4. Giao di n Runnable .......................................................................................... 82

2.5. Thi t l p đ u tiên cho tuy n .......................................................................... 83 2.6. Nhóm tuy n (Thread Group) ............................................................................ 84

2.7. Đ ng b các tuy n thi hành .............................................................................. 84 BÀI 2. L P TRÌNH SOCKET ...................................................................................... 86

1. Các ki n th c liên quan .......................................................................................... 86 1.1. Gi i thi u Socket .............................................................................................. 86

1.2. L p trình Socket trong java .............................................................................. 87 2. Kh o sát m t s l p trong gói java.net ................................................................... 87

2.1. L p InetAddress ............................................................................................... 87 2.2. L p URL và URI .............................................................................................. 93

2.3. L p Socket ...................................................................................................... 101 2.3.1 M t s hàm t o c a l p Socket ................................................................. 102

2.3.2. L y v thông tin gắn v i Socket .............................................................. 103 2.3.3. Đóng Socket ............................................................................................. 106

2.3.4. Truy n trong ch đ haft duplex .............................................................. 107 2.4. L p ServerSocket ........................................................................................... 108

2.4.1. M t s hàm t o c a l p ServerSocket ..................................................... 108 2.4.2. Ch p nh n vƠ đóng k t n i....................................................................... 111

2.5. L p DatagramSocket ...................................................................................... 113 2.6. L p DatagramPacket ...................................................................................... 113

3. TCP Socket ........................................................................................................... 113 CH NG 4 CÔNG NGH JSP/SERVLET VÀ L P TRÌNH K T N I C S D

LI U TRONG JAVA ...................................................................................................... 133 1. Công ngh Jsp/Servlet .......................................................................................... 133

1.1. Gi i thi u ........................................................................................................ 133 1.2. So sánh JSP/Servlet và CGI, ASP, ISAPI ...................................................... 133

1.3. Servlet là gì ..................................................................................................... 134 1.3.1 Gi i pháp v i Servlet ................................................................................ 135

1.3.2 Môi tr ng runtime c a servlet ................................................................ 135 1.3.3 Giao ti p vƠ vòng đ i c a servlet ............................................................. 136

1.3.4 Các đ i t ng request và response ........................................................... 137 1.3.5 D li u chia sẻ và c đ nh (Persistent and shared data) ............................ 141

1.3.6 Các thu c tính ServletContext .................................................................. 143

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

Biên so n: Nguy n Th Đi u Page 5

1.3.7 Các thu c tính và tài nguyên yêu cầu (Request attributes and resources) 144

1.3.8 Đa tuy n (Multithreading) ........................................................................ 145 2. Truy c p c s d li u trong java ......................................................................... 146

2.1. T ng quan ....................................................................................................... 146 2.2. Các l p trong JDBC API dùng để truy c p CSDL ......................................... 146

2.2.1. M t s giao di n và l p trong gói java.sql ............................................... 146 2.2.2. M t s giao di n và l p trong gói javax.sql ............................................. 147

2.3. K t n i CSDL v i JDBC ................................................................................ 147 2.4 T ng tác v i CSDL ....................................................................................... 152

2.4.1. T o ra m t JDBC Statements ................................................................... 152 2.4.2. S dụng đ i t ng Prepared Statements .................................................. 161

2.5. Gọi th tục l u tr bằng JDBC ...................................................................... 162 2.6. Qu n lý giao d ch ........................................................................................... 162

CH NG 5. L P TRÌNH THI T B DI Đ NG V I J2ME ........................................ 163 1. Gi i thi u v J2ME và l p trình cho thi t b di đ ng ........................................... 163 2. Ki n trúc c a J2ME .............................................................................................. 164

2.1. Gi i thi u các thành phần trong n n t ng J2ME ............................................ 164 2.2. Đ nh nghĩa v Profile ..................................................................................... 165

3. L p trình v i J2ME ............................................................................................... 166 3.1. MIDlet ậ Vòng đ i c a m t MIDlet .............................................................. 166 3.2. Đ i t ng Display .......................................................................................... 169 3.3. Đ i t ng Displayable ................................................................................... 169 3.4. Giao di n ng i dùng c p cao ........................................................................ 169

3.4.1. Đ i t ng Display, Displayable và Screens ............................................ 169 3.4.2. Thành phần Form và Items ...................................................................... 170 3.4.3. Thành phần List, Textbox, Alert, và Ticker ............................................ 171

4. Ch ng trình J2ME đầu tiên ................................................................................ 171 4.1. Thi t l p môi tr ng l p trình ........................................................................ 171 4.2. T o project ...................................................................................................... 172

4.2.1. T o ng dụng MIDP Using Source Editor .............................................. 172 4.2.2. T o ng dụng MIDP Using the Visual Mobile Designer ........................ 173

4.3. Đóng gói vƠ t i ng dụng j2me vƠo đi n tho i .............................................. 174 4.3.1. Đóng gói ng dụng .................................................................................. 174 4.3.2. T i ng dụng vào thi t b di đ ng qua Internet ........................................ 177

TÀI LI U THAM KH O ............................................................................................... 179

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

Biên so n: Nguy n Th Đi u Page 6

CH NG 1. GI I THI U T NG QUAN V NGÔN NG L P TRÌNH JAVA

N i dung c a ch 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 xâ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 đ c chọn, Java là tên c a m t quán cafe mà

nhóm thi t k java hay đ n đó u ng).

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 xâ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 để xâ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

Đ c l p v i h n n

M nh m

H tr l p trình đa tuy n

L p trình phân tán

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

Biên so n: Nguy n Th Đi u Page 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.

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

2.3. Độ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 x 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. 2.4. 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

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

Biên so n: Nguy n Th Đi u Page 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 đư xin 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 x lý l i và h i phục sau l i.

2.5. 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 xa…

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.

2.8. 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 x 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ể xây dựng các kiểu ng dụng sau:

3.1. ng dụng Applets

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

Biên so n: Nguy n Th Đi u Page 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 đ c nhúng bên trong trang Web.

Khi trang Web hiển th trong trình duy t, Applet s đ c t i v và thực thi t i trình duy t.

3.2. 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 xu t đ c thể hi n t i d u nhắc l nh.

3.3. 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 x 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 x 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 để

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

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

3.6. ng dụng mạng

Java là m t ngôn ng r t thích h p cho vi c xâ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.

3.7. ng dụng nhiều tầng(multi-tier)

V i Java b n có thể xâ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ể xâ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)

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

Biên so n: Nguy n Th Đi u Page 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 để xá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ể xem 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 x 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 ng th c.

Các toán h ng c a mã bytecode.

Các tham s truy n cho ph ng th c.

Các bi n cục b .

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 ng h p thông th ng thì

t ng l nh m t n i ti p nhau s đ c thực thi.

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 1.0 - S dụng lần đầu vƠo năm 1995.

Java 1.1 ậ ợ a ra năm 1997 v I nhi u u điểm h n phiên b n tr c.

o JDK 1.1.4 (Sparkler) 12 tháng 9, 1997

o JDK 1.1.5 (Pumpkin) 3 tháng 12, 1997

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

Biên so n: Nguy n Th Đi u Page 11

o JDK 1.1.6 (Abigail) 24 tháng 4, 1998

o JDK 1.1.7 (Brutus) 28 tháng 9, 1998

o JDK 1.1.8 (Chelsea) 8 tháng 4, 1999

Java 2:

o J2SE 1.2 (Playground) 4 tháng 12, 1998

o J2SE 1.2.1 (không có) 30 tháng 3, 1999

o J2SE 1.2.2 (Cricket) 8 tháng 7, 1999

o J2SE 1.3 (Kestrel) 8 tháng 5, 2000

o J2SE 1.3.1 (Ladybird) 17 tháng 5, 2001

o J2SE 1.4.0 (Merlin) 13 tháng 2, 2002

o J2SE 1.4.1 (Hopper) 16 tháng 9, 2002

o J2SE 1.4.2 (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), đ c công b 11 tháng 12 năm 2006

o JDK 6.18,2010

o Java SE 7 (còn gọi lƠ Dolphin), đ c bắt đầu t tháng 8 năm 2006 vƠ công b vƠo năm 2010.

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'

javap d ch ng c bytecode và in ra thông tin v các thu c tính (các tr ng), các

ph ng th c c a m t l p.

Cú pháp:

javap [options] classname

d) Công cụ sinh tài liệu, 'javadoc'

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

Biên so n: Nguy n Th Đi u Page 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 xem 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ụ x 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.

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

Biên so n: Nguy n Th Đi u Page 13

f) java.net

Cung c p kh năng giao ti p v i máy t xa. 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 để x lý các sự ki n trong ch ng trình nh chu t,

bàn phím.

h) java.rmi

Công cụ để gọi hàm t xa. Chúng cho phép t o đ i t ng trên máy khác và s

dụng các đ i t 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 xu t c s

d li u quan h nh Oracle, SQL Server,.... 7. 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)

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

Biên so n: Nguy n Th Đi u Page 14

- Bên trong thân c a m i l p ta khai báo các thu c tính, ph ng th c c a l p đó, Java là ngôn ng h ng đ i t ng, do v y mã l nh ph i nằm trong l p nƠo đó. M i l nh

đ u đ c k t thúc bằng d u ch m ph y “;”.

- 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 xâ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 để xá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 xá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 xác đ nh d li u vƠ các ph ng th c c a l p

đó. V c b n m t 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á xác đ nh l p

//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

}

Một đơn vị biên dịch là

một tệp tin .java

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

Biên so n: Nguy n Th Đi u Page 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 ng th c

methodname - Tên c a ph 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 x 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 c l i.

7.2 Chương trình Java đầu tiên

Ví d 1: HelloWorld.java

public class HelloWorld

{

public static void main(String[] args)

{

System.out.println("Hello World!");

}//end method

}//end class

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

Định nghĩa lớp có tên HelloWorld

Bắt đầu đoạn lệnh

Phương thức main

Xuất ra màn hình

Kết thúc đoạn lệnh

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

Biên so n: Nguy n Th Đi u Page 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:

- Để 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\

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

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

Biên so n: Nguy n Th Đi u Page 17

CH NG 2. L P TRỊNH H NG Đ I T NG TRONG JAVA

Ch 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 ng Đ i t ng (Object-oriented

Programming).

Đ nh nghĩa m t L p (Class).

Đ nh nghĩa m t Đ i t ng (Object).

Nh n th c đ c sự khác bi t gi a L p vƠ Đ i t ng.

Nh n th c đ c sự cần thi t đ i v i ph ng th c Thi t l p (Construction) vƠ H y (Destruction).

Đ 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 ng th c tr u t ng

boolean Kiểu d li u logic

break Đ c s dụng để k t thúc vòng lặp hoặc c u trúc switch

byte kiểu d li u s nguyên

case đ c s dụng trong l n switch

cast Ch a đ c s dụng (để dƠnh cho t ng lai)

catch đ c s dụng trong x lý ngo i l

char kiểu d li u ký tự

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

Biên so n: Nguy n Th Đi u Page 18

class Dùng để khai báo l p

const Ch a đ c dùng

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

extends 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 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 x lý ngo i l

float kiểu s thực

for Câu l nh lặp

goto Ch a đ c dùng

if Câu l nh lựa chọn

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 ng có ph i là m t thể hi n c a l p hay không

interface s dụng để khai báo giao di n

long kiểu s nguyên

native Khai báo ph ng th c đ c vi t bằng ngôn ng biên d ch C++

new t o m t đ i t ng m i

null m t đ i t ng không t n t i

package Dùng để khai báo m t gói

private đặc t truy xu t

protected đặc t truy xu t

public đặc t truy xu t

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

Biên so n: Nguy n Th Đi u Page 19

return Quay t ph ng th c v ch gọi nó

short kiểu s nguyên

static Dùng để khai báo bi n, thu c tính tĩnh

super Truy xu t đ n l p cha

switch l nh lựa chọn

synchronized m t ph ng th c đ c quy n truy xu t trên m t đ i t ng

this Ám ch chính l p đó

throw Ném ra ngo i l

throws Khai báo ph ng th c ném ra ngo i l

true Giá tr logic

try s dụng để bắt ngo i l

void Dùng để khai báo m t ph ng th c không tr v giá tr

while Dùng trong c u trúc lặp

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 để xá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 đ i t 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ú ý.

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

Biên so n: Nguy n Th Đi u Page 20

Sau đơy lƠ quy c đặt tên trong java (chú ý đơy ch lƠ quy c do v y không bắt bu c ph i tuơn theo quy 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 i ‘_’, ví dụ PI, MAX_VALUE

3. Chú thích trong ch 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 đơu?, cơu tr l i là: đơu có thể đặt

đ c m t d u cách thì đó có thể đặt chú thích.

4. Kiểu d li u

Các ng dụng luôn x lý d li u đầu vƠo vƠ xu 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 xá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 ng trình Java không 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 đ 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ỷ

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

Biên so n: Nguy n Th Đi u Page 21

T khoá Mô t Kích c T i thiểu T i đa L p bao

(kiểu s nguyên)

byte S nguyên 1 byte 8 bit -128 127 Byte

short s nguyên 2 byte 16 bit -215 215-1 Short

int s nguyên 4 byte 32 bit -231 231-1 Integer

long s nguyên 8 byte 64 bit -263 -263-1 Long

(kiểu s thực)

float kiểu thực v i đ chính xác đ n 4 byte

32 bit IEEE754 IEEE754 Float

double d u ch m đ ng v i đ chính xác đôi 8 byte

64 bit IEEE754 IEEE754 Double

(kiểu khác)

char kiểu kí tự 2 byte 16 bit Unicode 0 Unicode 216-1 Character

boolean kiểu logic true/false - - Boolean

void - - - - Void

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 ng đ c t o ra cho phép cƠi đặt đa th a k trong Java.

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. Để x 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).

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

Biên so n: Nguy n Th Đi u Page 22

float c=34.896751f;

int b = (int)c +10;

Đầu tiên giá tr d u ph y đ ng c đ c đ i thƠnh giá tr nguyên 34. Sau đó nó đ c c ng v i 10 vƠ k t qu lƠ giá tr 44 đ 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 xá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 xá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 trình ch có tác đ ng trong ph m vi kh i đó, không có ý nghĩa vƠ không đ 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 ng vƠ ch in hoa (case -sensitive).

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. 5.2. Khai báo mảng

5.2.1 Mảng một chiều

a) Khai báo

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

Biên so n: Nguy n Th Đi u Page 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ó xá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 ng

- Cũng nh các đ i t 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 đư đ c đ nh nghĩa, hưy khai báo m t m ng g m 100

đ i t 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:

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

Biên so n: Nguy n Th Đi u Page 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 t đ c gán các giá

tr là: 1, 3, 5, 7, 9

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 x t đ n các phần t c a m ng m t chi u

Để truy xu 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 xu 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:

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

Biên so n: Nguy n Th Đi u Page 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.nextInt();

//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.nextInt();

}

//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 xem 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.nextInt();

//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.nextInt();

}

//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ờ

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

Biên so n: Nguy n Th Đi u Page 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");

} }

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

hoặc

hoặc

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

KDL [][]…[] tên_mảng;

N lần

KDL tên_mảng [][]…[] ;

N lần

KDL tên_m ng [][]…[] =new KDL[spt1][spt2]…[sptN];

N lần

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

Biên so n: Nguy n Th Đi u Page 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 xu 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 xu 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.nextInt();

System.out.print("Nhập số cột:");

int sc = cs.nextInt();

//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.nextInt();

}

//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 đ ng chéo chính

(sinh viên tự làm).

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

Biên so n: Nguy n Th Đi u Page 28

5.3. Xâu ký tự

Vi c x lý các xâu ký tự trong Java đ c h tr b i hai l p String và

StringBuffer. Lớp String dùng cho những xâu ký tự bất biến, nghĩa là nh ng xâu ch

đọc vƠ sau khi đ c kh i t o giá tr thì n i dung bên trong xâu không thể thay đ i đ c.

L p StringBuffer đ c s dụng đ i v i nh ng xâu ký tự đ ng, t c là có thể thay đ i

đ c n i dung bên trong c a xâu.

5.3.1. Lớp String

Chu i lƠ m t dưy các ký tự. L p String cung c p các ph ng th c để thao tác v i các chu i. Nó cung c p các ph 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 xuyê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 xem xét các ph ng th c c a l p String.

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

Biên so n: Nguy n Th Đi u Page 29

- char charAt(int index ) Phương thức này trả về một ký tự tại vị trí index 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 text = new String(“Hello World”);

char textArray[] = text.toCharArray( );

- int indexOf(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”);

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

Biên so n: Nguy n Th Đi u Page 30

int index1 = day.indexOf(‘n’);

//chứa 2

int index2 = day.indexOf(‘z’,2);

//chứa –1 nếu “z” không tìm thấy tại vị trí 2.

int index3 = day.indexOf(“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 xơu

static String valueOf(Object obj)//Chuyển một đối tượng thành xâ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 xâu.

static String valueOf(boolean b)//Chuyển một giá trị logic thành xâu, xâ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 xâu

static String valueOf(int i)//chuyển một số nguyên thành xâu

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

Biên so n: Nguy n Th Đi u Page 31

static String valueOf(long l)//Chuyển một giá trị long thành xâu

static String valueOf(float f)//chuyển một giá trị float thành xâu

static String valueOf(double d)//chuyển một giá trị double thành xâu

5.3.2. 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 ng StringBuffer, hoặc n i thêm d li u vƠo t i v trí cu i. L p nƠy cung c p nhi u ph ng th c kh i t o. Ch ng trình sau minh ho cách s dụng các ph 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 đ i t 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 ng c a StringBuffer đ c đặt l i, đi u ki n sau s đ c kiểm tra:

N u dung l ng(NewCapacity) m i l n h n đ i s đ c truy n cho ph ng th c “ensureCapacity()”, thì dung l ng m i (NewCapacity) đ c đặt.

N u dung l ng m i nh h n đ i s đ c truy n cho ph ng th c “ensureCapacity()”, thì dung l ng đ c đặt bằng giá tr tham s truy n vƠo.

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

Biên so n: Nguy n Th Đi u Page 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 ng c a s1 đ n 12 =(5*2+2) b i vì dung l ng truy n vƠo lƠ 8 nh h n dung l ng đ 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 ng truy n vƠo lƠ 30 thì l n h n dung l ng đ c tính toán (12*2+2).

Các ph ng th c l p StringBuffer

Trong phần nƠy, chúng ta s xem xét các ph ng th c c a l p StringBuffer v i m t ch ng trình.

- void append()

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 t 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

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

Biên so n: Nguy n Th Đi u Page 33

(float) đ 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 c a đ i t ng StringBuffer. B t kỳ đ i s nƠo, tr ký tự hoặc chu i, đ c chuyển sang chu i vƠ sau đó m i đ 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 index, 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ự đ c sao chép vƠo m ng đích t v trí này.

Ví d :

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

Biên so n: Nguy n Th Đi u Page 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 ng StringBuffer, vƠ tr v m t đ i t ng StringBuffer khác. Ví dụ:

StringBuffer str = new StringBuffer(“devil”);

StringBuffer strrev = str.reverse();

Bi n “strrev” ch a “lived”. 5.3.3. 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 xa 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 xâ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, String,

boolean)

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”, “,”);

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

Biên so n: Nguy n Th Đi u Page 35

Trong cơu l nh đầu tiên, StringTokenizer c a “st1” s đ c xơy dựng bằng cách s dụng các chu i đ 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ự xu 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 xơ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.

L p StringTokenizer cƠi đặt giao di n Enumeration. Vì th , nó bao g m các ph ng th c hasMoreElements() vƠ nextElement(). Các ph ng th c có thể s dụng c a l p StringTokenizer đ c tóm tắt trong b ng sau:

Ph ng th c M c đích

countTokens() 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.

nextElement() Tr v token k ti p trong chu i. Nó thì gi ng nh nextToken.

nextToken() Tr v Token k ti p trong chu i. Nó thì gi ng nh nextElement.

nextToken(String) Thay đ i b d u phân cách bằng chu i đ c ch đ nh, và sau

đó tr v token k ti p trong chu i.

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 xem xé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Ơ nextToken() đ 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 đó.

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

Biên so n: Nguy n Th Đi u Page 36

String mathExpr = “4*3+2/4”;

StringTokenizer st1 = new StringTokenizer(mathExpr,”*+/-“, true);

//trong khi vẫn còn các token, hiển thị

System.out.println(“Tokens of mathExpr: “);

while(st1.hasMoreTokens())

System.out.println(st1.nextToken());

//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.nextToken());

}

}

K t qu ch y ch ng trình đ c mô t nh hình d i.

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

Biên so n: Nguy n Th Đi u Page 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 đ :

if(Boolean-expression)

statement;

b) dạng đủ

Cú pháp S đ :

if(Boolean-expression)

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;

sai

đúng

statement

đi u ki n

đi u ki n Statement 1

đúng sai

Statement2

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

Biên so n: Nguy n Th Đi u Page 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 x=2;

int i = (x>6)?1:2;

K t qu thu đ c i = 2 1.3. Cấu trúc switch

a) Dạng khuyết

Cú pháp: S đ kh i:

switch(biểu_th c) {

case gt_1:

l nh 1; [ break;]

case gt_2:

l nh 2; [ break;]

case gt_n:

l nh n; [ break;]}

biểu_th c bằng gt_1

l nh 1

biểu_th c bằng gt_2

.....................................................................

biểu_th c bằng gt_n

No

Yes

Yes

No

Yes

No

break;

l nh 2 break;

l nh n break;

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

Biên so n: Nguy n Th Đi u Page 39

b) Dạng đủ

Cú pháp S đ kh i:

switch(biểu_th c) {

case gt_1:

l nh 1; [ break;]

case gt_2:

l nh 2; [ break;]

case gt_n:

l nh n; [ break;]

default:

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ê trên thì java s đ a ra m t

thông báo l i.

- 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 (BooleanExpression) {

statement;

}

S đ kh i sau:

biểu_th c bằng gt_1

L nh 1

biểu_th c bằng gt_2

L nh 2

.....................................................................

biểu_th c bằng gt_n

L nh n

Yes

Yes

No

Yes

No

l nh n+1

Đi u ki n lặp

đúng

L nh

sai

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

Biên so n: Nguy n Th Đi u Page 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 xong

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 đ c thực hi n lần nào (do biểu th c

lôgic ban đầu có giá tr false )

2.2. Lặp kiểm tra điều kiện sau

Cú pháp:

do {

statement(s);

} while (expression);

Sự ho t đ ng c a c u trúc nƠy đ c thể hi n qua s đ sau:

Đi u ki n lặp

đúng

L nh

sai

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

Biên so n: Nguy n Th Đi u Page 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 xong 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 đ c thực hi n ít nh t m t lần

3. C u trúc for

Đâ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 đó:

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

Biên so n: Nguy n Th Đi u Page 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.

S đ kh i di n gi i sự ho t đ ng c a c u trúc for sau:

Nhận xé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_Expression;) 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++)

increment

initialization

termination

statement

đúng sai

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

Biên so n: Nguy n Th Đi u Page 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;// Next iteration

System.out.println(i);

}

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

Biên so n: Nguy n Th Đi u Page 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:

0

9

18

27

36

45

54

63

72

10

20

30

40

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ó

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

Biên so n: Nguy n Th Đi u Page 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;

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

Biên so n: Nguy n Th Đi u Page 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ể xem

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.

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

Biên so n: Nguy n Th Đi u Page 47

1. Đ nh nghĩa l p

1.1. Khai báo lớp

M t l p đ c đ nh nghĩa theo m u sau:

[public][<abstract><final>][ class <Tên l p>

[extends <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 đ c khai báo là l p

public.

(2) abstract là b t cho java bi t đơy lƠ m t l p tr u t ng, do v y ta không thể t o ra

m t thể hi n c a l p này.

(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 ng trình bi t ta đang khai báo m t l p, l p này có tên là

NameOfClass.

(5) extends 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.

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

Biên so n: Nguy n Th Đi u Page 48

Sau đơu lƠ ví dụ đ n gi n đ nh nghĩa l p ngăn x 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 bên trong l p, ta không thể truy

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 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 đ c đ n thành phần private này ta ph i t o ra các

ph ng th c ph ng th c get và set.

(4) Các ph ng th c th ng khai báo lƠ public, để chúng có thể truy c p t b t c đơu.

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

Biên so n: Nguy n Th Đi u Page 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.

1.1.1 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 ng th c và hàm t o thì đó lƠ khai báo thu c tính,

khai báo nh ng ch khác s cho ta bi n.

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

Biên so n: Nguy n Th Đi u Page 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 xé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 xu 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 xu 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. 1.1.2 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 vƠo đ nh

ngăn x p, nó đ c đ nh nghĩa nh sau:

Cũng gi ng nh m t l p, m t ph 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):

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

Biên so n: Nguy n Th Đi u Page 51

- Phần thân c a ph ng th c g m các l nh để mô t hành vi c a ph ng th c, các hành

vi nƠy đ 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 xé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 ng cụ thể

nào

- L i gọi ph ng th c tĩnh xu t phát t :

o tên c a l p: tên_l p.tên_ph 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

1.2.1. 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 ng th c

static //đơy lƠ ph ng th c l p

abstract //đơy lƠ ph ng th c không có cƠi đặt

final //ph ng th c này không thể ghi đè

native //ph ng th c nƠy đ c vi t trong m t ngôn ng khác

synchronized //đơ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 exception //khai báo các ngo i l có thể đ c nem ra t ph ng th c

Trong đó:

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

Biên so n: Nguy n Th Đi u Page 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 ng th c nƠy đ c vi t bằng m t ngôn ng

l p trình nƠo đó không ph i lƠ java ( th ng đ c vi t bằng C/C++)

- synchronized đơy lƠ m t ph 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 ng th c,

theo sau t khoá này là danh sách các ngo i l có thể đ c ph ng th c này ném ra

Chú ý:

(1) N u trong l p có ít nh t m t ph ng th c tr u t ng thì l p đó ph i là l p tr u t ng

(2) Không có thu c tính tr u t ng

(3) Ta không thể t o đ i t 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)

1.2.2 Nhận giá trị trả về từ phương thức

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

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

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

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

Biên so n: Nguy n Th Đi u Page 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:

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

Biên so n: Nguy n Th Đi u Page 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 = 10 1.2.4. Thân của phương thức

Trong ví dụ sau thân c a ph ng th c isEmpty vƠ ph ng th c pop đ c in đ m

và có mầu đ

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ể xem 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 ng cũng t ng tự nh khai báo m t bi n, m ng c a kiểu d li u nguyên thuỷ

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 c m ng];

Tên_L p[kích th 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

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

Biên so n: Nguy n Th Đi u Page 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 xuất tới các thành phần c a lớp

Để truy xu 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.

3.2. Cách viết hàm tạo

3.2.1 Đặ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 đ c t o ra

- hàm t o có thể có đ i s nh các ph ng th c thông th ng khác

- trong m t l p có thể có nhi u hàm t o

Ví d :

Ví dụ 1: s dụng hàm t o để in ra mƠn hình xơu “Creating Rock”

class Rock {

Rock() {// This is the constructor

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

Biên so n: Nguy n Th Đi u Page 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

}

}// /:~

3.2.2. Hàm tạo mặc định

Khi xây dựng m t l p mà không xâ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

đ i t 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 xẩy ra khi chúng ta không xâ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");

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

Biên so n: Nguy n Th Đi u Page 57

// không vấn đề gì

}

}

3.2.3. 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 đ c t i đa m t hàm t o, đi u nƠy có nghĩa lƠ ta không thể gọi đ 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 xau");

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

Biên so n: Nguy n Th Đi u Page 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 xau");

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 9

3.3. Khối khởi đầu vô danh và khối khởi đầu tĩnh

3.3.1. 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 ng h p này kh i vô danh là gi i pháp duy nh t )

Ví d : 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 xu ng d i

public class Untitled1{

// hàm tạo

public Untitled1 (){

System.out.println ( "Day la ham tao" );

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

Biên so n: Nguy n Th Đi u Page 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

3.3.2. 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Ơ

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

Biên so n: Nguy n Th Đi u Page 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

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

Biên so n: Nguy n Th Đi u Page 61

Java không có ph ng th c h y b . Ph ng th c finalize t ng tự nh ph ng th c h y b c a C++, tuy nhiên nó không ph i lƠ ph 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.

4.2. 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 ng t ng nào

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 b phá huỷ, s có m t hƠm đ 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 xơ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.

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

Biên so n: Nguy n Th Đi u Page 62

Ta tóm tắt qua b ng sau:

T khoá Truy c p

trong chính

l p đó

Truy c p

trong l p

con cùng gói

Truy c p

trong l p con

khác gói

Truy c p

trong l p khác

cùng gói

Truy c p

trong l p

khác khác

gói

private X - - - -

protected X X X X -

public X X X X X

default X X - X -

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.

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

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

Biên so n: Nguy n Th Đi u Page 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 xem 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 xuấ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

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

Biên so n: Nguy n Th Đi u Page 64

Java cho phép ta xây dựng nhi u ph ng th c trùng tên nhau, trong cùng m t l p,

hi n t ng các ph 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.

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

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

Biên so n: Nguy n Th Đi u Page 65

BÀI 4 K TH A (INHERITANCE), ĐA HỊNH

1. L p c s và l p d n xu t

M t l p đ c xây dựng thông qua k th a t m t l p khác gọi là l p d n xu t

(hay còn gọi là l p con, l p h u du ), l p dùng để xây dựng l p d n xu 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 xu t ngoài các thành phần c a riêng nó, nó còn đ c k th a t t c

các thành phần c a l p cha.

2. Cách xây dựng l p d n xu t

Để nói l p b là d n xu t c a l p a ta dùng t khoá extends, cú pháp nh sau:

class b extends 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 xu t, nh v y t p thu c tính

c a l p d n xu t s g m: các thu c tính khai báo trong l p d n xu t và các thu c tính c a

l p c s , tuy nhiên trong l p d n xu 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 xu t k th a t t c các ph ng th c c a l p c s tr :

- Ph ng th c t o dựng

- Ph ng th c finalize

5. Ph ng th c kh i t o của l p c s

L p d n xu 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 xu 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 ng minh

c a l p c s , th thì l p c s ph i đ 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 xu 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 xu 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.

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

Biên so n: Nguy n Th Đi u Page 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 extends 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 xuat" );

}

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 xuat

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 ng

minh:

class B

{

public B ()

{

System.out.println ( "Ham tao của lop co so" );

}

}

public class A extends 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 xuat" );

}

public static void main ( String arg[] )

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

Biên so n: Nguy n Th Đi u Page 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 extends 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 xuat");

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

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

{

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

Biên so n: Nguy n Th Đi u Page 68

System.out.println ( "Ham tao của lop co so" );

}

}

public class A extends 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 xuat" );

}

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 xu 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 xét ví d sau:

class ASillyClass {

boolean aVariable;

void aMethod() {

aVariable = true;

}

}

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

Biên so n: Nguy n Th Đi u Page 69

class ASillierClass extends 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 xu 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”. 7.1. 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ó.

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

Biên so n: Nguy n Th Đi u Page 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 9

7.3. Phương th c final

M t ph ng th c bình th ng có thể b ghi đè l p d n xu t, đôi khi ta không

mu n ph ng th c c a ta b ghi đè l p d n xu 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 xu 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.

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

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

Biên so n: Nguy n Th Đi u Page 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{

//

}

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

t 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 đ 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

con

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 ng

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 ng

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

9. Đa hình thái

Đa hình thái trong l p trình h ng đ i t ng đ c p đ n kh năng quy t đ nh trong

lúc thi hành (runtime) mã nào s đ c ch y, khi có nhi u ph ng th c trùng tên nhau

nh ng 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 ng còn đ c gọi v i nhi u cái

tên khác nhau nh : t ng ng b i, k t ghép đ ng,..

Đa hình thái cho phép các v n đ khác nhau, các đ i t ng khác nhau, các ph ng

th c khác nhau, các cách gi i quy t khác nhau theo cùng m t l c đ chung.

Các b 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 ng, hoặc là m t giao di n), l p này

s đ c các l p con m r ng( đ i v i l p th ng, hoặc l p tr u t ng), hoặc triển khai

chi ti t ( đ i v i giao di n ).

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

Biên so n: Nguy n Th Đi u Page 72

2. Xây dựng các l p d n xu t t l p c s v a t o. Trong l p d n xu 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 ng), hoặc triển khai chi ti t nó ( đ i

v i l p c s tr u t ng hoặc giao di n).

3. Thực hi n vi c t o khuôn xu 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 xu 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 xu ng, vi c t o khuôn xu ng luôn đ c java ch p thu n, do

v y khi t o khuôn xu 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.

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

Biên so n: Nguy n Th Đi u Page 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 xa 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 xu 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 c đ nh nghĩa c a interface. Sau đơy lƠ hình nh c a m t interface.

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

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

Biên so n: Nguy n Th Đi u Page 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

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

1.2. Phần thân

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

ph 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 c các khai báo thì ta s nh n đ c m t l i lúc d ch

(3) T t c các tr ng tự đ ng là final và static, nên ta không cần ph i cho b t này vào.

1.3. 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 xu t triển khai, do v y các l p d n xu 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 extends Applet implements StockWatcher {

.. .

public void valueChanged(String tickerSymbol, double newValue) {

if (tickerSymbol.equals(sunTicker)) {

.. .

} else if (tickerSymbol.equals(oracleTicker)) {

.. .

} else if (tickerSymbol.equals(ciscoTicker)) {

.. .

}

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

Biên so n: Nguy n Th Đi u Page 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 đ c li t kê cách nhau

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 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 đ c khai

báo là abstract

(3) Do giao di n cũng lƠ m t l p tr u t 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 nextElement() {

if (!hasMoreElements())

throw new NoSuchElementException();

else

return items.elementAt(currentItem--);

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

Biên so n: Nguy n Th Đi u Page 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 ( đ c bàn kỹ khi

nói v thi t k giao di n ng i dùng)

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

Biên so n: Nguy n Th Đi u Page 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 x 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ẻ.

1.2. Tiểu trình ( thread )

M t tiểu trình là m t đ n v x lý c b n trong h th ng. M i tiểu trình x 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.

1.3. 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, Unix, Linux 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

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

Biên so n: Nguy n Th Đi u Page 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.

1.4. 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 xá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 đó x y ra, hay

đ i m t thao tác nh p/xu 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 đ c x lý, hay nói cách khác ti n trình

đang s h u CPU.

- Blocked: ti n trình đang ch đ c c p tài nguyên, hay ch m t sự ki n nƠo đó xẩy

ra.

- Ready: ti n trình đang ch c p CPU để x lý.

- K t thúc: ti n trình đư hoƠn t t vi c x lý.

1.5. Miền găng ( Critical Section )

a) Vấn đề tranh chấp tài nguyên

Ta xé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 ng trình trong đó có thể xẩy ra các mâu thu n truy xu t trên tài nguyên

dụng chung đ 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 x lý, cũng nh gi i phóng

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

Biên so n: Nguy n Th Đi u Page 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ể xâ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 đ c gán m t công vi c cụ thể, chúng đ c thực thi đ ng

th i v i các lu ng khác.

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 extends 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 ng th c lắm, chúng ch có m t vài ph ng th c

h u dụng đ 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() đ c

gọi, khi start() đ c gọi thì ph ng th c run() cũng đ c kích ho t

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

Biên so n: Nguy n Th Đi u Page 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 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ì ph 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

ph 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 ng th c notify () thay vì s dụng ph ng th c

resume()

- public static void sleep( long millis) Threadows InterruptedException

Đặt tuy n thi hành vào tr ng thái ng , trong kho ng th i gian xá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 xem tuy n có b ngắt không

- public void setpriority( int p)

n đ nh đ u tiên cho tuy n thi hƠnh, đ u tiên đ c xác đ nh là m t s nguyên

thu c đo n [1,10]

- public final void wait() throws InterruptException

Đặ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

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

Biên so n: Nguy n Th Đi u Page 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 extends 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 extends 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 xen 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

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

Biên so n: Nguy n Th Đi u Page 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 xong. 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

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

Biên so n: Nguy n Th Đi u Page 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.

2.5. 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:

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

Biên so n: Nguy n Th Đi u Page 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 đ c c p

th i gian s dụng CPU nhi u h n tuy n t, lý do lƠ ta đư đặt đ u tiên c a tuy n t1 l n

h n đ u tiên c a tuy n t.

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 ng

tự nhau.

Để 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.

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

Biên so n: Nguy n Th Đi u Page 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 ng,

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

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

Biên so n: Nguy n Th Đi u Page 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 c l 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 i nh n. Hình th c liên l c nƠy có đặc điểm:

- Ng 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

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

Biên so n: Nguy n Th Đi u Page 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 xa, ta ph i bi t đ c đ a ch IP c a máy xa, tuy nhiên đ a ch IP thì r t

khó nh , đôi khi ta không thể bi t chính xá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 xa 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 xa 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 c l i. Có m t s ph ng th c sau mà

b n cần quan tâm:

Ph­¬ng ph¸p M« t¶

Public void equals( Object

obj)

So s¸nh 2 ®èi t-îng

Public byte[] getAddress() LÊy vÒ ®Þa chØ IP d-íi d¹ng m¶ng byte

public static

InetAddress[]

getAllByName(String ho

st)

throws

UnknownHostException

Tr¶ vÒ m¶ng ®èi t-îng InetAddress, v× mét m¸y cã thÓ cã nhiÒu ®Þa chØ IP (do cã nhiÒu card m¹ng), nªn ph-¬ng thøc nµy tr¶ vÒ mét m¶ng chøa tÊt c¶ c¸c ®Þa chØ t-¬ng øng víi tªn miÒn.

public static InetAddress

getByName(String host)

throws

UnknownHostException

Tr¶ l¹i ®èi t-îng InetAddress cã tªn ®-îc chØ ra, tªn nµy lµ mét x©u kÝ tù d-íi d¹ng tªn miÒn hoÆc ®Þa chØ IP

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

Biên so n: Nguy n Th Đi u Page 88

public String

getHostAddress()

Tr¶ vÒ ®Þa chØ IP cña m¸y chñ

public String

getHostName()

Tr¶ vÒ tªn cña m¸y chñ

public static InetAddress

getLocalHost()

throws

UnknownHostException

Tr¶ vÒ ®èi t-îng InetAddress kÕt hîp víi chÝnh m¸y ®ã

public boolean

isMulticastAddress()

KiÓm tra xem ®Þa chØ nµy cã ph¶i lµ ®Þa chØ Multicast 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 UnknownHostException, 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("www.cvauni.edu.vn");

System.out.println(address);

}

catch (UnknownHostException ex) {

System.out.println("Could not find www.cvauni.edu.vn");

}

}

}

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

Biên so n: Nguy n Th Đi u Page 89

K t qu ch y ch ng trình nh sau:

www.cvauni.edu.vn/127.0.0.1Ngoài cách truy n vƠo ph ng th c getByName m t xâu

ký tự thể hi n tên máy b n ta thể truy n vào m t xâu thể hi n đ a ch IP c a máy nh sau:

InetAddress address = InetAddress.getByName("192.168.101.1");

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 (UnknownHostException ex) {

System.out.println("Could not find this computer's address.");

}

}

}

K t qu ch y ch ng trình nh sau:

cvauni1/192.168.101.1Ví 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("www.cvauni.edu.vn");

for (int i = 0; i < addresses.length; i++) {

System.out.println(addresses[i]);

}

}

catch (UnknownHostException ex) {

System.out.println("Could not find www.cvauni.edu.vn");

}

}

}

K t qu ch y ch ng trình nh sau: www.cvauni.edu.vn/192.168.101.1

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

Biên so n: Nguy n Th Đi u Page 90

www.cavuni.edu.vn/10.0.0.2

www.cvauni.edu.vn/162.163.10.5

www.cvauni.edu.vn/3.152.90.25

s dĩ cho k t qu nh trên lƠ do máy có cƠi 4 card m ng, t ng ng v i m i card m ng

tôi đặt m t d a ch IP cho nó.

N u máy c a b n có n i m ng Internet b n có thể kiểm tra xem máy ch

www.microsoft.com c a Microsoft đ c cài bao nhiêu b giao ti p m ng bằng cách

thayInetAddress.getAllByName("www.cvauni.edu.vn"); b i

InetAddress.getAllByName("www.microsoft.com");

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("162.163.10.5");

System.out.println(ia.getHostName());

}

catch (Exception ex) {

System.err.println(ex);

}

}

}

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 (UnknownHostException ex) {

System.out.println("I'm sorry. I don't know my own address.");

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

Biên so n: Nguy n Th Đi u Page 91

}

} }

K t qu in ra nh sau:

My address is 192.168.101.1

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 www.cvauni.edu.vn

hoặc www.microsoft.com nh sau:

import java.net.*;

class GetHostAddress1 {

public static void main(String[] args) {

try {

InetAddress me = InetAddress.getByName("www.cvauni.edu.vn");

String dottedQuad = me.getHostAddress();

System.out.println("Address is " + dottedQuad);

}

catch (UnknownHostException ex) {

System.out.println("I'm sorry. I don't know my own address.");

}

}

}

K t qu in ra nh sau:

Address is 192.168.101.1

Ví d 6: Kiểm tra xem 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("www.cvauni.edu.vn");

InetAddress add2 = InetAddress.getByName("www.dantri.com.vn");

if (add1.equals(add2)) {

System.out.println("Hai dia chi nay co cung IP");

}

else {

System.out.println("Hai dia chi nay khac IP");

}

}

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

Biên so n: Nguy n Th Đi u Page 92

catch (UnknownHostException ex) {

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 \"exit\" or \"quit\" to quit.");

try {

while (true) {

String host = in.readLine();

if (host.equalsIgnoreCase("exit") ||

host.equalsIgnoreCase("quit")) {

break;

}

System.out.println(lookup(host));

}

}

catch (IOException ex) {

System.err.println(ex);

}

}

}

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

Biên so n: Nguy n Th Đi u Page 93

private static String lookup(String host) {

InetAddress node;

try {

node = InetAddress.getByName(host);

}

catch (UnknownHostException ex) {

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 xem đị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

MalformedURLException n u b n t o ra m t URL t m t giao th c không đ c h tr

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

Biên so n: Nguy n Th Đi u Page 94

hoặc các thông tin cung c p trong URL không chính xác thì b n s nh n đự c m t ngo i

l MalformedURLException

a) Tạo ra một URL từ một xâu

public URL(String url) throws MalformedURLException

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

Ví d 1: T o ra m t URL t m t xâu và bắt ngo i l sinh ra

try {

URL u = new URL("http://www.cvauni.edu.vn/");

}

catch (MalformedURLException ex) {

System.err.println(ex);

}

Ví d 2: Ví dụ này t o ra m t s URL và kiểm tra xem giao th c t ng ng v i các URL

có đ c h tr trong virtual machine c a b n hay không

/* Which protocols does a virtual machine support? */

import java.net.*;

class ProtocolTester {

public static void main(String[] args) {

// hypertext transfer protocol

testProtocol("http://www.adc.org");

// secure http

testProtocol("https://www.amazon.com/exec/obidos/order2/");

// file transfer protocol

testProtocol("ftp://metalab.unc.edu/pub/languages/java/javafaq/");

// Simple Mail Transfer Protocol

testProtocol("mailto:[email protected]");

// 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");

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

Biên so n: Nguy n Th Đi u Page 95

// JAR

testProtocol(

"jar:http://cafeaulait.org/books/javaio/ioexamples/javaio.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://www.adc.org/+/index.html");

testProtocol("verbatim:http://www.adc.org/");

}

private static void testProtocol(String url) {

try {

URL u = new URL(url);

System.out.println(u.getProtocol() + " is supported");

}

catch (MalformedURLException ex) {

String protocol = url.substring(0, url.indexOf(':'));

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

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

Biên so n: Nguy n Th Đi u Page 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 MalformedURLException

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", "www.microsoft.com", "/index.html");

}

catch (MalformedURLException ex) {

// All VMs should recognize http

}

Đo n ch ng trình trên t o ra m t URL ch đ n

http://www.microsoft.com/index.html, 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 MalformedURLException

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, "/index.html");

}

catch (MalformedURLException ex) {

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

Biên so n: Nguy n Th Đi u Page 97

System.err.println(ex);

}

Ví dụ này t o ra m t URL tr đ n http://localhost: 8080/index.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 MalformedURLException

Ví d :

try {

URL u1 = new URL("http://www.ibiblio.org/javafaq/index.html");

URL u2 = new URL (u1, "mailinglists.html");

}

catch (MalformedURLException ex) {

System.err.println(ex);

}

Trong ví dụ nƠy thì u1 đang tr đ n http://www.ibiblio.org/javafaq/index.html còn

u2 thì đang tr đ n http://www.ibiblio.org/javafaq/ 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, email=25, ftp=23...

- 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ề xtocid1902914

URL u = new URL(

"http://www.ibiblio.org/javafaq/javafaq.html#xtocid1902914");

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(

"http://www.ibiblio.org/nywc/compositions.phtml?category=Piano");

System.out.println("The query string of " + u + " is " + u.getQuery( ));

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

Biên so n: Nguy n Th Đi u Page 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("http://java.sun.com");

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.indexOf('@');

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 (MalformedURLException ex) {

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 http://java.sun.com

The scheme is http

The user info is null

The host is java.sun.com

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

Biên so n: Nguy n Th Đi u Page 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

B n có thể nh n v d li u đ c ch đ nh trong URL bằng cách s dụng cách

ph n th c sau:

public InputStream openStream( ) throws IOException

public URLConnection openConnection( ) throws IOException

public URLConnection openConnection(Proxy proxy) throws IOException // 1.5

public Object getContent( ) throws IOException

public Object getContent(Class[] classes) throws IOException // 1.3

public final InputStream openStream( ) throws IOException

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("http://localhost:80/index.html");

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 (MalformedURLException ex) {

System.err.println(“is not a parseable URL");

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

Biên so n: Nguy n Th Đi u Page 100

}

catch (IOException ex) {

System.err.println(ex);

}

} // end main

} // end SourceViewer

K t qu ch y nh sau:

<html>

<head>

<meta http-equiv="Content-Type"content="text/html; charset=iso-8859-1">

<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 IOException

Ph ng th c này m m t socket k t n i đ n máy ch . N u ph ng th c này th t

b i nó ném ra ngo i l IOException.

Ví d :

try {

URL u = new URL("http://www.jennicam.org/");

try {

URLConnection uc = u.openConnection( );

InputStream in = uc.getInputStream( );

// read from the connection...

} // end try

catch (IOException ex) {

System.err.println(ex);

}

} // end try

catch (MalformedURLException ex) {

System.err.println(ex);

}

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

Biên so n: Nguy n Th Đi u Page 101

Trong java 1.5 còn m t ph ng th c đ c n p ch ng nh sau:

public URLConnection openConnection(Proxy proxy) throws IOException

Ph ng th c này r t h u dụng khi trong m ng c a b n có s dụng proxy

- Ph ng th c public final Object getContent( ) throws IOException

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("http://localhost:80/index.html");

try {

Object o = u.getContent();

System.out.println("I got a " + o.getClass().getName());

} // end try

catch (IOException ex) {

System.err.println(ex);

}

} // end try

catch (MalformedURLException ex) {

System.err.println("is not a parseable URL");

}

} // end main

} // end ContentGetter

K t qu ch y nh sau:

I got a sun.net.www.protocol.http.HttpURLConnection$HttpInputStream

N u thay URL u = new URL("http://localhost:80/index.html"); b i URL u = new

URL("http://localhost:80/print.gif"); k t qu thu đ c nh sau:

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 ng

dùng để k t n i đ n máy ch , còn đ i v i máy ch nó th ng dùng để đáp l i k t n i t

máy khách.

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

Biên so n: Nguy n Th Đi u Page 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.

2.3.1 Một số hàm tạo của lớp Socket

a) public Socket(String host, int port) throws UnknownHostException, IOException

Ta th ng s 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

c a máy là m t xâu ký tự, tên c a máy ch có thể là tên mìên hoặc đ a ch IP. N u nh không t n t i máy này thì nó s ném ra m t ngo i l UnknownHostException. N u

Socket không thể m vì b t c lý do nào thì nó ném ra ngo i l IOException.

Ví d : K t n i đ n web server www.cvauni.edu.vn

try {

Socket toCvauni= new Socket("www.cvauni.edu.vn", 80);

//~ Socket toCvauni= new Socket("162.163.10.5", 80);

// send and receive data...

}

catch (UnknownHostException ex) {

System.err.println(ex);

}

catch (IOException ex) {

System.err.println(ex);

}

- public Socket(InetAddress host, int port) throws IOException

Ta th ng s dụng hàm t o nƠy để k t n i đ n máy ch khi bi t m t InetAddress

gắn v i nó.

Ví dụ sau cũng k t n i đ n máy ch www.cvauni.edu.vn trên c ng 80:

try {

InetAddress cvauni = InetAddress.getByName("www.cvauni.edu.vn");

//~ InetAddress cvauni = InetAddress.getByName("162.135.10.5");

Socket cvauniSocket = new Socket(cvauni , 80);

// send and receive data...

}

catch (UnknownHostException ex) {

System.err.println(ex);

}

catch (IOException ex) {

System.err.println(ex);

}

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

Biên so n: Nguy n Th Đi u Page 103

- public Socket(String host, int port, InetAddress interface, int localPort) throws

IOException, UnknownHostException

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 1024 - 65535.

Ví d :

try {

InetAddress inward = InetAddress.getByName("cvauni");

Socket socket = new Socket("www.cvauni.edu.vn", 80, inward, 0);

// work with the sockets...

}

catch (UnknownHostException ex) {

System.err.println(ex);

}

catch (IOException ex) {

System.err.println(ex);

}

- public Socket(InetAddress host, int port, InetAddress interface, int localPort) throws

IOException

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("www.cvauni.edu.vn");

Socket socket = new Socket(http, 80, inward, 0);

// work with the sockets...

}

catch (UnknownHostException ex) {

System.err.println(ex);

}

catch (IOException ex) {

System.err.println(ex);

}

2.3.2. Lấy về thông tin gắn với Socket

- Ph ng th c public InetAddress getInetAddress() dùng để l y v đ i t ng

InetAddress t ng ng v i máy remote.

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

Biên so n: Nguy n Th Đi u Page 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 (UnknownHostException ex) {

System.err.println(ex);

}

catch (IOException ex) {

System.err.println(ex);

}

- 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 (UnknownHostException ex) {

System.err.println(ex);

}

catch (IOException ex) {

System.err.println(ex);

}

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

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 (UnknownHostException ex) {

System.err.println(ex);

}

catch (IOException ex) {

System.err.println(ex);

}

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

Biên so n: Nguy n Th Đi u Page 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 (UnknownHostException ex) {

System.err.println(ex);

}

catch (IOException ex) {

System.err.println(ex);

}

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("www.cvauni.edu.vn", 80);

System.out.println("Connected to " + theSocket.getInetAddress()

+ " on port " + theSocket.getPort() + " from port "

+ theSocket.getLocalPort() + " of "

+ theSocket.getLocalAddress());

} // end try

catch (UnknownHostException ex) {

System.err.println("I can't find host");

}

catch (SocketException ex) {

System.err.println("Could not connect to host");

}

catch (IOException ex) {

System.err.println(ex);

}

} // end main

} // end SocketInfo

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

Biên so n: Nguy n Th Đi u Page 106

- Ph ng th c public OutputStream getOutputStream() throws IOException 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 IOException 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.

2.3.3. Đó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 xu 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 IOException

M t Socket s tự đ ng đóng l i n u xẩy ra m t trong các tính hu ng sau:

- C hai lu ng nh p xu t gắn v i Socket đ u đ c đóng l i.

- Khi ch 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 xẩ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("www.cvauni.edu.vn", 80);

// interact with the socket...

} // end try

catch (UnknownHostException ex) {

System.err.println(ex);

}

catch (IOException ex) {

System.err.println(ex);

}

finally {

// Đóng Socket lại

if (connection != null) connection.close( );

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

Biên so n: Nguy n Th Đi u Page 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 xu t không xẩ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 xa hay ch a vƠ nh n v false trong

tr ng h p ng c l i.

Th nên để kiểm tra xem 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 ng th c này

tr v true n u nh Socket đ c liên k t v i m t c ng cục b nƠo đó.

2.3.4. Truyền trong chế độ haft duplex

Kể t phiên b n java 1.3 có thêm hai ph ng th c:

public void shutdownInput( ) throws IOException

public void shutdownOutput( ) throws IOException

Hai ph ng th c này cho phép b n đóng lu ng nh p hoặc xu 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 duplex).

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 xong thì lu ng xu 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("www.cvauni.edu.vn", 80);

Writer out = new OutputStreamWriter(connection.getOutputStream( ));

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

Biên so n: Nguy n Th Đi u Page 108

out.write("GET / HTTP 1.0\r\n\r\n");

out.flush( );

/*

Đóng lu ng xu t l i. Sau khi đóng lu ng xu 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 (IOException ex) {

}

finally {

try {

if (connection != null) connection.close( );

}

catch (IOException ex) {}

}

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.

2.4.1. Một số hàm tạo của lớp ServerSocket

public ServerSocket(int port) throws BindException, IOException

public ServerSocket(int port, int queueLength)

throws BindException, IOException

public ServerSocket(int port, int queueLength, InetAddress bindAddress)

throws IOException

public ServerSocket( ) throws IOException // Java 1.4

Các hàm t o nƠy xá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 xét cụ thể t ng hàm t o:

- Hàm t o public ServerSocket(int port) throws BindException, IOException

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

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

Biên so n: Nguy n Th Đi u Page 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 (IOException ex) {

System.err.println(ex);

}

Chú ý:

- N u không thể t o ra m t ServerSocket thì nó s ném ra ngo i l IOException

- N u port đư đ c s dụng cho m t ch ng trình khác r i thì ngo i l

BindException s đ c ném ra.

Ví dụ tìm xem 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 next 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 (IOException ex) {

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 IOException,

BindException

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 .

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

Biên so n: Nguy n Th Đi u Page 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 (IOException ex) {

System.err.println(ex);

}

- Hàm t o public ServerSocket(int port, int queueLength, InetAddress bindAddress)

throws BindException, IOException

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 162.163.10.5 và m t b giao ti p m ng khác có đ a ch 192.168.101.1. Để t o ra m t

ServerSocket lắng nghe trên c ng 3456, b giao ti p m ng 162.163.10.5 (ch không ph i

là 192.168.101.1) và cho phép 100 yêu cầu k t n i.

try {

ServerSocket httpd = new ServerSocket(3456, 100,

InetAddress.getByName("162.163.10.5"));

} catch (IOException ex) {

System.err.println(ex); }

- Hàm t o public ServerSocket( ) throws IOException // 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 IOException // Java 1.4

public void bind(SocketAddress endpoint, int queueLength) // Java 1.4

throws IOException

Hàm t o nƠy cũng r t h u dụng khi b n cần đặt m t s thu c tính cho

ServerSocket tr c khi nó thực sự ch p nh n các k t n i.

Thông th 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 đó.

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

Biên so n: Nguy n Th Đi u Page 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);

2.4.2. 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 IOException {

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

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

Biên so n: Nguy n Th Đi u Page 112

//Client.java

import java.net.*;

import java.io.*;

class Client {

public static void main(String[] args) throws IOException {

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

}

}

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

ch 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 c l i, tuy nhiên

n u k t n i ch a đ 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

đó.

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

Biên so n: Nguy n Th Đi u Page 113

Th nên để kiểm tra xem 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.

2.6. Lớp DatagramPacket

L p này thể hi n cho m t gói d li u đ c g i đi bằng giao th c UPD. Nó đ c

s dụng v i l p DatagramSocket.

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 x 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 ng Socket, ta s s dụng đ i t ng nƠy để

“giao ti p” v i máy khách

Socket connectToClient=s.accept();

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

Biên so n: Nguy n Th Đi u Page 114

B c 3) nh n v các đ i t ng outputStream và inputStream t đ i t ng Socket nh n v

t ph ng th c accept b c 2, các đ i t 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 ng inputStream v n liên k t v i đ i

t 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/xu 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) x 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 ng vi c đóng k t n i đ c

kh i x ng t phía máy khách

Ví d 1: Nh n v trang index.html tr máy ch web www.cvauni.edu.vn 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("www.cvauni.edu.vn", 80);

OutputStream raw = http.getOutputStream();

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

Biên so n: Nguy n Th Đi u Page 115

OutputStream buffered = new BufferedOutputStream(raw);

out = new PrintWriter(buffered);

out.write("GET /index.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 (Exception ex) {

ex.printStackTrace();

}

finally {

try {

out.close();

}

catch (Exception ex) {}

}

}

}

Ví d 2: Xây dựng ch ng trình EchoClient vƠ EchoServer.

Xây dựng ch 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+".");

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

Biên so n: Nguy n Th Đi u Page 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 (IOException 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("www.cvauni.edu.vn", 3456);

client.requestServer();

client.shutdown();

}

}

class ClientConnect {

Socket connection;

DataOutputStream out;

BufferedReader in;

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

Biên so n: Nguy n Th Đi u Page 117

public ClientConnect(String destination, int port) {

try {

connection = new Socket(destination, port);

in = new BufferedReader(new InputStreamReader(connection.getInputStream()));

out = new DataOutputStream(connection.getOutputStream());

System.out.println("Connected to server at port 3456.");

}

catch (Exception 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':

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

Biên so n: Nguy n Th Đi u Page 118

finished = true;

break;

default:

break;

}

}

}

catch (Exception e) {

System.out.println(e);

}

}

while (!finished);

}

public void shutdown() {

try {

connection.close();

}

catch (IOException ex) {

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 đ c hiển th trong ô k t qu , khi ta kích

chu t nút Đóng, 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ủ:

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

Biên so n: Nguy n Th Đi u Page 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/xuấ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 (IOException ex)

{

}

}

public static void main(String[] args)

{

Server server1 = new Server();

}

}

Mã ngu n phía máy khách:

package net.cvauni;

import javax.swing.*;

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

Biên so n: Nguy n Th Đi u Page 120

import java.awt.*;

import java.io.*;

import java.net.*;

import java.awt.event.*;

public class Frame1 extends JFrame

{

// Khai báo các thành phần

Socket connectToServer;

DataInputStream in; // luồng nhập

DataOutputStream out; //luồng xuất

boolean isConnect = false; //biến kiểm tra xem đã 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 (UnknownHostException ex)

{

JOptionPane.showMessageDialog(this, "khong tim thay may chu", "loi",

JOptionPane.ERROR_MESSAGE);

}

catch (IOException ex)

{

JOptionPane.showMessageDialog(this, "co loi ve nhap xuat", "loi",

JOptionPane.ERROR_MESSAGE);

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

Biên so n: Nguy n Th Đi u Page 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.getText())); // gửi chuều dài

out.writeDouble(Double.parseDouble(jtfRong.getText())); //gửi chiều rộng

out.flush(); // đẩy hết dữ liệu ra

jtfKetQua.setText(String.valueOf(in.readDouble())); // nhận về kết quả và

// hiển thị trong ô kết quả

}

catch (NumberFormatException ex)

{

// 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 (IOException ex)

{

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 (IOException ex)

{

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

Biên so n: Nguy n Th Đi u Page 122

}

System.exit(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)

{

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

Biên so n: Nguy n Th Đi u Page 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ụ đ c nhi u máy khách, ch ng trình phía máy khách v n gi nguyên, ta ch thay đ i ch 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 (IOException ex)

{

}

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

Biên so n: Nguy n Th Đi u Page 124

}

}

class HandleClient extends 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 (IOException ex)

{

}

//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 (IOException ex1)

{

}

}

}

}

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

Biên so n: Nguy n Th Đi u Page 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ó xá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

xa, 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 ng trình g m có 2 ch ng trình, hai ch ng trình nƠy lƠ ngang hƠng không có ch ng trình nƠo lƠ ch c , các l nh cần

thi t để liên l c đ c trong ch đ không k t n i đ c in đ m

Mã chương trình th nhất:

package net.cvauni;

import javax.swing.*;

import java.awt.event.*;

import java.awt.*;

import java.io.*;

import java.net.*;

public class Frame2 extends 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);

}

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

Biên so n: Nguy n Th Đi u Page 126

catch (SocketException ex)

{

}

}

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 (IOException ex)

{

}

}

}

private void dong()

{

try

{

s.close();// đóng kết nối

}

catch (Exception ex)

{

}

System.exit(0);

}

public static void main(String[] args)

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

Biên so n: Nguy n Th Đi u Page 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.getText().getBytes();

InetAddress local = null;

try

{

local = InetAddress.getLocalHost();

}

catch (UnknownHostException ex)

{

}

// 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 (IOException ex1)

{

JOptionPane.showMessageDialog(this, "khong the guu duoc");

}

}

void jbtExit_actionPerformed(ActionEvent e)

{

dong();

System.exit(0);

}

void this_windowClosing(WindowEvent e)

{

dong();

}

}

class Frame2_jbtSend_actionAdapter implements java.awt.event.ActionListener

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

Biên so n: Nguy n Th Đi u Page 128

{

private Frame2 adaptee;

Frame2_jbtSend_actionAdapter(Frame2 adaptee)

{

this.adaptee = adaptee;

}

public void actionPerformed(ActionEvent e)

{

adaptee.jbtSend_actionPerformed(e);

}

}

class Frame2_jbtExit_actionAdapter implements java.awt.event.ActionListener

{

private Frame2 adaptee;

Frame2_jbtExit_actionAdapter(Frame2 adaptee)

{

this.adaptee = adaptee;

}

public void actionPerformed(ActionEvent e)

{

adaptee.jbtExit_actionPerformed(e);

}

}

class Frame2_this_windowAdapter extends 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 javax.swing.*;

import java.awt.*;

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

Biên so n: Nguy n Th Đi u Page 129

import java.awt.event.*;

import java.io.*;

import java.net.*;

public class Frame3 extends JFrame

{

// Khai báo

private DatagramSocket s;

private DatagramPacket sen, rev;

private boolean isFirstLine = true;

//user code

try

{

s = new DatagramSocket(4002);

}

catch (SocketException ex)

{

}

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 (IOException ex)

{

}

}

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

Biên so n: Nguy n Th Đi u Page 130

}

private void dong()

{

try

{

s.close();

}

catch (Exception ex)

{

}

System.exit(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.getText().getBytes();

InetAddress local = null;

try

{

local = InetAddress.getLocalHost();

}

catch (UnknownHostException ex)

{

}

sen = new DatagramPacket(dat, dat.length, local, 2004);

try

{

s.send(sen);

}

catch (IOException ex1)

{

JOptionPane.showMessageDialog(this, "khong the guu duoc");

}

}

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

Biên so n: Nguy n Th Đi u Page 131

void jbtExit_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_jbtExit_actionAdapter implements java.awt.event.ActionListener

{

private Frame3 adaptee;

Frame3_jbtExit_actionAdapter(Frame3 adaptee)

{

this.adaptee = adaptee;

}

public void actionPerformed(ActionEvent e)

{

adaptee.jbtExit_actionPerformed(e);

}

}

class Frame3_this_windowAdapter extends java.awt.event.WindowAdapter

{

private Frame3 adaptee;

Frame3_this_windowAdapter(Frame3 adaptee)

{

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

Biên so n: Nguy n Th Đi u Page 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 ng DatagramSocket để nh n và g i d li u, bằng hàm t o c a nó nh sau:

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)

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

Biên so n: Nguy n Th Đi u Page 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 .

1.1. 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, x 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.

1.2. 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, …

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

Biên so n: Nguy n Th Đi u Page 134

Microsoft đ a ra m t gi i pháp khác phục nh c điểm c a các trình CGI, công

ngh này c a Windows đ 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 x 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 ng tự nh ISAPI, tuy nhiên nó đ c vi t bằng mã java.

JSP/servlets là công ngh c a Java đ 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.

1.3. 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 x 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ẻ để x 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 x 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 xó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.

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

Biên so n: Nguy n Th Đi u Page 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 x 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ó.

1.3.1 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 x lý, hoặc trên m t h th ng load-balancing s

là m i x 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 xác đ nh t t h n trong h

th ng file. Vi c x 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.

1.3.2 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 để x

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 xâ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

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

Biên so n: Nguy n Th Đi u Page 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.

1.3.3 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 ServletException: 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 x lý yêu cầu đầu tiên c a nó.

public void service(ServletRequest request, ServletResponse response) throws

ServletException, IOException: ph ng th c nƠy đ c gọi để x 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 ng th c này song song, vì th nó tr nên an

toàn.

public void detroy(): ph 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 ServletException {

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

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

Biên so n: Nguy n Th Đi u Page 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 javax.servlet.*;

import javax.servlet.http.*;

public class ReqInfoServlet extends HttpServlet {

...

}

M t t p các ph ng th c trong HTTPServlet là nh ng ph ng th c xá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 x 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 x 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 ng th c

doGet

protected void doGet(HttpServletRequest request,HttpServletResponse response)

throws ServletException, IOException{

...

}

1.3.4 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 xu 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 ng vƠ stdin để nh n thông tin v yêu cầu, tuy

nhiên vi c đặt tên các bi n môi tr ng có thể khác nhau gi a các CGI, và m t vài bi n

không đ c cung c p b i t t c các Web server.

Đ i t ng HTTPServletRequest cũng cung c p thông tin gi ng nh bi n môi

tr ng c a CGI theo m t h ng chuẩn. Nó cũng cung c p nh ng ph 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.

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

t 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

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

Biên so n: Nguy n Th Đi u Page 138

xu t văn b n text. 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à xem 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 ServletException, OException {

response.setContentType("text/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.nextElement();

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

Biên so n: Nguy n Th Đi u Page 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.nextElement();

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

http://localhost:8080/servlet/ReqInfoServlet?foo=bar&foo=baz 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

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

Biên so n: Nguy n Th Đi u Page 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 Unix). 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 ng

Cookie. Để thêm m t cookie vào tr l i, HTTPServletResponse cung c p ph ng th c

addCookie đặt m t đ i t ng Cookie nh lƠ m t đ i s .

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

http://localhost:8080/servlet/ReqInfoServlet/foo/bar?fee=baz thì rong trình duy t s hiển

th

Request info

getCharacterEncoding:

getContentLength: -1

getContentType: null

getProtocol: HTTP/1.0

getRemoteAddr: 127.0.0.1

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

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

Biên so n: Nguy n Th Đi u Page 141

Request headers:

Connection : Keep-Alive

User-Agent : Mozilla/4.5 [en] (WinNT; I)

Host : thangnc

Accept : image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */*

Accept-Encoding : gzip

Accept-Language : en

Accept-Charset : iso-8859-1,*,utf-8

Cookie : TOMCATID=TO04695278486734222MC1010AT

Cookies:

TOMCATID : TO04695278486734222MC1010AT

N u b n mu n servlet này x 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ể x 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 ServletException, IOException {

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 x

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.

1.3.5 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 x

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 xem xét v chúng m t cách chi ti t d i đơy. M t cách h u hi u khác x 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);

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

Biên so n: Nguy n Th Đi u Page 142

Ph ng th c nƠy đặt vào m t đ i s kiểu boolean. N u đ i s đ c đặt vào là true

thì s có m t session m i đ 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 x 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

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

Biên so n: Nguy n Th Đi u Page 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 xác

đ nh. Hầu h t các servlet engine đ u cho phép b n xá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 setMaxInactiveInterval 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 (context) 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 context, nh ng v i

phiên b n 2.1 c a API, context tr nên h u dụng h n vƠ có thể đ c xem nh xu 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.

1.3.6 Các thuộc tính ServletContext

T t c các servlet thu c v m t ng c nh (context) 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 context, nh ng v i

phiên b n 2.1 c a API, context tr nên h u dụng h n vƠ có thể đ c xem nh xu 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.

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 context và h tr nhi u context trong cùng m t host.

ServletContext 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

context. đơy, chúng ta s ch xem xét các attribute c a ServletContext 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 ServletContext 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 context 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 c, m t b ng kiểu (style sheet) URL cho m t ng dụng, tên c a m t mail

server …

M t server nh n m t tham chi u đ n đ i t ng ServletContext 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 getServletContext làm cho nó th t sự d

dàng

ServletContext context = getServletContext();

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

Biên so n: Nguy n Th Đi u Page 144

String styleSheet = context.getParameter(“stylesheet”);

If(styleSheet != null) {

//Xác định một style sheet mới cho ứng dụng

Context.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, x lý

request t m t HTML FORM có m t style sheet xá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:

ServletContext context = getServletContext();

String styleSheet = context.getAttribute(“stylesheet”);

out.println(“<HTML><HEAD>”);

out.println(“<LINK HREF=” + styleSheet + “ TYPE=text/css REL=STYLESHEET>”);

1.3.7 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 xác h n là cho siêu l p ServletRequest). Chúng

đ c xá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

xu t t m t servlet trong lu ng xu t t servlet chính.

Các ph ng th c getResourcev và getResourceAsStream c a l p ServletContext

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

ServletContext 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 context để b n xá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 ng th c có thể là m t ch đ trong m t

article 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 m t servlet x lý bằng

cách chia nh thƠnh các thread để thực thi t ng ng v i ph ng th c x lý request (ví

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

Biên so n: Nguy n Th Đi u Page 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.

1.3.8 Đa tuyến (Multithreading)

Nh b n đư th y phần tr c, các request song song đ c m t servlet x lý bằng

cách chia nh thƠnh các thread để thực thi t ng ng v i ph ng th c x 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 ServletException, IOException {

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 ng th c. Đi u nƠy có nghĩa là giá tr c a instance variable someParam s đ c đặt vào thread th hai trong khi thread

đầu tiên v n còn s dụng nó.

Chuyển sang m t thread an toƠn nh sau:

private String someParam;

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

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

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

Biên so n: Nguy n Th Đi u Page 146

trong các instance variable trong tr ng h p không làm vi c v i t t c , trong tr ng h p

này thay vì s dụng đ i t ng HttpSession, các attribute ServletContext 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 xơ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.

2.2. 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à

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

2.2.1. 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 xem 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è

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

Biên so n: Nguy n Th Đi u Page 147

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

2.2.2. Một số giao diện và lớp trong gói javax.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 ng trình java (hay b t c ch ng trình vi t

bằng ngôn ng nào khác) ph i tuơn theo các b 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.

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ài gi ng Ngôn ng l p trình Java

Biên so n: Nguy n Th Đi u Page 148

Các b c để xâ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

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

Biên so n: Nguy n Th Đi u Page 149

B 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

v a n p 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 xâ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 xâ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

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

Biên so n: Nguy n Th Đi u Page 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 www.microsoft.com

- 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à 1433

+ 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");

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

Biên so n: Nguy n Th Đi u Page 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.executeQuery("Select * from t");

while(rs.next())

System.out.println(rs.getString("a")+ rs.getString("b"));

} catch (SQLException ex) {

} catch (ClassNotFoundException ex) {

}

}

}

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 xu 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

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

Biên so n: Nguy n Th Đi u Page 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:

- @admin 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 M« t¶

Satement 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ã chøa

tham sè

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

2.4.1. 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 execute c a đ i t ng nƠy để thực thi m t l nh SQL,

chẳng h n nh đo n l nh sau s dụng ph ng th c executeUpdate để thực thi m t câu

l nh truy v n c p nh t:

stmt.executeUpdate("CREATE TABLE COFFEES"+"(COF_NAME VARCHAR(32), SUP_ID INTEGER, PRICE FLOAT, " + "SALES INTEGER, TOTAL INTEGER)");

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

Biên so n: Nguy n Th Đi u Page 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 executeQuery() 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 executeQuery() 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)

Để thực thi các l nh DDL b n s dụng ph ng th c executeUpdate c a đ i

t ng Statement theo m u:

stmt.executeUpdate(DDL_SQL_STRING);

Trong đó:

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

Biên so n: Nguy n Th Đi u Page 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 executeUpdate 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 executeUpdate() c a đ i t ng Statement theo m u:

stmt.executeUpdate(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 executeUpdate tr v m t s nguyên thể hi n s b n ghi đ c nh

h ng sau l nh nƠy, để bi t đ c s b n ghi đ c nh h ng b n có thể thực hi n theo

m u sau:

[int recordEffect=] stmt.executeUpdate(DML_SQL_STRING);

Ví d 1: Thêm m t b n ghi vào b ng sinhvien

stmt.executeUpdate(“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.executeUpdate(“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.executeUpdate(“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 executeUpdate

Ví d : b n mu n c ng thêm phụ c p cho t t c các ng i có trình đ đ i học lên 10 đ ng

b n làm

stmt.executeUpdate(

"UPDATE COFFEES " +

"SET CP=PC+10 WHERE td=dh”);

Thêm b n ghi vào b ng CSDL

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

Biên so n: Nguy n Th Đi u Page 155

Để chèn d li u vào b ng b n s dụng ph ng th c executeUpdate 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.executeUpdate(

"INSERT INTO COFFEES " +

"VALUES ('Colombian', 101, 7.99, 0, 0)");

Xoá b n ghi trong CSDL

Để xoá d li u t b ng CSDL b n s dụng ph ng th c executeUpdate c a đ i

t 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.executeUpdate(

"DELETE FROM COFFEES");

c) Thực thi câu l nh truy v n (Query Language)

Để thực thi câu l nh truy v n b n s dụng ph ng th c executeQuery() c a đ i

t ng Statement theo m u sau:

ResultSet rs=stmt.executeQuery(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 executeQuery 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.executeQuery(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.executeQuery(“SELECT * FROM SinhVien”);

While(rs.next())

{

//.. 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 ý nghÜa

next 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

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

Biên so n: Nguy n Th Đi u Page 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

pos)

Di chuyÓn con trá vÒ b¶n ghi thø pos tÝnh tõ

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

pos)

Di chuyÓn con trá vÒ tr-íc b¶n ghi hiÖn t¹i

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.executeQuery(query);

while (rs.next()) {

// sử dụng phương thức getString vì cột //COF_NAME có kiểu VARCHAR

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

Biên so n: Nguy n Th Đi u Page 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

T

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

T C R B M

H Y I P

A N

R A

R

Y

getByte X x x x x x x x x x x x x

getShort x X x x x x x x x x x x x

getInt x x X x x x x x x x x x x

getLong x x x X x x x x x x x x x

getFloat x x x x X x x x x x x x x

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

Biên so n: Nguy n Th Đi u Page 158

getDouble x x x x x X X x x x x x x

getBigDecima

l

x x x x x x x X X x x x x

getBoolean x x x x x x x x x X x x x

getString x x x x x x x x x x X X x x x x x x x

getBytes X X x

getDate x x x X x

getTime x x x X x

getTimestamp x x x x x X

getAsciiStre

am

x x X x x x

getUnicodeSt

ream

x x X x x x

getBinaryStr

eam

x x X

getObject x x x x x x x x x x x x x x x x 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 “x” 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 ng th c trong JDBC 2.0 để thực hi n cũng công vi c đó.

Đ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 ng bằng các ph ng th c updateXXX() t ng ng,

b n xác nh n vi c c p nh t bằng ph ng th c updateRow(). Ph 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.

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

Biên so n: Nguy n Th Đi u Page 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 ng th c c a đ i t ng ResultSet c p nh t

đ c.

M t 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:

1. Di chuyển con tr đ n b n ghi t m insertrow bằng ph ng th c

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

updateXXX().

3. 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() để xá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

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

Biên so n: Nguy n Th Đi u Page 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.executeQuery("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 SQLException.

- 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

Để xoá 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 ng th c c a đ i t ng ResultSet.

Các b c để xoá m t b n ghi kh i ResultSet

- Di chuyển con tr đ n b n ghi cần xoá

- Gọi ph ng th c deleteRow();

Chú ý: Tuỳ vƠo trình đi u kh ên mà vi c xoá đ c thực hi n ngay hay ch lƠ đánh d u

xoá. để 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

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

Biên so n: Nguy n Th Đi u Page 161

rs.absolute(3);

rs.deleteRow();

// Xoá bản ghi cuối cùng

rs.last();

rs.deleteRow();

2.4.2. 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 executeUpdate để 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.executeUpdate();

}

Nh b n th y qua ví dụ trên để:

- L y v đ i t 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(index, value)

- Thực thi truy v n v i các tham s v a cung c p b n gọi ph ng th c

executeUpdate() c a đ i t ng prepareStatement.

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

Biên so n: Nguy n Th Đi u Page 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 executeXXX() t ng ng để thực thi th tục l u tr .

2.6. 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.executeUpdate();

PreparedStatement updateTotal = con.prepareStatement(

"UPDATE COFFEES SET TOTAL = TOTAL + ? WHERE COF_NAME LIKE ?");

updateTotal.setInt(1, 50);

updateTotal.setString(2, "Colombian");

updateTotal.executeUpdate();

// Xác nhận commit

con.commit();

// đặt lại chế độ auto-commit

con.setAutoCommit(true);

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

Biên so n: Nguy n Th Đi u Page 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 x 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

xâ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 xâ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 đ x lý cụ thể. Các thi t b di đ ng khác nhau có thể có b vi x 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ó

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

Biên so n: Nguy n Th Đi u Page 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 xâ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 x lý

Kiểu m ng k t n i

Do đơy lƠ đặc t nên các nhà s n xu 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

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

Biên so n: Nguy n Th Đi u Page 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 x 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 x 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

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

Biên so n: Nguy n Th Đi u Page 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 ng tự MIDP, nh ng v i th tr ng là các máy PDA v i màn hình và b nh l n h n

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.

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

Configuration Profile

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

Biên so n: Nguy n Th Đi u Page 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 javax.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 javax.microedition.lcdui.*;

import javax.microedition.midlet.*;

public class test extends 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("Exit",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();

}

}

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

Biên so n: Nguy n Th Đi u Page 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 xu 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 exit 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 MIDletStateChangeException.

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.

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

Biên so n: Nguy n Th Đi u Page 169

MIDlet đang tr ng thái ho t đ ng chuyển đ n thực thi ph ng th c pauseApp()

thông qua ph ng th c notifyPaused(): ph 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 ng th c m i nƠy đặt MIDlet vào tr ng thái trung

gian gi a các tr ng thái khác.

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ể xem 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

xu t hi n trên mƠn hình cũng nh th i điểm phù h p để hiển th chúng.

3.3. Đố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 extends Displayable

public abstract class Screen extends Displayable

3.4. Giao diện người dùng cấp cao

3.4.1. Đố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ểđ c hiển th ra trên thi t b nh Forms, TextBoxes, ChoiceGroups, .. M t

đ i 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:

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

Biên so n: Nguy n Th Đi u Page 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 i đơy s mô t m i quan h c a l p

Screen và các thành phần thể hi n m c cao.

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 ng dùng để thể hi n

giao di n ng i dùng trong MIDP.

3.4.2. 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 xem qua các thành phần hiển th trên thi t b :

DateField

Gauge

StringItem

TextField

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

Biên so n: Nguy n Th Đi u Page 171

ChoiceGroup

Spacer

CustomItem

Image and ImageItem

3.4.3. Thành phần List, Textbox, Alert, và Ticker

Trong phần này chúng ta s xem xét các đ i t ng ListBox, TextBox, 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 xem 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 5.5.1 tr lên).

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

Biên so n: Nguy n Th Đi u Page 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.

4.2. Tạo project

Sau khi đư cƠi đặt xong 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.

4.2.1. 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 Next;

Nh p tên Project trong phần Project Name, thay đ i n i l u tr Project trong

Project Location;

Click chọn Set as Main Project và b chọn Create Hello MIDlet (đ c chọn mặc

đ nh). Chọn Next;

Chọn Sun Java Wireless Toolkit 2.5.2 for CLDC trong Emulator Platform (mặc

đ nh). Chọn Next;

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 Explorer 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 Explorer để 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 javax.microedition.midlet.*;

import javax.microedition.lcdui.*;

public class HelloMIDlet extends MIDlet implements CommandListener{

private Form mMainForm;

private Display display;

private Command cmdExit;

private StringItem str;

public HelloMIDlet() {

display = Display.getDisplay(this);

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

Biên so n: Nguy n Th Đi u Page 173

mMainForm = new Form("Chuong trinh so 2");

str = new StringItem(null,"Chao mung cac ban den voi MIDP");

cmdExit = new Command("Exit",Command.EXIT,0);

mMainForm.append(str);

mMainForm.addCommand(cmdExit);

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();

}

}

4.2.2. 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 Next;

Nh p tên Project trong phần Project Name, thay đ i n i l u tr Project trong

Project Location;

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 đư đ c chọn mặc

đ nh). Chọn Next;

Chọn Sun Java Wireless Toolkit 2.5.2 for CLDC trong Emulator Platform (mặc

đ nh). Chọn Next;

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

Biên so n: Nguy n Th Đi u Page 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 xong 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 Text và nh p text mu n hiển th (VD:

“Hello World”). 4.3. Đóng gói và tải ng dụng j2me vào điện thoại

4.3.1. Đó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 xác

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

Biên so n: Nguy n Th Đi u Page 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ể xem 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 xu 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Ơ MIDlet-

Vendor và MIDlet-Version:

MIDlet-Vendor là thông tin v nhà s n xu 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:

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

Biên so n: Nguy n Th Đi u Page 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 xong, 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

Explorer để xem 2 t p tin nƠy đ c t o ra trên đĩa c ng c a b n.

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

Biên so n: Nguy n Th Đi u Page 177

4.3.2. 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 xu 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ụ www.JavaVietnam.org). 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 Exchange) 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

http://tomcat.apache.org) 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:

text/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 x lý các t p tin này khi t i chúng v t

máy ch web.

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

Biên so n: Nguy n Th Đi u Page 178

K ti p b n hãy t o ra m t t p tin HTML đ n gi n để tr đ n ng dụng MIDlet

c a b n. Mặc dù có thể b n không cần t o ra t p tin này vì n u đi n tho i c a b n có thể

truy c p t p tin HTML thì nó cũng có thể truy c p t p tin .jad, tuy nhiên vi c có t p tin

HTML giúp cho vi c đ nh h ng và t i ng dụng v d dƠng h n. B n cũng cần chú ý là

trang HTML nƠy đ c truy c p bằng đi n tho i di đ ng nên kích th c t p tin này cần

nh nh t có thể. Bây gi b n hãy dùng m t ch ng trình so n th o văn b n nh Notepad và nh p vào n i dung sau cho t p tin HelloSuite.html:

<html>

De tai ve ung dung HelloWorld, moi ban nhan vao <a href="HelloSuite.jad">day</a>

</html>

Nh b n th y, trang HTML này cung c p liên k t đ n t p tin .jad, vƠ nh trong bƠi tr c các b n đư bi t, t p tin .jad l i ch a tham kh o đ n t p tin .jar thông qua tham s

c u hình là MIDlet-Jar-URL: HelloSuite.jar .

Cu i cùng, t t c đư sẵn sàng và bây gi b n upload 3 t p tin .jad, .jar và .html vào

cùng th mục trên máy ch web c a b n sao cho t p tin .html có thể đ c truy c p t

trình duy t web nh Firefox hay Internet Explorer. Bơy gi b n hãy dùng đi n tho i c a

b n để truy c p vƠo trang HelloSuite.html để t i ng dụng HelloWorld c a b n vƠo đi n.

V i nh ng b n ch a có máy ch web riêng, các b n có thể đăng ký m t d ch vụ

hosting mi n phí trên Internet, các b n có thể dùng www.google.com để tìm ki m các

d ch vụ free web hosting.

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

Biên so n: Nguy n Th Đi u Page 179

TÀI LI U THAM KH O

[1]. Java tập 1, 2, 3. Ph ng Lan, NXB Lao đ ng xã h i, 2006

[2]. Core Java 1,2. ngu n Internet

[4]. Java cơ sở và nâng cao, Hoàng Trọng Th ĐH S ph m kỹ thu t H ng Yên

[4]. Giáo trình lý thuyết và bài tập Java, Trần Tiens Dũng, NXB Lao đ ng xã h i

[3]. Programming Wireless Devices with the Java third edition, Addison Wesley