m è c l è ccvauni.edu.vn/imgupload_dinhkem/file/java/giao trinh java 2013.pdf · bài gi§ng...
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