Trang 1

Tr - ê n g ®¹ i h ä c s- ph ¹ m k ü t h uËt h - ng y ª n
k h o a c « n g n g h Ö t h « n g t i n
---------------ooo------------------
§ Ò c - ¬ n g bµ i g i ¶ n g Ja v a
Nhóm biên soan: 1. Hoàng Trong Thê
2. Nguyên Duy Tân
Trang 2
MUC LUC
Chuong 1: CÁC KHÁI NIEM CO BAN.................................................................. 5
BÀI 1. LÀM QUEN VÓI JAVA................................................................................... 5
I. Lich su java ........................................................................................................... 5
II. Java em là ai ......................................................................................................... 5
II. Môt sô dác trung cua java ..................................................................................... 5
III. Các kiêu ung dung Java........................................................................................ 7
IV. Máy ao Java (JVM-Java Virtual Machine) .......................................................... 7
BÀI 2 NEN TANG CUA JAVA ................................................................................ 9
I. Tâp ký tu dùng trong java ...................................................................................... 9
II. Tu khoá cua Java .................................................................................................. 9
III. Dinh danh (tên) ................................................................................................. 10
IV. Câu trúc môt chuong trình java ......................................................................... 10
V. Chuong trình JAVA dâu tiên .............................................................................. 12
VI. Chú thích trong chuong trình ............................................................................ 14
VII. Kiêu du liêu ..................................................................................................... 15
VII. Môt sô phép toán trên kiêu du liêu nguyên thuy ............................................... 17
IX. Toán tu chuyên kiêu .......................................................................................... 23
X. Các hàm toán hoc ............................................................................................... 24
XI. Các phép toán trên kiêu kí tu ............................................................................. 26
BÀI 3. DIEU KHIEN LUONG CHUONG TRÌNH .................................................... 27
I. Câu trúc rë nhánh ................................................................................................. 27
II. Câu trúc láp while và do-while ........................................................................... 30
III. Câu trúc for ....................................................................................................... 32
IV. Lênh break và continue ..................................................................................... 34
Chuong 2: LAP TRÌNH HUÓNG DOI TUONG ......................................................... 37
BÀI 1. DINH NGHÌA LÓP ....................................................................................... 38
I. Khai báo lop ........................................................................................................ 38
II. Chi tiêt vê khai báo môt phuong thuc ................................................................. 40
III. Tu khoá this ...................................................................................................... 43
IV. Tu khoá super ................................................................................................... 43
V. Su dung lop ........................................................................................................ 44
VI. Diêu khiên viêc truy câp dên các thành viên cua môt lop .................................. 44
BÀI 2. KHOI DAU VÀ DON DEP ............................................................................ 47
I. Phuong thuc tao dung (constructor) ..................................................................... 47
II. Khôi khoi dâu vô danh và khôi khoi dâu tinh ...................................................... 49
III. Don dep: kêt thúc và thu rác .............................................................................. 51
BÀI 3. CÁC THÀNH PHAN TÌNH ........................................................................... 52
I. Thuôc tính tinh .................................................................................................... 52
II. Phuong thuc tinh ................................................................................................ 52
BÀI 4. NAP CHONG PHUONG THUC .................................................................. 53
I. Khái niêm vê phuong thuc bôi tai ........................................................................ 53
Trang 3
II. Yêu câu cua các phuong thuc bôi tai ................................................................... 53
BÀI 5. KE THUA (INHERITANCE) ........................................................................ 54
I. Lop co so và lop dân xuât .................................................................................... 54
II. Cách xây dung lop dân xuât ................................................................................ 54
III. Thua kê các thuôc tính ...................................................................................... 54
IV. Thua kê phuong thuc ........................................................................................ 54
V. Khoi dâu lop co so ............................................................................................. 54
VI. Ghi dè phuong thuc ( Override ) ....................................................................... 56
VI. Thành phân protected ........................................................................................ 56
VII. Tu khoá final ................................................................................................... 56
BÀI 6. LÓP CO SO TRUU TUONG ......................................................................... 61
BÀI 7. DA HÌNH THÁI ............................................................................................ 62
BÀI 8. GIAO DIEN, LÓP TRONG, GÓI ................................................................... 63
I. Giao diên ............................................................................................................. 63
II. Lop trong ............................................................................................................ 65
Bài 9. MANG, XÂU KÝ TU, TAP HOP ................................................................... 67
I. Mang ................................................................................................................... 67
II. Xâu ký tu ............................................................................................................ 70
III. Lop StringTokenizer ......................................................................................... 75
IV. Môt sô lop co ban cua Java ............................................................................... 77
V. Các lop tâp hop .................................................................................................. 83
Chuong 3: XU LÝ NGOAI LE ............................................................................ 92
I. Muc dích cua viêc xu lý ngoai lê .......................................................................... 92
II. Mô hình su lý ngoai lê cua java .......................................................................... 92
III. Dác ta ngoai lê ................................................................................................... 93
III. Ném ra ngoai lê ................................................................................................. 93
IV. Bát ngoai lê ....................................................................................................... 93
V. Khôi ‘finally’ ...................................................................................................... 95
VI. Môt sô lop ngoai lê chuân cua Java ................................................................... 96
Chuong 4: LAP TRÌNH DA TUYEN ........................................................................ 97
I. Các kiên thuc liên quan ........................................................................................ 97
II. Lâp trình da tuyên trong Java .............................................................................. 98
Chuong 5: NHAP XUAT (Input/Output) ............................................................... 104
I. Lop luông .......................................................................................................... 105
II. Lop File ............................................................................................................ 113
Chuong 6: LAP TRÌNH DO HOA AWT ................................................................ 120
I. Gioi thiêu vê hê thông dô hoa cua Java .............................................................. 120
II. Trình quan lý hiên thi trong Java ...................................................................... 124
III. Xu lý su kiên trong Java .................................................................................. 125
Chuong 7 LAP TRÌNH CO SO DÙ LIEU .............................................................. 143
I. Tông quan 143
II. Các kêu trình diêu khiên JDBC......................................................................... 143
Trang 4
III. Các lop trong JDBC API dùng dê truy câp CSDL ........................................... 146
IV. Kêt nôi CSDL voi JDBC ................................................................................. 147
V. Tuong tác voi CSDL ........................................................................................ 152
VI. Quan lý giao dich ............................................................................................ 160
Chuong 8: LAP TRÌNH SOCKET .............................................................................. 164
I. Các kiên thuc liên quan ...................................................................................... 164
II. Khao sát môt sô lop trong gói java.net .............................................................. 164
2. Lop URL và URI .............................................................................................. 171
3. Lop Socket........................................................................................................ 176
4. Lop ServerSocket.............................................................................................. 182
5. Lop DatagramSocket ......................................................................................... 185
6. Lop DatagramPacket ......................................................................................... 185
III. TCP Socket ..................................................................................................... 185
Chuong 9: JAVA MAIL .............................................................................................. 205
I. Các khái niêm MAIL ......................................................................................... 205
II. Gui mail voi thu viên có sán cua java ............................................................... 206
III. Gioi thiêu java mail API .................................................................................. 207
III. Gui mail .......................................................................................................... 212
IV. Nhân mail ....................................................................................................... 215
V. Xoá mail ........................................................................................................... 221
Chuong 10: LAP TRÌNH PHÂN TÁN VÓI ................................................................. 222
JAVA RMI ( REMOTE METHOD INVOKE)............................................................. 222
I. RMI và lâp trình phân tán dôi tuong .................................................................. 222
II. Goi phuong thuc tu xa và các vân dê phát sinh ................................................. 223
III. Vai trò cua các lop trung gian .......................................................................... 223
IV. Cài dát dôi tuong phân tán .............................................................................. 224
Chuong 11: JAVA JSP (JAVA SERVLET) ................................................................. 233
Chuong 12: EJB (ENTERPRISE JAVA BEANS) ........................................................ 234
I. Tông quan vê JavaBean ..................................................................................... 234
II. Xây dung thành phân JavaBean ........................................................................ 234
III. Tìm hiêu Instrospector ..................................................................................... 247
IV. Dóng gói JavaBean ......................................................................................... 249
Trang 5
Chuong 1: CÁC KHÁI NIEM CO BAN
BÀI 1. LÀM QUEN VÓI JAVA
I. Lich su java
Java là môt ngôn ngu lâp trình duoc Sun Microsystems gioi thiêu vào tháng 6 nám
1995. Tu dó, nó dã tro thành môt công cu lâp trình cua các lâp trình viên chuyên nghiêp.
Java duoc xây dung trên nên tang cua C và C++. Do vây nó su dung các cú pháp cua C và
các dác trung huong dôi tuong cua C++.
Ban dâu Java duoc thiêt kê dê làm ngôn ngu viêt chuong trình cho các san phâm
diên tu dân dung nhu dâu video, tivi, diên thoai, máy nhán tin.. . Tuy nhiên voi su mãnh
më cua Java dã khiên nó nôi tiêng dên muc vuot ra ngoài su tuong tuong cua các nhà thiêt
kê ra nó.
Java khoi thuy tên là Oak- là cây sôi moc o phía sau ván phòng cua nhà thiêt kê
chính ông Jame Gosling, sau này ông thây ráng dã có ngôn ngu lâp trình tên Oak rôi, do
vây nhóm thiêt kê quyêt dinh dôi tên, “Java” là cái tên duoc chon, Java là tên cua môt
quán cafe mà nhóm thiêt kê java hay dên dó uông.
II. Java em là ai
Java là ngôn ngu lâp trình huong dôi tuong, do vây không thê dùng Java dê viêt
môt chuong trình huong chuc náng. Java có thê giai quyêt hâu hêt các công viêc mà các
ngôn ngu khác có thê làm duoc.
Java là ngôn ngu vua biên dich vua thông dich. Dâu tiên mã nguôn duoc biên dich
báng công cu JAVAC dê chuyên thành dang ByteCode. Sau dó duoc thuc thi trên tung
loai máy cu thê nho chuong trình thông dich JAVA. Muc tiêu cua các nhà thiêt kê Java là
cho phép nguoi lâp trình viêt chuong trình môt lân nhung có thê chay trên bât cu phân
cung cu thê, thê nên khâu hiêu cua các nhà thiêt kê Java là “Write One, Run Any Where”.
Ngày nay, Java duoc su dung rông rãi dê viêt chuong trình chay trên Internet. Nó là
ngôn ngu lâp trình huong dôi tuong dôc lâp thiêt bi, không phu thuôc vào hê diêu hành.
Java không chi dùng dê viêt các ung dung chay don le hay trong mang mà còn dê xây
dung các trình diêu khiên thiêt bi cho diên thoai di dông, PDA, …
II. Môt sô dàc trung cua java
1.Don gian
Nhung nguoi thiêt kê mong muôn phát triên môt ngôn ngu dê hoc và quen thuôc
voi da sô nguoi lâp trình. Java tua nhu C++, nhung dã luoc bo di các dác trung phuc tap,
không cân thiêt cua C và C++ nhu: thao tác con tro, thao tác dinh nghia chông toán tu
(operator overloading),… Java không su dung lênh “goto” cung nhu file header (.h). Câu
trúc “struct” và “union” cung duoc loai bo khoi Java. Nên có nguoi bao Java là “C++--“,
ngu ý bao java là C++ nhung dã bo di nhung thu phuc tap, không cân thiêt.
2. Huóng dôi tuong
Có thê nói java là ngôn ngu lâp trình hoàn toàn huong dôi tuong, tât cac trong java
dêu là su vât, dâu dâu cung là su vât.
3. Dôc lâp vói hê nên
Muc tiêu chính cua các nhà thiêt kê java là dôc lâp voi hê nên hay còn goi là dôc
lâp phân cung và hê diêu hành. Dây là kha náng môt chuong trình duoc viêt tai môt máy
nhung có thê chay duoc bât ky dâu
Trang 6
Tính dôc lâp voi phân cung duoc hiêu theo nghia môt chuong trình Java nêu chay
dúng trên phân cung cua môt ho máy nào dó thì nó cung chay dúng trên tât ca các ho máy
khác. Môt chuong trình chi chay dúng trên môt sô ho máy cu thê duoc goi là phu thuôc
vào phân cung.
Tính dôc lâp voi hê diêu hành duoc hiêu theo nghia môt chuong trình Java có thê
chay duoc trên tât ca các hê diêu hành. Môt chuong trình chi chay duoc trên môt sô hê
diêu hành duoc goi là phu thuôc vào hê diêu hành.
Các chuong trình viêt báng java có thê chay trên hâu hêt các hê nên mà không cân
phai thay dôi gì, diêu này dã duoc nhung nguoi lâp trình dát cho nó môt khâu hiêu :viêt
môt lân, chay moi noi', diêu này là không thê có voi các ngôn ngu lâp trình khác.
Dôi voi các chuong trình viêt báng C, C++ hoác môt ngôn ngu nào khác, trình biên
dich së chuyên tâp lênh thành mã máy (machine code), hay lênh cua bô vi xu lý. Nhung
lênh này phu thuôc vào CPU hiên tai trên máy ban. Nên khi muôn chay trên loai CPU
khác, chúng ta phai biên dich lai chuong trình.
4. Manh mê
Java là ngôn ngu yêu câu chát chë vê kiêu du liêu, viêc ép kiêu tu dông bua bãi cua
C, C++ nay duoc han chê trong Java, diêu này làm chuong trình rõ ràng, sáng sua, ít lôi
hon.Java kiêm tra lúc biên dich và ca trong thoi gian thông dich vì vây Java loai bo môt
môt sô loai lôi lâp trình nhât dinh.Java không su dung con tro và các phép toán con tro.
Java kiêm tra tât ca các truy nhâp dên mang, chuôi khi thuc thi dê dam bao ráng các truy
nhâp dó không ra ngoài gioi han kích thuoc.
Trong các môi truong lâp trình truyên thông, lâp trình viên phai tu mình câp phát
bô nho. Truoc khi chuong trình kêt thúc thì phai tu giai phóng bô nho dã câp. Vân dê nay
sinh khi lâp trình viên quên giai phóng bô nho dã xin câp truoc dó. Trong chuong trình
Java, lâp trình viên không phai bân tâm dên viêc câp phát bô nho. Qúa trình câp phát, giai
phóng duoc thuc hiên tu dông, nho dich vu thu nhát nhung dôi tuong không còn su dung
nua (garbage collection).
Co chê bây lôi cua Java giúp don gian hóa qúa trình xu lý lôi và hôi phuc sau lôi.
5. Hô tro lâp trình da tuyên
Dây là tính náng cho phép viêt môt chuong trình có nhiêu doan mã lênh duoc chay
song song voi nhau. Voi java ta có thê viêt các chuong trình có kha náng chay song song
môt cách dê dàng, hon thê nua viêc dông bô tài nguyên dùng chung trong Java cung rât
dong gian. Diêu này là không thê có dôi voi môt sô ngôn ngu lâp trình khác nhu C/C++,
pascal …
6. Phân tán
Java hô tro dây du các mô hình tính toán phân tán: mô hình client/server, goi thu
tuc tu xa…
7. Hô tro internet
Muc tiêu quan trong cua các nhà thiêt kê java là tao diêu kiên cho các nhà phát triên
ung dung có thê viêt các chuong trình ung dung internet và web môt cách dê dàng, voi
java ta có thê viêt các chuong trình su dung các giao thuc 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
khá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.
Trang 7
8. Thông dich
Các chuong trình java cân duoc thông dich truoc khi chay, môt chuong trình java
duoc biên dich thành mã byte code mã dôc lâp voi hê nên, chuong trình thông dich java së
ánh xa mã byte code này lên môi nên cu thê, diêu này khiên java châm chap di phân nào.
III. Các kiêu úng dung Java
Voi Java ta có thê xây dung các kiêu ung dung sau:
1. Úng dung Applets
Applet là chuong trình Java duoc tao ra dê su dung trên Internet thông qua các trình
duyêt hô tro Java nhu IE hay Netscape. Applet duoc nhúng bên trong trang Web. Khi
trang Web hiên thi trong trình duyêt, Applet së duoc tai vê và thuc thi tai trình duyêt.
2. Úng dung dòng lênh (console)
Các chuong trình này chay tu dâu nhác lênh và không su dung giao diên dô hoa.
Các thông tin nhâp xuât duoc thê hiên tai dâu nhác lênh.
3. Úng dung dô hoa
Dây là các chuong trình Java chay dôc lâp cho phép nguoi dùng tuong tác qua giao
diên dô hoa.
4. JSP/Servlet
Java thích hop dê phát triên ung dung nhiêu lop. Applet là chuong trình dô hoa
chay trên trình duyêt tai máy tram. O các ung dung Web, máy tram gui yêu câu toi máy
chu. Máy chu xu lý và gui kêt qua tro lai máy tram. Các Java API chay trên máy chu chiu
trách nhiêm xu lý tai máy chu và tra loi các yêu câu cua máy tram. Các Java API chay trên
máy chu này mo rông kha náng cua các ung dung Java API chuân. Các ung dung trên máy
chu này duoc goi là các JSP/Servlet. hoác Applet tai máy chu. Xu lý Form cua HTML là
cách su dung don gian nhât cua JSP/Servlet. Chúng còn có thê duoc dùng dê xu lý du liêu,
thuc thi các giao dich và thuong duoc thuc thi thông qua máy chu Web.
5. Úng dung co so dû liêu
Các ung dung này su dung JDBC API dê kêt nôi toi co so du liêu. Chúng có thê là
Applet hay ung dung, nhung Applet bi gioi han boi tính bao mât.
6. Úng dung mang
Java là môt ngôn ngu rât thích hop cho viêc xây dung các ung dung mang. Voi thu
viên Socket ban có thê lâp trình voi hai giao thuc: UDP và TCP.
7. Úng dung nhiêu tâng
Voi Java ban có thê xây dung phân tán nhiêu tâng voi nhiêu hô tro khác nhau nhu:
RMI, CORBA, EJB, Web Service
8. Úng dung cho các thiêt bi di dông
Hiên nay phân lon các thiêt bi di dông nhu: Diên thoai di dông, máy tro giúp cá
nhân… dêu hô tro Java. Thê nên ban có thê xây dung các ung dung chay trên các thiêt bi
di dông này. Dây là môt kiêu ung dung khá hâp dãn, boi vì các thiêt bi di dông này ngày
càng phô biên và nhu câu có các ung dung chay trên dó, dác biêt là các ung dung mang
tính chât giai trí nhu game
IV. Máy ao Java (JVM-Java Virtual Machine)
Máy ao là môt phân mêm mô phong môt máy tính thât (máy tính ao). Nó có tâp
hop các lênh logic dê xác dinh các hoat dông cua máy tính và có môt hê diêu hành ao.
Nguoi ta có thê xem nó nhu môt máy tính thât (máy tính có phân cung ao, hê diêu hành
Trang 8
ao). Nó thiêt lâp các lop truu tuong cho: Phân cung bên duoi, hê diêu hành, mã dã biên
dich.
Trình biên dich chuyên mã nguôn thành tâp các lênh cua máy ao mà không phu thuôc
vào phân cung và hê diêu hành cu thê. Trình thông dich trên môi máy së chuyên tâp lênh
này thành chuong trình thuc thi. Máy ao tao ra môt môi truong bên trong dê thuc thi các
lênh báng cách:
Ø Nap các file .class
Ø Quan lý bô nho
Ø Don “rác”
Viêc không nhât quán cua phân cung làm cho máy ao phai su dung ngán xêp dê luu tru
các thông tin sau:
Ø Các “Frame” chua các trang thái cua các phuong thuc.
Ø Các toán hang cua mã bytecode.
Ø Các tham sô truyên cho phuong thuc.
Ø Các biên cuc bô.
Khi JVM thuc thi mã, môt thanh ghi cuc bô có tên “Program Counter” duoc su dung.
Thanh ghi này tro toi lênh dang thuc hiên. Khi cân thiêt, có thê thay dôi nôi dung thanh
ghi dê dôi huong thuc thi cua chuong trình. Trong truong hop thông thuong thì tung lênh
môt nôi tiêp nhau së duoc thuc thi.
Môt khái niêm thông dung khác trong Java là trình biên dich “Just In Time-JIT”. Các
trình duyêt thông dung nhu Netscape hay IE dêu có JIT bên trong dê táng tôc dô thuc thi
chuong trình Java. Muc dích chính cua JIT là chuyên tâp lênh bytecode thành mã máy cu
thê cho tung loai CPU. Các lênh này së duoc luu tru và su dung môi khi goi dên.
Trang 9
BÀI 2 NÈN TÀNG CÙA JAVA
I. Tâp ký tu dùng trong java
Moi ngôn ngu nói chung, ngôn ngu lâp trình nói riêng dêu phai xây dung trên môt
tâp hop chu cái (hay còn goi là bang chu cái), các kí tu duoc nhóm lai theo môt cách nào
dó dê tao thành các tu, các tu lai duoc nhóm lai thành các câu (trong ngôn ngu lâp trình
goi là câu lênh), môt chuong trình máy tính tính là môt tâp các câu lênh duoc bô trí theo
môt trât tu mà nguoi viêt ra chúng sáp dát
Ngôn ngu java duoc duoc xây dung trên bang chu cái unicode, do vây ta có thê
dùng các kí tu unicode dê dát tên cho các dinh danh.
II. Tù khoá cua Java
Môi ngôn ngu lâp trình có môt tâp các tu khoá, nguoi lâp trình phai su dung tu
khoá theo dúng nghia mà nguoi thiêt kê ngôn ngu dã dê ra, ta không thê dinh nghia lai
nghia cua các tu khoá, nhu su dung nó dê dát tên biên, hàm..
Sau dây là môt sô tù khoá thuòng gáp:
Tù khóa Mô ta
abstract Su dung dê khai báo lop, phuong thuc truu tuong
boolean Kiêu du liêu logic
break Duoc su dung dê kêt thúc vòng láp hoác câu trúc switch
byte kiêu du liêu sô nguyên
case duoc su dung trong lên switch
cast Chua duoc su dung (dê dành cho tuong lai)
catch duoc su dung trong xu lý ngoai lê
char kiêu du liêu ký tu
class Dùng dê khai báo lop
const Chua duoc dùng
continue duoc dùng trong vòng láp dê bát dâu môt vòng láp moi
default duoc su dung trong lênh switch
do duoc dùng trong vòng láp diêu kiên sau
double kiêu du liêu sô thuc
else kha náng lua chon thu hai trong câu lênh if
extends chi ráng môt lop duoc kê thua tu môt lop khác
false Gía tri logic
final Dùng dê khai báo háng sô, phuong thuc không thê ghi dè, hoác lop không
thê kê thua
finally phân cuôi cua khôi xu lý ngoai lê
float kiêu sô thuc
for Câu lênh láp
goto Chua duoc dùng
if Câu lênh lua chon
implements chi ráng môt lop triên khai tu môt giao diên
import Khai báo su dung thu viên
instanceof kiêm tra môt dôi tuong có phai là môt thê hiên cua lop hay không
interface su dung dê khai báo giao diên
long kiêu sô nguyên
native Khai báo phuong thuc duoc viêt báng ngông ngu biên dich C++
new tao môt dôi tuong moi
Trang 10
null môt dôi tuong không tôn tai
package Dùng dê khai báo môt gói
private dác ta truy xuât
protected dác ta truy xuât
public dác ta truy xuât
return Quay tu phuong thuc vê chô goi nó
short kiêu sô nguyên
static Dùng dê khai báo biên, thuôc tính tinh
super Truy xuât dên lop cha
switch lênh lua chon
synchronized môt phuong thuc dôc quyên truy xuât trên môt dôi tuong
this Ám chi chính lop dó
throw Ném ra ngoai lê
throws Khai báo phuong thuc ném ra ngoai lê
true Giá tri logic
try su dung dê bát ngoai lê
void Dùng dê khai báo môt phuong thuc không tra vê giá tri
while Dùng trong câu trúc láp
III. Dinh danh (tên)
Tên dùng dê xác dinh duy nhât môt dai luong trong chuong trình. Trong java tên duoc
dát theo quy tác sau:
- Không trùng voi tu khoá
- Không bát dâu báng môt sô, tên phai bát dâu báng kí tu hoác bát dâu báng kí $,_
- Không chua dâu cách, các kí tu toán hoc nhu +, -, *,/, %..
- Không trùng voi môt dinh danh khác trong cùng môt pham vi
Chú ý:
- Tên nên dát sao cho có thê mô ta duoc dôi tuong trong thuc tê
- Giông nhu C/C++, java có phân biêt chu hoa chu thuong
- Trong java ta có thê dát tên voi dô dài tuy ý
- Ta có thê su dung các kí tu tiêng viêt dê dát tên
Quy uóc vê dát tên trong java
Ta nên dát tên biên, háng, lop, phuong thuc sao cho nghia cua chúng rõ ràng, dê hiêu,
khoa hoc và mang tính uoc lê quôc tê. Do java có phân biêt chu hoa, chu thuong nên ta
phai cân thân và chú ý.
Sau dây là quy uoc dát tên trong java (chú ý dây chi là quy uoc do vây không bát buôc
phai tuân theo quy uoc này):
- Dôi voi biên và phuong thuc thì tên bao gio cung bát dâu báng ký tu thuong, nêu tên
có nhiêu tu thì ghép lai thì: ghép tât ca các tu thành môt, ghi tu dâu tiên chu thuong,
viêt hoa kí tu dâu tiên cua môi tu theo sau trong tên, ví du area, radius, readInteger…
- Dôi voi tên lop, giao diên ta viêt hoa các kí tu dâu tiên cua môi tu trong tên, ví du lop
WhileTest, Circle
- Tên háng bao gio cung viêt hoa, nêu tên gôm nhiêu tu thì chúng duoc nôi voi hau boi
kí tu ghach duoi ‘_’, ví du PI, MAX_VALUE
IV. Câu trúc môt chuong trình java
- Môi ung dung Java bao gôm môt hoác nhiêu don vi biên dich (môi don vi biên dich
là môt têp tin có phân mo rông Java)
- Môi don vi biên dich bao gôm môt hoác nhiêu lop
Trang 11
- Môi ung dung dôc lâp phai có duy nhât môt phuong thuc main (diêm bát dâu cua ung
dung)
- Môi don vi biên dich có nhiêu nhât môt lop duoc khai báo là public, nêu nhu trong
don vi biên dich có lop public thì tên cua don vi biên dich phai trùng voi tên cua lop
public (giông hêt nhau ca ký tu hoa lân ký tu thuong)
- Bên trong thân cua môi lop ta khai báo các thuôc tính, phuong thuc cua lop dó, Java
là ngôn ngu huong dôi tuong, do vây mã lênh phai nám trong lop nào dó. Môi lênh dêu
duoc kêt thúc báng dâu châm phay “;”.
- Trong ngôn ngu Java, lop là môt don vi mâu có chua du liêu và mã lênh liên quan dên
- môt thuc thê nào dó. Khi xây dung môt lop, thuc chât ban dang tao ra môt môt kiêu du
liêu. Kiêu du liêu moi này duoc su dung dê xác dinh các biên mà ta thuong goi là “dôi
tuong”. Dôi tuong là các thê hiên (instance) cua lop. Tât ca các dôi tuong dêu thuôc vê
môt lop có chung dác tính và hành vi. Môi lop xác dinh môt thuc thê, trong khi dó môi
dôi tuong là môt thê hiên thuc su.
- Khi ban khai báo môt lop, ban cân xác dinh du liêu và các phuong thuc cua lop dó.
Vê co ban môt lop duoc khai báo nhu sau:
/ / Nhâp khâu các t hu viên
i mpor t t hu_viên;
/ / Xây dung các lóp
publ i c cl ass cl sMai n{
.
publ i c st at i c voi d mai n( St r i ng ar gs[ ] )
{
/ / diêm bât dâu cúa chuong t rình
}
.
}
cl ass l p1
{
.
}
cl ass l p2
{
.
}
Môt don vi bi ên dich là môt t êp
t in . j ava
Trang 12
Cú pháp:
class classname
{ var_datatype variablename;
...........
<met_datatype> methodname (parameter_list){...........}
............
}
Trong dó:
class - Tu khoá xác dinh lop
classname - Tên cua lop
var_datatype - kiêu du liêu cua biên
variablename - Tên cua biên
met_datatype - Kiêu du liêu tra vê cua phuong thuc
methodname - Tên cua phuong thuc
parameter_list – Các tham sô duoc cua phuong thuc
- Ban còn có thê dinh nghia môt lop bên trong môt lop khác. Dây là lop xêp lông nhau,
các thê hiên (instance) cua lop này tôn tai bên trong thê hiên cua môt lop che phu chúng.
Nó chi phôi viêc truy nhâp dên các thành phân cua lop bao phu chúng. Có hai loai lop
trong dó là lop trong tinh “static” và lop trong không tinh “non static”
+ Lop trong tinh (static)
Lop trong tinh duoc dinh nghia voi tu khoá “static”. Lop trong tinh có thê truy nhâp
vào các thành phân tinh cua lop phu nó.
+ Lop trong không tinh (non static)
Lop bên trong (không phai là lop trong tinh) có thê truy nhâp tât ca các thành phân cua
lop bao nó, song không thê nguoc lai.
V. Chuong trình JAVA dâu tiên
Dê có thê biên dich và chay các chuong trình java ta phai cài
- JRE (Java Runtime Enviroment) môi truong thuc thi cua java, nó bao gôm: JVM (Java
Virtual Machine) máy ao java vì các chuong trình java duoc thông dich và chay trên
máy ao java và tâp các thu viên cân thiêt dê chay các ung dung java.
- Bô công cu biên dich và thông dich JDK cua Sun Microsystem
Sau khi cài dát JDK (gia su thu muc cài dát là C:\JDK1.4) ta së nhân duoc môt câu trúc
thu muc nhu sau:
- Dê biên dich môt chuong trình java sang mã byte code ta dùng lênh
C:\JDK1.4\BIN\javac TênTêp.java
- Dê thông dich và chay chuong trình ta su dung lênh
Trang 13
C:\JDK1.4\BIN\java TênTêp
Dê biên dich và chay chuong trình Java don gian ta nên thiêt dát hai biên môi truong
“paht” và “classpath” nhu sau:
- Dôi voi dòng WinNT:
+ R-Click vào My Computerà chon Propertiesà chon Advancedà Enviroment
Variables
+ Trong phân System variables chon new dê thêm biên môi truong moi, trong hôp
thoai hiên ra gõ “classpath” vào ô Variable Name và
“.;C:\jdk1.4\lib\tools.jar;C:\jdk1.4\lib\dt.jar;C:\jdk1.4\jre\lib\rt.jar” trong ô variable
value (chú ý không gõ dâu “ vào, muc dích dê cho dê nhìn mà thôi)
+ Cung trong phân System variables tìm dên phân path trong danh sáchà chon edit
dê sua lai giá tri hiên có, trong ô value ta thêm vào cuôi “;C:\jdk1.4\bin”
Công viêc dát các biên môi truong dã xong, dê thây duoc tác dung cua các biên môi
truong ta cân phai khoi dông lai máy
- Dôi voi dòng Win9X:
Mo têp C:\Autoexec.bat sau dó thêm vào hai dòng sau:
+classpath=.;C:\jdk1.4\lib\tools.jar;C:\jdk1.4\lib\dt.jar;C:\jdk1.4\jre\lib\rt.jar
+ path=…;c:\jdk1.4\bin
Khoi dông lai máy dê thây duoc tác dung cua các biên môi truong này
Ví du dâu tiên: chuong trình Hello World (chuong trình khi chay së in ra màn hình loi
chào Hello World)
Các buoc:
Trang 14
- Mo môt chuong trình soan thao ván ban hô tro asciii, nhu notepad, wordpad,
EditPlus… và gõ vào các dòng sau:
public class HelloWorld {
public static void main(String[] args){
System.out.println("Hello World");
}
}
- Ghi lai voi cái tên C:\HelloWorld.java (chú ý tên têp phai trùng voi tên lop, kê ca chu
hoa chu thuong, phân mo rông là java)
- Mo cua sô DOS Prompt
+ Chuyên vào thu muc C:\
+ Gõ lênh javac HelloWorld.java dê biên dich chuong trình, nêu viêc biên dich
thành công (chuong trình không có lôi cú pháp) thì ta së thu duoc têp
HelloWorld.class trong cùng thu muc, nêu trong chuong trình còn lôi cú pháp
thì trong buoc này ta së nhân duoc môt thông báo lôi và lúc này têp
HelloWorld.class cung không duoc tao ra
+ Gõ lênh java HelloWorld (chú ý không gõ phân mo rông) dê chay chuong trình
HelloWorld.
Sau khi thông dich và chay ta nhân duoc
VI. Chú thích trong chuong trình
Trong java ta có 3 cách dê ghi chú thích
Cách 1: su dung cáp /* và */ ý nghia cua cáp chú thích này giông nhu cua C, C++
Cách 2: su dung cáp // ý nghia cua cáp chú thích này giông nhu cua C, C++
Cách 3: su dung cáp /** và */, dây là kiêu chú thích tài liêu (không có trong C/C++), nó
dùng dê tao ra tài liêu chú thích cho chuong trình.
Voi cách thu nhât và cách ba ta có thê viêt chú thích trên nhiêu dòng, voi cách chú thích
hai ta chi có thê chú thích trên môt dòng.
Chú ý: Trong java ta có thê dát chú thích o dâu?, câu tra loi là: o dâu có thê dát duoc môt
dâu cách thì o dó có thê dát chú thích.
Trang 15
VII. Kiêu dü liêu
1. Các kiêu dû liêu nguyên thuv
Tù khoá Mô ta Kích cõ Tôi thiêu Tôi da Lóp bao
(kiêu sô nguyên)
byte sô nguyên môt byte 8 bit -128 127 Byte
short sô nguyên ngán 16 bit -2
15
2
15
-1 Short
int sô nguyên 32 bit -2
31
2
31
-1 Integer
long sô nguyên dài 64 bit -2
63
-2
63
-1 Long
(kiêu sô thuc)
float kiêu thuc voi dô chính
xác don
32 bit IEEE754 IEEE75
4
Float
double Double-precision
floating point
64 bit IEEE754 IEEE75
4
Double
(kiêu khác)
char kiêu kí tu 16 bit Unicode 0 Unicode
2
16
-1
Character
boolean kiêu logic true hoác false - - Boolean
void - - - - Void
Dác diêm cua các biên có kiêu nguyên thuy là vùng nho cua chúng duoc câp phát o phân
stack. Do vây viêc truy xuât vào môt biên kiêu nguyên thuy rât nhanh.
2. Kiêu tham chiêu
Trong Java có 3 kiêu du liêu tham chiêu
Kiêu dü liêu Mô ta
Mang (Array) Tâp hop các du liêu cùng kiêu.
Lop (Class) Là su cài dát mô ta vê môt dôi tuong trong bài toán.
Giao diên
(Interface)
Là môt lop thuân truu tuong duoc tao ra cho phép cài dát
da thua kê trong Java.
Dác diêm cua các biên kiêu tham chiêu là nó chua dia chi cua dôi tuong mà nó tro
dên.
Kêu nguyên t huý
kiêu logi c boolean Kiêu sô
Kiêu sô t huc
Kiêu kí t u
Ki êu sô
boolean
char byt e short i nt long
float
doubl
e
Trang 16
Vùng nho cua biên tham chiêu duoc câp phát o vùng nho stack còn vùng nho cua
dôi tuong duoc câp phát o vùng nho heap. Viêc truy xât vào vùng nho heap châm hon truy
xât vào vùng nho stack tuy nhiên java có co chê cho phép truy câp vào vùng nho heap voi
tôc dô xâp xi báng tôc dô truy câp vào vùng nho stack.
VIII. Khai báo biên
1. Khai báo biên
Tuong tu ngôn ngu C/C++, dê khai báo biên trong java ta su dung cú pháp sau:
type name [=InitValue];
trong dó:
- type là kiêu du liêu cua biên
- name là tên cua biên, tên biên là môt xâu kí tu duoc dát theo quy tác dát tên cua java
- InitValue là giá tri khoi tao cho biên, dây là phân tuy chon, nêu bo qua phân này thì giá
tri ban dâu cua biên duoc khoi tao giá tri mác dinh
Chú ý:
- Nêu cân khai báo nhiêu biên có cùng môt kiêu du liêu ta có thê dát các khai báo các biên
trên môt dòng, các biên này duoc phân cách nhau boi dâu phay
- Java së xu lý các biên không duoc khoi dâu giá tri nhu sau:
+ Dôi voi thuôc tính (biên duoc khai báo trong pham vi cua lop) thì Java së tu dông
khoi gán giá tri cho các biên theo quy tác sau:
+ giá tri 0 cho kiêu du liêu sô
+ false cho kiêu logic
+ kí tu null (mã 0) cho kí tu
+ giá tri null cho kiêu dôi tuong
+ Dôi voi các biên cuc bô thì biên không duoc khoi gán giá tri mác dinh, tuy nhiên
Java së báo lôi nêu ta su dung môt biên chua duoc nhân giá tri
2. Pham vi biên
Môi biên duoc khai báo ra có môt pham vi hoat dông, pham vi cua biên là noi mà
biên có thê duoc truy câp, diêu này xác dinh ca tính thây duoc và thoi gian sông cua biên.
Biên t ham chiêu Ðôi t uong
Trang 17
Ø Biên pham vi lop là biên duoc khai báo bên trong lop nhung bên ngoài các phuong
thuc và hàm tao, tuy nhiên viêc khai báo phai xuât hiên truoc khi biên duoc su dung
Ø Biên pham vi cuc bô là biên duoc khai báo bên trong môt khôi, pham vi cua biên tính
tu diêm biên duoc khai báo cho dên cuôi khôi mà biên duoc khai báo
Ví du:
{
int i=1; // chi có i sán sàng su dung
{
int j=10; // ca i và j dêu sán sàng
}
// chi có i sán sàng
// j không sán sàng vì nám ngoài pham vi
}
Chú ý: Ta không thê làm diêu sau cho dù nó có thê trong C/C++
{
int i=1;
{ int i=10;// không duoc phép vì dã có môt biên cùng tên voi nó }
}
Nhung nguoi thiêt kê java cho ráng diêu dó có thê gây lân lôn, do vây ho dã quyêt
dinh không cho phép che giâu môt biên o pham vi lon hon.
Chú ý: thoi gian sông cua các dôi tuong không tuân theo quy luât thoi gian sông cua các
biên kiêu nguyên thuy.
VII. Môt sô phép toán trên kiêu dü liêu nguyên thuy
1. Phép gán
Cú pháp Biên=BiêuThúc;
Phép gán duoc thuc hiên báng toán tu ‘=’, nó có nghia là “ hãy tính toán giá tri biêu
thuc bên phai dâu gán, sau dó dua giá tri dó vào ô nho có tên nám o bên trái dâu gán’
Chú ý:
+ Câu lênh gán gôm môt dâu ‘=’
+ Kiêu cua biêu thuc bên phai dâu gán phai tuong thích voi kiêu du liêu cua biên
+ Trong java ta có thê thuc hiên môt dây gán nhu sau:
i = j = 10; // ca i và j dêu có giá tri 10
Trang 18
2. Toán tu toán hoc
Ngôn ngu java cung có các phép toán sô hoc nhu các ngôn ngu khác: + ( phép công), - (
phép tru ), * ( phép nhân ),/ ( phép chia ), % ( phép toán chia lây phân nguyên)
Ta mô ta tóm tát các phép toán sô hoc qua bang tông kêt sau:
Phép toán Su dung Mô ta
+ op1 + op2 Công op1 voiop2
- op1 - op2 Tru op1 cho op2
* op1 * op2 Nhân op1 voi op2
/ op1/ op2 chia op1 cho op2
% op1 % op2 Tính phân du cua phép chia op1 cho op2
3. Toán tu táng, giam
Giông nhu ngôn ngu C/C++, java cung có phép toán táng, giam, ta có thê mô ta
tóm tát qua các báng sau:
Phép toán Su dung Mô ta
++ op++
Táng op lên 1 don vi, giá tri cua op duoc táng lên truoc khi biêu
thuc chua nó duoc tính
++ ++op
Táng op lên 1 don vi, giá tri cua op duoc táng lên sau khi biêu thuc
chua nó duoc tính
-- op--
Giam op xuông1 don vi, giá tri cua op duoc giam xuông truoc khi
biêu thuc chua nó duoc tính
-- --op
Giam op xuông1 don vi, giá tri cua op duoc giam xuông sau khi
biêu thuc chua nó duoc tính
Chú ý: nêu toán tu táng truóc, táng sau(giam truóc, giam sau) dúng môt mình(không
nám trong biêu thuc ) thì chúng hoat dông nhu nhau, chúng chi khác nhau khi chúng nám
trong biêu thuc
4. Phép toán quan hê
Phép toán quan hê bao gio cung cho kêt qua boolean, phép toán quan hê së so sánh
2 giá tri, nó xác dinh môi quan hê giua chúng, ví du! = së tra vê true nêu 2 toán hang là
khác nhau.
Ta tóm tát các phép toán qua bang sau:
Phép toán Su dung Nhân vê giá tri true khi
> op1 > op2 op1 lon hon op2
>= op1 >= op2 op1 lon hon hoác báng op2
< op1 < op2 op1 nho hon op2
<= op1 <= op2 op1 nho hon hoác báng op2
== op1 == op2 op1 báng op2
!= op1! = op2 op1 khác op2
Ví du: Su dung các phép toán quan hê
public class RelationalDemo {
public static void main(String[] args) {
// a few numbers
Trang 19
int i = 37;
int j = 42;
int k = 42;
System.out.println("Variable values...");
System.out.println(" i = " + i);
System.out.println(" j = " + j);
System.out.println(" k = " + k);
//greater than
System.out.println("Greater than...");
System.out.println(" i > j = " + (i > j)); // false
System.out.println(" j > i = " + (j > i));// true
System.out.println(" k > j = " + (k > j));// false, they are equal
//greater than or equal to
System.out.println("Greater than or equal to...");
System.out.println(" i >= j = " + (i >= j));// false
System.out.println(" j >= i = " + (j >= i));// true
System.out.println(" k >= j = " + (k >= j));// true
//less than
System.out.println("Less than...");
System.out.println(" i < j = " + (i < j));// true
System.out.println(" j < i = " + (j < i));// false
System.out.println(" k < j = " + (k < j));// false
//less than or equal to
System.out.println("Less than or equal to...");
System.out.println(" i <= j = " + (i <= j));// true
System.out.println(" j <= i = " + (j <= i));// false
System.out.println(" k <= j = " + (k <= j));// true
//equal to
System.out.println("Equal to...");
System.out.println(" i == j = " + (i == j));// false
System.out.println(" k == j = " + (k == j));// true
//not equal to
System.out.println("Not equal to...");
System.out.println(" i! = j = " + (i! = j));// true
System.out.println(" k! = j = " + (k! = j));// false
}
}
Dây là dâu ra cua chuong trình
Variable values...
i = 37
j = 42
k = 42
Greater than...
i > j = false
j > i = true
k > j = false
Greater than or equal to...
i >= j = false
j >= i = true
k >= j = true
Less than...
Trang 20
i < j = true
j < i = false
k < j = false
Less than or equal to...
i <= j = true
j <= i = false
k <= j = true
Equal to...
i == j = false
k == j = true
Not equal to...
i! = j = true
k! = j = false
5. Phép toán logic
Java hô tro 6 phép toán logic duoc chi ra trong bang sau:
Phép toán Su dung Nhân vê giá tri true khi
&& op1 && op2
Ca op1 và op2 dêu là true, giá tri cua op2 chi duoc tính
khi op1 là true
|| op1 || op2
Hoác op1 hoác op2 là true, giá tri cua op2 chi duoc tính
khi op1 là false
! ! op op là false
& op1 & op2
Ca op1 và op2 dêu là true, giá tri cua op2 luôn duoc tính
kê ca khi op1 là false
| op1 | op2
Hoác op1 hoác op2 là true, giá tri cua op2 luôn luôn duoc
tính kê ca khi op1 là true
^ op1 ^ op2 Nêu op1 khác op2
Nhân xét:
+ Phép toán && ( & ) chi nhân giá tri true khi và chi khi ca hai toán hang dêu là true
+ Phép toán || ( | ) chi nhân giá tri false khi và chi khi ca hai toán hang là false
+ Phép toán ^ chi nhân giá tri true khi và chi khi hai toán hang khác nhau
6. phép toán thao tác trên bit
6.1. Phép toán dich bit
Ta së mô ta phép toán dich chuyên qua bang sau:
Phép toán Su dung Kêt qua
>> op1 >> op2
Dich chuyên op1 sang phai op2 bit, op2 bit phía bên phai së
duoc diên báng các bít 0
<< op1 << op2
Dich chuyên op1 sang trái op2 bit(giu nguyên dâu cua op1),
op2 bit nám bên trái së duoc diên báng các bít 0
>>> op1>>> op2 Dich chuyên op1 sang phai op2 bit, op2 bit
Sau dây là hình minh hoa phép toán dich bít
Trang 21
Ví du:
13>>1=6 vì 13=11012 do vây khi dich phai môt bit ta së duoc 1102=6
5<<1=10 vì 5=1012 do vây khi dich trái 1 bit ta së duoc 10102=10
5<<2=100 vì 5=1012 do vây khi dich trái 2 bit ta së duoc 101002=100
Nhân xét: phép toán dich trái môt bit chính là phép nhân vói 2, còn dich phai chính là
phép chia cho 2
6.2. Phép toán logic trên bit
Các phép toán thao tác bit cho phép ta thao tác trên tung bit riêng le trong môt kiêu du liêu
thích hop, các phép toán thao tác bit thuc hiên dai sô boolean trên các bit tuong ung cua 2
toán hang dê tao ra kêt qua
Ta tóm tát các phép toán trong bang sau:
Phép toán Su dung Thuc hiên
& op1 & op2 Thuc hiên phép and các bit tuong ung cua op1 voi op2
| op1 | op2 Thuc hiên phép or các bit tuong ung cua op1 voi op2
^ op1 ^ op2 Thuc hiên phép xor các bit tuong ung cua op1 voi op2
~ ~op2 Thuc hiên phép lât not các bit cua op2
Bang giá tri chân lý cua các phép toán dái sô boolean:
Trang 22
Phép AND
op1 op2 Result
0 0 0
0 1 0
1 0 0
1 1 1
Phép XOR
op1 op2 Result
0 0 0
0 1 1
1 0 1
1 1 0 op1 op2 Result
0 0 0
0 1 1
1 0 1
1 1 1
Ví du:
1101// 13
& 1100// 12
------
1100// 12
1101// 13
| 1100// 12
------
1101// 13
1101// 13
^ 1100// 12
------
0001// 1
! 10101=01010
7. Toán tu gán tát
Giông nhu C/C++ java cung có toán tu gán, ta tóm tát các toán tu gán qua bang
sau:
Phép gán Su dung Tuong duong
+= op1 += op2 op1 = op1 + op2
-= op1 -= op2 op1 = op1 - op2
*= op1 *= op2 op1 = op1 * op2
/= op1/ = op2 op1 = op1/ op2
%= op1 %= op2 op1 = op1 % op2
Phép NOT
op1 Result
0 1
1 0
Trang 23
&= op1 &= op2 op1 = op1 & op2
|= op1 |= op2 op1 = op1 | op2
^= op1 ^= op2 op1 = op1 ^ op2
<<= op1 <<= op2 op1 = op1 << op2
>>= op1 >>= op2 op1 = op1 >> op2
>>>= op1 >>>= op2 op1 = op1 >>> op2
8. Thú tu uu tiên cua các phép toán
Thu tu uu tiên cua các phép toán xác dinh trình tu tính toán giá tri cua môt biêu thuc, java
có nhung quy tác riêng dê xác dinh trình tu tính toán cua biêu thuc, ta phai nho quy tác
sau:
Ø Các phép toán môt ngôi bao gio cung duoc thuc hiên truoc tiên
Ø Trong môt biêu thuc có nhiêu phép toán thì phép toán nào có dô uu tiên cao hon së
duoc thuc hiên truoc phép toán có dô uu tiên thâp
Ø Trong môt biêu thuc có nhiêu phép toán có dô uu tiên ngang nhau thì chúng së duoc
tính theo trình tu tu trái qua phai
Ta có bang tóm tát thu tu uu tiên cua các phép toán trong bang sau:
postfix operators []. (params) expr++ expr--
unary operators ++expr --expr +expr -expr ~!
creation or cast new (type)expr
multiplicative */ %
additive + -
shift << >> >>>
relational < > <= >= instanceof
equality ==! =
Bitwise AND &
Bitwise exclusive OR ^
Bitwise inclusive OR |
Logical AND &&
Logical OR ||
Conditional ?:
Assignment = += -= *=/ = %= &= ^= |= <<= >>= >>>=
Trong bang trên thu tu uu tiên cua các phép toán duoc giam tu trên xuông duoi,
trên cùng môt hàng thì chúng có dô uu tiên ngang nhau.
• Toán tu dây
Không giông nhu C/C++, trong java chô duy nhât mà ta có thê dát toán tu dây là bên trong
cáp ngoác tròn cua câu trúc for( së duoc mô ta chi tiêt trong chuong sau )
IX. Toán tu chuyên kiêu
9.1 Chuyên dôi kiêu không tuòng minh
Viêc chuyên dôi kiêu thuong duoc diên ra môt cách tu dông trong truong hop biêu
thuc gôm nhiêu toán hang có kiêu du liêu khác nhau. Diêu này dôi khi làm cho ban khá
ngac nhiên vì nhân duoc môt kêt qua không theo ý muôn. Ví du ta xét doan trình sau:
int two=2, three=3;
Trang 24
float result=1.5 +three/two;
kêt qua nhân duoc cua result là 2.5. Diêu mà ban mong muôn là 3.0 chu không phai là 2.5.
Kêt qua 2.5 nhân duoc là do three và two là hai giá tri nguyên nên kêt qua cua phép chia
three/two cho ta môt giá tri nguyên bàng 1 chu không phai là 1.5. Dê nói ráng kêt qua cua
phép chia three/two là môt giá tri thuc chu không phai là môt giá tri nguyên thì môt trong
hai toán hang cua phép chia này phai là môt sô thuc. Do vây ta cân phai chuyên kiêu cua
môt trong hai toán hang này hoác ca hai thành sô thuc. Dê nhân duoc kêt qua dúng trong
truong hop này ban cân viêt nhu sau:
float result=1.5 + (float) three/two; hoác
float result=1.5 + three/ (float)two; hoác
float result=1.5 +(float)three/(float)two;
Lý do mà ta viêt nhu trên là nêu trong môt phép toán có su tham gia cua nhiêu toán hang
có kiêu khác nhau thì java së chuyên kiêu tu dông cho các toán hang môt cách tu dông
theo quy tác sau:
byte -> short -> int -> long -> float -> double
9.2. Chuyên dôi kiêu tuòng minh
Dê chuyên dôi kiêu môt cách tuong minh ta su dung cú pháp sau:
(type) biêu_thúc;
khi gáp câu lênh này java së tính toán giá tri cua biêu thuc sau dó chuyên dôi kiêu giá tri
cua biêu thuc thành kiêu type.
Ví du:
(int) 2.5 * 2 = 4
(int) 2.5 * 2.5 = 5
(int)(2.5 * 2.5) = 6
1+(float)5/2=1+5/(float)2=1+(float)5/(float)2=3.5
Chú ý:
- Phép toán chuyên kiêu là phép toán có dô uu tiên cao, nên (int)3.5*2≠(int)(3.4*2)
- Cân chú ý khi chuyên môt biêu thuc kiêu du liêu có miên giá tri lon sang môt kiêu
có miên giá tri nho hon. Trong truong hop này có thê ban së bi mât thông tin.
X. Các hàm toán hoc
Các hàm toán hoc nhu sin, cos, sqrt duoc java viêt sán trong lop Math. Lop này nám trong
gói java.lang (gói mác dinh) do vây ban không cân phai thêm câu lênh import o dâu
chuong trình dê có thê su dung lop này. Các hàm này duoc viêt là các phuong thuc tinh do
vây ta không cân phai tao ra thê hiên cua lop Math.
Bang sau liêt kê môt sô phuong thuc tinh trong lop Math:
Tên phuong thúc Mô ta ý nghia Kiêu tham sô Kiêu tra vê
sin(arg) tính sin cua arg arg là môt biêu thuc kiêu
double thê hiên môt cung
theo radians
double
cos(arg) tính cos cua arg arg là môt biêu thuc kiêu
double thê hiên môt cung
theo radians
double
tan(arg) tính tang cua arg arg là môt biêu thuc kiêu
double thê hiên môt cung
theo radians
double
asin(arg) tính sin-1 (arcsin) arg là môt biêu thuc kiêu double trong hê
Trang 25
arg double thê hiên môt cung
theo radians
radians
acos(arg) tính cos-1
(arccosin) cua arg
arg là môt biêu thuc kiêu
double thê hiên môt cung
theo radians
double trong hê
radians
atan(arg) tính tan-1
(arctang) cua arg
arg là môt biêu thuc kiêu
double thê hiên môt cung
theo radians
double trong hê
radians
atan2 (arg1,arg2) tính tan-1
(arctang) cua
arg1/arg2
arg1,arg2 là các biêu thuc
kiêu double thê hiên môt
cung theo radians
double trong hê
radians
abs(arg) tính tri tuyêt dôi
cua arg
arg là môt biêu thuc kiêu
int, long, float, hoác double
The same type as
the argument
max (arg1,arg2) Nhân vê giá tri lon
trong hai tham sô
arg1, arg2 là môt biêu thuc
kiêu int, long, float, hoác
double
Nhân vê kiêu
cùng kiùu voi
tham sô
min (arg1,arg2) Nhân vê giá tri
nho trong hai tham

arg1, arg2 lµ mét biùu thøc
kiùu int, long, float, hoÆc
double
Nhân vê kiêu
cùng kiùu voi
tham sô
ceil(arg) Nhân vê giá tri
nguyên nho hon
hoác báng arg
arg là biêu thuc kiêu float
hoác double
double
floor(arg) Nhân vê giá tri
nguyên lon hon
hoác báng arg
arg là biêu thuc kiêu float
hoác double
double
round(arg) Tra vê giá tri
nguyên gân arg
nhât, giá tri này
chính là giá tri cua
arg sau khi dã làm
tròn
arg là biêu thuc kiêu float
hoác double
Nhân vê kiêu int
nêu arg kiêu float,
nhân vê kiùu long
nêu arg kiêu
double
rint(arg) Giông nhu
round(arg)
arg là biêu thuc kiêu double double
sqrt(arg) tính cán bâc hai
cua arg
arg là biêu thuc kiêu double double
pow (arg1,arg2) tính arg1arg2 Ca arg1 và arg2 là các biêu
thuc kiêu double
double
exp(arg) tính earg arg là biêu thuc kiêu double double
log(arg) tính logarithmo sô
e cua arg
arg là biêu thuc kiêu double double
random() Nhân vê môt sô
gia ngâu nhiên
nám trong khoan
[0, 1)
Không có tham sô double
Ví du vê các hàm toán hoc trong lop Math, ban hãy gõ doan chuong trình sau và cho chay
thu dê thây duoc kêt qua tính toán cua các hàm toán hoc.
Trang 26
XI. Các phép toán trên kiêu kí tu
Dôi voi kiêu kí tu ta có thê thuc hiên các phép toán sô hoc (nhu: +, -, *,/ ) và các phép
toán quan hê.
Ví du:
char kt1=’A’;
char kt2=tk1+a;// kt2 nhân ký tu B
char kt3=(char)33*2;// kt3 nhân ký tu B
(kt1>kt2)= false;
(kt2=kt3)= false;
Trang 27
BÀI 3. ÐIÈU KHIEN LUÒNG CHUONG TRÌNH
Chuong trình là môt dây các lênh duoc bô trí thuc hiên theo môt trình tu nào dó,
nhung dôi khi ta muôn diêu khiên luông thuc hiên cua chuong trình tuy thuôc vào diêu
kiên gì dó. Ngôn ngu lâp trình java cung câp môt sô phát biêu cho phép ta diêu khiên
luông thuc hiên cua chuong trình, chúng duoc liêt kê trong bang sau:
Kiêu lênh Tù khoá
Láp while, do-while, for
Quyêt dinh if-else, switch-case
Xu lý lôi try-catch-finally, throw
Rë nhánh break, continue, label:, return
I. Câu trúc rê nhánh
1.1. Phát biêu if
a) Dang khuyêt
Cú pháp
if (Boolean-expression)
statement;
su hoat dông cua câu trúc if thiêu duoc mô ta qua so dô sau:
b) Dang du
Cú pháp
if (Boolean-expression)
statement1;
else
statement2;
su hoat dông cua câu trúc if thiêu duoc mô ta qua so dô sau:
diêu kiên
statement
T
F
diêu kiên
Statement 1
dúng
sai
Statement2
Trang 28
1.2. Biêu thúc diêu kiên
Cú pháp:
Variable=booleanExpression? true-result-expression:
false-result-expression;
1.3. câu trúc switch
a) Dang khuyêt
Cú pháp
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;]
}
Sau dây là so dô khôi mô ta su hoat dông cua câu trúc rë nhánh switch dang thiêu
biêu_thuc
báng gt_1 lênh 1
biêu_thuc
báng gt_2
.....................................................................
biêu_thuc
báng gt_n
No
Yes
Yes
No
Yes
No
break;
lênh 2 break;
lênh n break;
Trang 29
b) Dang du
Cú pháp
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;
}
Sau dây là so dô khôi mô ta su hoat dông cua câu trúc switch dang du
Chú ý:
- Biêu_thuc phai là môt biêu thuc có kiêu char, byte, short, int nhung không thê là kiêu
long, nêu biêu_thuc có kiêu khác voi các kiêu liêt kê o trên thì java së dua ra môt thông
báo lôi.
- Nêu biêu_thuc báng giá tri cua gt_i thì các lênh tu lênh i cho dên lênh n nêu không có
default (lênh n+1 nêu có default) së duoc thuc hiên.
- Câu lênh break thoát ra khoi câu trúc switch.
So dô khôi mô ta su hoat dông cua câu trúc switch trong truong hop có lênh break
biêu_t húc
bâng gt _1
Lênh 1
biêu_t húc
bâng gt _2 Lênh 2
.............. ......... ........................
.......... ............
biêu_t húc
bâng gt _n
Lênh n
No
Yes
Yes
No
Yes
No
lênh n+ 1
Trang 30
1.4. Toán tu diêu kiên
Toán tu diêu kiên là môt loai toán tu dác biêt vì nó gôm ba thành phân câu thành
biêu thuc diêu kiên. hay nói cách khác toán tu diêu kiên là toán tu 3 ngôi.
Cú pháp :
Biêu thúc 1? biêu thúc 2 : biêu thúc 3;
Trong dó
biêu thúc 1: Biêu thuc 1 là môt biêu thuc logic. Tuc là nó tra tra vê giá tri True hoác False
biêu thúc 2: Giá tri tra vê nêu biêu thuc 1 nhân giá True.
biêu thúc 3: Giá tri tra vê nêu biêu thuc 1 nhân giá tri False
Chú ý: Kiêu giá tri cua biêu thuc 2 và biêu thuc 3 phai tuong thích voi nhau.
Ví du: Doan biêu thuc diêu kiên sau tra vê giá tri “a là sô chán” nêu nhu giá tri cua biên a
là sô chán, nguoc lai tra vê giá tri “a là sô le” nêu nhu giá tri cua biên a là sô le.
String result=a%2==0 ? "a là sô chán" : "a là sô le";
II. Câu trúc làp while và do-while
1. Láp kiêm tra diêu kiên truóc
Ta có thê su dung câu trúc while dê thuc thi láp di láp lai môt lênh hoác môt khôi
lênh trong khi diêu kiên dúng
Cú pháp:
while (BooleanExpression) {
statement;
}
ta có thê thây duoc luông thuc hiên cua chuong trình thông qua so dô khôi sau:
truoc tiên phát biêu while së tính giá tri cua biêu thuc logic, nêu giá tri cua biêu thuc logic
là dúng thì câu lênh trong thân cua while së duoc thuc hiên, sau khi thuc hiên xong nó tính
lai giá tri cua biêu thuc logic, nêu giá tri dúng nó lai tiêp tuc thuc hiên lênh trong thân
while cho dên khi giá tri cua biêu thuc sai.
Ví du:
Diêu kiên láp
dúng
Lênh
sai
Trang 31
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 thuc bên trong cáp ngoác tròn phai là môt biêu thuc logic ( biêu thuc tra vê
giá tri true hoác false )
+ Biêu thuc diêu kiên phai nám trong cáp ngoác tròn
+ Sau tu khoá while ta chi có thê dát duoc duy nhât môt lênh, do vây dê có thê thuc
hiên nhiêu tác vu sau while ta phai bao chúng trong môt khôi lênh
+ Bên trong thân cua vòng láp while ta nên có lênh làm thay dôi giá tri cua biêu thuc
logic, nêu không chúng ta së roi vào vòng láp vô han.
+ Câu lênh trong thân câu trúc while có thê không duoc thuc hiên lân nào (do biêu
thuc lôgic ban dâu có giá tri false )
2. Láp kiêm tra diêu kiên sau
Cú pháp:
do {
statement(s);
} while (expression);
su hoat dông cua câu trúc này duoc thê hiên qua so dô sau:
Nhìn vào so dô này ta thây su hoat dông cua nó nhu sau:
b1. Thuc hiên lênh
b2. Sau khi thuc hiên lênh xong nó tính giá tri cua biêu thuc logic
Ðiêu kiên l åp
dúng
Lênh
sai
Trang 32
b3. Nêu biêu thuc logic dúng nó quay tro lai b1, nêu sai thì b4
b4. Kêt thúc vòng láp và thuc hiên lênh sau do-while
ví du:
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 thuc bên trong cáp ngoác tròn phai là môt biêu thuc logic ( biêu thuc tra vê
giá tri true hoác false )
+ Biêu thuc diêu kiên phai nám trong cáp ngoác tròn
+ Sau tu khoá do ta có thê dát duoc nhiêu lênh
+ Bên trong thân cua vòng láp do-while ta nên có lênh làm thay dôi giá tri cua biêu
thuc logic, nêu không chúng ta së roi vào vòng láp vô han.
+ Câu lênh trong thân câu trúc do-while duoc thuc hiên ít nhât môt lân
III. Câu trúc for
Dây la câu trúc láp phô biên nhât trong các ngôn ngu lâp trình, mà nôi dung cua
vòng láp cân phai láp di láp lai môt sô lân biêt truoc, cú pháp cua nó nhu sau:
for (initialization; termination; increment)
{
statement
}
Trong dó:
- initialization là giá tri khoi tao truoc khi vòng làp bát dau, nó chi duoc thuc hiên duy
nhât môt lân truoc khi vòng láp bát dâu
- termination là diêu kiên dùng dê kêt thúc quá trình làp
- increment là câu lênh dùng dê diêu khiên quá trình làp
- statement là câu lênh mà ta can phai thuc hiên làp di làp lai.
So dô khôi diên giai su hoat dông cua câu trúc for sau:
Trang 33
Nhân xét:
+ Thân cua câu trúc láp for ta chi có thê dát duoc duy nhât môt lênh, do vây dê có
thê thuc hiên nhiêu tác vu trong thân for ta phai bao chúng trong khôi lênh
+ Thân vòng láp for có thê không duoc thuc 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 phai có
+ Sô lân thuc hiên initialization=1
+ Sô lân thuc hiên termination = sô lân láp +1
+ Sô lân thuc hiên increment = sô lân láp
+ Ta có thê dát môt vài khai báo biên trong phân initialization, nhu ví du sau
+ Ta có thê mô ta câu trúc while thông qua câu trúc for nhu sau
for (; Boolean_Expression;) statement;
Ví du: kiêt kê ra 128 các kí tu asciii dâu tiên
public class ListCharacters {
public static void main(String[] args) {
for ( char c = 0; c < 128; c++)
if (c! = 26 ) // ANSI Clear screen
System.out.println( "value: " + (int)c +" character: " + c);
}
}// /:~
Toán tu dây và vòng láp for
Trong bài truoc ta dã nhác dên toán tu dây (toán tu dây là môt dây các lênh don
duoc cách nhau boi dâu phây), trong java chô duy nhât mà ta có thê dát toán tu dây dó là
bên trong câu trúc láp for, ta có thê dát toán tu dây ca trong phân initialization lân phân
increment
Ví du vê toán tu 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 qua chay chuong trình sau:
i= 1 j= 11
increment
initialization
termination
statement
dúng
Trang 34
i= 2 j= 4
i= 3 j= 6
i= 4 j= 8
IV. Lênh break và continue
Bên trong thân cua các câu trúc láp ta có thê diêu khiên luông thuc hiên báng cách
su dung lênh break và continue, lênh break së châm dut quá trình láp mà không thuc hiên
nôt phân còn lai cua câu trúc láp, continue së ngung thuc thi phân còn lai cua thân vòng
láp và chuyên diêu khiên vê diêm bát dâu cua vòng láp, dê thuc hiên lân láp tiêp theo, ví
du sau chi ra cách su dung 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);
}
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 qua chay chuong 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á tri cua i không thê dat duoc giá tri 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 cua
lênh nhây goto ( khét tiêng và duoc coi là nguôn sinh các lôi ) dó là lênh break và continue
Trang 35
Nhãn cua vòng láp
Trong thuc tê các vòng láp có thê lông vào nhau, muc dô lông nhau không han chê,
thê thì câu hoi dát ra là lênh break së thoát ra khoi vòng láp nào, câu tra loi là nó thoát ra
khoi vòng láp mà lênh break duoc dát, thê thì làm cách nào ta có thê cho nó thoát ra khoi
môt vòng láp tuy ý nào dó, câu tra loi là java dã hô tro cho ta môt công cu dó là nhãn cua
vòng láp.
Nhãn là môt cái tên sau dó có 2 dâu châm
Ví du LabelName:
Chô duy nhât mà nhãn có ý nghia dó là ngay truoc lênh láp, ta không thê có bât cu
môt lênh nào nám giua nhãn và lênh láp, ta mô ta su hoat dông, cách su dung nhãn cua
vòng láp thông qua ví du 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;
}
}
}
}
// Can't break or continue
// to labels here
Trang 36
}
static void prt(String s) {
System.out.println(s);
}
}
kêt qua chay chuong trình nhu 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
Trang 37
Chuong 2: LAP TRÌNH HUÓNG DÓI TUONG
Lop là khái niêm trong tâm cua lâp trình huong dôi tuong, java là ngôn ngu lâp
trình huong dôi tuong, môt chuong trình java gôm môt tâp các dôi tuong, các dôi tuong
này phôi hop voi nhau dê tao thành môt ung dung hoàn chinh. Các dôi tuong duoc mô ta
qua khái niêm lop, lop là su mo rông khái niêm RECORD trong pascal, hay struct cua C,
ngoài các thành phân du liêu, lop còn có các hàm ( phuong thuc, hành vi ), ta có thê xem
lop là môt kiêu du liêu, vì vây nguoi ta còn goi lop là kiêu du liêu dôi tuong. Sau khi dinh
nghia lop ta có thê tao ra các dôi tuong ( báng cách khai báo biên ) cua lop vua tao, do vây
có thê quan niêm lop là tâp hop các dôi tuong cùng kiêu.
Trang 38
BÀI 1. ÐINH NGHÏA LÓP
I. Khai báo lóp
1.1. Môt lóp duoc dinh nghîa theo mâu sau:
[pbulic][final][abstract] class <tên_lóp>{
// khai báo các thuôc tính
// khai báo các phuong thúc
}
sau dâu là ví du don gian dinh nghia lop ngán xêp:
Tông quát: môt lóp duoc khai báo dang sau:
[public][<abstract><final>][ class <Tên lop>
[extends <Tên lop cha>] [implements <Tên giao diên>] {
<Các thành phân cua lop, bao gôm: thuôc tính và phuong thuc>
}
Trong dó:
1. Boi mác dinh môt lop chi có thê su dung boi môt lop khác trong cùng môt gói voi
lop dó, nêu muôn gói khác có thê su dung lop này thì lop này phai duoc khai báo là lop
public.
2. abstract là bô tu cho java biêt dây là môt lop truu tuong, do vây ta không thê tao ra
môt thê hiên cua lop này
3. final là bô tu cho java biêt dây là môt lop không thê kê thua
Trang 39
4. class là tu khoá cho chuong trình biêt ta dang khai báo môt lop, lop này có tên là
NameOfClass
5. extends là tu khoá cho java biêt lop này này duoc kê thua tu lop super
6. implements là tu khoá cho java biêt lop này së triên khai giao diên Interfaces, dây
là môt dang tuong tu nhu kê thua bôi cua java.
Chú ý:
a) Thuôc tính cua lop là môt biên có kiêu du liêu bât ky, nó có thê lai là môt biên có
kiêu là chính lop dó
b) Khi khai báo các thành phân cua lop (thuôc tính và phuong thuc) có thê dùng môt
trong các tu khoá private, public, protected dê giuo han su truy câp dên thành phân dó.
– Ccác thành phân private chi có thê su dung duoc o bên trong lop, ta không thê truy
câp vào các thành phân private tu bên ngoài lop
– Các thành phân public có thê truy câp duoc ca bên trong lop lân bên ngoài lop.
– Các thành phân protected tuong tu nhu các thành phân private, nhung có thê truy câp
duoc tu bât cu lop con nào kê thua tu nó.
– Nêu môt thành phân cua lop khi khai báo mà không su dung môt trong 3 bô tu
protected, private, public thì su truy câp là ban bè, tuc là thành phân này có thê truy
câp duoc tu bât cu lop nào trong cùng gói voi lop dó.
c) Các thuôc tính nên dê muc truy câp private dê dam bao tính dâu kín và lúc dó dê
bên ngoài pham vi cua lop có thê truy câp duoc dên thành phân private này ta phai tao
ra các phuong thuc phuong thuc get và set.
d) Các phuong thuc thuong khai báo là public, dê chúng có thê truy câp tu bât cu dâu.
e) Trong môt têp chuong trình (hay còn goi là môt don vi biên dich) chi có môt lop
duoc khai báo là public, và tên lop public này phai trùng voi tên cua têp kê ca chu
hoa, chu thuong
1.2. Khai báo thuôc tính
Tro lai lop Stack
public class Stack {
private Vector items;
// a method with same name as a member variable
public Vector items() {
...
}
}
Trong lop Stack trên ta có môt thuôc tính duoc dinh nghia nhu sau:
private Vector items;
Viêc khai báo nhu trên duoc goi là khai báo thuôc tính hay còn goi là biên thành viên lop
Tông quát viêc khai báo môt thuôc tính duoc viêt theo mâu sau:
Trong dó:
Trang 40
Ø accessLevel có thê là mot trong các tu public, private, protected hoàc có thê bo trông,
ý nghia cua các bô tu này duoc mô ta o phân trên
Ø - static là tu khoá báo ráng dây là mot thuoc tính lop, nó là mot thuoc tính su dung
chung cho ca lop, nó không là cua riêng môt dôi tuong nào.
Ø - transient và volatile chua duoc dùng
Ø - type là mot kiêu dù liêu nào dó
Ø name là tên cua thuoc tính
Chú ý: Ta phai phân biêt duoc viêc khai báo nhu 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 thuong? Câu tra loi là tât ca các khai báo bên trong thân cua
môt lop và bên ngoài tât ca các phuong thuc và hàm tao thì dó là khai báo thuôc tính, khai
báo o nhung chô khác së cho ta biên.
1.3. Khai báo phuong thúc
Trong lop Stack trên ta có phuong thuc push dùng dê dây môt dôi tuong vào dinh ngán
xêp, nó duoc dinh nghia nhu sau:
Cung giông nhu môt lop, môt phuong thuc cung gôm có 2 phân: phân khai báo và phan
thân
- Phân khai báo gôm có nhung phân sau( chi tiêt cua khai báo duoc mô ta sau):
- Phân thân cua phuong thuc gôm các lênh dê mô ta hành vi cua phuong thuc, các hành vi
này duoc viêt báng các lênh cua java.
II. Chi tiêt vê khai báo môt phuong thúc
1. Tông quát môt phuong thúc duoc khai báo nhu sau:
accessLevel //mô ta muc dô truy câp dên phuong thuc
static //dây là phuong thuc lop
abstract //dây là phuong thuc không có cài dát
final //phuong thuc này không thê ghi dè
native //phuong thuc này duoc viêt trong môt ngôn ngu khác
synchronized //dây là phuong thuc dông bô
returnType //giá tri tra vê cua phuong thuc
MethodName //tên cua phuong thuc
throws
exception
//khai báo các ngoai lê có thê duoc nem ra tu phuong
thuc
Trong dó:
Trang 41
- accessLevel có thê là môt trong các tu khoá public, private, protected hoác bo trông, ý
nghia cua các bô tu này duoc mô ta trong phân khai báo lop
- static là tu khoá báo cho java biêt dây là môt phuong thuc lop
- abstract tu khoá cho biêt dây là môt lop truu tuong, nó không có cài dát.
- final dây là tu khoá báo cho java biêt dây là phuong thuc không thê ghi dè tu lop con
- native dây là tu khoá báo cho java biêt phuong thuc này duoc viêt báng môt ngôn ngu
lâp trình nào dó không phai là java ( thuong duoc viêt báng C/C++)
- synchronized dây là môt phuong thuc dông bô, nó rât huu ích khi nhiêu phuong thuc
cùng truy câp dông thoi vào tài nguyên miên gáng
- returnType là môt kiêu du liêu, dây là kiêu tra vê cua phuong thuc, khi phuong thuc
không tra vê du liêu thì phai dùng tu khoá void
- MethodName là tên cua phuong thuc, tên cua phuong thuc duoc dát theo quy tác dát tên
cua java
- throws là tu khoá dùng dê khai báo các ngoai lê có thê duoc ném ra tu phuong thuc,
theo sau tu khoá này là danh sách các ngoai lê có thê duoc phuong thuc này ném ra
Chú ý:
1) Nêu trong lop có ít nhât môt phuong thuc truu tuong thì lop dó phai là lop truu
tuong
2) không có thuôc tính truu tuong
3) ta không thê tao dôi tuong cua lop truu tuong
4) khác voi ngôn ngu C/C++, java bát buôc ban phai khai báo giá tri tra vê cho phuong
thuc, nêu phuong thuc không tra vê du liêu thi dùng tu khoá void (trong C/C++ khi ta
không khai báo giá tri tra vê thì mác dinh giá tri tra vê là int)
2. Nhân giá tri tra vê tù phuong thúc
Ta khai báo kiêu giá tri tra vê tu lúc ta khai báo phuong thuc, bên trong thân cua
phuong thuc ta phai su dung phát biêu return value; dê nhân vê kêt qua, nêu hàm duoc
khai báo kiêu void thì ta chi su dung phát biêu return; mênh dê return dôi khi còn duoc
dùng dê kêt thúc môt phuong thuc.
3. Truyên tham sô cho phuong thúc
Khi ta viêt các phuong thuc, môt sô phuong thuc yêu câu phai có môt sô tham sô,
các tham sô cua môt phuong thuc duoc khai báo trong loi khai báo phuong thuc, chúng
phai duoc khai báo chi tiêt có bao nhiêu tham sô, môi tham sô cân phai cung câp cho
chúng môt cái tên và kiêu du liêu cua chúng.
Ví du: ta có môt phuong thuc dùng dê tính tông cua hai sô, phuong thuc này duoc khai
báo nhu sau:
public double tongHaiSo(double a, double b){
return (a + b);
}
1. Kiêu tham sô
Trong java ta có thê truyên vào phuong thuc môt tham sô có kiêu bât ky, tu kiêu du
liêu nguyên thuy cho dên tham chiêu dôi tuong.
2. Tên tham sô
Khi ban khai báo môt tham sô dê truyên vào phuong thuc thì ban phai cung câp cho
nó môt cái tên, tên nay duoc su dung bên trong thân cua phuong thuc dê tham chiêu dên
tham sô duoc truyên vào.
Trang 42
Chú ý: Tên cua tham sô có thê trùng voi tên cua thuôc tính, khi dó tên cua tham sô së
“che” di tên cua phuong thuc, boi vây bên trong thân cua phuong thuc mà có tham sô có
tên trùng voi tên cua thuôc tính, thì khi nhác dên cái tên dó có nghia là nhác dên tham sô.
3. Truyên tham sô theo tri
Khi goi môt phuong thuc mà tham sô cua phuong thuc có kiêu nguyên thuy, thì ban
sao giá tri cua tham sô thuc su së duoc chuyên dên phuong thuc, dây là dác tính truyên
theo tri ( pass- by – value ), nghia là phuong thuc không thê thay dôi giá tri cua các tham
sô truyên vào.
Ta kiêm tra diêu này qua ví du 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 goi ham = " + t);
test(t);
System.out.println("Gia tri cúa t truoc khi goi ham = " + t);
}
}
Ta së nhân duoc kêt qua ra nhu sau:
Gia tri cua t truoc khi goi ham = 10
Gia tri cua t bên trong ham sau khi tang len 1 la 11
Gia tri cua t truoc khi goi ham = 10
4. Thân cua phuong thúc
Trong ví du sau thân cua phuong thuc isEmpty và phuong thuc pop duoc in dâm và
có mâu do
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--]; }
}
Ví du: Xây dung lop man
import java.lang.*;
import java.io.*;
import java.util.*;
public class Man
Trang 43
{protected
String ten;
int namsinh;
public Man(String name,int birthday){
ten=name;namsinh=birthday;
}
public int tuoi()
{Calendar now=Calendar.getInstance();
return (now.get(Calendar.YEAR) - namsinh);
}
public void hienthi()
{System.out.println("Ho va ten:"+ten);
System.out.println("Ho va ten:"+tuoi());
}
public void HienThiNgay()
{ Calendar now=Calendar.getInstance();
System.out.println("Ngay hien tai=" +now.get(Calendar.DATE));
System.out.println("Thang hien tai=" +now.get(Calendar.MONTH));
System.out.println("Nam hien tai=" +now.get(Calendar.YEAR));
System.out.println("Gio hien tai=" +now.get(Calendar.HOUR));
System.out.println("Phut hien tai=" +now.get(Calendar.SECOND));
}
III. Tù khoá this
Thông thuong bên trong thân cua môt phuong thuc ta có thê tham chiêu dên các
thuôc tính cua dôi tuong dó, tuy nhiên trong môt sô tình huông dác biêt nhu tên cua tham
sô trùng voi tên cua thuôc tính, lúc dó dê chi các thành viên cua dôi tuong dó ta dùng tu
khoá this, tu khoá this dùng dê chi dôi tuong này.
Ví du sau chi ra cho ta thây trong tình huông này bát buôc phai dùng tu khoá this vì tên
tham sô cua phuong thuc tao dung lai trùng voi tên cua 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;
}
IV. Tù khoá super
Khi môt lop duoc kê thua tu lop cha trong ca lop cha và lop con dêu có môt
phuong thuc trùng tên nhau, thê thì làm thê nào có thê goi phuong thuc trùng tên dó cua
lop cha, java cung câp cho ta tu khoá super dùng dê chi doi tuong cua lop cha
Ta xét ví du sau
class ASillyClass
{ boolean aVariable;
void aMethod() {
aVariable = true;
}
}
Trang 44
class ASillierClass extends ASillyClass
{ boolean aVariable;
void aMethod() {
aVariable = false;
super.aMethod();
System.out.println(aVariable);
System.out.println(super.aVariable);
}
}
trong ví du trên ta thây trong lop cha có phuong thuc tên là aMethod trong lop con cung
có môt phuong thuc cùng tên, ta còn thây ca hai lop này cùng có môt thuôc tính tên
aVariable dê có thê truy câp vào các thành viên cua lop cha ta phai dùng tu khoá super.
Chú ý: Ta không thê dùng nhiêu tu khoá này dê chi lop ông, lop cu… cháng han viêt nhu
sau là sai: super.super.add(1,4);
V. Su dung lóp
Sau khi khao môt môt lop ta có thê xem lop nhu là môt kiêu du liêu, nên ta có thê
tao ra các biên, mang các dôi tuong, viêc khai báo môt biên, mang các dôi tuong cung
tuong tu nhu khai báo môt biên, mang cua kiêu du liêu nguyên thuy
Viêc khai báo môt biên, mang duoc khai báo theo mâu sau:
<Tên_Lóp> < tên_biên>;
<Tên_Lóp> <tên_mang>[kích thuóc mang];
<Tên_Lóp>[kích thuóc mang] <tên_mang>;
Vê ban chât môi dôi tuong trong java là môt con tro toi môt vùng nho, vùng nho
này chính là vùng nho dùng dê luu tru các thuôc tính, vùng nho dành cho con tro này thì
duoc câp phát trên stack, còn vùng nho dành cho các thuôc tính cua dôi tuong này thì
duoc câp phát trên heap.
VI. Diêu khiên viêc truy câp dên các thành viên cua môt lóp
Khi xây dung môt lop ta có thê han chê su truy câp dên các thành viên cua lop, tu
môt dôi tuong khác.
Ta tóm tát qua bang sau:
Tu khoá Truy câp
trong
chính lop

Truy câp
trong lop
con cùng
gói
Truy câp
trong lop
con khác
gói
Truy câp trong
lop khác cùng gói
Truy câp trong
lop khác khác gói
private X - - - -
protected X X X X -
public X X X X X
default X X - X -
Trong bang trên thì X thê hiên cho su truy câp hop lê còn – thê hiên không thê truy câp
vào thành phân này.
1. Các thành phân private
Các thành viên private chi có thê su dung bên trong lop, ta không thê truy câp các
thành viên private tu bên ngoài lop này.
Ví du:
class Alpha
Trang 45
{
private int iamprivate;
private void privateMethod()
{
System.out.println("privateMethod");
}
}
class Beta {
void accessMethod()
{
Alpha a = new Alpha();
a.iamprivate = 10;// không hop lê
a.privateMethod();// không hop lê
}
}
2. Các thành phân protected
Các thành viên protected së duoc thao luân trong chuong sau
3. Các thành phân public
Các thành viên public có thê truy câp tu bât cu dâu, ta se xem ví du sau:
package Greek;
public class Alpha
{
public int iampublic;
public void publicMethod()
{ System.out.println("publicMethod");}
}
package Roman;
import Greek.*;
class Beta {
void accessMethod() {
Alpha a = new Alpha();
a.iampublic = 10; // hop lê
a.publicMethod(); // hop lê
}
}
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 su dung môt trong các tu public, private,
protected thì java mác dinh thành viên dó có muc truy câp gói.
Ví du
package Greek;
class Alpha {
int iampackage;
void packageMethod() { System.out.println("packageMethod");}
}
package Greek;
class Beta {
Trang 46
void accessMethod() { Alpha a = new Alpha();a.iampackage = 10;// legal
a.packageMethod();// legal}
}
Trang 47
BÀI 2. KHÒI ÐÀU VÀ DON DEP
I. Phuong thúc tao dung (constructor)
1. Công dung
Phuong thuc tao dung là môt phuong thuc cua lop ( nhung khá dác biêt ) thuong dùng
dê khoi tao môt dôi tuong moi. Thông thuong nguoi ta thuong su dung hàm tao dê khoi
gán giá tri cho các thuôc tính cua dôi tuong và có thê thuc hiên môt sô công viêc cân thiêt
khác nhám chuân bi cho dôi tuong moi.
2. Cách viêt hàm tao
a) dác diêm cua phuong thúc tao dung
Ø hàm tao có tên trùng voi tên cua lop
Ø hàm tao không bao gio tra vê kêt qua
Ø nó duoc java goi tu dông khi môt dôi tuong cua lop duoc tao ra
Ø hàm tao có thê có dôi sô nhu các phuong thuc thông thuong khác
Ø trong môt lop có thê có nhiêu hàm tao
b) Ví du
Ví du 1: su dung hàm tao dê in ra màn hình xâu “Creating Rock”
class Rock {
Rock() {// This is the constructor
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í du 2: su dung hàm tao có dô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);// goi hàm tao có dôi
}
}// /:~
3. Hàm tao mác dinh
Khi xây dung môt lop mà không xây dung hàm tao thê thì java së cung câp cho ta
môt hàm tao không dôi mác dinh, hàm tao này thuc chât không làm gì ca, nêu trong lop dã
có ít nhât môt hàm tao thì hàm tao mác dinh së không duoc tao ra, khi ta tao ra môt dôi
tuong thì së có môt hàm tao nào dó duoc goi, nêu trình biên dich không tìm thây hàm tao
tuong ung nó së thông báo lôi, diêu này thuong xây ra khi chúng ta không xây dung hàm
Trang 48
tao không dôi nhung khi tao dung dôi tuong ta lai không truyên vào tham sô, nhu duoc chi
ra trong ví du 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 tao không dôi
TestPassByValue thu1 = new TestPassByValue("Hello World");
// không vân dê gì
}
}
4. Goi hàm tao tù hàm tao
Khi ban viêt nhiêu hàm tao cho lop, có dôi lúc ban muôn goi môt hàm tao này tu
bên trong môt hàm tao khác dê tránh phai viêt láp mã. Dê có thê goi dên hàm tao ta su
dung tu khoá this.
Cú pháp this(danh sách dôi sô);
Ví du:
public class Test {
public Test ()
{
System.out.println("hàm tao không dôi");
}
public Test ( int i)
{
this();// goi dên hàm tao không dôi cúa chính lóp này
}
public static void main(String[] args) {
TestPassByValue thu=new TestPassByValue(10);
}
}
Chú ý:
a) bên trong câu tu ta chi có thê goi duoc tôi da môt câu tu, diêu này có nghia là ta không
thê goi duoc tu 2 câu tu tro lên bên trong môt câu tu khác nhu duoc chi ra trong ví du
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ê goi hai hàm tao tró lên bên trong môt hàm tao
this(10);
System.out.println("Day la ham tao doi so xau");
}
Trang 49
public static void main(String[] args) {
TestPassByValue thu = new TestPassByValue();//
TestPassByValue thu1 = new TestPassByValue("Hello World");//
}
}
b) khi goi môt hàm tao bên trong môt hàm tao khác thì loi goi hàm tao phai là lênh dâu
tiên trong thân phuong thuc, nên ví du sau së bi 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();// goi dên câu tú phái là lênh dâu tiên
}
public static void main(String[] args) {
Test thu = new Test ("Hello World¨);
}
}
nêu cho dich ví du trên trình biên dich së phàn nàn
"Test.java": call to this must be first statement in constructor at line 7, column 9
II. Khôi khoi dâu vô danh và khôi khoi dâu tinh
1. Khôi vô danh
Trong java ta có thê dát môt khôi lênh không thuôc môt phuong thuc nào, nghia là
khôi này không thuôc bât cu phuong thuc nào kê ca hàm tao. khi dó khôi lênh này duoc
goi là khôi vô danh, khôi vô danh này duoc java goi thuc thi khi môt dôi tuong duoc tao
ra, các khôi vô danh duoc goi truoc ca hàm tao, thông thuong ta hay su dung khôi vô danh
dê khoi dâu các thuôc tính cua lop hoác duoc su dung dê khoi tao cho các thôc tính cua
môt lop vô danh(vì lop vô danh không có tên do vây ta không thê viêt hàm tao cho lop
này, trong truong hop này khôi vô danh là giai pháp duy nhât )
Ví du: o ví du này ta có 3 khôi vô danh, khi chay java cho thuc thi các khôi vô danh này
theo thu tu tu trên xuông duoi
public class Untitled1{
// hàm tao
public Untitled1 (){
System.out.println ( "Day la ham tao" );
}
// bät dâu khôi vô danh
{
System.out.println ( "khoi khoi dau thu 3 ");
}// kêt thúc khôi vô danh
//bät dâu khôi vô danh
{
System.out.println ( "khoi khoi dau thu 1 ");
}//kêt thúc khôi vô danh
// bät dâu khôi vô danh
{
Trang 50
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 chay chuong trình së cho kêt qua 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
2. Khôi khoi dâu tînh
Khôi khoi dâu tinh là môt khôi lênh bên ngoài tât ca các phuong thuc, kê ca hàm
tao, truoc khôi lênh này ta dát tu khoá static, tu khoá này báo cho java biêt dây là khôi
khoi dâu tinh, khôi này chi duoc goi 1 lân khi dôi tuong dâu tiên cua lop này duoc tao ra,
khôi khoi dâu tinh này cung duoc java goi tu dông truoc bât cu hàm tao nào, thông thuong
ta su dung khôi khoi dâu tinh dê khoi dâu các thuôc tính tinh ( static ), sau dây là môt ví
du có 1 khôi khoi dâu tinh và môt khôi vô danh, dê ban thây duoc su khác nhau giua khôi
khoi dâu tinh và khôi vô danh
public class Untitled1
{
public Untitled1 ()
{
System.out.println ( "Ðây là hàm tao" );
}
static {// dây là khôi khói dâu tïnh
System.out.println ( "Ðây là khôi khói dâu tïnh");
System.out.println("Khôi này chi duoc goi 1 lân khi thê hiên dâu tiên cúa lóp duoc
tao ra");
}
{//dâ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 ();/ / tao ra thê hiên thú nhât cúa lóp
Untitled1 dt2 = new Untitled1 ();/ / tao tiêp thê hiên thu 2 cúa lóp
}
}
khi cho chay chuong trình ta së duoc kêt qua ra nhu sau:
Dây là khôi khoi dâu tinh
Khôi này chi duoc goi 1 lân khi thê hiên dâu tiên cua lop duoc tao ra
Trang 51
Dây là khôi vô danh
Dây là hàm tao
Dây là khôi vô danh
Dây là hàm tao
Nhìn vào kêt qua ra ta thây khôi khoi dâu tinh chi duoc java goi thuc hiên 1 lân khi dôi
tuong dâu tiên cua lop này duoc tao, còn khôi vô danh duoc goi môi khi môt dôi tuong
moi duoc tao ra
III. Don dep: kêt thúc và thu rác
1. Phuong thúc finalize
Java không có phuong thuc huy bo. Phuong thuc finalize tuong tu nhu phuong
thuc huy bo cua C++, tuy nhiên nó không phai là phuong thuc huy bo. So di nó không
phai là phuong thuc huy bo vì khi dôi tuong duoc huy bo thì phuong thuc này chua chác
dã duoc goi dên. Phuong thuc này duoc goi dên chi khi bô thu rác cua Java duoc khoi
dông và lúc dó dôi tuong không còn duoc su dung nua. Do vây phuong thuc finalize có
thê không duoc goi dên.
2. Co chê gom rác cua java
Nguoi lâp trình C++ thuong su dung toán tu new dê câp phát dông môt dôi tuong,
nhung lai thuong quên goi toán tu delete dê giai phóng vùng nho này khi không còn dùng
dên nua, diêu này làm rò ri bô nho dôi khi dân dên chuong trình phai kêt thúc môt cách
bât thuong, qua thât dâu là môt diêu tôi tê. Trong java ta không cân quan tâm dên diêu dó,
java có môt co chê thu rác tu dông, nó du thông minh dê biêt dôi tuong tuong nào không
dùng nua, rôi nó tu dông thu hôi vùng nho dành cho dôi tuong dó.
Trong ngôn ngu C++ khi môt dôi tuong bi phá huy, së có môt hàm duoc goi tu
dông, hàm này duoc goi là huy tu hay còn goi là hàm huy, thông thuong hàm hàm huy
mác dinh là du là du dê don dep, tuy nhiên trong môt sô truong hop thì hàm huy mác dinh
lai không thê dáp ung duoc, do vây nguoi lâp trình C++, phai viêt ra hàm huy riêng dê làm
viêc dó, tuy nhiên java lai không có khái niêm hàm huy hay môt cái gì dó tuong tu.
Trang 52
BÀI 3. CÁC THÀNH PHÀN TÏNH
I. Thuôc tính tinh
Thuôc tính duoc khai báo voi tu khoá static goi là thuôc tính tinh
Ví du:
class Static{
static int i = 10;// Dây là thuôc tính tinh
int j = 10;// Dây là thuôc tính thuong

}
+ Các thuôc tính tinh duoc câp phát môt vùng bô nho cô dinh, trong java bô nho dành cho
các thuôc tính tinh chi duoc câp phát khi lân dâu tiên ta truy câp dên nó.
+ Thành phân tinh là chung cua ca lop, nó không là cua riêng môt dôi tuong nào ca.
+ Dê truy xuât dên thuôc tính tinh ta có thê dùng môt trong 2 cách sau:
tên_lop.tên_thuôc_tính_tinh;
tên_dôi_tuong.tên_thuôc_tính_tinh;
ca 2 cách truy xuât trên dêu có tác dung nhu nhau
+ khoi gán giá tri cho thuôc tính tinh
thành phân tinh duoc khoi gán báng môt trong 2 cách sau:
Ø Su dung khôi khoi dâu tinh (xem lai bài truoc )
Ø Su dung khoi dâu truc tiêp khi khai báo nhu ví du trên
Chú ý: Ta không thê su dung hàm tao dê khoi dau các thuoc tính tinh, boi vì hàm tao
không phai là phuong thuc tinh.
II. Phuong thúc tinh
Môt phuong thuc duoc khai báo là static duoc goi là phuong thuc tinh
Ví du:
class Static{
static int i;// Dây là thuôc tính tinh
// phuong thuc tinh
static void println (){
System.out.println ( i );
}
}
+ Phuong thuc tinh là chung cho ca lop, nó không lê thuôc vào môt dôi tuong cu thê nào
+ Loi goi phuong thuc tinh xuât phát tu:
tên cua lop: tên_lop.tên_phuong_thuc_tinh(tham sô);
tên cua dôi tuong: tên_dôi_tuong. tên_phuong_thuc_tinh(tham sô);
+ Vì phuong thuc tinh là dôc lâp voi dôi tuong do vây o bên trong phuong thuc tinh ta
không thê truy câp các thành viên không tinh cua lop dó, tuc là bên trong phuong thuc
tinh ta chi có thê truy câp dên các thành viên tinh mà thôi.
+ Ta không thê su dung tu khoá this bên trong phuong thuc tinh
Trang 53
BÀI 4. NAP CHÒNG PHUONG THÚC
I. Khái niêm vê phuong thúc bôi tai
Java cho phép ta xây dung nhiêu phuong thuc trùng tên nhau, trong cùng môt lop, hiên
tuong các phuong thuc trong môt lop có tên giông nhau duoc goi là bôi tai phuong thuc.
II. Yêu câu cua các phuong thúc bôi tai
Do su dung chung môt cái tên cho nhiêu phuong thuc, nên ta phai cho java biêt cân
phai goi phuong thuc nào dê thuc hiên, java dua vào su khác nhau vê sô luong dôi cung
nhu kiêu du liêu cua các dôi này dê phân biêt các phuong thuc trùng tên dó.
Ví du:
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 bôi tai thích hop thì nó së dua ra môt thông
báo lôi
2) Ta không thê su dung giá tri tra vê cua hàm dê phân biêt su khác nhau giua 2
phuong thuc bôi tai
3) Không nên quá lam dung các phuong thuc bôi tai vì trình biên dich phai mât thoi
gian phán doán dê tìm ra hàm thích hop, diêu này dôi khi còn dân dên sai sót
4) Khi goi các hàm nap chông ta nên có lênh chuyên kiêu tuong minh dê trình biên
dich tìm ra hàm phù hop môt cách nhanh nhât
5) Trong java không thê dinh nghia chông toán tu nhu trong ngôn ngu C++, có thê
dây là môt khuyêt diêm, nhung nhung nguoi thiêt kê java cho ráng diêu này là
không cân thiêt, vì nó quá phuc tap.
Trang 54
BÀI 5. KÉ THÙA (INHERITANCE)
I. Lóp co so và lóp dân xuât
- Môt lop duoc xây dung thông qua kê thua tu môt lop khác goi là lop dân xuât (hay còn
goi là lop con, lop hâu duê ), lop dùng dê xây dung lop dân xuât duoc goi là lop co so (
hay còn goi là lop cha, hoác lop tô tiên )
Ø Môt lop dân xuât ngoài các thành phân cua riêng nó, nó còn duoc kê thua tât ca các
thành phân cua lop cha
II. Cách xây dung lóp dân xuât
Dê nói lop b là dân xuât cua lop a ta dùng tu khoá extends, cú pháp nhu sau:
class b extends a
{
// phân thân cua lop b
}
III. Thùa kê các thuôc tính
Thôc tính cua lop co so duoc thua kê trong lop dân xuât, nhu vây tâp thuôc tính cua lop
dân xuât së gôm: các thuôc tính khai báo trong lop dân xuât và các thuôc tính cua lop co
so, tuy nhiên trong lop dân xuât ta không thê truy câp vào các thành phân private, package
cua lop co so
IV. Thùa kê phuong thúc
Lop dân xuât kê thua tât ca các phuong thuc cua lop co so tru:
Ø Phuong thuc tao dung
Ø Phuong thuc finalize
V. Khoi dâu lóp co so
Lop dân xuât kê thua moi thành phân cua lop co, diêu này dân ta dên môt hình
dung, là lop dân xuât có cùng giao diên voi lop co so và có thê có các thành phân moi bô
sung thêm. nhung thuc tê không phai vây, kê thua không chi là sao chép giao diên cua lop
cua lop co so. Khi ta tao ra môt dôi tuong cua lop suy dân, thì nó chua bên trong nó môt
su vât con cua lop co so, su vât con này nhu thê ta dã tao ra môt su vât tuong minh cua
lop co so, thê thì lop co so phai duoc bao dam khoi dâu dúng, dê thuc hiên diêu dó trong
java ta làm nhu sau:
Thuc hiên khoi dau cho lop co so báng cách goi cau tu cua lop co so bên trong cau tu cua
lop dan xuat, nêu ban không làm diêu này thì java se làm giúp ban, nghia là java luôn tu
dong thêm loi goi cau tu cua lop co so vào cau tu cua lop dan xuat nêu nhu ta quên làm
diêu dó, dê có thê goi cau tu cua lop co so ta su dung tu khoá super
Ví du 1: ví du này không goi câu tu cua lop co so môt cách tuong minh
class B
{
public B ()
{ System.out.println ( "Ham tao cúa lop co so" );}
}
public class A extends B
{ public A () {// không goi hàm tao cúa lóp co só tuòng minh
System.out.println ( "Ham tao cúa lop dan xuat" );
}
Trang 55
public static void main ( String arg[] )
{
A thu = new A ();
}
}
Kêt qua chay chuong trình nhu sau:
Ham tao cua lop co so
Ham tao cua lop dan xuat
Ví du 2: ví du này su dung tu khoá super dê goi câu tu cua lop co so môt cách tuong minh
class B
{ public B ()
{ System.out.println ( "Ham tao cúa lop co so" ); }
}
public class A extends B
{ public A ()
{ super();// goi tao cúa lóp co só môt cách tuòng minh
System.out.println ( "Ham tao cúa lop dan xuat" );
}
public static void main ( String arg[] )
{
A thu = new A ();
}
}
khi chay chung trình ta thây kêt qua giông hêt nhu ví du trên
Chú ý 1: Nêu goi tuong minh câu tu cua lop co so, thì loi goi này phai là lênh dâu tiên,
nêu ví du trên dô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 goi câu tú cúa lóp co só không phái là lênh dâ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 dich doan mã này ta së nhân duoc môt thông báo lôi nhu sau:
"A.java": call to super must be first statement in constructor at line 15, column 15
Chú ý 2: ta chi có thê goi dên môt hàm tao cua lop co so bên trong hàm tao cua lop dân
xuât, ví du chi ra sau dã bi báo lôi
class B
{ public B (){System.out.println ( "Ham tao cúa lop co so" );}
public B ( int i )
{System.out.println ( "Ham tao cúa lop co so" );}
Trang 56
}
public class A extends B
{ public A ()
{super ();
super ( 10 );/ / không thê goi nhiêu hon 1 hàm tao cúa lóp co só
System.out.println ( "Ham tao cúa lop dan xuat" );
}
public static void main ( String arg[] )
{
A thu = new A ();
}
}
1. Trât tu khoi dâu
Trât tu khoi dâu trong java duoc thuc hiên theo nguyên tác sau: java së goi câu tu
cua lop co so truoc sau dó moi dên câu tu cua lop suy dân, diêu này có nghia là trong cây
pha hê thì các câu tu së duoc goi theo trât tu tu gôc xuông dân dên lá
2. Trât tu don dep
Mác dù java không có khái niêm huy tu nhu cua C++, tuy nhiên bô thu rác cua java
vân hoat dông theo nguyên tác làm viêc cua câu tu C++, tuc là trât tu thu rác thì nguoc lai
so voi trât tu khoi dâu.
VI. Ghi dè phuong thúc ( Override )
Hiên tuong trong lop co so và lop dân xuât có hai phuong thuc giông hêt nhau ( ca
tên lân bô tham sô) goi là ghi dè phuong thuc ( Override ), chú ý Override khác Overload.
Goi phuong thúc bi ghi dè cua lóp co so
Bên trong lop dân xuât, nêu có hiên tuong ghi dè thì phuong thuc bi ghi dè cua lop co so
së bi ân di, dê có thê goi phuong thuc bi ghi dè cua lop co so ta dùng tu khoá super dê truy
câp dên lop cha, cú pháp sau:
super.overridden MethodName();
Chú ý: Nêu môt phuong thuc cua lop co so bi bôi tai ( Overload ), thì nó không thê bi ghi
dè ( Override ) o lop dân xuât.
VI. Thành phân protected
Trong môt vài bài truoc ta dã làm quen voi các thành phân private, public, sau khi
dã hoc vê kê thua thì tu khoá protected cuôi cùng dã có ý nghia.
Tu khoá protected báo cho java biêt dây là thành phân riêng tu dôi voi bên ngoài nhung lai
sán sàng voi các con cháu
VII. Tù khoá final
Tu khoá final trong java có nhiêu nghia khác nhau, nghia cua nó tuy thuôc vào ngu
canh cu thê, nhung nói chung nó muôn nói “cái này không thê thay dôi duoc”.
1. Thuôc tính final
Trong java cách duy nhât dê tao ra môt háng là khai báo thuôc tính là final
Ví du:
public class A
{ // dinh nghïa hãng tên MAX_VALUE giá tri 100
static final int MAX_VALUE = 100;
public static void main ( String arg[] )
Trang 57
{ A thu = new A ();
System.out.println("MAX_VALUE= " +thu.MAX_VALUE);
}
}
Chú ý:
1) Khi dã khai báo môt thuôc tính là final thì thuôc tính này la háng, do vây ta không thê
thay dôi giá tri cua nó
2) Khi khai báo môt thuôc tính là final thì ta phai cung câp giá tri ban dâu cho nó
3) Nêu môt thuôc tính vua là final vua là static thì nó chi có môt vùng nho chung duy
nhât cho ca lop
2. Dôi sô final
Java cho phép ta tao ra các dôi final báng viêc khai báo chúng nhu vây bên trong
danh sách dôi, nghia là bên trong thân cua phuong pháp này, bât cu cô gáng nào dê thay
dôi giá tri cua dôi dêu gây ra lôi lúc dich
Ví du sau bi báo lôi lúc dich vì nó cô gáng thay dôi giá tri cua dôi final
public class A
{ static public void thu ( final int i )
{ i=i+1;//không cho phép thay dôi giá tri cúa tham sô final
System.out.println ( i );;
}
public static void main ( String arg[] )
{ int i = 100;
thu ( i );
}
}
chuong trình này së bi báo lôi:
"A.java": variable i might already have been assigned to at line 5, column 9
3. Phuong thúc final
Môt phuong thuc bình thuong có thê bi ghi dè o lop dân xuât, dôi khi ta không
muôn phuong thuc cua ta bi ghi dè o lop dân xuât vì lý do gì dó, muc dích chu yêu cua
các phuong thuc final là tránh ghi dè, tuy nhiên ta thây ráng các phuong thuc private
së tu dông là final vì chúng không thê thây duoc trong lop dân xuât lên chúng không
thê bi ghi dè, nên cho dù ban có cho môt phuong thuc private là final thì ban cung cha
thây môt hiêu ung nào
4. Lóp final
Nêu ban không muôn nguoi khác kê thua tu lop cua ban, thì ban hãy dùng tu khoá
final dê ngán can bât cu ai muôn kê thua tu lop này.
Chú ý: Do môt lop là final (tuc không thê kê thua )do vây ta không thê nào ghi dè các
phuong thuc cua lop này, do vây dung cô gáng cho môt phuong thuc cua lop final là
final
Ví du vê tính kê thùa
1. Xây dung lóp co so
package JavaContent;
import java.util.*;
class HocSinh {
//Khai bao du lieu thanh phan
protected
Trang 58
String hoTen;
String diaChi;
int namSinh;
protected double dToan;
double dLy;
double dHoa;
//Khai bao Contructor & Detructor
public HocSinh(String name,String Address,int birthday,double d1,double d2,double
d3)
{hoTen=name;diaChi=Address;namSinh=birthday;dToan=d1;dLy=d2;dHoa=d3; }
//Khai bao cac phuong thuc cua lop Man
public int tinhTuoi()
{Calendar now=Calendar.getInstance();
return (now.get(Calendar.YEAR)-namSinh); }
public double tongDiem()
{return (dToan+dLy+dHoa);}
public void hienThi()
{System.out.println("Ho va ten nhan su="+hoTen);
System.out.println("Dia chi ="+diaChi);
System.out.println("Tuoi="+tinhTuoi());
System.out.println("Diem Toan="+dToan);
System.out.println("Diem Ly="+dLy);
System.out.println("Diem Hoa="+dHoa);
System.out.println("Tong diem cac mon="+tongDiem());
}
public static void main(String args[])
{HocSinh ng1=new HocSinh("Nguyen Tam Hung","Quang Ninh",1977,6.4,9.0,6.7);
ng1.hienThi();
}
}
2. Xây dung lóp dân xuât
package JavaContent;
import java.io.*;
import java.lang.*;
public class HocSinhCD extends HocSinh
{//-------------------Khai bao du lieu thanh phan cho lop CanBo
protected double dTin;
static private BufferedReader br=new BufferedReader(new
InputStreamReader(System.in));
//-----------------Khai bao Contructor,Detructor;
public HocSinhCD(String name, String Address, int birthday, double d1,double d2,
double d3,double d4)
{ super(name, Address, birthday, d1, d2, d3);dTin=d4;}
//----------------Xay dung cac phuong thuc
public double tongDiem()
{return (dToan+dLy+dHoa+dTin);}
//--------------------------------------------------
public double diemTBUT()
{return (dToan*2+dLy+dHoa+dTin*2)/6;}
//--------------------------------------------------
public void hienThi1()
{System.out.println("CAC THONG SO VE CAN BO");
Trang 59
hienThi();
System.out.println("Diem mon Tin=" +dTin);
System.out.println("Diem TBC co uu tien=" +diemTBUT());
}
//--------------------------------------------------
public static void main(String args[])
{String ht=" ",dc=" ";
int ns=0;
double d1=0,d2=0,d3=0,d4=0;
System.out.print("Nhap vao ho ten:");ht=readString();
System.out.print("Nhap vao dia chi:");dc=readString();
System.out.print("Nhap vao nam sinh:");ns=readInt();
System.out.print("Nhap vao diem Toan:");d1=readDouble();
System.out.print("Nhap vao diem Ly:");d2=readDouble();
System.out.print("Nhap vao diem Hoa:");d3=readDouble();
System.out.print("Nhap vao diem in:");d4=readDouble();
HocSinhCD hs1=new HocSinhCD(ht,dc,ns,d1,d2,d3,d4);
// HocSinhCD hs1=new HocSinhCD("Nguyen Van Thanh","Ha
Tay",1980,7.0,7.0,7.0,7.0);
hs1.hienThi1();
HocSinhCD TK1[]=new HocSinhCD[100];//Khai bao mot mang hoc sinh trong 1 lop
TK1[0]=hs1;
TK1[0].hienThi();
//Goi phuong thuc Hie Thi cua lop co so hs1.hienThi();
//Doi hpuong thuc readDoube
}
//----------------Xay dung cac phuong thuc nhap du lieu
public static int readInt()
{int d=0;
try{
String str=br.readLine();
d=Integer.parseInt(str);
}catch(IOException ex){System.out.println("Loi IO "+ex.toString());}
return d;
}
//--------------------------------------------------
public static long readLong()
{ long d=0;
try{
String str=br.readLine();
d=Long.parseLong(str);
}catch(IOException ex){System.out.println("Loi IO "+ex.toString());}
return d;
}
//--------------------------------------------------
public static float readFloat()
{ float d=0;
try{
String str=br.readLine();
d=Float.parseFloat(str);
}catch(IOException ex){System.out.println("Loi IO "+ex.toString());}
Trang 60
return d;
}
//--------------------------------------------------
public static double readDouble()
{ double d=0;
try{
String str=br.readLine();
d=Double.parseDouble(str);
}catch(IOException ex){System.out.println("Loi IO "+ex.toString());}
return d;
}
//-------------------------------------------------------
public static String readString()
{ String str=" ";
try{
str=br.readLine();
}catch(IOException ex){System.out.println("Loi IO "+ex.toString());}
return str;
}
}
Trang 61
BÀI 6. LÓP CO SÒ TRÙU TUONG
Môt lop co so truu tuong là môt lop chi duoc dùng làm co so cho các lop khác, ta
không thê tao ra thê hiên cua lop này, boi vì nó duoc dùng dê dinh nghia môt giao diên
chung cho các lop khác.
Phuong thúc trùu tuong
Môt lop truu tuong có thê chua môt vài phuong thuc truu tuong, do lop truu tuong
chi làm lop co so cho các lop khác, do vây các phuong thuc truu tuong cung không duoc
cài dát cu thê, chúng chi gôm có khai báo, viêc cài dát cu thê së dành cho lop con
Chú ý:
1. Nêu trong lop có phuong thuc truu tuong thì lop dó phai duoc khai báo là truu tuong
2. Nêu môt lop kê thua tu lop truu tuong thì: hoác chúng phai ghi dè tât ca các phuong
thuc ao cua lop cha, hoác lop dó phai là lop truu tuong
3. Không thê tao ra dôi tuong cua lop truu tuong
Trang 62
BÀI 7. ÐA HÌNH THÁI
Da hình thái trong lâp trình huong dôi tuong dê câp dên kha náng quyêt dinh trong
lúc thi hành (runtime) mã nào së duoc chay, khi có nhiêu phuong thuc trùng tên nhau
nhung o các lop có câp bâc khác nhau.
Chú ý: Kha náng da hình thái trong lâp trình huong dôi tuong còn duoc goi voi nhiêu cái
tên khác nhau nhu: tuong ung bôi, kêt ghép dông,..
Da hình thái cho phép các vân dê khác nhau, các dôi tuong khác nhau, các phuong thuc
khác nhau, các cách giai quyêt khác nhau theo cùng môt luoc dô chung.
Các buoc dê tao da hình thái:
1) Xây dung lop co so (thuong là lop co so truu tuong, hoác là môt giao diên), lop
này së duoc các lop con mo rông( dôi voi lop thuong, hoác lop truu tuong), hoác triên
khai chi tiêt ( dôi voi giao diên ).
2) Xây dung các lop dân xuât tu lop co so vua tao. trong lop dân xuât này ta së ghi dè
các phuong thuc cua lop co so( dôi voi lop co so thuong), hoác triên khai chi tiêt nó (
dôi voi lop co so truu tuong hoác giao diên).
3) Thuc hiên viêc tao khuôn xuông, thông qua lop co so, dê thuc hiên hành vi da hình
thái
Khái niêm vê tao khuôn lên, tao khuôn xuông
Ø Hiên tuong môt dôi tuong cua lop cha tham tro dên môt dôi tuong cua lop con thì duoc
goi là tao khuôn xuông, viêc tao khuôn xuông luôn duoc java châp thuân, do vây khi
tao khuôn xuông ta không cân phai ép kiêu tuong minh.
Ø Hiên tuong môt dôi tuong cua lop con tham tro toi môt dôi tuong cua lop cha thì duoc
goi là tao khuôn lên, viêc tao khuôn lên là an toàn, vì môt dôi tuong cua lop con cung
có dây du các thành phân cua lop cha, tuy nhiên viêc tao khuôn lên së bi báo lôi nêu
nhu ta không ép kiêu môt cách tuong minh.
Trang 63
BÀI 8. GIAO DIEN, LÓP TRONG, GÓI
Giao diên là môt khái niêm duoc java dua ra voi 2 muc dích chính:
Ø Dê tao ra môt lop co so thuân ao, môt lop không có bât cu hàm nào duoc cài dát
Ø Thuc hiên hành vi tuong tu nhu kê thua bôi, boi trong java không có khái niêm kê thua
bôi, nhu cua C++
Lop trong cho ta môt cách thuc tinh vi dê che giâu mã môt cách tôi da, trong java ta có thê
dinh nghia môt lop bên trong môt lop khác, thâm chí ta còn có thê tao lop trong, bên trong
thân cua môt phuong thuc, diêu này cho phép ta có thê tao ra các lop cuc bô, chi duoc su
dung nôi bô bên trong môt don vi dó. Ta không thê tao ra môt lop trong, trong ngôn ngu
C++
I. Giao diên
Tu khoá interface dã dua khái niêm abstract di xa thêm môt buoc nua. Ta có thê
nghi nó nhu là môt lop abstract “thuân tuý”, nó cho phép ta tao ra môt lop thuân ao, lop
này chi gôm tâp các giao diên cho các lop muôn dân xuât tu nó, môt interface cung có thê
có các truong, tuy nhiên java tu dông làm các truong này thành static và final
Dê tao ra môt interface, ta dùng tu khoá interface thay vì tu 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 nhu: tên cua interface, nó có kê thua tu môt giao diên khác hay không. Phân thân chua
các khai báo háng, khai báo phuong thuc ( nhung không có cài dát). Giông nhu môt lop ta
cung có thê thêm bô tu public vào truoc dinh nghia cua interface. Sau dây là hình anh cua
môt interface.
Nhung do java tu dông làm các truong thành final nên ta không cân thêm bô tu
này, do vây ta có thê dinh nghia lai giao diên nhu sau:
Nhung do java tu dông làm các truong thành final nên ta không cân thêm bô tu này
public interface StockWatcher
{
final String
sunTicker = "SUNW";
final String oracleTicker = "ORCL";
final String ciscoTicker = "CSCO";
void valueChanged(String tickerSymbol, double newValue);
}
Trang 64
1. Phân khai báo cua giao diên
Tông quát phân khai báo cua môt giao diên có câu trúc tông quát nhu sau:
Public //giao diên này là công công
interface InterfaceName //tên cua giao diên
Extends SuperInterface //giao diên này là mo rông cua 1 giao diên
khác
{
InterfaceBody
}
//thân cua giao diên
Trong câu trúc trên có 2 phân bát buôc phai có dó là phân interface và InterfaceName, các
phan khác là tuv chon.
2. Phân thân
Phân thân khai báo các các háng, các phuong thuc rông ( không có cài dát ), các phuong
thuc này phai kêt thúc voi dâu châm phây ‘;’, boi vì chúng không có phân cài dát
Chú ý:
1. Tât ca các thành phân cua môt giao diên tu dông là public do vây ta không cân phai
cho bô tu này vào.
2. Java yêu câu tât ca các thành phân cua giao diên phai là public, nêu ta thêm các bô tu
khác nhu private, protected truoc các khai báo thì ta së nhân duoc môt lôi lúc dich
3. Tât ca các truong tu dông là final và static, nên ta không cân phai cho bô tu này vào.
3. Triên khai giao diên
Boi môt giao diên chi gôm các mô ta chúng không có phân cài dát, các giao diên duoc
dinh nghia dê cho các lop dân xuât triên khai, do vây các lop dân xuât tu lop này phai triên
khai dây du tât ca các khai báo bên trong giao diên, dê triên khai môt giao diên ban bao
gôm tu khoá implements vào phân khai báo lop, lop cua ban có thê triên khai môt hoác
nhiêu giao diên ( hình thuc này tuong tu nhu kê thua bôi cua C++)
Ví du 1
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)) {
.. .
}
}
}
Ví du 2
public interface MyInterface{
public void add(int x, int y);
public void volume(int x, int y, int z);
Trang 65
} //Hoãc
interface Interface_Const{
public static final double price = 100.0;
public static final int counter = 5;
}
+ Su dung Interface trên
package JavaContent;
public class Use_MyInterface implements MyInterface,Interface_Const
{ public void add(int x, int y)
{System.out.println("Tong cua 2 so "+x+" + " + y+" la:"+ (x+y));}
public void volume(int x, int y, int z)
{ System.out.println("Tich cua 3 so "+x+" * " + y+"*"+z+" la:"+ (x*y*z));
}
public static void main(String args[])
{Use_MyInterface uu=new Use_MyInterface();
uu.add(4,8);
uu.volume(20,15,9);
System.out.println("Gia tri hang so price="+price);
System.out.println("Gia tri hang so counter="+counter);
}
}
Chú ý:
+ Nêu môt lop triên khai nhiêu giao diên thì các giao diên này duoc liêt kê cách nhau boi
dâu phây ‘,’
+ Lop triên khai giao diên phai thuc thi tât ca các phuong thuc duoc khai báo trong giao
diên, nêu nhu lop dó không triên khai, hoác triên khai không hêt thì nó phai duoc khai báo
là abstract
+ Do giao diên cung là môt lop truu tuong do vây ta không thê tao thê hiên cua giao diên
+ Môt lop có thê triên khai nhiêu giao diên, do vây ta có loi dung diêu này dê thuc hiên
hành vi kê thua bôi, vôn không duoc java hô tro
+ Môt giao diên có thê mo rông môt giao diên khác, báng hình thuc kê thua
II. Lóp trong
Có thê dát môt dinh nghia lop này vào bên trong môt lop khác. diêu này duoc goi là
lop trong. Lop trong là môt tính náng có giá tri vì nó cho phép ban gôp nhóm các lop vê
mát logic thuôc vê nhau và dê kiêm soát tính thây duoc cua các lop này bên trong lop
khác. Tuy nhiên ban phai hiêu ráng lop trong không phai là là hop thành
Ví du:
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() {
Trang 66
return (currentItem >= 0);
}
public Object nextElement() {
if (!hasMoreElements())
throw new NoSuchElementException();
else
return items.elementAt(currentItem--);
}
}
}
Lop trong rât huu hiêu khi ban ban muôn tao ra các lop diêu hop ( duoc bàn kÿ khi nói vê
thiêt kê giao diên nguoi dùng )
Trang 67
Bài 9. MÀNG, XÂU KÝ TU, TAP HOP
I. Mang
1. Mang 1 chiêu
a) Khai báo
Cú pháp khai báo:
- KDL tên_mang[];//Khai báo môt con tro mang
- KDL []tên_mang;//nhu trên
- KDL tên_mang[] = new KDL[spt];//Tao ra môt mang có spt phân tu
Trong cú pháp trên thì:
Ø KDL là môt kiêu du liêu bât ky nhu: kiêu nguyên thuy, kiêu dôi tuong… nó xác dinh
kiêu du liêu cua tung phân tu cua mang.
Ø Spt là sô phân tu cua mang.
Chú ý:
Ø Mang trong Java là môt dôi tuong
Ø Cung nhu các dôi tuong khác, mang phai duoc tao ra báng toán tu new nhu sau:
Tên_mang=new KDL[spt];
Ø Khi mang duoc tao ra thì môi phân tu cua mang së nhân môt giá tri mác dinh, quy tác
khoi tao giá tri cho các phân tu cua mang cung chính là quy tác khoi dâu giá tri cho các
thuôc tính cua dôi tuong, tuc là môi phân tu cua mang së nhân giá tri:
+ 0 nêu KDL là kiêu sô
+ ‘\0’ nêu KDL là kí tu
+ false nêu KDL là boolean
+ null nêu KDL là môt lop nào dó.
Ví du 1: Khai báo môt mang sô nguyên gôm 100 phân tu
Cách 1:
int mangInt[]; //Khai báo môt con tro dên mang các sô nguyên
mangInt=new int[100]; //Tao ra mang
Cách 2:
int mangInt[]=new int[100];
Ví du 2: Gia su ta có lop SinhVien dã duoc dinh nghia, hãy khai báo môt mang gôm 100
dôi tuong cua lop SinhVien
SinhVien arraySinhVien[]=new SinhVien[100];
Chú ý: Lúc này môi phân tu cua mang arraySinhVien là môt con tro cua lop SinhVien và
hiên gio môi phân tu cua mang dang tro dên giá tri null. Dê khoi tao tung phân tu cua
mang ta phai làm nhu sau:
arraySinhVien[0]=new SinhVien(“sv01”, “Nguyên Ván An”, “Hung Yên”);
arraySinhVien[1]=new SinhVien(“sv02”, “Nguyên Thi Bình”, “Bác Giang”);
….
arraySinhVien[99]=new SinhVien(“sv100”, “Dào Thi Mên”, “Hà Nam”);
Ngoài cách khai báo trên Java còn cho phép ta kêt hop ca khai báo và khoi gán các
phân tu cua mang theo cách sau:
int[] mangInt = {1, 3, 5, 7, 9};
Tao ra môt mang gôm 5 phân tu, các phân tu cua mang lân luot duoc gán các giá tri là: 1,
3, 5, 7, 9
Trang 68
SinhVien[] mangSinhVien = {
new SinhVien(“sv01”, “Nguyên Ván A”, “HY”),
new SinhVien(“sv02”, “Nguyên Thi B”, “HN”),
new SinhVien(“sv03”, “Dô Thi Q”, “BG”),
null
};
Khai báo môt mang gôm 4 phân tu, giá tri cua các phân tu lân luot duoc khoi gán nhu sau:
mangSinhVien [0]=new SinhVien(“sv01”, “Nguyên Ván A”, “HY”)
mangSinhVien [1]=new SinhVien(“sv02”, “Nguyên Thi B”, “HN”)
mangSinhVien [2]=new SinhVien(“sv03”, “Dô Thi Q”, “BG”)
mangSinhVien [3]=null
b) Truy xât dên các phân tu cua mang môt chiêu
Dê truy xuât dên phân tu thu ind cua mang ta su dung cú pháp nhu sau:
Tên_mang[ind-1]
Chú ý: Phân tu dâu tiên cua mang có chi sô là 0.
Ví du:
int a[]=new int [3]; //Khai báo và tao ra mang gôm 3 phân tu
Lúc này các phân tu cua mang lân luot duoc truy xuât nhu sau:
- Phân tu dâu tiên cua mang là a[0]
- Phân tu thu 2 cua mang là a[1]
- Phân tu thu 3 dông thoi là phân tu cuôi cùng cua mang là a[2]
c) Lây vê sô phân tu hiên tai cua mang
Mang trong Java là môt dôi tuong, do vây nó cung có các thuôc tính và các phuong
thuc nhu các dôi tuong khác. Dê lây vê sô phân tu cua mang ta su dung thuôc tính length
nhu sau:
Tên_mang.length
Ví du 1: Nhâp vào môt mang và in ra màn hình
import com.theht.Keyboard;
class ArrayDemo{
public static void main(String[] args) {
//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=Keyboard.readInt();
//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]=Keyboard.readInt();
}
//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] + " ");
}
}
Trang 69
Ví du 2: Nhâp vào môt mang sô thuc sau dó kiêm tra xem mang có phai là môt dãy táng
hay không?
import com.theht.Keyboard;
class ArrayDemo2{
public static void main(String[] args) {
//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=Keyboard.readInt();
//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]=Keyboard.readInt();
}
//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 dôi trang thái cò
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");
}
}
2. Mang nhiêu chiêu
a) Khai báo
Khai báo mang N chiêu trong Java duoc tiên hành nhu sau:
hoác
Trong dó:
Ø KDL là môt kiêu du liêu bât ky: nguyên thuy hoác lop
Ø sp1, sp2, …, sptN lân luot là sô phân tu trên chiêu thu 1, 2, .., N
Ví du:
- Khai báo môt con tro cua mang 2 chiêu
int[][] a ; hoác int a[][];
Ø Khai báo và tao ra mang 2 chiêu:
int[][] a = new int[2][3]; // Ma trân gôm 2 hàng, 3 côt
KDL [][]…[] tên_mang;
N lân
KDL t ên_mng [ ] [ ] [ ] ;
N lân
KDL tên_mang [][]…[] =new KDL[spt1][spt2]…[sptN];
N lân
Trang 70
- Khai báo và khoi gán giá tri cho các phân tu cua mang 2 chiêu:
int a[][]={
{1, 2, 5}. //Các phân tu trên hàng thu nhât
{2, 4, 7, 9}. //Các phân tu trên hàng thu hai
{1, 7}. //Các phân tu trên hàng thu ba
}
Khai báo trên së tao ra môt mang hai chiêu gôm: 3 hàng, nhung trên môi hàng lai
có sô phân tu khác nhau, cu thê là: trên hàng thu nhât có 3 phân tu, hang 2 gôm 4 phân tu
và hàng thu 3 gôm 2 phân tu.
Chú ý: Voi khai báo trên nêu ta liêt kê các phân tu cua mang theo trình tu tu trái qua phai
và tu trên xuông duoi thì các phân tu lân luot 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 dên phân tu mang nhiêu chiêu
tên_mang[ind1][ind2]
Ví du 1: Nhâp vào môt ma trân và in ra màn hình
import com.theht.Keyboard;
class MaTram {
public static void main(String[] args) {
//Nhâp sô hàng và sô côt
System.out.print("Nhâp sô hàng:");
int sh = Keyboard.readInt();
System.out.print("Nhâp sô côt:");
int sc = Keyboard.readInt();
//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] = Keyboard.readFloat();
}
//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í du 2: Nhâp vào ma trân vuông sau dó tính tông các phân tu trên duong chéo chính.
II. Xâu ký tu
Viêc xu lý các xâu ký tu trong Java duoc hô tro boi hai lop String và StringBuffer.
Lop String dùng cho nhùng xâu ký tu bat biên, nghia là nhung xâu chi doc và sau khi
duoc khoi tao giá tri thì nôi dung bên trong xâu không thê thay dôi duoc. Lop
StringBuffer duoc su dung dôi voi nhung xâu ký tu dông, tuc là có thê thay dôi duoc nôi
dung bên trong cua xâu.
Trang 71
1. Lóp String
Chuôi là môt dãy các ký tu. Lop String cung câp các phuong thuc dê thao tác voi
các chuôi. Nó cung câp các phuong thuc khoi tao (constructor) khác nhau:
String str1 = new String( );
//str1 chua môt chuôi rông.
String str2 = new String(“Hello World”);
//str2 chua “Hello World”
char ch[] = {‘A’,’B’,’C’,’D’,’E’};
String str3 = new String(ch);
//str3 chua “ABCDE”
String str4 = new String(ch,0,2);
//str4 chua “AB” vì 0- tính tu ký tu bát dâu, 2- là sô luong ký tu kê tu ký tu bát dâu.
Toán tu “+” duoc su dung dê công chuôi khác vào chuôi dang tôn tai. Toán tu “+”
này duoc goi nhu là “nôi chuôi”. O dây, nôi chuôi duoc thuc hiên thông qua lop
“StringBuffer”. Chúng ta së thao luân vê lop này trong phân sau. Phuong thuc “concat( )”
cua lop String cung có thê thuc hiên viêc nôi chuôi. Không giông nhu toán tu “+”, phuong
thuc này không thuong xuyên nôi hai chuôi tai vi trí cuôi cùng cua chuôi dâu tiên. Thay
vào dó, phuong thuc này tra vê môt chuôi moi, chuôi moi dó së chua giá tri cua ca hai.
Diêu này có thê duoc gán cho chuôi dang tôn tai. Ví du:
String strFirst, strSecond, strFinal;
StrFirst = “Charlie”;
StrSecond = “Chaplin”;
//….báng cách su dung phuong thuc concat( ) dê gán voi môt chuôi dang tôn tai.
StrFinal = strFirst.concat(strSecond);
Phuong thuc concat( ) chi làm viêc voi hai chuôi tai môt thoi diêm.
Các phuong thúc cua lóp String
Trong phân này, chúng ta së xem xét các phuong thuc cua lop String.
- char charAt(int index ) Phuong thuc này tra vê mot ký tu tai vi trí index trong chuoi.
Ví du:
String name = new String(“Java Language”);
char ch = name.charAt(5);
Biên “ch” chua giá tri “L”, tu dó vi trí các sô bát dâu tu 0.
- boolean startsWith(String s ) Phuong thuc này tra vê giá tri kiêu logic (Boolean), phu
thuoc vào chuoi có bát dau voi mot chuoi con cu thê nào dó không.
Ví du:
String strname = “Java Language”;
boolean flag = strname.startsWith(“Java”);
Trang 72
Biên “flag” chua giá tri true.
- boolean endsWith(String s ) Phuong thuc này tra vê mot giá tri kiêu logic (boolean),
phu thuoc vào chuoi kêt thúc báng mot chuoi con nào dó không.
Ví du:
String strname = “Java Language”;
boolean flag = strname.endsWith(“Java”);
Biên “flag” chua giá tri false.
- String copyValueOf( )
Phuong thuc này tra vê môt chuôi duoc rút ra tu môt mang ký tu duoc truyên nhu môt dôi
sô. Phuong thuc này cung lây hai tham sô nguyên. Tham sô dâu tiên chi dinh vi trí tu noi
các ký tu phai duoc rút ra, và tham sô thu hai chi dinh sô ký tu duoc rút ra tu mang. Ví du:
char name[] = {‘L’,’a’,’n’,’g’,’u’,’a’,’g’,’e’};
String subname = String .copyValueOf(name,5,2);
Bây gio biên “subname” chua chuôi “ag”.
- char [] toCharArray( )
Phuong thuc này chuyên chuôi thành môt mang ký tu. Ví du:
String text = new String(“Hello World”);
char textArray[] = text.toCharArray( );
- int indexOf(String sunString )
Phuong thuc này tra vê thu tu cua môt ký tu nào dó, hoác môt chuôi trong pham vi môt
chuôi. Các câu lênh sau biêu diên các cách khác nhau cua viêc su dung hàm.
String day = new String(“Sunday”);
int index1 = day.indexOf(‘n’);
//chua 2
int index2 = day.indexOf(‘z’,2);
//chua –1 nêu “z” không tìm thây tai vi trí 2.
int index3 = day.indexOf(“Sun”);
//chua muc 0
- String toUpperCase( )
Phuong thuc này tra vê chu hoa cua chuôi.
String lower = new String(“good morning”);
System.out.println(“Uppercase: ”+lower.toUpperCase( ));
- String toLowerCase( )
Phuong thuc này tra vê chu thuong cua chuôi.
String upper = new String(“JAVA”);
System.out.println(“Lowercase: “+upper.toLowerCase( ));
- String trim()
Phuong thuc này cát bo khoang tráng hai dâu chuôi. Hãy thu doan mã sau dê thây
su khác nhau truoc và sau khi cát bo khoang tráng.
Ten lop
Edited by Foxit Reader
Copyright(C) by Foxit Software Company,2005-2008
For Evaluation Only.
Trang 73
String space = new String(“ Spaces “);
System.out.println(space);
System.out.println(space.trim()); //Sau khi cát bo khoang tráng
- boolean equals(String s)
Phuong thuc này so sánh nôi dung cua hai dôi tuong chuôi.
String name1 = “Java”, name2 = “JAVA”;
boolean flag = name1.equals(name2);
Biên “flag” chua giá tri false.
- Các phuong thúc valueOf duoc nap chông dê cho phép chuyên môt giá tri thành xâu
static String valueOf(Object obj)//Chuyên môt dôi tuong thành xâu, báng cách goi dên
phuong thuc toString cua dôi tuong obj
static String valueOf(char[] characters)//Chuyên mang các ký tu thành xâu.
static String valueOf(boolean b)//Chuyên môt giá tri logic thành xâu, xâu nhân duoc là
“true” hoác “false” tuong ung voi giá tri true hoác false cua b
static String valueOf(char c)//Chuyên kí tu thành xâu
static String valueOf(int i)//chuyên môt sô nguyên thành xâu
static String valueOf(long l)//Chuyên môt giá tri long thành xâu
static String valueOf(float f)//chuyên môt giá tri float thành xâu
static String valueOf(double d)//chuyên môt giá tri double thành xâu
2. Lóp StringBuffer
Lop StringBuffer cung câp các phuong thuc khác nhau dê thao tác môt dôi tuong
dang chuôi. Các dôi tuong cua lop này rât mêm deo, dó là các ký tu và các chuôi có thê
duoc chèn vào giua dôi tuong StringBuffer, hoác nôi thêm du liêu vào tai vi trí cuôi. Lop
này cung câp nhiêu phuong thuc khoi tao. Chuong trình sau minh hoa cách su dung các
phuong thuc khoi tao khác nhau dê tao ra các dôi tuong cua lop 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()” cua StringBuffer là hai phuong thuc hoàn toàn khác nhau.
Phuong thuc “length()” dê câp dên sô các ký tu mà dôi tuong thuc chua, trong khi
“capacity()” tra vê tông dung luong cua môt dôi tuong (mác dinh là 16) và sô ký tu
trong dôi tuong StringBuffer.
Dung luong cua StringBuffer có thê thay dôi voi phuong thuc “ensureCapacity()”. Dôi
sô int dã duoc truyên dên phuong thuc này, và dung luong moi duoc tính toán nhu sau:
NewCapacity = OldCapacity * 2 + 2
Edited by Foxit Reader
Copyright(C) by Foxit Software Company,2005-2008
For Evaluation Only.
Trang 74
Truoc khi dung luong cua StringBuffer duoc dát lai, diêu kiên sau së duoc kiêm tra:
- Nêu dung luong(NewCapacity) moi lon hon dôi sô duoc truyên cho phuong thuc
“ensureCapacity()”, thì dung luong moi (NewCapacity) duoc dát.
- Nêu dung luong moi nho hon dôi sô duoc truyên cho phuong thuc
“ensureCapacity()”, thì dung luong duoc dát báng giá tri tham sô truyên vào.
Chuong trình sau minh hoa dung luong duoc tính toán và duoc dát nhu thê nào.
class test{
public static void main(String args[]){
StringBuffer s1 = new StringBuffer(5);
System.out.println("Dung luong cúa bô nhó dêm = "+s1.capacity()); //chúa 5
s1.ensureCapacity(8);
System.out.println("Dung luong cúa bô nhó dêm = "+s1.capacity()); //chúa 12
s1.ensureCapacity(30);
System.out.println("Dung luong cúa bô nhó dêm = "+s1.capacity()); //chúa 30
}
}
Trong doan mã trên, dung luong ban dâu cua s1 là 5. Câu lênh
s1.ensureCapacity(8);
Thiêt lâp dung luong cua s1 dên 12 =(5*2+2) boi vì dung luong truyên vào là 8 nho hon
dung luong duoc tính toán là 12 .
s1.ensureCapacity(30);
Thiêt lâp dung luong cua “s1” dên 30 boi vì dung luong truyên vào là 30 thì lon hon dung
luong duoc tính toán (12*2+2).
Các phuong thúc lóp StringBuffer
Trong phân này, chúng ta së xem xét các phuong thuc cua lop StringBuffer voi môt
chuong trình.
- void append()
Phuong thuc này nôi thêm môt chuôi hoác môt mang ký tu vào cuôi cùng cua dôi
tuong StringBuffer. Ví du:
StringBuffer s1 = new StringBuffer(“Good”);
s1.append(“evening”);
Giá tri trong s1 bây gio là “goodevening”.
- void insert()
Phuong thuc này có hai tham sô. Tham sô dâu tiên là vi trí chèn. Tham sô thu hai
có thê là môt chuôi, môt ký tu (char), môt giá tri nguyên (int), hay môt giá tri sô thuc
(float) duoc chèn vào. Vi trí chèn së lon hon hay báng 0, và nho hon hay báng chiêu dài
cua dôi tuong StringBuffer. Bât ky dôi sô nào, tru ký tu hoác chuôi, duoc chuyên sang
chuôi và sau dó moi duoc chèn vào. Ví du:
StringBuffer str = new StringBuffer(“Java sion”);
str.insert(1,’b’);
Biên “str” chua chuôi “Jbava sion”.
- char charAt()
Phuong thuc này tra vê môt giá tri ký tu trong dôi tuong StringBuffer tai vi trí duoc chi
dinh.Ví du:
StringBuffer str = new StringBuffer(“James Gosling”);
char letter = str.charAt(6); //chúa “G”
Trang 75
- void setCharAt(int index, char value)
Phuong thuc này duoc su dung dê thay thê ký tu trong môt StringBuffer báng môt ký tu
khác tai môt vi trí duoc chi dinh.
StringBuffer name = new StringBuffer(“Jawa”);
name.setCharAt(2,’v’);
Biên “name” chua “Java”.
- void setLength()
Phuong thuc này thiêt lâp chiêu dài cua dôi tuong StringBuffer. Nêu chiêu dài duoc chi
dinh nho hon chiêu dài du liêu hiên tai cua nó, thì các ký tu thua së bi cát bot. Nêu chiêu
dài chi dinh nhiêu hon chiêu dài du liêu thì các ký tu null duoc thêm vào phân cuôi cua
StringBuffer
StringBuffer str = new StringBuffer(10);
str.setLength(str.length() +10);
- char [] getChars()
Phuong thuc này duoc su dung dê trích ra các ký tu tu dôi tuong StringBuffer, và sao chép
chúng vào môt mang. Phuong thuc getChars() có bôn tham sô sau:
Chi sô dâu: vi trí bát dâu, tu noi mà ký tu duoc lây ra.
Chi sô kêt thúc: vi trí kêt thúc
Mang: Mang dích, noi mà các ký tu duoc sao chép.
Vi trí bát dâu trong mang dích: Các ký tu duoc sao chép vào mang dích tu vi trí này.
Ví du:
StringBuffer str = new StringBuffer(“Leopard”);
char ch[] = new char[10];
str.getChars(3,6,ch,0);
Bây gio biên “ch” chua “par”
- void reverse()
Phuong thuc này dao nguoc nôi dung cua môt dôi tuong StringBuffer, và tra vê môt dôi
tuong StringBuffer khác. Ví du:
StringBuffer str = new StringBuffer(“devil”);
StringBuffer strrev = str.reverse();
Biên “strrev” chua “lived”.
III. Lóp StringTokenizer
Môt lop StringTokenizer có thê su dung dê tách môt chuôi thành các phân tu
(token) nho hon. Ví du, môi tu trong môt câu có thê coi nhu là môt token. Tuy nhiên, lop
StringTokenizer dã di xa hon viêc phân tách các tu trong câu. Dê tách ra các thành token
ta có thê tuy biên chi ra môt tâp dâu phân cách các token khi khoi tao dôi tuong
StringTokenizer. Nêu ta không chi ra tâp dâu phân cách thì mác dinh là dâu tráng (space,
tab, ...). Ta cung có thê su dung tâp các toán tu toán hoc (+, *, /, và -) trong khi phân tích
môt biêu thuc.
Bang sau tóm tát 3 phuong thuc tao dung cua lop StringTokenizer:
Phuong thuc xây dung Ý nghia
StringTokenizer(String) Tao ra môt dôi tuong StringTokenizer moi
Trang 76
dua trên chuôi duoc chi dinh.
StringTokenizer(String, Strìng) Tao ra môt dôi tuong StringTokenizer moi
dua trên (String, String) chuôi duoc chi dinh
và môt tâp các dâu phân cách.
StringTokenizer(String, String,
boolean)
Tao ra môt dôi tuong StringTokenizer dua
trên chuôi duoc chi dinh, môt tâp các dâu
phân cách, và môt co hiêu cho biêt nêu các
dâu phân cách së duoc tra vê nhu các token
hay không.
Các phuong thuc tao dung o trên duoc minh hoa trong các ví du 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”, “,”);
Trong câu lênh dâu tiên, StringTokenizer cua “st1” së duoc xây dung báng cách su
dung các chuôi duoc cung câp và dâu phân cách mác dinh. Dâu phân cách mác dinh là
khoang tráng, tab, các ký tu xuông dòng. Các dâu phân cách này thì chi su dung khi phân
tách ván ban, nhu voi “st1”.
Câu lênh thu hai trong ví du trên xây dung môt dôi tuong StringTokenizer cho các
biêu thuc toán hoc báng cách su dung các ký hiêu *, +, /, và -.
Câu lênh thu 3, StringTokenizer cua “st3” su dung dâu phây nhu môt dâu phân cách.
Lop StringTokenizer cài dát giao diên Enumeration. Vì thê, nó bao gôm các
phuong thuc hasMoreElements() và nextElement(). Các phuong thuc có thê su dung cua
lop StringTokenizer duoc tóm tát trong bang sau:
Phuong thúc Muc dích
countTokens() Tra vê sô các token còn lai.
hasMoreElements() Tra vê True nêu còn có token dang duoc dánh dâu
trong chuôi. Nó thì giông hêt nhu hasMoreTokens.
hasMoreTokens() Tra vê True nêu còn có token dang duoc dánh dâu
trong chuôi. Nó giông hêt nhu hasMoreElements.
nextElement() Tra vê token kê tiêp trong chuôi. Nó thì giông nhu
nextToken.
nextToken() Tra vê Token kê tiêp trong chuôi. Nó thì giông nhu
nextElement.
nextToken(String) Thay dôi bô dâu phân cách báng chuôi duoc chi
dinh, và sau dó tra vê token kê tiêp trong chuôi.
Hãy xem xét chuong trình dã cho o bên duoi. Trong ví du này, hai dôi tuong
StringTokenizer dã duoc tao ra. Dâu tiên, “st1” duoc su dung dê phân tách môt biêu thuc
toán hoc. Thu hai, “st2” phân tách môt dòng cua các truong duoc phân cách boi dâu phây.
Ca hai tokenizer, phuong thuc hasMoreTokens() và nextToken() duoc su dung dê duyêt
qua tâp các token, và hiên thi các token.
import java.util.*;
public class StringTokenizerImplementer{
public static void main(String args[]){
// dãt môt biêu thúc toán hoc và tao môt tokenizer cho chuôi dó.
Trang 77
String mathExpr = "4*3+2/4¨;
StringTokenizer st1 = new StringTokenizer(mathExpr,¨*+/-", true);
//trong khi vân còn các token, hiên thi
System.out.println("Tokens of mathExpr: ");
while(st1.hasMoreTokens())
System.out.println(st1.nextToken());
//tao môt chuôi cúa các truòng duoc phân cách bói dâu phây và tao //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 thi.
System.out.println("Comma-delimited tokens : ");
while (st2.hasMoreTokens())
System.out.println(st2.nextToken());
}
}
Kêt qua chay chuong trình duoc mô ta nhu hình duoi.
IV. Môt sô lóp co ban cua Java
Các lop co ban, hay su dung cua Java nhu: Object, các lop Wrapper (lop bao cua
các kiêu du liêu nguyên thuy), Math, String và lop StringBuffer. Nhung lop này duoc xây
dung trong gói java.lang (gói mác dinh cua Java, khi cân su dung các lop trong gói này ta
không cân phai import nó). Moi lop trong Java dêu là lop con cua lop Object .
Obj ect
Boolea Charact e Voi Numbe Mat h St rin St ringBuff
I nt eger Short Byt e Long Float Doubl e
. . .
Trang 78
Câu trúc phân câp môt sô lop trong gói java.lang
1. Lóp Object
Tât ca các lop duoc xây dung trong các chuong trình Java dêu hoác là truc tiêp
hoác gián tiêp duoc mo rông tu lop Object. Dây là lop co so nhât, dinh nghia hâu nhu tât
ca nhung phuong thuc phân co ban dê các lop con cháu cua nó su dung truc tiêp hoác viêt
dè.
Object cung cap các phuong thuc sau:
int hashCode()
Khi các dôi tuong duoc luu vào các bang bám (hash table), hàm này có thê su dung dê xác
dinh duy nhât giá tri cho môi dôi tuong. Diêu này dam bao tính nhât quán cua hê
thông khi thuc hiên chuong trình.
Class getClass()
Tra lai tên lop cua dôi tuong hiên thoi.
boolean equals(Object obj)
Cho lai kêt qua true khi dôi tuong hiên thoi và obj là cùng môt dôi tuong. Hàm này
thuong duoc viêt dè o các lop con cho phù hop voi ngu canh so sánh báng nhau trong
các lop mo rông dó.
protected Object clone() throws CloneNotSupportedException
Dôi tuong moi duoc tao ra có cùng các trang thái nhu dôi tuong hiên thoi khi su dung
clone(), nghia là tao ra ban copy moi cua dôi tuong hiên thoi.
String toString()
Nêu các lop con không viêt dè hàm này thì nó së tra lai dang biêu diên ván ban (textual)
cua dôi tuong. Hàm println() o lop PrintStream së chuyên các dôi sô cua nó sang dang ván
ban khi su dung hàm toString().
protected void finalize() throws Throwable
Hàm này duoc goi ngay truoc khi dôi tuong bi don vào “thùng rác”, nghia là truoc khi dôi
tuong dó bi huy bo.
2. Các lóp bao kiêu nguyên thuy (Wrapper class)
Các giá tri nguyên thuy không phai là dôi tuong trong Java. Dê có thê thao tác duoc
trên các giá tri nguyên thuy (giá tri sô, kí tu và logic) thì gói java.lang cung cap các lop
bao gói (Wrapper) cho tung kiêu dù liêu nguyên thuy (goi tát là lop bao). Các lop bao có
nhung dác tính chung sau:
Các toán tu tao lâp chung. Các lop bao (tru lop Character chi có môt toán tu tao lâp)
dêu có hai toán tu tao lâp:
Toán tu tao lâp su dung giá tri nguyên thuy dê tao ra dôi tuong tuong ung
Character charObj = new Character(‘a’);
Boolean boolObj = new Boolean(true);
Integer intObj = new Integer(2002);
Float floatObj = new Float(3.14F);
Double doubleObj = new Double(3.14);
Toán tu thu hai: chuyên các dôi tuong lop String biêu diên cho các giá tri nguyên
thuy vê các lop tuong ung. Các toán tu này së ném ra ngoai lê
NumberFormatException khi giá tri String truyên vào hàm tao không hop lê.
Boolean boolObj = new Boolean(“true”);
Integer intObj = new Integer(“2002”);
Trang 79
Float floatObj = new Float(“3.14F”);
Double doubleObj= new Double(“3.14”);
Có các hàm tiên ích chung: valueOf(String s), toString(), typeValue(), equals().
Môi lop (tru lop Character) dêu dinh nghia hàm static valueOf(String s) tra lai dôi
tuong tuong ung. Các hàm này ném ra ngoai lê NumberFormatException khi giá
tri String truyên vào phuong thuc không hop lê.
Boolean boolObj = Boolean.valueOf(“true”);
Integer intObj = Integer.valueOf(“2002”);
Float floatObj = Float.valueOf(“3.14F”);
Double doubleObj= Double.valueOf(“3.14”);
Các lop viêt dè hàm toString() tra lai là các dôi tuong String biêu diên cho các giá
tri nguyên thuy o dang xâu.
String charStr = charObj.toString(); // “a”
String boolStr = boolObj.toString(); // “true”
String intStr = intObj.toString(); // “2002”
String doubleStr = doubleObj.toString(); // “3.14”
Các lop dinh nghia hàm typeValue() tra lai các giá tri nguyên thuy tuong ung voi
các dôi tuong nguyên thuy.
boolean b = boolObj.booleanValue(); // true
int i = intObj.intValue(); // 2002
float f = floatObj.floatValueOf(); // 3.14F
double d = doubleObj.doubleValueOf(); // 3.14
char c = charObj.charValue(); // ‘a’
Các lop viêt dè hàm equals() dê thuc hiên so sánh báng nhau cua các dôi tuong
nguyên thuy.
Character charObj = new Character(‘a’);
boolean charTest = charObj.equals(‘b’); // false
Integer intObj1 = Integer.valueOf(“2010”);
boolean intTest = intObj.equals(intObj1); // false
Lop Boolean
Lop này dinh nghia hai dôi tuong Boolean.TRUE, Boolean.FALSE biêu diên cho hai giá
tri nguyên thuy true và false tuong ung.
Lop Character
Lop Character dinh nghia hai giá tri cuc tiêu, cuc dai Character.MIN_VALUE,
Character.MAX_VALUE và các giá tri kiêu ký tu Unicode. Ngoài ra lop này còn dinh
nghia môt sô hàm static dê xu lý trên các ký tu:
static boolean isLowerCase(char ch)// true nêu ch là ký tu thuong
static boolean isUpperCase(char ch)// true nêu ch là ký tu viêt hoa
static boolean isDigit(char ch) // true nêuch là chu sô
static boolean isLetter(char ch)// true nêu ch là chu cái
static boolean isLetterOrDigit(char ch) // true nêu ch là chu hoác là sô
static char toUpperCase(char ch)// Chuyên ch vê chu viêt hoa
Trang 80
static char toLowerCase(char ch)// Chuyên ch vê chu viêt thuong
static char toTitleCase(char ch) // Chuyên ch vê dang tiêu dê.
Các lop bao kiêu so
Các lop Byte, Short, Integer, Long, Float, Double là các lop con cua lop Number. Trong
các lop này dêu xác dinh hai giá tri:
<Lop bao>.MIN_VALUE
<Lop bao>.MAX_VALUE
là các gioi han cua các sô trong kiêu dó. Ví du,
byte minByte = Byte.MIN_VALUE; // -128
int maxInt = Integer.MAX_VALUE; // 2147483647
Trong môi lop bao có hàm typeValue() dê chuyên các giá tri cua các dôi tuong nguyên
thuy vê giá tri sô:
byte byteValue()
short shortValue()
int intValue()
long longValue()
float floatValue()
double doubleValue()
Trong môi lop bao còn có hàm static parseType(String s) dê chuyên các giá tri duoc biêu
diên duoi dang xâu vê các giá tri sô:
byte value1 = Byte.parseByte(“16”);
int value2 = Integer.parseInt(“2002”);
double value3 = Double.parseDouble(“3.14”);
Ví du: Viêt chuong trình dê nhâp vào môt dãy sô tùy ý và sáp xêp theo thu tu táng dân.
import java.io.*;
class SapXep{
static int[] day;
static void nhap(){
String str;
int n = day.length;
DataInputStream stream = new DataInputStream(System.in);
System.out.println("Nhap vao " + n + " so nguyen");
for (int k = 0; k < n; k++){
try{
System.out.print(k + ": ¨);
str = stream.readLine();
day[k] = Integer.valueOf(str).intValue();
}catch(IOException e){
System.err.println("I/O Error!");
}
}
}
static void hienThi(){
int n = day.length;
for (int k = 0; k < n; k++)
System.out.print(day[k] + " ");
System.out.println();
Trang 81
}
static void sapXep(){
int x, max, k;
for(int i =day.length-1; i > 0; i--){
max = day[i];k = i;
for (int j = 0; j < i; j++)
if (max < day[j]){
max = day[j];
k = j;
}
day[k] = day[i];
day[i] = max;
}
}
public static void main(String[] args){
String str;
int n;
DataInputStream stream = new DataInputStream(System.in);
System.out.print("\nCho biet bao nhieu so nhap vao: ");
try{
str = stream.readLine();
}catch(IOException e){
System.err.println("I/O Error!");
str = "0";
}
n = Integer.valueOf(str).intValue();
SapXep.day = new int[n];
nhap();
sapXep();
System.out.println("Day so duoc sap xep: ");
hienThi();
}
}
Lop Void
Lop này ký hiêu cho dôi tuong cua lop Class biêu diên cho giá tri void.
3. Lóp Math
Lop final class Math dinh nghia môt tâp các hàm tinh dê thuc hiên các chuc náng
chung cua toán hoc nhu các phép làm tròn sô, sinh sô ngâu nhiên, tìm sô cuc dai, cuc tiêu,
v.v.
Lop final class Math còn cung câp nhung háng sô nhu sô e (co sô cua logarithm), sô pi
thông qua Math.E và Math.PI.
Các hàm làm tròn và xu lý các giá tri gioi han
static int abs(int i)
static long abs(long l)
static float abs(float f)
static double abs(double d)
+ Hàm abs() duoc nap chông dê tra lai giá tri tuyêt dôi cua dôi sô.
static double ceil(double d)
Trang 82
+ Hàm ceil() tra lai giá tri nho nhât kiêu double mà không nho hon dôi sô và lai báng
sô nguyên. Ví du ceil(3.14) cho giá tri 4.0 là sô trân trên cua dôi sô.
static double floor(double d)
+ Hàm floor() tra lai giá tri lon nhât kiêu double mà không lon hon dôi sô và lai báng
sô nguyên. Ví du floor(3.14) cho giá tri 3.0 là sô sàn duoi cua dôi sô.
static int round(float f d)
static long round(double d)
+ Hàm round() duoc nap chông dê tra lai sô nguyên gân nhât cua dôi sô.
static int max(int a, int b)
static long max(long a, long b)
static float max(float a, float b)
static double max(double a, double b)
+ Hàm max() duoc nap chông dê tra lai giá tri cuc dai cua hai dôi sô.
static int min(int a, int b)
static long min(long a, long b)
static float min(float a, float b)
static double min(double a, double b)
+ Hàm min() duoc nap chông dê tra lai giá tri cuc tiêu cua hai dôi sô.
Các hàm luy thua
static double pow(double d1, double d2)
+ Hàm pow() tra lai giá tri là luy thua cua d1 và d2 (d1d2).
static double exp(double d)
+ Hàm exp() tra lai giá tri là luÿ thua co sô e và sô mu d (ed).
static double log(double d)
+ Hàm log() tra lai giá tri là lô-ga-rit tu nhiên (co sô e) cua d.
static double sqrt(double d)
+ Hàm sqrt() tra lai giá tri là cán bâc hai cua d , hoác giá tri NaN nêu dôi sô âm.
Các hàm luong giác
static double sin(double d)
+ Hàm sin() tra lai giá tri là sine cua góc d duoc cho duoi dang radian.
static double cos(double d)
+ Hàm cos() tra lai giá tri là cose cua góc d duoc cho duoi dang radian.
static double tan(double d)
+ Hàm tan() tra lai giá tri là tangent cua góc d duoc cho duoi dang radian.
Hàm sinh sô ngâu nhiên
static double random()
+ Hàm random() cho lai giá tri là sô ngâu nhiên trong khoang tu 0.0 dên 1.0.
Trang 83
V. Các lóp tâp hop
Tâp hop (Collection) trong Java cho phép luu lai tham chiêu dên các dôi tuong. Các
dôi tuong bât ky có thê duoc luu tru, tìm kiêm và duoc thao tác nhu là các phân tu cua tâp
hop.
Phân giao diên
Giao diên (interface) Collection là co so dê phát triên, mo rông thành các giao diên
khác nhu Set, List, SortedSet và Map và giao diên co so dê mo rông thành SortedMap.
Hình sau mô ta câu trúc phân câp theo quan hê kê thua cua các giao diên lõi.
Các giao diên lõi cua câu trúc Collection duoc mô ta trong bang sau:
interface Mô ta
Collection interface co so dinh nghia tat ca các phép toán co ban cho các lop
cân duy trì thuc hiên và cài dát chúng
Set Mo rông Collection dê cài dát câu trúc tâp hop, trong dó không có
phân tu duoc láp và chúng không duoc sáp xêp
SortedSet Mo rông Set dê cài dát câu trúc tâp hop duoc sáp, trong dó không có
phân tu duoc láp và chúng duoc sáp xêp theo thu tu
List Mo rông Collection dê cài dát câu trúc danh sách, trong dó các phân tu
duoc sáp xêp theo thu tu, và có láp
Map interface co so dinh nghia các phép toán dê các lop su dung và cài dát
các ánh xa tu khoá sang các giá tri
SortedMap Mo rông cua Map dê cài dát các ánh xa khoá theo thu tu
Phân cài dát
Gói java.util cung câp tâp các lop cài dát các giao diên lõi dê tao ra nhung câu trúc du
liêu thuong su dung nhu: Vector, HashTable, HashSet, LinkedList, TreeSet, v.v. Nhùng
lop này và giao diên lõi duoc xây dung theo câu trúc phân câp nhu trong hình H6-3.
< < int erface
> >
< < i nt erface
> >
< < int erface
> >
< < int erface
> >
< < int erface
> >
< < i nt erface
> >
Trang 84
Các giao diên lõi và các lop cài dát chúng
Trong hình trên ký hiêu à biêu diên cho quan hê kê thua giua các giao diên và -->
biêu diên cho su cài dát các giao diên.
Phân thuât toán
Lop java.util.Collection (cân phân biêt voi giao diên Collection) cung câp môt sô
hàm static thuc hiên nhùng thuat toán da xa cho nhùng phép toán khác nhau trên tâp hop,
kê ca sáp xêp, tìm kiêm và dich chuyên các phân tu.
Môt sô hàm trong sô dó là:
static int binarySearch(List list, Object key)
Su dung thuât toán tìm kiêm nhi phân dê xác dinh chi sô cua phân tu key trong
danh sách list.
static void fill(List list, Object obj)
Thay thê tât ca các phân tu trong danh sách list báng obj.
static void shuffle(List list)
Hoán vi các phân tu cua danh sách list môt cách ngâu nhiên.
static void sort(List list)
Sáp xêp các phân tu trong danh sách list theo thu tu táng dân.
1. Collection
Giao diên Collection duoc xây dung nhu là mâu hop dông cho tât ca các câu trúc
tâp hop có thê dua vào dó mà thuc thi và cài dát. Gói java.util cung câp các lop tâp hop và
cài dát hâu hêt các hàm cua Collection.
Các phép toán co so
int size();Xác dinh kích thuoc cua tap hop.
boolean isEmpty();Tra lai true nêu tap hop rong, nguoc lai false.
boolean contains(Object obj);Tra lai true nêu tap hop chua obj, nguoc lai false.
boolean add(Object obj); // Tùy chon
Tree Map
Hash Set
< <
i nt erface> >
Sor t ed Set
Arr ay Li st Vect or LinkedLi st
< <
i nt erface> >
Map
< <
int erf ace> >
Sor t ed Map
< <
int erf ace> >
Li st
HashMap
HasTabl e
< <
i nt erface> >
Set
Tree Set
< <
int erface> >
Col l ect i on
Trang 85
boolean remove(Object obj); // Tùy chon
Tra lai true nêu tâp hop thuc hiên thành công viêc bô sung (loai bo) obj, nguoc lai false.
Môt sô phép toán khác
Nhung phép toán sau thuc hiên trên tâp hop nhu môt don vi câu trúc du liêu.
boolean cotainAll(Collection c); // Tùy chon
Kiêm tra xem tap hop hiên thoi có chua ca tap hop c hay không.
boolean addAll(Collection c);// Tùy chon
Thuc hiên phép hop hai tap hop
boolean removeAll(Collection c); // Tùy chon
Thuc hiên phép tru hai tâp hop
boolean retainAll(Collection c); // Tùy chon
Thuc hiên phép giao hai tâp hop
void clear() // Tùy chon
Huy bo dôi tuong trong tâp hop các phép trên tra lai true nêu thuc hiên thành công
và cho kêt qua thuc hiên duoc minh hoa nhu trong hình H6-4, trong dó a, b là hai
tâp hop bât ky.
a.addAll(b) a.removeAll(b) a.retainAll(b)
Hình Các phép toán trên các tâp hop
2. Set (tâp hop)
Tâp hop Set là câu trúc du liêu, trong dó không có su láp lai và không có su sáp
xêp cua các phân tu. Giao diên Set không dinh nghia thêm các hàm moi mà chi gioi han
lai các hàm cua Collection dê không cho phép các phân tu cua nó duoc láp lai.
Gia su a, b là hai tâp hop (hai dôi tuong cua các lop cài dát Set). Kêt qua thuc hiên trên a,
b có thê mô ta nhu trong bang sau:
Các hàm trong
Set
Các phép hop tuong ung
a.containsAll(b) b ⊆ a ? (Tâp con)
a.addAll(b) a = a ∪ b (Hop tâp hop)
a.removeAll(b) a = a - b (Hiêu tâp hop)
a.retainAll(b) a = a ∩ b (Giao tâp hop)
a.clear() a = ∅ (Tâp rông)
Sau dây chúng ta xét môt sô lop thuc thi cài dát giao diên Set.
HashSet
Môt dang cài dát nguyên thuy cua Set là lop HashSet, trong dó các phân tu cua nó là
không duoc sáp. Lop này có các toán tu tao lâp:
HashSet():Tao ra môt tâp moi không có phân tu nào ca (tâp rông).
HashSet(Collection c)
a
b
a
a a a
Trang 86
Tao ra môt tâp moi chua các phân tu cua tâp hop c nhung không cho phép láp.
HashSet(int initCapacity)
Tao ra môt tâp moi rông có kích thuoc (kha náng chua) là initCapacity.
HashSet(int initCapacity, float loadFactor)
Tao ra môt tâp moi rông có kích thuoc (kha náng chua) là initCapacity và yêu tô
duoc nap vào là loadFactor.
Ví du 6.4 Khi thuc hiên các dôi sô duoc dua vào sau tên chuong trình theo dòng lênh.
Chuong trình bát dâu voi tap1 là rông và lây các ký tu cua dôi sô dâu tiên dê tao ra tap2.
So sánh hai tâp dó, thông báo kêt qua ra màn hình, sau dó công dôn tap2 vào tap1 và lai
tiêp tuc nhu thê dôi voi dôi sô tiêp theo cho dên hêt.
import java.util.*;
public class TapKT {
public static void main(String args[]) {
int nArgs = args.length; // Sô dôi sô cúa chuong trình
Set tap1 = new HashSet(); // Tao ra tâp thú nhât là rông
for (int i = 0; i < nArgs; i++){
String arg = args[i]; // Lây tùng dôi sô cúa chuong trình
Set tap2 = new HashSet();// Tao ra tâp thú 2
int size = arg.length(); // Sô ký tu trong môi dôi sô
for (int j = 0; j < size; j++)// Tâp thú 2 chúa các ký tu cúa arg
tap2.add(new Character(arg.charAt(j)));
// Tao ra tâp tapChung chính bãng tap1
Set tapChung = new HashSet(tap1);
tapChung.retainAll(tap2);// tapChung = tap1 ∩ tap2
boolean b = tapChung.size() == 0;
if (b)
System.out.println(tap2+" va "+tap1+" la roi nhau");
else {
// tap2 có phái là tâp con cúa tap1?
boolean isSubset = tap1.containsAll(tap2);
// tap1 có phái là tâp con cúa tap2?
boolean isSuperset = tap2.containsAll(tap1);
// tap1 có bãng tap2?
if (isSuperset && isSubset)
System.out.println(tap2 + " bang tap " + tap1);
else if (isSubset)
System.out.println(tap2+" la tap con cua "+tap1);
else if (isSuperset)
System.out.println(tap2+" la tap cha cua "+tap1);
else
System.out.println(tap2 + " va " + tap1 + " co "
+ tapChung + " la phan chung");
}
tap1.addAll(tap2);// hop tap2 vào tap1
}
}
}
Dich và thuc hiên chuong trình voi các dôi sô nhu sau:
java TapKT em voi em anh
së cho kêt qua:
[m, e] va [ ] la roi nhau
Trang 87
[v, i, o] va [m, e] la roi nhau
[m, e] la tap con cua [m, v, i, e, o]
[a, h, n] va [m, v, i, e, o] la roi nhau
3. List (danh sách)
Câu trúc List là dang tâp hop các phân tu duoc sáp theo thu tu (còn duoc goi là dãy
tuân tu) và trong dó cho phép láp (hai phân tu giông nhau). Ngoài nhung hàm mà nó duoc
kê thua tu Collection, List còn bô sung thêm nhung hàm nhu:
Object get(int index)
Cho lai phân tu duoc xác dinh boi index.
Object set(int index, Object elem) // Tùy chon
Thay thê phân tu duoc xác dinh boi index báng elem.
void add(int index, Object elem) // Tùy chon
Chèn elem vào sau phân tu duoc xác dinh boi index.
Object remove(int index) // Tùy chon
Bo di phân tu duoc xác dinh boi index.
boolean addAll(int index, Collection c) // Tùy chon
Chèn các phân tu cua tâp hop c vào vi trí duoc xác dinh boi index.
int indexOf(Object elem)
Cho biêt vi trí lân xuât hiên dâu tiên cua elem trong danh sách.
int lastIndexOf(Object elem)
Cho biêt vi trí lân xuât hiên cuôi cùng cua elem trong danh sách.
List subList(int fromIndex, int toIndex)
Lây ra môt danh sách con tu vi trí fromIndex dên toIndex .
ListIterator listIterator()
Cho lai các phân tu liên tiêp bát dâu tu phân tu dâu tiên.
ListIterator listIterator(int index)
Cho lai các phân tu liên tiêp bát dâu tu phân tu duoc xác dinh boi index.
Trong dó ListIterator là giao diên mo rông giao diên Iterator dã có trong java.lang.
Các lóp ArrayList, Vector và LinkedList
Ba lop này có nhung toán tu tao lâp dê tao ra nhung danh sách moi rông hoác có
các phân tu lây theo các tâp hop khác.
Vector và ArrayList là hai lop kiêu mang dông (kích thuoc thay dôi duoc). Hiêu suât su
dung hai lop này là tuong duong nhau, tuy nhiên nêu xét theo nhiêu khía canh khác thì
ArrayList là câu trúc hiêu qua nhât dê cài dát câu trúc danh sách List.
Ví du 6.5 Hê thông có môt dãy N_DIGIT (5) chu sô bí mât. Hãy viêt chuong trình nhâp
vào N_DIGIT chu sô dê doán xem có bao nhiêu chu sô trùng và có bao nhiêu vi trí các
chu sô trùng voi dãy sô cho truoc.
import java.util.*;
public class NhapDoanSo {
final static int N_DIGIT = 5;
public static void main(String args[]){
if(args.length != N_DIGIT) {
System.err.println("Hay doan " + N_DIGIT + " chu so!");
return;
}
List biMat = new ArrayList();// Tao danh sách biMat là rông
Trang 88
biMat.add("5"); // Bô sung các sô vào dãy biMat
biMat.add("3");
biMat.add("2");
biMat.add("7");
biMat.add("2");
List doan = new ArrayList();// Tao danh sách doan là rông
for(int i = 0; i < N_DIGIT; i++)
doan.add(args[i]); // Ðua các sô tù dôi sô chuong trình vào doan
List lap = new ArrayList(biMat);// Luu luu biMat sang lap
int nChua = 0;
// Ðêm sô các chü sô trùng nhau, nghïa là thuc hiên duoc phép bó di remove()
for(int i = 0; i < N_DIGIT; i++)
if (lap.remove(doan.get(i))) ++nChua;
int nViTri = 0;
ListIterator kiemTra = biMat.listIterator();
ListIterator thu = doan.listIterator();
// Tìm nhüng vi trí doán trúng trong hai dãy có lãp
while (kiemTra.hasNext())// Khi còn phân tú tiêp theo
// Kiêm tra xem lân luot các vi trí cúa hai dãy có trùng nhau hay không
if (kiemTra.next().equals(thu.next())) nViTri++;
// Thông báo kêt quá ra màn hình
System.out.println(nChua + " chu so doan trung.");
System.out.println(nViTri + " vi tri doan trung.");
}
}
Dich và thuc hiên chuong trình:
java NhapDoanSo 3 2 2 2 7
së cho kêt qua:
4 chu so doan trung
1 vi tri doan trung
4. Map (ánh xa)
Map dinh nghia các ánh xa tu các khoá (keys) vào các giá tri. Luu ý: các khóa phai
là duy nhât (không cho phép láp). Môi koá duoc ánh xa sang nhiêu nhât môt giá tri, duoc
goi là ánh xa don.
Các ánh xa không phai là các tâp hop, giao diên Map cung không phai là mo rông cua các
Collection. Song, phép ánh xa có thê xem nhu là môt loai tâp hop theo nghia: các khoá
(key) tao thành tâp hop và tâp hop các giá tri (value) hoác tâp các cáp <key, value>.
Giao diên Map khai báo nhung hàm sau:
Object put(Object key, Object value); // Tùy chon
Chèn vào môt cáp <key, value>
Object get(Object key);
Doc giá tri duoc xác dinh boi key nêu có ánh xa, nguoc lai cho null nêu không có
ánh xa ung voi key.
Object remove(Object key); // Tùy chon
Loai bo ánh xa duoc xác dinh boi key.
boolean containsKey(Object key);
Cho giá tri true nêu key duoc ánh xa sang môt giá tri nào dó, nguoc lai là false.
boolean containsValue(Object value);
Cho giá tri true nêu value duoc ánh xa boi môt key nào dó, nguoc lai là false.
Trang 89
int size();
Cho sô các cáp ánh xa <key, value>.
boolean isEmpty();
Cho giá tri true nêu ánh xa rông, nguoc lai là false.
Môt sô phép toán thuong dùng
void putAll(Map t); // Tùy chon
Sao lai các ánh xa tu t.
void clear(); // Tùy chon
Xoá di tât ca các ánh xa.
Set keySet();
Xác dinh tâp các khoá.
Collection values();
Xác dinh tâp hop các giá tri.
Set entrySet();
Xác dinh tâp các ánh xa <key, value>.
Các lóp HashMap và HashTable
Hai lop này cài dát giao diên Map và duoc xây dung trong java.lang. Chúng cho phép tao
ra các ánh xa moi có thê rông hoác có nhung kích thuoc tùy ý.
Ví du 6.6
Viêt chuong trình nhap vào các trong luong và in ra tan suat cua các trong luong
dó trong các nhóm cách nhau 5 don vi (kg).
import java.util.*;
public class NhomTrongluong {
public static void main(String args[]){
// Tao ra môt ánh xa dê luu tân suât cúa môi nhóm
Map demNhom = new HashMap();
int nArgs = args.length;
// Ðoc các trong luong duoc nhâp vào tù dôi sô và chia nhóm cách nhau 5 don vi.
for(int i = 0; i < nArgs; i++){
double trongL = Double.parseDouble(args[i]);
Integer nhomTL=new Integer((int)Math.round(trongL/5)*5);
Integer demCu = (Integer)demNhom.get(nhomTL);
// Tãng sô lân trong luong trong cùng nhóm, nêu là lân dâu (demCu = null) thì dãt là 1.
Integer demMoi = (demCu == null)?
new Integer(1): new Integer(demCu.intValue()+1);
demNhom.put(nhomTL, demMoi);
}
// Lây ra tâp các giá tri tù ánh xa demNhom
List keys = new ArrayList(demNhom.keySet());
// Sãp xêp lai theo các nhóm trong luong
Collections.sort(keys);
ListIterator keyIterator = keys.listIterator();
// Tìm tân suât cúa các trong luong duoc nhâp vào trong các nhóm
while(keyIterator.hasNext()) {
Integer nhom = (Integer) keyIterator.next();
Integer dem = (Integer) demNhom.get(nhom);
int demInt = dem.intValue();
// Sú dung hàm fill() cúa lóp Array dê tao ra xâu gôm demInt các dâu '*'
char[] bar = new char[demInt];
Trang 90
Arrays.fill(bar, '*');
System.out.println(nhom+"\t" + new String(bar));
}
}
}
Dich và chay chuong trình NhomTrongLuong voi các tham sô:
java NhomTrongLuong 75 72 93 12 34
së cho kêt qua:
*
*
1. **
95 *
Nhu vây, nhóm 10 kg có 1, 35 kg có 1, 75 kg có 2 và 95 kg có 1.
4. SortedSet (tâp duoc sáp) và SortedMap (ánh xa duoc sáp)
Các câu trúc tâp hop (set) và ánh xa (map) có giao diên dác biêt là SortedSet và
SortedMap nhu trong hình H6-5 dê cài dát nhung câu trúc có các phân tu duoc sáp theo
thu tu chi dinh.
Giao diên SortedSet
SortedSet là giao diên mo rong cua Set cung cap các hàm dê xu lý các tap duoc sáp.
SortedSet headSet(Object toElem);
Cho lai tâp duoc sáp gôm nhung phân tu dung truoc toElem.
SortedSet tailSet(Object fromElem);
Cho lai tâp duoc sáp gôm nhung phân tu cuôi dung sau fromElem.
SortedSet subSet(Object fromElem, Object toElem);
Cho lai tâp duoc sáp gôm nhung phân tu kê tu fromElem dên toElem.
Object first();Cho lai phan tu dau tiên (cuc tiêu) cua tap duoc sáp.
Object last();Cho lai phan tu cuoi cùng (cuc dai) cua tap duoc sáp.
Comparator comparator()
Cho lai thu tu so sánh cua câu trúc duoc sáp, cho null nêu các phân tu duoc sáp theo thu
tu tu nhiên (táng dân)
Giao diên SortedMap
SortedMap là giao diên mo rong cua Map cung cap các hàm dê xu lý các ánh xa duoc
sáp theo thu tu cua khoá (key).
SortedMap headMap(Object toKey);Cho lai ánh xa duoc sáp gom nhùng phan tu dung
truoc toKey.
SortedMap tailMap(Object fromKey);Cho lai ánh xa duoc sáp gom nhùng phan tu cuoi
dung sau fromKey.
SortedMap subMap(Object fromKey, Object toKey);Cho lai ánh xa duoc sáp gôm nhung
phân tu kê tu fromKey dên toKey.
Object firstKey();Cho lai phan tu dau tiên (cuc tiêu) cua ánh xa duoc sáp.
Object lastKey();Cho lai phan tu cuoi cùng (cuc dai) cua ánh xa duoc sáp.
TreeSet và TreeMap
Hai lop này cài dát hai giao diên SortedSet và SortedMap tuong ung. Chúng có bôn loai
toán tu tao lâp nhu sau:
TreeSet()
TreeMap()
Trang 91
Tao ra nhùng tap hoàc ánh xa moi và rong, duoc sáp theo thu tu tàng dan cua các
phân tu hoác cua khoá.
TreeSet(Comparator c)
TreeMap(Comparator c)
Tao ra nhùng tap hoàc ánh xa moi duoc sáp và xác dinh thu tu so sánh theo c.
TreeSet(Collection c)
TreeMap(Map m)
Tao ra nhùng tap hoàc ánh xa moi duoc sáp và có các phan tu lay tu c hoàc tu m
tuong ung.
TreeSet(SortedSet s)
TreeMap(SortedMap m)
Tao ra nhung tâp hoác ánh xa moi duoc sáp và có các phân tu lây tu s hoác tu m tuongung.
Trang 92
Chuong 3: XU LÝ NGOAI LE
Dôi voi nguoi lâp trình ho có thê gáp môt trong các lôi sau:
- Lôi cú pháp (syntac error)
- Lôi logic thuât toán
- Lôi lúc thuc thi ( runtime error)
- Dôi voi lôi cú pháp nguoi lâp trình có thê phát hiên và sua lôi, dua vào trình biên dich,
dây là lôi dê phát hiên và sua chua, tuy nhiêmn dây cung là lôi gây khó khán và chán nan
dôi voi nguoi moi hoc lâp trình.
- Dôi voi lôi thuât toán, dây là lôi khó phát hiên và sua chua nhât, tuy nhiên trong bài này
ta không bàn luân vê vân dê này.
- Dôi voi lôi lúc thuc thi, ta hoàn toàn có thê kiêm soát duoc chúng, thông thuong lôi
runtime thuong do nguyên nhân khách quan nhu: truy câp vào môt ô dia nhung ô dia này
lai chua sán sàng, hay thuc hiên phép chia nhung mâu sô lai báng 0, kêt nôi voi máy tính o
xa nhung máy dó lai không tôn tai…, khi môt lôi runtime xây ra JVM së phát sinh môt
ngoai lê, nêu môt chuong trình không cung câp mã su lý ngoai lê có thê kêt thúc không
bình thuong, trong bài hôm nay ta së bàn vê vân dê su lý ngoai lê trong java.
- Moi lop biêt lê trong java dêu duoc dân xuât tu lop co so Throwable, ta có thê tao ra lop
ngoai lê riêng báng cách mo rông lop Throwable
I. Muc dích cua viêc xu lý ngoai lê
Môt chuong trình nên có co chê xu lý ngoai lê thích hop. Nêu không, chuong trình së
bi ngát khi môt ngoai lê xay ra. Trong truong hop dó, tât ca các nguôn tài nguyên mà hê
thông dã câp không duoc giai phóng. Diêu này gây lãng phí tài nguyên. Dê tránh truong
hop này, tât ca các nguôn tài nguyên mà hê thông câp nên duoc thu hôi lai. Tiên trình này
dòi hoi co chê xu lý ngoai lê thích hop.
Ví du, xét thao tác vào ra (I/O) trong môt tâp tin. Nêu viêc chuyên dôi kiêu du liêu
không thuc hiên dúng, môt ngoai lê së xay ra và chuong trình bi huy mà không dóng tâp
tin lai. Lúc dó tâp tin dê bi hu hai và các nguôn tài nguyên duoc câp phát cho tâp tin
không duoc tra lai cho hê thông.
II. Mô hình su lý ngoai lê cua java
Mô hình su lý ngoai lê cua java dua trên ba hoat dông chính: dác ta ngoai lê, ném
ra ngoai lê, và bát ngoai lê.
- Môi phuong thuc dêu có thê phát sinh các ngoai lê, các ngoai lê có thê phát sinh cân
duoc mô ta chi tiêt trong lênh khai báo cua phuong thuc, viêc khai báo này duoc goi là dác
ta ngoai lê.
- Khi môt câu lênh trong phuong thuc gây lôi, mà nguoi lâp trình không cung câp mã xu
lý lôi, thì ngoai lê duoc chuyên dên phuong thuc goi phuong thuc dó, viêc này duoc goi là
ném ra biêt lê, ta có thê ném ra biêt lê môt cách tuong minh (diêu này së duoc gioi thiêu
sau).
- Sau khi JVM ném ra môt ngoai lê, thì hê thông thi hành java bát dâu tiên trình tìm mã xu
lý lôi. Mã xu lý lôi hay còn goi là mã xu lý biêt lê, java runtime së tìm mã xu lý lôi báng
cách lân nguoc tro lai chuôi các phuong thuc goi nhau, bát dâu tu phuong thuc hiên tai.
Chuong trình së kêt thúc nêu không tìm thây mã xu lý biêt lê. Quá trình tìm kiêm này goi
là bát biêt lê.
Trang 93
III. Dàc ta ngoai lê
Dác ta ngoai lê là khai báo cho trình biên dich biêt là phuong thuc này có thê gây ra
ngoai lê lúc thi hành.
Dê khai báo biêt lê ta su dung tu khoá throws trong khai báo phuong thuc, ví du:
public void myMethod() throws IOException, RemoteException
tu khoá throws chi cho trình biên dich java biêt ráng phuong thuc này có thê ném ra ngoai
lê IOException và RemoteException, nêu môt phuong thuc ném ra nhiêu ngoai lê thì các
ngoai lê duoc khai báo cách nhau boi dâu phây ‘,’
III. Ném ra ngoai lê
Môt phuong thuc sau khi dã khai báo các biêt lê, thì ban (hoác chuong trình thuc thi java)
có thê ném ra các dôi tuong biêt lê, có kiêu mà ta dã khai báo trong danh sách throws. Cú
pháp cua lênh ném ra ngoai lê:
throw ExceptionObject;
Chú ý:
- Ban phai chú ý giua lênh khai báo biêt lê và lênh ném ra ngoai lê
- Môt phuong thuc chi có thê ném ra các ngoai lê mà nó duoc khai báo
IV. Bàt ngoai lê
Môt ngoai lê (exception) trong chuong trình Java là dâu hiêu chi ra ráng có su xuât
hiên môt diêu kiên không bình thuong nào dó.
Khi môt ngoai lê xay ra, dôi tuong tuong ung voi ngoai lê dó duoc tao ra. Dôi tuong
này sau dó duoc truyên cho phuong thuc là noi mà ngoai lê xay ra. Dôi tuong này chua
thông tin chi tiêt vê ngoai lê. Thông tin này có thê duoc nhân vê và duoc xu lý. Các ngoai
lê này có thê là môt ngoai lê chuân cua Java hoác có thê là môt ngoai lê do ta tao ra. Lop
‘Throwable’ duoc Java cung câp là cha cua tât ca các ngoai lê trong Java (lop dâu tiên
trong cây thua kê).
Sau khi ban dã biêt cách khai báo và ném ra biêt lê, thì phân viêc quan trong nhât là
bát và xu lý biêt lê.
Vân dê dôi voi nguoi lâp trình java là phai biêt duoc doan mã nào cua anh ta có thê
gây ra lôi. Khi ho dã khoanh vùng duoc doan mã có thê gây ra lôi ho së dát doan mã, có
kha náng gây ra lôi dó trong khôi try ( thu làm), và dát doan mã xu lý lôi trong khôi catch
( bát giu). Khuôn dang tông quát nhu sau:
try{
// Các lênh có kha náng gây lôi
}
catch ( TypeException1 ex){
// Mã duoc thuc thi khi môt ngoai lê TypeException1 duoc phát sinh trong khôi try
}
catch ( TypeException2 ex){
// Mã duoc thuc thi khi môt ngoai lê TypeException2 duoc phát sinh trong khôi try
}
...
catch ( TypeExceptionN ex){
// Mã duoc thuc thi khi môt ngoai lê TypeExceptionN duoc phát sinh trong khôi try
} finally{
// khôi lênh nay luôn duoc thuc hiên cho dù ngoai lê có xay ra trong khôi try hay không.
}
Trang 94
Nêu không có môt ngoai lê nào phát sinh trong khôi try thì các mênh dê catch së bi
bo qua, trong truong hop môt trong các câu lênh bên trong khôi try gây ra môt ngoai lê thì,
thì java së bo qua các câu lênh còn lai trong khôi try dê di tìm mã xu lý ngoai lê, nêu kiêu
ngoai lê so khop voi kiêu ngoai lê trong mênh dê catch, thì mã lênh trong khôi catch dó së
duoc thuc thi, nêu không tìm thây môt kiêu ngai lê nào duoc so khop java së kêt thúc
phuong thuc dó và chuyên biêt lê dó ra phuong thuc dã goi phuong thuc này quá trình này
duoc tiêp tuc cho dên khi tìm thây mã xu lý biêt lê, nêu không tìm thây mã xu lý biêt lê
trong chuôi các phuong thuc goi nhau, chuong trình có thê châm dut và in thông báo lôi ra
luông lôi chuân System.err
Ví du:
Thuc hiên
khôi t ry
Tìm khôi xú lý lôi
( khôi cat ch) dê
t huc hiên
Nêu ngoai lê sinh r a
t rong khôi t r y là môt
t hê hiên cúa lóp
ngoai lê
Thuc hiên khôi
cat ch úng vói
ngoai lê 1
Nêu ngoai lê sinh r a
t rong khôi t r y là môt
t hê hiên cúa lóp
ngoai lê
Thuc hiên khôi
cat ch úng vói
ngoai lê 2
false
true
true
false
…………
Nêu ngoai lê sinh r a
t rong khôi t r y là môt
t hê hiên cúa lóp
ngoai lê
Thuc hiên khôi
cat ch úng vói
ngoai lê 1
true
Có ngoai xây
ra t rong khôi
t ry
yes
no
Thuc hiên
khôi finally
Trang 95
class TryClass{
public static void main(String args[]) {
int n=0;
try {
System.out.println(1/n);
}
catch(ArithmeticException ex)
{System.out.println("Loi chia cho 0¨);}
}
}
Khi chay chuong trình này ta se thu duoc môt dòng in ra màn hình nhu sau:
Loi chia cho 0
Trong doan chuong trình trên khi chia môt sô cho 0 së gáp ngoai lê ArithmeticException,
biêt duoc ngoai lê này có thê xây ra do vây ta bát nó và xu lý trong khôi
catch(ArithmeticException ex), o dây ex là môt dôi tuong cua lop ArithmeticException
chua các thông tin vê ngoai lê xây ra, ta có thê lây cá thông tin vê ngoai lê cháng han nhu
lây vê mô ta ngoai lê nhu sau:
System.out.println(a.getMessage()).
V. Khôi ‘finally’
Khi môt ngoai lê xuât hiên, phuong thuc dang duoc thuc thi có thê bi dung mà không
duoc hoàn thành. Nêu diêu này xay ra, thì các doan mã phía sau (ví du nhu doan mã có
chuc náng thu hôi tài nguyên, nhu các lênh dóng tâp viêt o cuôi phuong thuc) së không
bao gio duoc goi. Java cung câp khôi finally dê giai quyêt viêc này. Thông thuong khôi
‘finally’ chua các câu lênh mang tính chât don dep nhu: dóng kêt nôi CSDL, dóng têp
tin,….
try{
//Các lênh có kha náng ném ra ngoai lê
}
catch(Exception1 ex1){

}
catch(Exception2 ex2){

}
catch(Exceptionn exn){

}
finally{
//Mã lênh don dep
}
Khôi ‘finally’ là tuy chon, không bát buôc phai có. Khôi này duoc dát sau khôi ‘catch’
cuôi cùng. Chuong trình së thuc thi câu lênh dâu tiên cua khôi ‘finally’ ngay sau khi gáp
câu lênh ‘return’ hay lênh ‘break’ trong khôi ‘try’.
Trang 96
Khôi ‘finally’ bao dam lúc nào cung duoc thuc thi, bât châp có ngoai lê xay ra hay
không.
Hình minh hoa su thuc hiên cua các khôi ‘try’, ‘catch’ và ‘finally’.
try block
catch block finally block
finally block
No Exception Exception occurs
VI. Môt sô lóp ngoai lê chuân cua Java
Danh sách môt sô lóp ngoai lê
Tên lóp ngoai lê Ý nghia
Throwable Dây là lop cha cua moi lop ngoai lê trong Java
Exception Dây là lop con truc tiêp cua lop Throwable, nó
mô ta môt ngoai lê tông quát có thê xây ra
trong ung dung
RuntimeException Lop co so cho nhiêu ngoai lê java.lang
ArthmeticException Lôi vê sô hoc, ví du nhu ‘chia cho 0’.
IllegalAccessException Lop không thê truy câp.
IllegalArgumentException Dôi sô không hop lê.
ArrayIndexOutOfBoundsExeption Lôi truy câp ra ngoài mang.
NullPointerException Khi truy câp dôi tuong null.
SecurityException Co chê bao mât không cho phép thuc hiên.
ClassNotFoundException Không thê nap lop yêu câu.
NumberFormatException Viêc chuyên dôi tu chuôi sang sô không thành
công.
AWTException Ngoai lê vê AWT
IOException Lop cha cua các lop ngoai lê I/O
FileNotFoundException Không thê dinh vi tâp tin
EOFException Kêt thúc môt tâp tin.
NoSuchMethodException Phuong thuc yêu câu không tôn tai.
InterruptedException Khi môt luông bi ngát.
Trang 97
Chuong 4: LAP TRÌNH DA TUYEN
I. Các kiên thúc liên quan
1. Tiên trình ( process)
Tiên trình là môt thê hiên cua môt chuong trình dang xu lý. So huu môt con tro
lênh, tâp các thanh ghi và các biên. dê hoàn thành tác vu cua mình, môt tiên trình còn cân
dên môt sô tài nguyên khác nhu: CPU, bô nho, các tâp tin, các thiêt bi ngoai vi..
Cân phân biêt duoc giua tiên trình và chuong trình. Môt chuong trình là môt thê hiên thu
dông, chua các chi thi diêu khiên máy tính dê thuc hiên muc dích gì dó; khi cho thuc thi
chi thi này thì chuong 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 chuong trình chay trên hê diêu hành và duoc quan lý
thông qua môt sô hiêu goi là the
2. Tiêu trình ( thread )
Môt tiêu trình là môt don vi xu lý co ban trong hê thông. Môi tiêu trình xu lý tuân
tu các doan code cua nó, so huu môt con tro lênh, môt tâp các thanh ghi và môt vùng nho
stack riêng, các tiêu trình chia se CPU voi nhau giông nhu cách chia se giua các tiên trình.
Môt tiên trình so huu nhiêu tiêu trình, tuy nhiên môt tiêu trình chi 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 se nhau không gian dia chi chung,
diêu này có nghia là các tiêu trình có thê chia se nhau các biên toàn cuc cua tiên trình. Môt
tiêu trình cung có thê có các trang thái giông nhu các trang thái cua môt tiên trình.
3. Hê diêu hành don nhiêm, da nhiêm
Ø HDH don nhiêm là HDH chi cho phép 1 tiên trình chay tai môt thoi diêm, ví du HDH
DOS là HDH don nhiêm.
Ø - HDH da nhiêm cho phép nhiêu tiên trình chay tai môt thoi diêm, ví du HDH
windows, Unix, Linux là các HDH da nhiêm
Ø HDH da nhiêm uu tiên: các tiên trình duoc câp phát thoi gian su dung CPU theo muc
uu tiên khác nhau
Ø HDH da nhiêm không uu tiên: các tiên trình không có muc uu tiên nào ca, chúng “tu
giác” nha quyên kiêm soát CPUsau khi kêt thúc phân công viêc
Chú ý: trong thuc tê môi máy thuong chi có 1 CPU, nên không thê có nhiêu tiên trình
chay tai môt thoi diêm. Nên thông thuong su da chuong chi là gia lâp. Chúng duoc gia lâp
báng cách luu tru nhiêu tiên trình trong bô nho tai môt thoi diêm, và diêu phôi CPU qua
lai giua các tiên trình.
4. Các trang thái cua tiên trình
Trang thái cua môt tiên trình tai môt thoi diêm duoc xác dinh boi hoat dông hiên
thoi cua tiên trình dó. Trong quá trình sông môt tiên trình thay dôi trang thái do nhiêu
nguyên nhân nhu: hêt thoi gian su dung CPU, phai cho môt su kiên nào dó xây ra, hay
doi môt thao tác nhâp/xuât hoàn tât…
Tai môt thoi diêm môt tiên trình có thê nhân môt trong các trang thái sau dây:
1. Tao moi: tiên trình dang duoc thành lâp
2. Running: các chi thi cua tiên trình dang duoc xu lý, hay nói cách khác tiên trình
dang so huu CPU
3. Blocked: tiên trình dang cho duoc câp tài nguyên, hay cho môt su kiên nào dó xây
ra
4. Ready: tiên trình dang cho câp CPU dê xu lý
5. Kêt thúc: tiên trình dã hoàn tât viêc xu lý
Trang 98
5. Miên gáng ( Critical Section )
a) Vân dê tranh châp tài nguyên
Ta xét tình huông sau:
Ø gia su A có 500$ trong tài khoan ngân hàng
Ø A quyêt dinh rút ra 100$ tu tài khoan ngân hàng, thao tác cua A gôm 2 buoc:
1) lây ra 100$
2) giam sô tài khoan di 100$
Ø Tình huông giua 2 thao tác 1 và
2, B tra A 300$, do vây B câp
nhât vào trong tài khoan cua A là 800$ ( =500$ +300$), sau dó A tiêp tuc công viêc 2,
nó câp nhât lai trong tài khoan là 400$, nhu vây B dã tra A 300$, nhung A không nhân
duoc.
b) Miên gáng (Critical Section)
Doan chuong trình trong dó có thê xây ra các mâu thuân truy xuât trên tài nguyên
dung chung duoc goi là miên gáng ( Critical Section )
6. Khoá chêt (deadlock)
Môt tâp các tiên trình duoc dinh nghia là o trong tình trang khoá chêt nêu nhu, môi tiên
trình trong tâp hop dêu dêu cho doi môt sô tài nguyên dang bi nám giu boi các tiên
trình khác, nhu vây không có tiên trình nào có thê tiêp tuc xu lý, cung nhu giai phóng
tài nguyên cho các tiên trình khác su dung, tât ca các tiên trình trong tâp hop dêu bi
khoá vinh viên!.
II. Lâp trình da tuyên trong Java
Voi Java ta có thê xây dung các chuong trình da luông. Môt ung dung có thê bao gôm
nhiêu luông. Môi luông duoc gán môt công viêc cu thê, chúng duoc thuc thi dông thoi voi
các luông khác.
Có hai cách dê tao ra luông
Cách 1: Tao ra môt lop kê thua tu lop Thread và ghi dè phuong thuc run cua lop
Thread nhu sau:
class MyThread extends Thread{
public void run(){
//Mã lênh cua tuyên
}
Mí i t¹ o KÕt thóc
Runni ng Ready
Bl ocked
S¬ ®å chuyÓn tr¹ ng th¸ i cña mét ti Õn tr×nh
A
500
$
1
2 500-
50
Trang 99
}
Cách 2: Tao ra môt lop triên khai tu giao diên Runnable, ghi dè phuong thuc run
class MyThread implements Runnable{
public void run(){
//Mã lênh cua tuyên
}
}
1. Lóp Thread
Lop Thread chua phuong thuc tao dung Thread() cung nhu nhiêu phuong thuc huu ích
có chuc náng chay, khoi dông, tam ngung, tiêp tuc, gián doan và ngung tuyên. Dê tao ra
và chay môt tuyên ta cân làm 2 buoc:
Ø Mo rông lop Thread và Ghi dè phuong thuc run()
Ø Goi phuong thuc start() dê bát dâu thuc thi tuyên
Lop Thread không có nhiêu phuong thuc lám, chúng chi có môt vài phuong thuc huu
dung duoc liêt kê sau:
Ø public void run()
duoc java goi dê thuc thi tuyên thi hành, ban phai ghi dè phuong thuc này dê thuc thi
nhiêm vu cua tuyên, boi vì phuong thuc run()cua lop Thread chi là phuong thuc rông
Ø public void start()
khi ta tao ra tuyên nó chua thuc su chay cho dên khi, phuong thuc start() duoc goi, khi
start() duoc goi thì phuong thuc run() cung duoc kích hoat
Ø public void stop()
có chuc náng ngung tuyên thi hành, phuong thuc này không an toàn, ban nên gán null
vào biên Thread dê dê dung tuyên, thay vì su dung phuong thuc stop()
Ø public void suspend()
Có chuc náng tam ngung tuyên, trong java 2, phuong thuc này ít duoc su dung, boi vì
phuong thuc này không nha tài nguyên mà nó lám giu, do vây có thê nguy co dân dên
deadlock ( khoá chêt ), ban nên dùng phuong thuc wait(), dê tam ngung tuyên thay vì
su dung phuong thuc suspend()
Ø public void resume()
Tiêp tuc vân hành tuyên nêu nhu nó dang bi ngung, nêu tuyên dang thi hành thì
phuong thuc này bi bo qua, thông thuong phuong thuc này duoc dùng kêt hop voi
phuong thuc suspend(), kê tu java 2 phuong thuc này cùn voi phuong thuc suspend()bi
tu chôi, do vây ban nên dùng phuong thuc notify () thay vì su dung phuong thuc
resume()
Ø public static void sleep( long millis) Threadows InterruptedException
dát tuyên thi hành vào trang thái ngu, trong khoang thoi gian xác dinh báng mili giây.
chú ý sleep() là phuong thuc tinh.
Ø public void interrupt()
làm gián doan tuyên thi hành
Ø public static boolean isInterrupt()
kiêm tra xem tuyên có bi ngát không
Ø public void setpriority( int p)
ân dinh dô uu tiên cho tuyên thi hành, dô uu tiên duoc xác dinh là môt sô nguyên thuôc
doan [1,10]
Ø public final void wait() throws InterruptException
Trang 100
dát tuyên vào trang thái cho môt tuyên khác, cho dên khi có môt tuyên khác thông báo
thì nó lai tiêp tuc, dây là phuong thuc cua lop co so Object
Ø public final void notify ()
dánh thuc tuyên dang cho, trên dôi tuong này
Ø public final void notifyAll() dánh thuc tât ca các tuyên dang cho trên dôi tuong này
Ø isAlive() Tra vê True, nêu luông là vân còn tôn tai (sông)
Ø getPriority() Tra vê muc uu tiên cua luông
Ø join() Doi cho dên khi luông kêt thúc
Ø isDaemon() Kiêm tra nêu luông là luông môt luông chay ngâm (deamon)
Ø setDeamon(boolean on) Dánh dâu luông nhu là luông chay ngâm
Ví du: Ta tao ra 2 tuyên thi hành song song, môt tuyên thuc hiên viêc in 200 dòng “Dai
hoc su pham kÿ thuât Hung Yên”, trong khi tuyên này dang thuc thi thì có môt tuyên khác
vân tiêp tuc in 200 dòng chu “chào mung ban dên voi 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 ( "Dai hoc su pham kÿ thuât Hung Yên" );
}
}
class ChaoJV extends Thread{
public void run (){
for ( int i = 1; i <= 200; i++ )
System.out.println ( "chào mung ban dên voi java" );
}
}
khi ta chay chuong trình thây kêt qua xen kë nhau nhu
………………..
Dai hoc su pham kÿ thuât Hung Yên
Dai hoc su pham kÿ thuât Hung Yên
chào mung ban dên voi java
Dai hoc su pham kÿ thuât Hung Yên
chào mung ban dên voi java
Dai hoc su pham kÿ thuât Hung Yên
chào mung ban dên voi java
chào mung ban dên voi java
…………...
Trang 101
2. Vòng dòi cua Thread
Hình sau thê hiên trang thái cua tuyên trong vòng doi cua chúng
3. Luông chay ngâm (deamon)
Môt chuong trình Java kêt thúc chi sau khi tât ca các luông thuc thi xong. Trong
Java có hai loai luông:
- Luông nguoi su dung
- Luông chay ngâm (deamon)
Nguoi su dung tao ra các luông nguoi su dung, trong khi các luông deamon là các
luông chay nên. Luông deamon cung câp các dich vu cho các luông khác. Máy ao Java
thuc hiên tiên trình thoát, khi dó chi còn duy nhât luông deamon vân còn sông. Máy ao
Java có ít nhât môt luông deamon là luông “garbage collection” (thu luom tài nguyên -
don rác). Luông don rác thuc thi chi khi hê thông không có tác vu nào. Nó là môt luông có
quyên uu tiên thâp. Lop luông có hai phuong thuc dê làm viêc voi luông deamon:
- public void setDaemon(boolean on)
- public boolean isDaemon()
4. Giao diên Runnable
O muc truoc ban dã tao ra các luông thuc hiên song song voi nhau, trong java ta
còn có thê tao ra các tuyên thi hành song song báng cách triên khai giao diên Runnable.
Chác ban së tu hoi, dã có lop Thread rôi tai sao lai còn có giao diên Runnable nua, chúng
khác gì nhau?, câu tra loi o chô, java không hô tro kê thua bôi, nêu chuong trình cua ban
vua muôn kê thua tu môt lop nào dó, lai vua muôn da tuyên thì ban bát buôc phai dùng
giao diên Runnable, cháng han nhu ban viêt các Applet, ban vua muôn nó là Applet, lai
vua muôn thuc thi nhiêu tuyên, thì ban vua phai kê thua tu lop Applet, nhung nêu dã kê
thua tu lop Applet rôi, thì ban không thê kê thua tu lop Thread nua.
Ta viêt lai ví du trên, nhung lân này ta không kê thua lop 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 ();
}
Trang 102
}
class ChaoDH implements Runnable{
public void run (){
ChaoDH thu = new ChaoDH ();
for ( int i = 1; i <= 200; i++ ) {
System.out.println("Ðai hoc su pham kÿ thuât Hung Yên");
}
}
}
class ChaoJV implements Runnable{
public void run (){
for ( int i = 1; i <= 200; i++ ) {
System.out.println ( "chào mùng ban dên vói java" );
}
}
}
Cho chay ví du này ta thây kêt qua ra không khác gì voi ví du truoc.
5. Thiêt lâp dô uu tiên cho tuyên
Khi môt tuyên duoc tao ra, nó nhân môt dô uu tiên mác dinh, dôi khi ta muôn diêu
chinh dô uu tiên cua tuyên dê dat duoc muc dích cua ta, thât don gian, dê dát dô uu tiên
cho môt tuyên ta chi cân goi phuong thuc setPriority() và truyên cho nó môt sô nguyên sô
này chính là dô uu tiên mà ban cân dát.
Ta viêt lai ví du trên nhu sau: Thêm vào phuong thuc main() 2 dòng lênh:
t.setPriority(1); //Tuyên này có dô uu tiên là 1
t1.setPriority(10); // Tuyên này có dô uu tiên là 1
Chay lai chuong trình này sau khi sua và truoc khi sua ta thây tuyên t1 duoc câp thoi gian
su dung CPU nhiêu hon tuyên t, lý do là ta dã dát dô uu tiên cua tuyên t1, lon hon dô uu
tiên cua tuyên t
Chú ý:
1. dô uu tiên cua môt tuyên biêu thi boi môt sô nguyên nám trong doan tu 1 dên 10,
môt lôi së phát sinh nêu ta gán cho nó dô uu tiên, nám ngoài khoang này
2. 2) nêu môt tuyên không duoc dát dô uu tiên thì nó së nhân dô uu tiên mác dinh
( báng 5 ), ta có thê kiêm tra diêu này báng cách goi phuong thuc getPriority()
6. Nhóm tuyên (Thread Group)
- Nhóm tuyên là môt tâp hop gôm nhiêu tuyên, khi ta tác dông dên nhóm tuyên ( cháng
han nhu tam ngung, …) thì tât ca các tuyên trong nhóm dêu nhân duoc cùng tác dông
dó, diêu này là tiên loi khi ta muôn quan lý nhiêu tuyên thuc hiên các tác vu tuong tu
nhau.
Ø Dê tao môt nhóm tuyên ta cân:
+ tao ra môt nhóm tuyên báng cách su dung phuong thuc tao dung cua lop
ThreadGroup()
ThreadGroup g=new ThreadGroup(“ThreadGroupName”);
ThreadGroup g=
new ThreadGroup(ParentThreadGroup,“ThreadGroupName”);
Dòng lênh trên tao ra môt nhóm tuyên g có tên là “ThreadGroupName”, tên cua tuyên
là môt chuôi và không trùng voi tên cua môt nhóm khác.
+ dua các tuyên vào nhóm tuyên dùng phuong thuc tao dung cua lop Thread() :
Thread =new Thread (g, new ThreadClass(),”ThisThread”);
Trang 103
7. Dông bô các tuyên thi hành
Khi nhiêu tuyên truy câp dông thoi vào tài nguyên dùng chung, mà tài nguyên này
lai không thê chia se, cho nhiêu tuyên, khi dó tài nguyên dùng chung có thê bi hong. Ví
du, môt luông có thê cô gáng doc du liêu, trong khi luông khác cô gáng thay dôi du liêu.
Trong truong hop này, du liêu có thê bi sai.
Trong nhung truong hop này, ban cân cho phép môt luông hoàn thành tron ven tác
vu cua nó, và rôi thì moi cho phép các luông kê tiêp thuc thi. Khi hai hoác nhiêu hon môt
luông cân thâm nhâp dên môt tài nguyên duoc chia se, ban cân chác chán ráng tài nguyên
dó së duoc su dung chi boi môt luông tai môt thoi diêm.
Boi trong java không có biên toàn cuc, chúng ta chi có thuôc tính cua dôi tuong, tât
ca các thao tác có thê dân dên hong hóc dêu thuc hiên qua phuong thuc, do vây java cung
câp tu khoá synchronized, tu khoá này duoc thêm vào dinh nghia cua phuong thuc báo
cho java biêt dây là môt phuong thuc dông bô, môi dôi tuong së có môt bô quan lý khoá,
bô quan lý khoá này chi cho 1 phuong thuc synchronized cua dôi tuong dó chay tai môt
thoi diêm
Mâu chôt cua su dông bô hóa là khái niêm “monitor” (giám sát), hay còn goi
“semaphore” (co hiêu). Môt “monitor” là môt dôi tuong mà duoc khóa dôc quyên. Chi
môt luông có thê có monitor tai môi thoi diêm. Tât ca các luông khác cô gáng thâm nhâp
vào monitor së bi trì hoãn, cho dên khi luông dâu tiên thoát khoi monitor. Các luông khác
duoc báo cho doi monitor. Môt luông có thê monitor môt dôi tuong nhiêu lân.
Trang 104
Chuong 5: NHAP XUÁT (Input/Output)
Môt chuong trình thuong xuyên làm viêc voi du liêu, dê có thê luu tru lâu dài chúng ta
phai luu tru và nhân lai du liêu tu thiêt bi luu tru ngoài, nguôn thông tin ngoài không chi
gôm du liêu duoc luu tru trên dia tu, dia CD mà nó có thê là du liêu cua môt chuong trình
khác, hoác có thê là duoc luu tru trên mang… dù chúng duoc luu tru o dâu chúng cung
chi có 1 sô dang nhu: dôi tuong, kí tu, hình anh hoác âm thanh, dù du liêu duoc luu tru
duoi hình thuc nào, luu tru o dâu thì java dêu truu tuong hoá thành các luông, diêu này là
rât tinh vi nó làm cho ta không cân phai quan tâm du liêu duoc luu tru o dâu, duoi dang
thuc nhu thê nào, nó dông nhât moi nguôn du liêu voi nhau:
Dê nhân vê các thông tin, môt chuong trình mo môt luông liên kêt voi dôi tuong nguôn(
têp tin, bô nho, Socket) và doc các thông tin tuân tu.
Tuong tu dê ghi thông tin ra các thiêt bi ngoài báng cách mo môt luông dên dôi tuong dích
và ghi thông tin ra môt cách tuân tu nhu
Luông là su truu tuong hoá o muc cao, do vây bât kê du liêu duoc doc vào tu dâu hoác ghi
ra dâu, thì thuât toán doc/ghi tuân tu dêu tua nhu sau:
Trang 105
I. Lóp luông
Java dua ra nhiêu lop luông, dê xu lý moi loai du liêu, java chia luông ra thanh 2 loai:
luông byte ( byte stream) và luông kí tu (character stream), lop InputStream và
OutputStream là hai lop co so cho moi luông nhâp xuât huong byte, và lop Reader/ Writer
là hai lop co so cho viêc doc ghi huong kí tu.
Lop RandomAccessFile kê thua tu lop Object và triên khai giao diên, InputStream và
OutputStream, dây là lop duy nhât hô tro ca doc lân ghi.
1.1. Lóp nhâp, xuât huóng kí tu
Reader và Writer là hai lop co so truu tuong cho luông huong kí tu, hai lop này cung câp
môt giao diên chung cho tât ca các lop doc/ ghi huong kí tu, môi lân doc/ ghi ra luông là
doc 2 byte tuong ung voi môt kí tu unicode, Sau day là mô hình phân câp các lop doc/ ghi
huong kí tu
1.2. Luông huóng byte
Dê có thê doc ghi 1 byte, ta phai su dung luông huong byte, hai lop InputStream và
OutputStream là hai lop co so truu tuong cho các luông huong byte, môi lân doc/ ghi ra
luông là doc/ ghi 8 bit du liêu ra luông, Hình sau thê hiên môi quan hê phân câp giua lop
doc/ ghi huong byte
Trang 106
Su tuong tu giua hai luông huong byte và huong kí tu
Lop Reader và InputStream có môt giao diên giông nhau, chúng chi khác nhau vê kiêu du
liêu doc vào, ví du lop Reader có các phuong thuc sau giúp cho viêc doc môt kí tu hoác
môt mang các kí tu
int read()
int read(char cbuf[])
int read(char cbuf[], int offset, int length)
Thì trong lop InputStream cung có các phuong thuc voi tên tuong tu cho viêc doc
môt byte hoác môt mang các byte
int read()
int read(byte cbuf[])
int read(byte cbuf[], int offset, int length)
Cung tuong tu vây lop Writer và OutputStream cung có môt giao diên tuong tu
nhau, ví du lop Writer dinh nghia các phuong thuc dê ghi môt kí tu, môt mang các kí tu ra
luông
int write(int c)
int write(char cbuf[])
int write(char cbuf[], int offset, int length)
Thì lop OutputStream cung có các phuong thuc tuong ung, dê ghi môt byte, môt
mang byte ra luông
int write(int c)
int write(byte cbuf[])
int write(byte cbuf[], int offset, int length)
Xu lý têp tin
Dê xu lý têp tin ngoai trú, ta su dung các luông liên quan dên têp tin nhu
FileInputStream và FileOutputStream cho viêc doc ghi têp huong byte, FileReader và
FileWriter cho viêc doc ghi huong kí tu, thông thuong muôn su dung luông têp tin ta su
dung hàm tao cua các lop tuong ung dê liên kêt luông voi môt têp tin cu thê.
Trang 107
public void FileInputStream ( String FileName)
public void FileInputStream ( File file)
public void FileOutputStream ( String FileName)
public void FileOutputStream (File file)
public void FileWriter ( String FileName)
public void FileWriter (File file)
public void FileReader ( String FileName)
public void FileReader (File file)
Ví du: Viêt chuong trình file copy, thuc hiên viêc copy môt têp, ta së viêt chuong trình này
su dung ca 2 luông huong byte và huong kí tu
import java.io.*;
// chuong trình copy sú dung luông huóng kí tu
public class CopyCharacter {
public static void main(String[] args) throws IOException {
File inputFile = new File("C:/in.txt");
File outputFile = new File("C:/out.txt");
FileReader in = new FileReader(inputFile);
FileWriter out = new FileWriter(outputFile);
int c;
while ((c = in.read())! = -1) out.write(c);
in.close();
out.close();
}
}
import java.io.*; // Chuong trình copy sú dung luông huóng byte
public class CopyBytes {
public static void main(String[] args) throws IOException {
File inputFile = new File("farrago.txt");
File outputFile = new File("outagain.txt");
FileInputStream in = new FileInputStream(inputFile);
FileOutputStream out = new FileOutputStream(outputFile);
int c;
while ((c = in.read())! = -1) out.write(c);
in.close();
out.close();
}
}
Luông dû liêu
Dê doc/ ghi các kiêu du liêu nguyên thuy, ta su dung luông DataInputStream và
DataOutputStream, lop DataInputStream triên khai giao diên DataInput, còn lop
DataOutputStream triên khai giao diên DataOuput
Các phuong thuc sau duoc dinh nghia trong giao diên DataOutput
void write(byte[] b) Ghi môt mang byte ra luông
void write(byte[] b, int off, int len) Ghi môt mang byte ra luông kê tu vi trí off,
Trang 108
len byte
void write(int b) Ghi môt byte ra luông
void writeBoolean(boolean v) Ghi môt giá tri logic ra luông
void writeByte(int v) Ghi ra luông phân thâp cua v
void writeBytes(String s) Ghi môt xâu ra luông
void writeChar(int v) Ghi môt kí tu ra luông
void writeChars(String s) Ghi môt xâu kí tu ra luông
void writeDouble(double v) Ghi môt sô double ra luông
void writeFloat(float v) Ghi môt sô thuc ra luông
void writeInt(int v) Ghi môt sô nguyên ra luông
void writeLong(long v) Ghi môt sô long ra luông
void writeShort(int v) Ghi môt sô short ra luông
void writeUTF(String str) Chi môt xâu kí tu Unicode ra luông
Các phuong thúc sau duoc dinh nghîa trong giao diên DataInput:
boolean readBoolean() doc môt giá tri logic tu luông
byte readByte() doc môt byte tu luông
char readChar() doc môt kí tu tu luông
double readDouble() doc môt sô double tu luông
float readFloat() doc môt sô float tu luông
void readFully(byte[] b) doc môt mang byte tu luông và ghi vào
mang
voidreadFully(byte[] b, int off, int len) doc len byte tu luông và ghi vào mang
tu vi trí off
int readInt() doc môt sô nguyên
String readLine() doc môt xâu kí tu cho dên khi gáp kí tu
xuông dòng và bo qua kí tu xuông dòng
long readLong() doc môt sô long
short readShort() doc môt sô short
int readUnsignedByte() doc môt sô nguyên không dâu trong
khoang 0..255
in treadUnsignedShort() doc môt sô nguyên không dâu trong
doan tu 0..65535
String readUTF() doc môt xâu kí tu Unicode
int skipBytes(int n) Bo qua n byte tu luông
Sau dây là môt ví du nho vê luông nhâp xuât du liêu, ví du này ghi du liêu ra têp rôi lai doc
lai:
import java.io.*;
public class DataIODemo {
public static void main(String[] args) throws IOException {
// write the data out
DataOutputStream out = new DataOutputStream(new FileOutputStream("c:/TestIO.txt"));
out.writeInt(10); // ghi sô nguyên
out.writeLong(123456789); // ghi sô long
Trang 109
out.writeDouble(123.456789); // ghi sô thuc chính xác kép
out.writeFloat(123.456789f); // ghi sô thuc chính xác don
out.writeBoolean(true); // ghi giá tri logic
out.writeUTF("Day la mot xau ki tu"); // ghi môt xâu
out.close();
// read it in again
DataInputStream in = new DataInputStream(new
FileInputStream("c:/TestIO.txt"));
try {
System.out.println("Gia tri nguyen " + in.readInt()); // doc lai sô nguyên
System.out.println("Gia tri long " + in.readLong()); // doc lai sô nguyên dài
System.out.println("Gia tri double " + in.readDouble());// doc lai sô thuc chính xác kép
System.out.println("Gia tri float " + in.readFloat()); // doc lai sô thuc chính xác don
System.out.println("Gia tri boolean " + in.readBoolean()); // doc lai giá tri logic
System.out.println("Gia tri xau " + in.readUTF()); // doc lai môt xâu unicode
}
catch (EOFException e) { System.out.println("loi");}
in.close();
}
}
1.3. Luông in ân
Vì các luông xuât ghi du liêu ra duoi dang nhi phân do vây ban không thê dùng lênh
type, hoác các chuong trình soan thao asciii dê xem duoc, trong java có thê su dung luông
in ân dê xuât du liêu ra duoi dang asciii. Lop PrintStream và PrintWriter së giúp ta làm viêc
này. Hai lop này thuc hiên chuc náng nhu nhau, dêu xuât ra du liêu dang asciii.
Mot so phuong thuc cua lop PrintStream:
boolean checkError() dôn hêt du liêu ra và kiêm tra lôi luông
void close() dóng luông
void flush() dôn du liêu trong vùng dêm ra
void print(boolean b) ghi giá tri logic ra luông
void print(char c) ghi kí tu
void print(char[] s) ghi môt mange kí tu
void print(double d) ghi môt sô thuc dô chính xác kép
void print(float f) ghi môt sô thuc
void print(int i) ghi môt sô nguyên
void print(long l) ghi môt sô nguyên dài
void print(Object obj) ghi môt dôi tuong
void print(String s) ghi môt xâu
void println() tao ra môt dòng trông
void println(boolean x) ghi giá tri logic ra luông và xuông dòng
void println(char x) ghi kí tu và xuông dòng
Trang 110
void println(char[] x) ghi môt mange kí tu và xuông dòng
void println(double x) ghi môt sô thuc dô chính xác kép và xuông dòng
void println(float x) ghi môt sô thuc và xuông dòng
void println(int x) ghi môt sô nguyên và xuông dòng
void println(long x) ghi môt sô nguyên dài và xuông dòng
void println(Object x) ghi môt dôi tuong và xuông dòng
void println(String x) ghi môt xâu và xuông dòng
protected void setError() dát trang thái lôi cua luông là true
void write(byte[] buf, int off, int
len)
ghi mang byte tu vi trí off len kí byte ra luông
void write(int b) ghi môt byte ra luông
Hàm tao cua lóp PrintStream:
PrintStream(OutputStream out) tao ra môt luông moi
PrintStream(OutputStream out, boolean autoFlush) tao ra môt luông moi voi chuc náng
AutoFlush ( tu dôn)
Môt sô phuong thuc cua lop PrintWriter
boolean checkError() dôn hêt du liêu ra và kiêm tra lôi luông
void close() dóng luông
void flush() dôn du liêu trong vùng dêm ra
void print(boolean b) ghi giá tri logic ra luông
void print(char c) ghi kí tu
void print(char[] s) ghi môt mange kí tu
void print(double d) ghi môt sô thuc dô chính xác kép
void print(float f) ghi môt sô thuc
void print(int i) ghi môt sô nguyên
void print(long l) ghi môt sô nguyên dài
void print(Object obj) ghi môt dôi tuong
void print(String s) ghi môt xâu
void println() tao ra môt dòng trông
void println(boolean x) ghi giá tri logic ra luông và xuông dòng
void println(char x) ghi kí tu và xuông dòng
void println(char[] x) ghi môt mange kí tu và xuông dòng
void println(double x) ghi môt sô thuc dô chính xác kép và xuông dòng
void println(float x) ghi môt sô thuc và xuông dòng
void println(int x) ghi môt sô nguyên và xuông dòng
Trang 111
void println(long x) ghi môt sô nguyên dài và xuông dòng
void println(Object x) ghi môt dôi tuong và xuông dòng
void println(String x) ghi môt xâu và xuông dòng
protected void setError() dát trang thái lôi cua luông là true
void write(byte[] buf, int off, int
len)
ghi mang byte tu vi trí off len kí byte ra luông
void write(int b) ghi môt byte ra luông
void write(int c) Ghi môt kí tu don
void write(String s) Ghi môt xâu
void write(String s, int off, int len) Ghi môt xâu len kí tu tính tu vi trí off
Các hàm tao cua lóp PrintWriter
- PrintWriter(OutputStream out) tao ra môt PrintWriter không có chuc náng tu dôn tu môt
dôi tuong OutputStream.
- PrintWriter(OutputStream out, boolean autoFlush) tao ra môt PrintWriter voi chuc náng
tu dôn tu môt dôi tuong OutputStrea.
- PrintWriter(Writer out) tao ra môt PrintWriter không có chuc náng tu dôn tu môt dôi
tuong Writer
- PrintWriter(Writer out, boolean autoFlush) tao ra môt PrintWriter voi chuc náng tu dôn tu
môt dôi tuong Writer
Sau dây là môt ví du vê luông in ân, ví du này in ra môt têp môt sô nguyên, môt sô
thuc và môt xâu kí tu, sau khi chay chuong trình ban có thê su dung lênh type cua DOS dê
xem
import java.io.*;
public class DataIODemo1 {
public static void main(String[] args) throws IOException {
// write the data out
PrintWriter out = new PrintWriter(new FileOutputStream("c:/a.txt"));
out.println(10);
out.println(1.2345);
out.print("xau ki tu");
out.close();
}
}
1.4. Luông dêm
Vì các thao tác voi ô cung, mang thuong lâu hon rât nhiêu so các thao tác voi bô nho
trong, do vây chúng ta cân phai có môt kÿ thuât nào dó dê táng tôc dô doc/ghi, kÿ thuât dó
chính là vùng dêm, voi vùng dêm ta së giam duoc sô lân doc ghi luông, trong java ta có thê
tao ra vùng dêm voi các lop
BufferInputStream, BufferOutputStream, BufferReader, BufferWriter, thông thuong ban së
nôi các luông cua ban vào luông dêm.
Trang 112
Các phuong thuc tao dung luông dêm:
public BufferInputStream( InputStream )
public BufferInputStream (InputStream in, int bufferSize)
public BufferOutputStream ( OutputStream out)
public BufferOutputStream ( OutputStream out, int bufferSize)
public BufferReader ( Reader in)
public BufferReader ( Reader in, int bufferSize)
public BufferWriter ( Writer out)
public BufferWriter ( Writer out, int bufferSize)
1êp tin truy câp ngâu nhiên
Tât ca các luông xét trên chi có thê doc, hoác ghi, chúng không thê doc ghi dông
thoi, chi duy nhât có môt lop cho phép ta doc ghi dông thoi, dó là lop RandomAccessFile,
lop này triên khai giao diên InputData và OutputData, nên chúng có tât ca các phuong thuc
cua ca 2 lop này, ngoài ra chúng còn có các phuong thuc sau:
- public void seek(long pos) chuyên con tro dên vi trí pos tính tu vi trí dâu tiên, chú ý vi trí
dâu tiên tính tu 0
- public long getFilePointer() tra vê vi trí con tro têp tính báng byte, kê ta dâu têp
- public long length() tra vê dô dài cua têp
- public void writeChar(int v) ghi kí tu unicode ra têp voi byte cao duoc ghi truoc
- public final void writeChars(String s) ghi môt xâu kí tu ra têp
Tuong tu giông C/C++ khi ban mo môt têp truy câp ngâu nhiên ban phai chi rõ chê dô làm
viêc là doc ‘r’, hay ghi ‘w’ hay doc ghi dông thoi ‘rw’, ví du nhu ban muôn mo têp a.txt
theo chê dô doc ghi dông thoi thì ban dùng cú pháp RandomAccessFile =new
RandomAccessFile(“C:/ a.txt”, “rw”)
Chuong trình duoi dây minh hoa cách dùng lop RandomAccessFile. Nó ghi môt giá
tri boolean, môt int, môt char, môt double toi môt file có tên ‘abc.txt’. Nó su dung phuong
pháp seek( ) dê tìm vi trí dinh vi bên trong tâp tin (bát dâu tu 1). Sau dó nó doc giá tri sô
nguyên, ký tu và double tu tâp tin và hiên thi chúng ra màn hình.
import java.lang.System;
import java.io.RandomAccessFile;
import java.io.IOException;
public class rndexam{
public static void main (String args[ ]) throws IOException {
RandomAccessFile rf;
rf = new RandomAccessFile("abc.txt¨, "rw¨);
rf.writeBoolean(true);
rf.writeInt(67868);
rf.writeChars("J¨);
rf.writeDouble(678.68);
//Sú dung phuong thúc seek() dê di chuyên con tró dên byte thú hai
rf.seek(1);
System.out.println(rf.readInt());
System.out.println(rf.readChar());
System.out.println(rf.readDouble());
Trang 113
rf.seek(0);
System.out.println(rf.readBoolean));
rf.close();
}
}
Kêt qua xuât ra cua chuong trình:
II. Lóp File
Lop File cung câp giao diên chung dê xu lý hê thông têp dôc lâp voi môi truong cua
các máy tính. Môt ung dung có thê su dung các chuc náng chính cua File dê xu lý têp hoàc
các thu muc (directory) trong hê thong têp. Dê xu lý các nôi dung cua các têp thì su dung
các lop FileInputStream, FileOutputStream và RandomAccessFile.
Lop File dinh nghia các thuôc tính phu thuôc vào môi truong (platform) duoc su dung dê xu lý
têp và tên goi các duong dân trong các thu muc môt cách dôc lâp voi môi truong.
public static final char separatorChar
public static final String separator
Dinh nghia các ký hiêu hoác các xâu su dung dê ngán cách các thành phân trong tên
cua duong dân. Ký hiêu ‘/’ dê ngán cách cho Unix, ‘\’ duoc su dung dê ngán cách các
muc cua duong dân trong Window.
Ví du: C:\book\Java là tên duong dân trong Window.
public static final char pathSeparatorChar
public static final String pathSeparator
Dinh nghia các ký hiêu hoác các xâu su dung dê ngán cách các têp hoác tên thu muc
trong danh sách cua các duong dân. Ký hiêu ngán cách ‘:’ cho Unix, ‘;’ duoc su dung
dê phân cách các duong dân trong Window.
Ví du: C:\book; C:\Java; D:\Anh\ABC; A:\Docs là danh sách các duong dân trong Window.
File(String pathName)
Gán duong dân có tên pathName cho dôi tuong cua lop File. pathName có thê là
duong dân tuyêt dôi (có du ca tên ô dia, tên cua tât ca các muc lân luot theo cây thu
muc) hoác duong dân tuong doi (bát dau tu thu muc hiên thoi).
Ví du:
File ch1 = new File(File.separator + “book” + File.separator + “chuong1”);
File(File direct, String filename)
Trang 114
Gán têp có tên filename o thu muc direct cho dôi tuong cua lop File. Nêu direct là
null thì filename duoc xu lý o thu muc hiên thoi, nguoc lai tên duong dân së là dôi
tuong direct ghép voi separator và filename.
Ví du:
File mucNhap = new File(“book” + File.separator + “duThao”);
File ch2 = new File(mucNhap, “chuong1”);
Lop File có thê su dung dê truy vân vào các hê thông têp dê biêt duoc các thông tin vê têp
và các thu muc.
Lop File cung câp các hàm dê nhân duoc các biêu diên phu thuôc vào môi truong cua
duong dân và các thành phân cua duong dân.
String getName()
Hàm getName() cho lai tên cua têp trong thu muc chi dinh. Ví du, tên cua
“C:\java\bin\javac” là “javac”.
St r i ng get Pat h( )
Hàm getPath() cho lai tên cua duong dân (tuyêt dôi hoác tuong dôi) chua têp chi dinh.
String getAbsolutePath()
Hàm getAbsolutePath() cho lai tên cua duong dân tuyêt dôi chua têp chi dinh.
long lastModified()
Hàm này cho lai thoi gian dang sô long cua lân sua dôi têp lân cuôi cùng.
long length()
Hàm này cho lai kích thuoc cua têp tính theo byte.
boolean equals(Object obj)
Hàm này so sánh tên các duong dân cua các dôi tuong têp, cho kêt qua true nêu
chúng dông nhât voi nhau.
boolean exists()
boolean isFile()
Hai hàm này cho kêt qua true nêu têp dó tôn tai trên duong dân hiên thoi.
boolean isDirectory()
Hàm này cho kêt qua true nêu thu muc dó tôn tai trên ô dia hiên thoi.
boolean createNewFile() throws IOException
Môt têp moi là rông duoc tao ra o thu muc hiên thoi chi khi têp này chua có.
boolean mkdir()
boolean mkdirs()
Tao ra các duong dân duoc xác dinh trong dôi tuong cua File.
boolean renameTo(File dest)
Hàm này dôi tên têp hiên thoi thành dest.
String[] list()
Hàm này hiên thi danh sách các têp o thu muc hiên thoi.
boolean delete()
Hàm này xoá têp hiên thoi.
Ví du 8.1 Viêt chuong trình dê doc và hiên thi các têp trong môt thu muc.
import java.io.*;
public class DirectoryLister{
public static void main(String args[]){
File entry;
if (args.length==0){
Trang 115
System.err.println("Hay cho biet ten duong dan?");
return;
}
entry = new File(args[0]); // Tao ra dôi tuong cúa File lây tên tù agrs[0]
listDirectory(entry); // Hiên thi các muc trong danh muc chi dinh
}
public static void listDirectory(File entry) {
try {
if(!entry.exists()) {
System.out.println(entry.getName() +"not found.");
return;
}
if (entry.isFile()){
// Nêu dôi sô cúa chuong trình là môt têp thì hiên thi têp dó
System.out.println(entry.getCanonicalPath());
} else if(entry.isDirectory()){
// Nêu dôi sô cúa chuong trình là môt danh muc thì doc ra (list())
String[] fileName = entry.list();
if (fileName ==null)return;
for (int i = 0; i<fileName.length; i++){
// Tao ra dôi tuong cúa File dê xú lý tùng muc
File item = new File(entry.getPath(), fileName[i]);
// Goi dê qui hàm listDirectory()dê hiên thi tùng têp.
listDirectory(item);
}
}
}catch(IOException e){System.out.println("Error:" +e);
}
}
}
Dich xong có thê chay trong môi truong DOS:
java DirectoryLister c:\users\lan
Tât ca các têp trong danh muc c:\users\lan së duoc hiên lên.
Môt sô ví du úng dung
Ví du 1:Ví du minh hoa viêc nhâp dû liêu tù bàn phím
package app001;
import java.lang.*;
import java.io.*;
import java.util.*;
public class InputOutput
{ public static void main(String srgs[]) throws IOException
{ BufferedReader kInput=new BufferedReader(new InputStreamReader(System.in));
String ten,nam;
do {
System.out.print("Nhap ho va ten:");ten=kInput.readLine();
System.out.print("Nhap nam sinh:");nam=kInput.readLine();
Trang 116
}while ((ten==null)||(nam==null));
kInput.close();
int ns=Integer.parseInt(nam);
System.out.println("Ho ten ban vua nhap ="+ten);
System.out.println("Nam sinh ban vua nhap ="+ns);
}
}
Ví du 2 Xây dung gói nhâp dû liêu cho riêng mình
package app002;
import java.io.*;
import java.util.*;
public class MyInput{
static private StringTokenizer stok;
static private BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
public static int readInt(){
int i = 0;
try{ String str = br.readLine();
stok = new StringTokenizer(str);
i = new Integer(stok.nextToken()).intValue();
}
catch (IOException ex){
System.out.println(ex);
}
return i;
}
public static double readDouble(){
double d = 0;
try{
String str = br.readLine();
stok = new StringTokenizer(str);
d = new Double(stok.nextToken()).doubleValue();
}
catch (IOException ex){
System.out.println(ex);
}
return d;
}
public static String readString(){
String S=" ";
try{ S = br.readLine();}
catch (IOException ex){
System.out.println(ex);
}
return S;
}
}
Trang 117
Ví du 3 Su dung gói nhâp dû liêu trong chuong trình Java
import app002.MyInput;
public class TestInput{
public static void main(String[] args){
System.out.print("Enter an integer: ");
int i = MyInput.readInt();
System.out.println("\nYou entered i = " + i);
System.out.print("Enter a double: ");
double d = MyInput.readDouble();
System.out.println("\nYou entered d = " + d);
System.out.print("Enter a String: ");
String SS=MyInput.readString();
System.out.println("\nYou entered S = " + SS);
}
}
Ví du 4. Minh hoa viêc doc, ghi file Text
package app001;
import java.lang.*;
import java.io.*;
import java.util.*;
import app001.*;
public class IOFile {
public static void main(String args[]) throws IOException
{ BufferedReader FileInput=new BufferedReader(new FileReader("C:\\filein.txt"));
PrintWriter FileOut=new PrintWriter(new BufferedWriter(new
FileWriter("C:\\fileout.txt")));
String ten=" ",nam="345";
long n=0;
while (FileInput.ready()==true) //==While (not eof())
{ ten = FileInput.readLine();
nam = FileInput.readLine();
System.out.println("Ho ten=" + ten);
System.out.println("nam sinh=" + nam);
}
FileInput.close();
int ns = Integer.parseInt(nam);
FileOut.println(ten);
FileOut.println(nam);
FileOut.close();
Man ng1=new Man(ten,ns);
ng1.hienthi();
ng1.HienThiNgay();
}
}
Ví du 5: Minh hoa su dung luông
Trang 118
package app002;
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.File;
import java.io.IOException;
public class FileIOExam0 {
public static void main(String args[]) throws IOException
{String s="Welcome to File Input Output Stream...";
//Mo file abc.txt de doc
FileOutputStream os=new FileOutputStream("C:\\abc.txt");
for(int i=0;i<s.length();i++) os.write(s.charAt(i)); //Ghi tung byte
os.close(); //Dong file abc.txt
//Mo file abc.txt de doc
FileInputStream is=new FileInputStream("C:\\abc.txt");
int ibyts=is.available(); //Lay so byte cua file abc.txt
byte ibuf[]=new byte[ibyts]; //Khai bao dung bo dem du lieu
int byrd=is.read(ibuf,0,ibyts); //Doc ibyts du lieu ra luong
System.out.println("They are:"+new String(ibuf));//Du lieu trong file
System.out.println("Input Stream has:" + ibyts+" available bytes");
System.out.println("Number of Bytes read are:"+byrd);
is.close();
//Xoa file abc.txt
// File f1=new File("c:\\abc.txt");
// f1.delete();
}
}
Ví d 6: Sú dung file ngâu nhiên
package welcome;
import java.lang.System;
import java.io.RandomAccessFile;
import java.io.IOException;
public class RandomAaccessFile0
{
public static void main(String args[]) throws IOException
{ RandomAccessFile rf=new RandomAccessFile("c:\\abcd.txt","rw");
rf.writeBoolean(true);
rf.writeInt(2345);
rf.writeChars("A");
rf.writeDouble(456.78);
// int a[10]={2,4,6,9,1,5,8,0,12,90};
int A[]=new int[10] ;
A[0]=2;A[1]=1;A[2]=9;A[3]=7;A[4]=8;A[5]=3;A[6]=4;A[7]=5;A[8]=12;A[9]=21;
for(int i=0;i<10;i++)
rf.writeInt(A[i]);
rf.seek(0);
System.out.println(rf.readBoolean());
System.out.println(rf.readInt());
Trang 119
System.out.println(rf.readChar());
System.out.println(rf.readDouble());
for(int i=0;i<10;i++) System.out.println(rf.readInt());
rf.close();
}
}
Trang 120
Chuong 6: LAP TRÌNH DO HOA AWT
Môt kha náng cua Java là cho phép ta xây dung các ung dung có giao diên dô hoa
hay còn goi là GUI (Grapthical User Interface). Khi Java duoc phát hành, các thành phân
dô hoa duoc tâp trung vào thu viên mang tên Abstract Window Toolkit (AWT). Dôi voi
môi hê nên, thành phân AWT së duoc ánh xa sang môt thành phân nên cu thê, báng cách su
dung truc tiêp mã native cua hê nên, chính vì vây nó phu thuôc rât nhiêu vào hê nên và nó
còn gây lôi trên môt sô hê nên. Voi ban phát hành Java 2, các thành phân giao diên duoc
thay báng tâp hop các thành phân linh hoat, da náng, manh më, dôc lâp voi hê nên thuôc
thu viên Swing. Phân lon các thành phân trong thu viên Swing dêu duoc tô vë truoc tiêp
trên canvas báng mã lênh cua Java, ngoai tru các thành phân là lop con cua lop
java.awt.Window hoác Java.awt.Panel vôn phai duoc vë báng GUI trên nên cu thê. Thành
phân Swing ít phu thuôc vào hê nên hon do vây ít gáp lôi hon và dác biêt nó su dung ít tài
nguyên cua hê thông hon các thành phân trong thu viên awt. Mác dù các thành phân awt
vân duoc hô tro trong Java 2 nhung, tuy nhiên Sun khuyên ban nên su dung các thành phân
Swing thay cho các thành phân awt, tuy nhiên các thành phân trong thu viên Swing không
thê thay tât ca các thành phân trong thu viên awt. Chúng chi thay thê môt phân cua awt
nhu: Button, Panel, TextFeild, v.v. Còn các lop tro giúp khác trong awt nhu : Graphics,
Color, Font, FontMetrics, v.v. vân không thay dôi. Bên canh dó các thành phân Swing còn
su dung mô hình su lý su kiên cua awt.
I. Giói thiêu vê hê thông dô hoa cua Java
1. Giói thiêu chung
Thiêt kê API cho lâp trình dô hoa cua Java là môt ví du hoàn hao vê cách dùng lop, su
kê thua và giao diên. API cho lâp trình dô hoa bao gôm môt tâp rât nhiêu lop nhám tro giúp
xây dung các thành phân giao diên khác nhau nhu: cua sô,nút ân, ô ván ban, menu, hôp
kiêm, v.v. Môi quan hê kê thua giua các thành phân này duoc mô ta trong hình sau:
Componient Dây là lop (truu tuong) cha cua moi lop giao diên nguoi dùng. Lop này
cung câp các thuôc tính, hành vi co ban nhât cua tât ca các thành phân giao diên.
Container Là môt vât chua dùng dê ghép nhóm các thành phân giao diên khác. Môi
vât chua có môt lop quan lý hiên thi, lop quan lý hiên thi có trách nhiêm bô trí cách
thuc hiên thi các thành phân bên trong. Hai vât chua hay duoc su dung nhât la
JFrame và JPanel.
Jcomponient Là lop cha cua moi thành phân Swing ligth weight, duoc vë truc tiêp
lên canvas báng mã lênh Java.
Window Duoc su dung dê tao ra môt cua sô, Thông thuong ta hay su dung hai lop
con cua nó là JFrame và JDialog.
JFrame là cua sô không lông bên trong cua sô khác.
JDialog là môt cua sô duoc hiên thi duoi dang modal.
JAplet là lop cha cua moi lop ung dung aplet.
JPanel là môt vât chua, luu giu các thành phân giao diên nguoi dùng.
Graphics là lop truu tuong cung câp ngu canh dô hoa dê vë các dôi tuong dô hoa
nhu: Duong tháng, duong tròn, hình anh…
Trang 121
Color lop này biêu diên môt mâu sác.
Font lop này biêu thi cho môt font dô hoa.
FontMetrics là môt lop truu tuong dùng dê xác dinh các thuôc tính cua Font.
Tât ca các thành phân dô hoa trong thu viên Swing duoc nhóm trong gói javax.swing. Da
sô các thành phân trong thu viên Swing dêu có tiêp dâu ngu là ‘J’, Ví du môt nút lênh trong
thu viên Swing có tên là JButton, môt memu có tên là JMenu.
Tât ca nhung lop khác duoc liêt kê trong hình duoi dây
Chú ý: Dung pha trôn các thành phân giao diên swing và awt trong cùng môt ung dung.
Cháng han nhu dung nên dát môt JButton vào môt Panel và dung nên dát Button vào
JPanel. Viêc làm này có thê gây lôi.
Obj ect
A W T E v e n t
Font
Font Met ri c
Color
Grapt hi cs
Componi ent Cont ainer Panel Appl et
Window Fr ame
Di alog
JComponent
JAppl et
JFr ame
JDi alog
Các t hành phân
khác t rong gói
j avax. swing duoc kê
t hùa t ù JComponent
Layout Manage
r
BorderLayout
FlowLayout
GridLayout
CardLayout
GridBagLayout
Trang 122
Môt lop duoc kê thua tu lop JComponent duoc thê hiên trong hình sau:
2. Môt sô phuong thúc cua lóp Component
Lop Component cung câp các thuôc tính, phuong thuc chung cho các lop con cua
nó. Sau dây là môt sô phuong thuc cua lop Component :
- Dimension getSize(): cho lai dôi tuong thuôc lop Dimension gôm width (chiêu rông),
height (chiêu cao) xác dinh kích thuoc cua mot thành phan tính theo pixel.
- void setSize(int width, int height) và void setSize(Dimension d) dát lai kích thuoc cua
thành phân.
- Point getLocation(): cho lai toa dô (kiêu Point) trên cùng bên trái (toa dô gôc) cua thành
phân dang xét.
JComponent
JText Component
AbstracButton JMenuItem JCheckBoxMen
JtoggleButton
JMenu
JRadioMenu
JBut t on
JEditorPane
JTextField
JTextArea
JPasswordField
JTextPane
JCheckBox
JRadioButto
JLabel
JList
JCompoBox JMenuBar
JOptionPane JScrollBar JCcollPane
JFileChooser
JPopupMenu JSeparator JSlider
JTabbedPane
JRootPane JPane
JprogressBar
JToolBar
JSplitBar
JTable
JTree
JColorChooser
JInternalFrame
JToolTip JtableHeader JLayeredPane
Trang 123
- void setLocation(int x, int y) và void setLocation(Point p): dát lai các toa dô duoc chi
dinh cho môt thành phân.
- Rectangle getBounds(): cho lai duong biên là hình chu nhât Rectangle bao gôm toa dô
gôc và chiêu dài, chiêu rông cua hình chu nhât.
- void setBounds(int x, int y) và void setBounds(Rectangle r):dát lai duong biên cho môt
thành phân.
- void setForeground(Color c):duoc su dung dê dát màu vë cho thành phân dô hoa
- void setBackground(Color c):dàt màu nên cho thành phan do hoa. Các tham sô cua hai
hàm này là dôi tuong cua lop Color së duoc gioi thiêu o phân sau.
- Font getFont(): duoc su dung dê biêt duoc font cua các chu dang xu lý trong thành
phân dô hoa.
- void setFont(Font f):dát lai font chu cho môt thành phân.
- void setEnabled(boolean b):Nêu dôi sô b cua hàm getEnabled() là true thì thành phân
dang xét hoat dông bình thuong, nghia là có kha náng kích hoat (enable), có thê tra loi các
yêu câu cua nguoi su dung và sinh ra các su kiên nhu mong muôn. Nguoc lai, nêu là false
thì thành phân tuong ung së không kích hoat duoc, nghia là không thê tra loi duoc các yêu
câu cua nguoi su dung.
- Luu ý: Tât ca các thành phân giao diên khi khoi tao dêu duoc kích hoat
- void setVisible(boolean b):Môt thành phân dô hoa có thê duoc hiên thi lên màn hình
(nhìn thây duoc) hoác bi che giâu tùy thuôc vào dôi sô cua hàm setVisible() là true hay
false.
3. Lóp Container
Lop Container là lop con cua lop truu tuong Component. Các lop chua (lop con cua
Container) cung câp tât ca các chuc náng dê xây dung các giao diên dô hoa ung dung, trong
dó có phuong thuc add() duoc nap chông dùng dê bô sung môt thành phân vào vât chua và
phuong thuc remove() cung duoc nap chông dê gõ bo môt thành phân ra khoi vât chua.
4. Tao ra Frame
Lop JFrame là lop con cua lop Frame (Frame là lop con cua lop Window) duoc su
dung dê tao ra nhung cua sô cho các giao diên ung dung GUI.
Kich ban chung dê tao ra môt cua sô là:
- Tao ra môt frame có tiêu dê gì dó, ví du “My Frame” :
JFrame myWindow= new JFrame(“My Frame”);
- Xây dung môt câu trúc phân câp các thành phân báng cách su dung hàm
myWindow.getContentPane().add() dê bô sung thêm JPanel hoác nhung thành phân
giao diên khác vào Frame:
Ví du: myWindow.getContentPane().add(new JButton(“OK”));// Dua vào môt nút
(JButton) có tên “OK” vào frame
- Dát lai kích thuoc cho frame su dung hàm setSize():
myWindow.setSize(200, 300);// Dát lai khung frame là 200 ( 300
- Gói khung frame dó lai báng hàm pack():
myWindow.pack();
- Cho hiên frame:
myWindow.setVisible(true);
Trang 124
II. Trình quan lý hiên thi trong Java
Khi thiêt kê giao diên dô hoa cho môt ung dung, chúng ta phai quan tâm dên kích
thuoc và cách bô trí (layout) các thành phân giao diên nhu: JButton, JCheckbox,
JTextField, v.v. sao cho tiên loi nhat doi voi nguoi su dung. Java có các lop dam nhiêm
nhung công viêc trên và quan lý các thành phân giao diên GUI bên trong các vât chua.
Bang sau cung câp bôn lop quan lý layout (cách bô trí và sáp xêp) các thành phân GUI.
Tên lóp Mô ta
FlowLayout Xêp các thành phân giao diên truoc tiên theo hàng tu trái qua phai,
sau dó theo côt tu trên xuông duoi. Cách sáp xêp này là mác dinh
dôi voi Panel, JPanel ,Applet và JApplet.
GridLayout Các thành phân giao diên duoc sáp xêp trong các ô luoi hình chu
nhât lân luot theo hàng tu trái qua phai và theo côt tu trên xuông
duoi trong môt phân tu chua. Môi thành phân giao diên chua trong
môt ô.
BorderLayout Các thành phân giao diên (ít hon 5) duoc dát vào các vi trí theo các
huong: north (bác), south (nam), west (tây), east (dông) và center
(trung tâm)). Cách sáp xêp này là màc dinh dôi voi lop Window,
Frame, Jframe, Dialog và JDialog.
GridBagLayout Cho phép dát các thành phân giao diên vào luoi hình chu nhât,
nhung môt thành phân có thê chiêm nhiêu nhiêu hon môt ô.
null Các thành phân bên trong vât chua không duoc sáp lai khi kích
thuoc cua vât chua thay dôi.
Các phuong pháp thiêt dát layout
Dê lây vê layout hay dê dát lai layout cho vât chua, chúng ta có thê su dung hai phuong
thuc cua lop Container:
LayoutManager getLayout();
void setLayout(LayoutManager mgr);
Các thành phân giao diên sau khi dã duoc tao ra thì phai duoc dua vào môt phân tu chua
nào dó. Hàm add() cua lop Container duoc nap chông dê thuc hiên nhiêm vu dua các
thành phân vào phân tu chua.
Component add(Component comp)
Component add(Component comp, int index)
Cmponent add(Component comp, Object constraints)
Cmponent add(Component comp, Object constraints, int index)
Trong dó, dôi sô index duoc su dung dê chi ra vi trí cua ô cân dát thành phân giao diên
comp vào. Dôi sô constraints xác dinh các huong dê dua comp vào phân tu chua.
Nguoc lai, khi cân loai ra khoi phân tu chua môt thành phân giao diên thì su dung các hàm
sau:
void remove(int index)
Trang 125
void remove(Component comp)
void removeAll()
1. Lóp FlowLayout
Lop FlowLayout cung câp các hàm tao lâp dê sáp hàng các thành phân giao diên:
FlowLayout()
FlowLayout(int aligment)
FlowLayout(int aligment, int horizongap, int verticalgap)
public static final int LEFT
public static final int CENTER
public static final int RIGHT
Dôi sô aligment xác dinh cách sáp theo hàng: tu trái, phai hay trung tâm,
horizongap và verticalgap là khoang cách tính theo pixel giùa các hàng các côt.
Truong hop mác dinh thì khoang cách giua các hàng, côt là 5 pixel.
2. Lóp GridLayout
Lop GridLayout cung câp các hàm tao lâp dê sáp hàng các thành phân giao diên:
GridLayout()
GridLayout(int rows, int columns)
GridLayout(int rows, int columns, int hoiongap, int verticalgap)
Tao ra môt luoi hình chu nhât có rows ( columns ô có khoang cách giua các hàng
các côt là horizongap, verticalgap. Môt trong hai dôi sô rows hoàc columns có thê là
0, nhung không thê ca hai, GridLayout(1,0) là tao ra luoi có môt hàng.
3.Lóp BorderLayout
Lop BorderLayout cho phép dát môt thành phân giao diên vào môt trong bôn huong: bác
(NORTH), nam (SOUTH), dông (EAST), tây (WEST) và o giùa (CENTER).
BorderLayout()
BorderLayout(int horizongap, int verticalgap)
Tao ra môt layout mác dinh hoác có khoang cách giua các thành phân (tính báng
pixel) là horizongap theo hàng và verticalgap theo côt.
Component add(Component comp)
void add(Component comp, Object constraint)
public static final String NORTH
public static final String SOUTH
public static final String EAST
public static final String WEST
public static final String CENTER
Truong hop mác dinh là CENTER, nguoc lai, có thê chi dinh huong dê dát các thành
phân comp vào phân tu chua theo constraint là môt trong các háng trên.
III. Xu lý su kiên trong Java
Các ung dung voi GUI thuong duoc huong dân boi các su kiên (event). Viêc nhân
môt nút, mo, dóng các Window hay gõ các ký tu tu bàn phím, v.v. dêu tao ra các su kiên
(event) và duoc gui toi cho chuong trình ung dung. Trong Java các su kiên duoc thê hiên
báng các dôi tuong. Lop co so nhât, lop cha cua tât ca các lop con cua các su kiên là lop
java.util.EventObject.
Trang 126
Hình H7-20 Các lop xu lý các su kiên
Các lop con cua AWTEvent duoc chia thành hai nhóm:
Các lop mô ta vê ngu nghia cua các su kiên,
Các lop su kiên o muc thâp.
1. Ý nghîa cua các lóp
a. ActionEvent
Su kiên này duoc phát sinh boi nhung hoat thuc hiên trên các thành phân cua GUI. Các
thành phân gây ra các su kiên hành dông bao gôm:
- JButton - khi mot nút button duoc khích hoat,
- JList - khi mot muc trong danh sách duoc kích hoat dúp,
- JmenuItem, JcheckBoxMenu, JradioMenu - khi mot muc trong thuc don duoc chon,
- JTextField - khi gõ phím ENTER trong truong vàn ban (text).
b. AdjustmentEvent
Su kiên này xây ra khi ta diêu chinh (adjustment) giá tri thanh cuôn (JScollBar)
Scrollbar - khi thuc hiên môt lân cán chinh trong thanh truot Scrollbar.
Lop này có phuong thuc int getValue(): cho lai giá tri hiên thoi duoc xác dinh boi lân cán
chinh sau cùng.
c. ItemEvent
Các thành phân cua GUI gây ra các su kiên vê các muc gôm có:
j ava.l ang.Obj ect
j ava. ut il.Event Obj ect
j ava.awt .event
Act ionEvent Adj ust ment Event Component Even
t
I t emEvent Text Event
Cont ainerEvent FocusEvent
I nput Event
Paint Event
WindowEvent
KeyEvent MouseEven
t
j ava. awt . AWTEvent
Trang 127
- JCheckbox - khi trang thái cua hôp kiêm tra Checkbox thay dôi.
- CheckboxMenuItem - khi trang thái cua hôp kiêm tra Checkbox ung voi muc cua
thuc don thay dôi.
- JRadioButton- khi trang thái cua hôp chon (Option) thay dôi.
- JList - khi môt muc trong danh sách duoc chon hoác bi loai bo chon.
- JCompoBox - khi môt muc trong danh sách duoc chon hoác bi loai bo chon.
Lop ItemEvent có phuong thuc Object getItem(): Cho lai doi tuong duoc chon hay vua bi
bo chon.
d. TextEvent
Các thành phân cua GUI gây ra các su kiên vê text gôm có:
TextArea - khi kêt thúc báng nhân nút ENTER,
TextField - khi kêt thúc báng nhân nút ENTER.
e. ComponentEvent
Su kiên này xuât hiên khi môt thành phân bi ân di/hiên ra hoác thay thay dôi lai kích thuoc.
Lop ComponentEvent có phuong thuc:
Component getComponent()
Cho lai doi tuong tham chiêu kiêu Component.
f. ContainerEvent
Su kiên này xuât hiên khi môt thành phân duoc bô sung hay bi loai bo khoi vât chua
(Container).
g. FocusEvent
Su kiên loai này xuât hiên khi môt thành phân nhân hoác mât focus.
h. KeyEvent
Lop KeyEvent là lop con cua lop truu tuong InputEvent duoc su dung dê xu lý các
su kiên liên quan dên các phím cua bàn phím. Lop này có các phuong thuc:
int getKeyCode()
- Dôi voi các su kiên KEY_PRESSED hoác KEY_RELEASED, hàm này duoc su dung dê
nhân lai giá tri nguyên tuong ung voi mã cua phím trên bàn phím.
char getKeyChar()
- Dôi voi các su kiên KEY_PRESSED, hàm này duoc su dung dê nhân lai giá tri nguyên,
mã Unicode tuong ung voi ký tu cua bàn phím.
i. MouseEvent
Lop MouseEvent là lop con cua lop truu tuong InputEvent duoc su dung dê xu lý các tín
hiêu cua chuôt. Lop này có các phuong thuc:
int getX()
int getY()
Point getPoint()
Các hàm này duoc su dung dê nhân lai toa dô x, y cua vi trí liên quan dên su kiên do
chuôt gây ra.
void translatePoint(int dx, int dy)
Hàm translate() duoc su dung dê chuyên toa dô cua su kiên do chuôt gây ra dên (dx,
dy).
int getClickCount()
Trang 128
Hàm getClickCount() dêm sô lân kích chuôt.
j. PaintEvent
Su kiên này xuât hiên khi môt thành phân duoc vë lai, thuc tê su kiên này xây ra khi
phuong thuc paint()/ update() duoc goi dên.
k. WindowEvent
Su kiên loai này xuât hiên khi thao tác voi các Window, cháng han nhu: dóng,
phóng to, thu nho.. môt cua sô. Lop này có phuong thuc:
Window getWindow()
Hàm này cho lai doi tuong cua lop Window ung voi su kiên liên quan dên Window
dã xay ra.
Kiêu su kiên Nguôn gây ra su kiên Phuong thuc dang ký, gõ bo
dôi tuong láng nghe
Giao diên
Listener láng
nghe tuong ung
AcitionEvent
JButton
JList
TexField
addComponentlistener
removeActiontListener
AcitionListener
AdjustmentEvent
JScrollbar addAdjustmentListener
removeAdjustmentListener
AdjustmentListe
ner
ItemEvent JCheckbox
JCheckboxMenuItem
JRadioButton
JList
JCompoBox
addItemListener
removeItemListener
ItemListener
TextEvent JTextArea
JTexField
JTextPane
JEditorPane
addTexListener
removeTextListener
TextListener
ComponentEvent Component
addComponentListener
removeComponentListener
ComponentListe
ner
ContainerEvent
Container addContainerListener
removeContainerListener
ContainerListen
er
FocusEvent
Component addFocusListener
removeFocusListener
FocusListener
KeyEvent
Component addkeyListener
removeKeyListener
KeyListener
MouseEvent
Component addMouseListener MouseMotionLi
Trang 129
remoMouseListener
addMouseMotionListener
remoMouseMotionListener
stener
WindowEvent
Window addWindowListener
removeWindowListener
WindowListener
3. Môt sô lóp diêu hop
Giao diên Listener làng nghe
Lop diêu hop tuong ung
AcitionListener
Không có lop diêu hop tuong ung
AdjustmentListener AdjustmentAdapter
ItemListener Không có lop diêu hop tuong ung
TextListener
Không có lop diêu hop tuong ung
ComponentListener ComponentAdapter
ContainerListener ContainerAdapter
FocusListener FocusAdapter
KeyListener KeyAdapter
MouseMotionListener MouseMotionAdapter
WindowListener WindowAdapter
Môt sô ví du minh hoa
/* The applet enables the user to enter the interest rate,the number of years,
and the loan amount. Clicking the compute button displays the monthly payment
and the total payment.
*/
import java.awt.*;
import java.awt.event.*;
import javax.swing.border.TitledBorder;
import java.applet.Applet;
import javax.swing.*;
public class StudentApp extends JFrame implements ActionListener{
private JTextField tRate = new JTextField(10);
private JTextField tYear = new JTextField(10);
private JTextField tLoan = new JTextField(10);
private JTextField tTotal = new JTextField(10);
private JButton compute = new JButton("Compute mortgage");
public static void main(String[] args){
StudentApp fr = new StudentApp();
fr.setSize(400, 200);
fr.setTitle("Mortgage Application");
//fr.center();
fr.setVisible(true);
}
Trang 130
public StudentApp(){
tTotal.setEditable(false);
JPanel p1 = new JPanel();
p1.setLayout(new GridLayout(5,2));
p1.add(new Label("Interest Rate"));
p1.add(tRate);
p1.add(new Label("Years"));
p1.add(tYear);
p1.add(new Label("Loan Amount"));
p1.add(tLoan);
p1.add(new Label("Total Payment"));
p1.add(tTotal);
p1.setBorder(new TitledBorder("Enter interest rate, year and loan amount"));
JPanel p2 = new JPanel();
p2.setLayout(new FlowLayout(FlowLayout.RIGHT));
p2.add(compute);
// Add the components to the applet
getContentPane().add(p1,BorderLayout.CENTER);
getContentPane().add(p2,BorderLayout.SOUTH);
// Register listener
compute.addActionListener(this);
}
// Handler for the compute button
public void actionPerformed(ActionEvent e){
if(e.getSource() == compute){
// Get values from text fields
double interest = (Double.valueOf(tRate.getText())).doubleValue();
int year = (Integer.valueOf(tYear.getText())).intValue();
double loan = (Double.valueOf(tLoan.getText())).doubleValue();
// Compute the total and displays it
double m = loan * interest * year;
tTotal.setText(String.valueOf(m));
}
}
}
Sú dung ListBox và nút lênh
import java.awt.*;
import java.awt.event.*;
class ChoiceList extends Frame implements ActionListener{
Label l1 = new Label("What is your favorite color");
Choice colors = new Choice();
Button bt = new Button("Exit");
public ChoiceList(String title){
super(title);
setLayout(new FlowLayout());
add(bt);
add(l1);
Trang 131
colors.addItem("White");
colors.addItem("Red");
colors.addItem("Orange");
colors.addItem("Green");
colors.addItem("Yellow");
colors.addItem("Blue");
add(colors);
bt.addActionListener(this);
}
public void actionPerformed(ActionEvent ev){
if(ev.getSource() == bt){
System.exit(0);
}
}
// public void mouseExited(MouseEvent m){}
public static void main(String args[]){
ChoiceList t = new ChoiceList("Choice List");
t.setSize(300, 200);
t.show();
}
}
/* ClockGroup.java
* display a group of international clocks
*/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import javax.swing.Timer;
import java.text.*;
public class ClockGroup extends JApplet implements ActionListener{
private ClockPanel clockP1, clockP2, clockP3;
private JButton btResum, btSus;
public static void main(String[] arg){
JFrame fr = new JFrame("Clock Group Demo");
ClockGroup app = new ClockGroup();
fr.getContentPane().add(app, BorderLayout.CENTER);
app.init();
app.start();
fr.setSize(600, 350);
fr.setVisible(true);
}
public void init(){
// Panel p1 for holding 3 clocks
JPanel p1 = new JPanel();
p1.setLayout(new GridLayout(1,3));
// Create a clock for Berlin
p1.add(clockP1 = new ClockPanel());
clockP1.setTitle("Berlin");
Trang 132
clockP1.clock.setTimeZoneID("ECT");
clockP1.clock.setLocale(Locale.GERMAN);
// Create a clock for SanFrancisco
p1.add(clockP2 = new ClockPanel());
clockP2.setTitle("San Francisco");
clockP2.clock.setTimeZoneID("PST");
clockP2.clock.setLocale(Locale.US);
// Create a clock for Taipei
p1.add(clockP3 = new ClockPanel());
clockP3.setTitle("Taipei");
clockP3.clock.setLocale(Locale.CHINESE);
clockP3.clock.setTimeZoneID("CTT");
// Panel p2 for holding 2 group buttons
JPanel p2 = new JPanel();
p2.setLayout(new FlowLayout());
p2.add(btResum = new JButton("Resume All"));
p2.add(btSus = new JButton("Suspend All"));
// Add p1, p2 into the applet
getContentPane().setLayout(new BorderLayout());
getContentPane().add(p1,BorderLayout.CENTER);
getContentPane().add(p2,BorderLayout.SOUTH);
// Register listener
btResum.addActionListener(this);
btSus.addActionListener(this);
}
public void actionPerformed(ActionEvent e){
if(e.getSource() == btResum){
// Start all clock
clockP1.resume();
clockP2.resume();
clockP3.resume();
}
else if (e.getSource() == btSus){
// Start all clock
clockP1.suspend();
clockP2.suspend();
clockP3.suspend();
}
}
}
class ClockPanel extends JPanel implements ActionListener{
private JLabel labelT;
protected Clock clock = null;
private JButton btResum, btSus;
public ClockPanel(){
JPanel bt = new JPanel();
bt.add(btResum = new JButton("Resum"));
bt.add(btSus = new JButton("Suspend"));
// Set BorderLayout for the ClockPanel
Trang 133
setLayout(new BorderLayout());
// Add title label to the north of the panel
add(labelT = new JLabel(), BorderLayout.NORTH);
labelT.setHorizontalAlignment(JLabel.CENTER);
// Add the clock to the center of the panel
add(clock = new Clock(),BorderLayout.CENTER);
add(bt,BorderLayout.SOUTH);
// Register
btResum.addActionListener(this);
btSus.addActionListener(this);
}
public void setTitle(String title){
labelT.setText(title);
}
public void actionPerformed(ActionEvent e){
if(e.getSource() == btResum){
clock.resume();
}
else if (e.getSource() == btSus){
clock.suspend();
}
}
public void resume(){
if(clock != null) clock.resume();
}
public void suspend(){
if(clock != null) clock.suspend();
}
}
class Clock extends StillClock implements ActionListener{
protected Timer timer;
public Clock(){
this(Locale.getDefault(), TimeZone.getDefault());
}
public Clock(Locale l, TimeZone t){
super(l, t);
timer = new Timer(1000,this);
timer.start();
}
public void resume(){
timer.start();
}
public void suspend(){
timer.stop();
}
public void actionPerformed(ActionEvent e){
repaint();
}
}
Trang 134
// Display a clock in JPanel
class StillClock extends JPanel{
protected TimeZone timeZ;
protected int xC, yC;
protected int clockR;
protected DateFormat form;
public StillClock(){
this(Locale.getDefault(), TimeZone.getDefault());
}
public StillClock(Locale l, TimeZone t){
setLocale(l);
this.timeZ = t;
}
public void setTimeZoneID(String newT){
timeZ = TimeZone.getTimeZone(newT);
}
// Override the paintComponent to display a clock
public void paintComponent(Graphics g){
super.paintComponent(g);
clockR = (int)(Math.min(getSize().width,getSize().height)*0.7*0.5);
xC = (getSize().width)/2;
yC = (getSize().height)/2;
// Draw circle
g.setColor(Color.black);
g.drawOval(xC-clockR, yC - clockR, 2*clockR,2*clockR);
g.drawString("12", xC - 5, yC - clockR);
g.drawString("9", xC - clockR-10, yC + 3);
g.drawString("3", xC + clockR, yC + 3);
g.drawString("6", xC + 3, yC + clockR + 10);
// Get current time using GregorianCalendar
GregorianCalendar cal = new GregorianCalendar(timeZ);
// Draw second hand
int second = (int) cal.get(GregorianCalendar.SECOND);
int sLen = (int)(clockR *0.9);
int xS = (int)(xC+sLen*Math.sin(second*(2*Math.PI/60)));
int yS = (int)(yC-sLen*Math.cos(second*(2*Math.PI/60)));
g.setColor(Color.red);
g.drawLine(xC, yC, xS, yS);
// Draw minut hand
int minute = (int) cal.get(GregorianCalendar.MINUTE);
int mLen = (int)(clockR *0.75);
int xM = (int)(xC+mLen*Math.sin(minute*(2*Math.PI/60)));
int yM = (int)(yC-mLen*Math.cos(minute*(2*Math.PI/60)));
g.setColor(Color.blue);
g.drawLine(xC, yC, xM, yM);
// Draw hour hand
int hour = (int) cal.get(GregorianCalendar.HOUR_OF_DAY);
int hLen = (int)(clockR *0.6);
int xH = (int)(xC+hLen*Math.sin((hour+minute/60.0)*(2*Math.PI/12)));
Trang 135
int yH = (int)(yC-hLen*Math.cos((hour+minute/60.0)*(2*Math.PI/12)));
g.setColor(Color.green);
g.drawLine(xC, yC, xH, yH);
// Set display form in specified style, locale, and timzone
form = DateFormat.getDateTimeInstance(
DateFormat.MEDIUM,DateFormat.LONG, getLocale());
form.setTimeZone(timeZ);
// Display current date
String today = form.format(cal.getTime());
FontMetrics fm = g.getFontMetrics();
g.drawString(today, (getSize().width-fm.stringWidth(today))/2,
yC+clockR+30);
}
}
Sú dung các diêu khiên
package welcome;
import java.awt.*;
import java.awt.event.*;
public class ComponentTest extends Frame implements
ActionListener,MouseListener
{ TextField tf1=new TextField(30);
TextField tf2 = new TextField(40);
Label label1 = new Label("This is a way to use component...");
Checkbox b1 = new Checkbox("Red", true);
Checkbox b2 = new Checkbox("Blue", true);
CheckboxGroup cb = new CheckboxGroup();
Checkbox bg1 = new Checkbox("Small", cb, true);
Checkbox bg2 = new Checkbox("Large", cb, true);
TextArea ta = new TextArea(3, 25);
Choice colors = new Choice();
Button btnResult = new Button("Double is");
Button btnExt = new Button("Exit");
PopupMenu optionsMenu = new PopupMenu("Options");
public ComponentTest(String title) {
super(title);
setLayout(new FlowLayout());
add(label1);
add(ta);
add(tf1);
add(tf2);
add(b1);
add(b2);
add(bg1);
add(bg2);
colors.addItem("While");
colors.addItem("Red");
colors.addItem("Oranges");
Trang 136
colors.addItem("Green");
colors.addItem("Yellow");
colors.addItem("Blue");
colors.addItem("Black");
add(colors);
add(btnResult);
add(btnExt);
btnResult.addActionListener(this);
btnExt.addActionListener(this);
MenuBar mbar = new MenuBar();
setMenuBar(mbar);
Menu fileMenu = new Menu("File");
mbar.add(fileMenu);
fileMenu.addActionListener(this);
MenuItem newItem = new MenuItem("New");
fileMenu.add(newItem);
MenuItem openItem = new MenuItem("Open");
fileMenu.add(openItem);
fileMenu.addSeparator();
MenuItem saveItem = new MenuItem("Save");
fileMenu.add(saveItem);
fileMenu.addSeparator();
MenuItem exitItem = new MenuItem("Exit");
fileMenu.add(exitItem);
exitItem.addActionListener(this);
Menu editMenu = new Menu("Edit");
mbar.add(editMenu);
editMenu.addActionListener(this);
MenuItem cutItem = new MenuItem("Cut");
editMenu.add(cutItem);
MenuItem copyItem = new MenuItem("Copy");
editMenu.add(copyItem);
fileMenu.addSeparator();
MenuItem paseItem = new MenuItem("Pase");
editMenu.add(paseItem);
editMenu.add(optionsMenu);
//PopupMenu optionsMenu=new PopupMenu("Options");
optionsMenu.addActionListener(this);
MenuItem readItem = new MenuItem("Read Only");
optionsMenu.add(readItem);
optionsMenu.addSeparator();
Menu formatMenu = new Menu("Format text");
optionsMenu.add(formatMenu);
optionsMenu.addSeparator();
CheckboxMenuItem insertItem = new CheckboxMenuItem("Insert", true);
formatMenu.add(insertItem);
formatMenu.addSeparator();
CheckboxMenuItem overtypeItem = new CheckboxMenuItem("Over type", false);
Trang 137
formatMenu.add(overtypeItem);
formatMenu.addSeparator();
}
public void actionPerformed(ActionEvent ae) {
if (ae.getSource() == btnResult) {
int num = Integer.parseInt(tf1.getText()) * 2;
tf2.setText(String.valueOf(num));
}
if (ae.getSource() == btnExt) {
System.exit(0);
}
if (ae.getActionCommand().equals("Exit")) {
System.exit(0);
}
if (ae.getActionCommand().equals("Open")) {
System.out.println("You pressed the menuItem Open...");
label1.setText("Open");
}
}
public void mouseEntered(MouseEvent m) { }
public void mouseExited(MouseEvent m) { }
public void mouseClicked(MouseEvent m) {
optionsMenu.show(this, m.getX(), m.getY());
}
public void mouseReleased(MouseEvent m) { }
public void mousePressed(MouseEvent m) { }
public static void main(String args[]) {
ComponentTest c = new ComponentTest("Vi du dung thu vien java.awt.*");
c.setSize(500, 300);
c.show();
}
}
/*
The program has 4 buttons labeled Add, Sub, Mul, Div and also create a menu
to perform the same operation. The user will also create to perform the
same operation. The user can choose the operation either from buttons or
from menu selections. Fig. The following contains a sample run of the
program.
*/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class MenuDemo1 extends JFrame implements ActionListener{
private JTextField num1, num2, res;
private JButton btAdd, btSub, btMul,btDiv;
private JMenuItem mAdd, mSub,mMul, mDiv, mClose;
public static void main(String[] arg){
MenuDemo1 fr = new MenuDemo1();
fr.pack();
Trang 138
fr.setVisible(true);
}
public MenuDemo1(){
setTitle("Menu Demo");
JMenuBar mb = new JMenuBar();
setJMenuBar(mb);
JMenu opMenu = new JMenu("Operation");
opMenu.setMnemonic('O');
mb.add(opMenu);
JMenu exitMenu = new JMenu("Exit");
exitMenu.setMnemonic('E');
mb.add(exitMenu);
opMenu.add(mAdd = new JMenuItem("Add", 'A'));
opMenu.add(mSub = new JMenuItem("Sub", 'S'));
opMenu.add(mMul = new JMenuItem("Mul", 'M'));
opMenu.add(mDiv = new JMenuItem("Div", 'D'));
exitMenu.add(mClose = new JMenuItem("Close", 'C'));
mAdd.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A,
ActionEvent.CTRL_MASK));
mSub.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,
ActionEvent.CTRL_MASK));
mMul.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_M,
ActionEvent.CTRL_MASK));
mDiv.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_D,
ActionEvent.CTRL_MASK));
JPanel p1 = new JPanel();
p1.setLayout(new FlowLayout());
p1.add(new JLabel("Number 1"));
p1.add(num1 = new JTextField(4));
p1.add(new JLabel("Number 2"));
p1.add(num2 = new JTextField(4));
p1.add(new JLabel("Result"));
p1.add(res = new JTextField(4));
res.setEditable(false);
JPanel p2 = new JPanel();
p2.setLayout(new FlowLayout());
p2.add(btAdd = new JButton("Add"));
p2.add(btSub = new JButton("Sub"));
p2.add(btMul = new JButton("Mul"));
p2.add(btDiv = new JButton("Div"));
getContentPane().setLayout(new BorderLayout());
getContentPane().add(p1, BorderLayout.CENTER);
getContentPane().add(p2, BorderLayout.SOUTH);
btAdd.addActionListener(this);
btSub.addActionListener(this);
Trang 139
btMul.addActionListener(this);
btDiv.addActionListener(this);
mAdd.addActionListener(this);
mSub.addActionListener(this);
mMul.addActionListener(this);
mDiv.addActionListener(this);
mClose.addActionListener(this);
}
public void actionPerformed(ActionEvent e){
String comm = e.getActionCommand();
if(e.getSource() instanceof JButton){
if("Add".equals(comm))
calculate('+');
else if ("Sub".equals(comm))
calculate('-');
else if ("Mul".equals(comm))
calculate('*');
else if ("Div".equals(comm))
calculate('/');
}
else if (e.getSource() instanceof JMenuItem){
if("Add".equals(comm))
calculate('+');
else if ("Sub".equals(comm))
calculate('-');
else if ("Mul".equals(comm))
calculate('*');
else if ("Div".equals(comm))
calculate('/');
else if ("Close".equals(comm))
System.exit(0);
}
}
private void calculate(char op){
int n1 = (Integer.parseInt(num1.getText().trim()));
int n2 = (Integer.parseInt(num2.getText().trim()));
int r = 0;
switch( op){
case '+': r = n1 + n2; break;
case '-': r = n1 - n2; break;
case '*': r = n1 * n2; break;
case '/': r = n1 / n2; break;
}
res.setText(String.valueOf(r));
}
}
Lâp trình menu
Trang 140
/*
The program has 4 buttons labeled Add, Sub, Mul, Div and also create a menu
to perform the same operation. The user will also create to perform the
same operation. The user can choose the operation either from buttons or
from menu selections. Fig. The following contains a sample run of the
program.
*/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class MenuDemo1 extends JFrame implements ActionListener{
private JTextField num1, num2, res;
private JButton btAdd, btSub, btMul,btDiv;
private JMenuItem mAdd, mSub,mMul, mDiv, mClose;
public static void main(String[] arg){
MenuDemo1 fr = new MenuDemo1();
fr.pack();
fr.setVisible(true);
}
public MenuDemo1(){
setTitle("Menu Demo");
JMenuBar mb = new JMenuBar();
setJMenuBar(mb);
JMenu opMenu = new JMenu("Operation");
opMenu.setMnemonic('O');
mb.add(opMenu);
JMenu exitMenu = new JMenu("Exit");
exitMenu.setMnemonic('E');
mb.add(exitMenu);
opMenu.add(mAdd = new JMenuItem("Add", 'A'));
opMenu.add(mSub = new JMenuItem("Sub", 'S'));
opMenu.add(mMul = new JMenuItem("Mul", 'M'));
opMenu.add(mDiv = new JMenuItem("Div", 'D'));
exitMenu.add(mClose = new JMenuItem("Close", 'C'));
mAdd.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A,
ActionEvent.CTRL_MASK));
mSub.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,
ActionEvent.CTRL_MASK));
mMul.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_M,
ActionEvent.CTRL_MASK));
Trang 141
mDiv.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_D,
ActionEvent.CTRL_MASK));
JPanel p1 = new JPanel();
p1.setLayout(new FlowLayout());
p1.add(new JLabel("Number 1"));
p1.add(num1 = new JTextField(4));
p1.add(new JLabel("Number 2"));
p1.add(num2 = new JTextField(4));
p1.add(new JLabel("Result"));
p1.add(res = new JTextField(4));
res.setEditable(false);
JPanel p2 = new JPanel();
p2.setLayout(new FlowLayout());
p2.add(btAdd = new JButton("Add"));
p2.add(btSub = new JButton("Sub"));
p2.add(btMul = new JButton("Mul"));
p2.add(btDiv = new JButton("Div"));
getContentPane().setLayout(new BorderLayout());
getContentPane().add(p1, BorderLayout.CENTER);
getContentPane().add(p2, BorderLayout.SOUTH);
btAdd.addActionListener(this);
btSub.addActionListener(this);
btMul.addActionListener(this);
btDiv.addActionListener(this);
mAdd.addActionListener(this);
mSub.addActionListener(this);
mMul.addActionListener(this);
mDiv.addActionListener(this);
mClose.addActionListener(this);
}
public void actionPerformed(ActionEvent e){
String comm = e.getActionCommand();
if(e.getSource() instanceof JButton){
if("Add".equals(comm))
calculate('+');
else if ("Sub".equals(comm))
calculate('-');
else if ("Mul".equals(comm))
calculate('*');
Trang 142
else if ("Div".equals(comm))
calculate('/');
}
else if (e.getSource() instanceof JMenuItem){
if("Add".equals(comm))
calculate('+');
else if ("Sub".equals(comm))
calculate('-');
else if ("Mul".equals(comm))
calculate('*');
else if ("Div".equals(comm))
calculate('/');
else if ("Close".equals(comm))
System.exit(0);
}
}
private void calculate(char op){
int n1 = (Integer.parseInt(num1.getText().trim()));
int n2 = (Integer.parseInt(num2.getText().trim()));
int r = 0;
switch( op){
case '+': r = n1 + n2; break;
case '-': r = n1 - n2; break;
case '*': r = n1 * n2; break;
case '/': r = n1 / n2; break;
}
res.setText(String.valueOf(r));
}
}
Trang 143
Chuong 7 LAP TRÌNH CO SO DÙ LIEU
I. Tông quan
Môt hua hen lon cua java là kha náng xây dung các ung dung CSDL dôc lâp voi hê
nên, công nghê này duoc biêt dên voi cái tên JDBC (Java Database Connectivity),
JDBC duoc thiêt kê tuong dôi don gian.
Mô hình JDBC dua ra môt tâp các lop và các phuong thuc dê giao tiêp voi ngôn du
liêu. JDBC API duoc tích hop vào ngay nên java nên ban không cân phai cài dát gì
thêm khi truy câp CSDL.
II. Các kêu trình diêu khiên JDBC
Các trình diêu khiên JDBC có thê phân thành 4 kiêu sau phu thuôc vào cách thuc
hoat dông, cách kêt nôi voi CSDL.
Kiêu 1 : JDBC su dung câu nôi ODBC (JDBC-ODBC Bridge )
ODBC là môt công nghê cua Microsoft dùng dê kêt nôi dên các hê co so du liêu
thông qua trình diêu khiên Driver cua hê co so du liêu dó. Môi hê co so du liêu cung
câp môt trình diêu khiên (Driver) có kha náng làm viêc (doc, câp nhât,..) duoc co so
du liêu cua chúng . Trình diêu khiên này së duoc dáng ký voi bô quan lý ODBC .
ODBC API là môt tâp các hàm API dê truy câp vào CSDL thông qua các trình diêu
khiên, nguoi lâp trình së su dung các hàm API trong giao diên này dê truy câp vào
CSDL.
Câu nôi JDBC – ODBC là môt trình diêu khiên su dung mã java dê goi lai các hàm
trong JDBC API. Báng cách này ban có thê kêt nôi duoc voi nhiêu hê quan tri co so
du liêu khác nhau.
Dê có thê kêt nôi vào môt hê CSDL cu thê nào dó (cháng han nhu: Access, SQL
Server, MySQL…) su dung câu nôi JDBC-ODBC ban cân phai có:
- Trình diêu khiên (Driver) cua dùng dê truy câp vào hê CSDL dó. Thông thuong
trình diêu khiên này duoc cung câp boi chính các hãng san xuât hê CSDL và nó
thuong duoc cài dát vào trong máy khi ban cài dát hê quan tri CSDL.
- Câu nôi JDBC-ODBC, dây là trình diêu khiên duoc cung câp miên phí boi hãng
Sun và nó duoc cài dát tu dông khi ban cài dát JDK.
Trang 144
Vì ráng trình diêu khiên ODBC phai duoc cài dát vào trong máy truoc khi ban có thê
su dung nên nó chi thích hop cho các ung dung máy don, hoác duoc chay trên máy
chu trong mô hình nhiêu tâng (Multi - tier), không thích hop cho các ung dung chay
trên máy khách nhu: Aplet, Fat Client.
Kiêu 2 : JDBC kêt nôi truc tiêp vói các trình diêu khiên co so dû liêu .
Kiêu kêt nôi này su dung mã java truc tiêp goi các hàm trong trình diêu khiên dác
thù cua môi hê co so du liêu mà không phai qua trung gian ODBC . Do vây kiêu kêt
nôi này nhanh và hiêu qua hon câu nôi JDBC – ODBC, nhung phai có trình diêu
khiên co so dác thù do nhà phát triên cung câp hoác cua môt hãng thu ba nào dó.
Java Application ,
Applet , Ser vlet
JDBC Driver
ODBC
Database driver
Database

JAVA
Mã Native
{
{
{
Mô hình truy câp CSDL qua câu nôi JDBC
Trang 145
Kiêu 3 : JDBC kêt nôi thông qua các úng dung mang trung gian
Voi kiêu kêt nôi này, máy chu së chiu trách nhiêm kêt nôi voi co so du liêu .
Máy khách chi su dung nhung trình diêu khiên gon nhe (thin) có kha náng giao tiêp
voi ung dung trung gian thông qua mang dê truy vân du liêu .
Kiêu 4 : JDBC kêt nôi thông qua các trình diêu khiên hoàn toàn mã java
Java Application ,
Applet , Servlet
JDBC Driver
Database driver

JAVA
Mã Native
{
{
D atab ase
Mô hình kêt nôi truc tiêp
Java Application ,
Applet , Servlet
JDBC Driver
Java Middle Ware
Java Native driver
Dat abase

JAVA
Mã JAVA
{
{
M¹ ng
Trang 146
Kiêu này cho phép máy khách su dung trình diêu khiên gon nhe nôi kêt truc tiêp vào trình
diêu khiên co so du liêu dác thù trên máy chu o xa thông qua mang Internet .
III. Các lóp trong JDBC API dùng dê truy câp CSDL
JDBC API bao gôm các lop và các giao diên duoc chua trong hai gói: java.sql và
javax.sql. Gói java.sql chua các giao diên và gói cho phép ta thuc hiên các thao tác co ban
dôi voi CSDL, gói javax.sql chua các lop và giao diên giúp ta thuc hiên các tính náng cao
câp.
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ô ta ý nghia
CallableStatement Giao diên chua các phuong thuc cho phép ta làm viêc voi thu
tuc luu tru 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 thuc thi các câu lênh SQL chua
tham sô
ResultSetMetaData
Connection Thê hiên môt kêt nôi dên CSDL
Driver Giao diên mà môi trình diêu khiên phai cài dát
ResultSet Thê hiên môt tâp các ban ghi lây vê tu CSDL
Statement Giao diên cho phép ta thuc hiên các phát biêu SQL
Java Application ,
Applet , Servlet
JDBC Driver
Java Native driver
CSDL

JAVA
Mã JAVA
{
{
Internet
Trang 147
b) Mét sô lóp
Tên lóp Ý nghia
Date Lop biêu diên kiêu DATE
DriverPropertyInfo Chua các thuôc tính cua trình diêu khiên dã nap
Timestamp Lop biêu diên cho SQL TimeTemp
DriverManager Lop quan lý các trình diêu khiên
Time Lop biêu diên kiêu DATE
Types Lop dinh nghia các háng tuong ung voi các kiêu du liêu SQL, hay
còn goi là kiêu du liêu JDBC
2. Môt sô lóp và giao diên trong gói javax.sql
Tham khao tài liêu vê JDBC
IV. Kêt nôi CSDL vói JDBC
Dê có thê làm viêc voi CSDL, môt chuong trình java (hay bât cu chuong trình viêt
báng ngôn ngu nào khác) phai tuân theo các buoc sau:
Mo kêt nôi dên CSDL.
Thuc hiên các lênh làm viêc voi CSDL nhu: truy vân, câp nhât…
Dóng kêt nôi, giai phóng tài nguyên.
Các buoc dê xây dung môt ung dung CSDL voi JDBC:
1. Chuân bi
a) Cài dát JDBC và trình diêu khiên:
Môt ung java chi có thê kêt nôi và làm viêc duoc voi du liêu trong CSDL thông qua
các trình diêu khiên và các thu viên JDBC API.
Truoc khi truy câp vào hê CSDL nào ban phai có trong tay trình diêu khiên tuong
ung voi hê CSDL dó. Ban có thê download các trình diêu khiên cho môt sô hê CSDL quen
thuôc tu dia chi java.sun.com/jdbc
b) Cài dát CSDL
Ban cân lua chon và cài dát môt hê quan tri CSDL, dê quan tri phân du liêu cua
chuong trình. Dây là lua chon cua ban tuy theo tính chât cua du liêu trong chuong trình
cung nhu muc tiên ban có dê có thê mua duoc hê quan tri dó.
Sau khi ban lua chon duoc hê quan tri CSDL phù hop ban tiên hành cài dát CSDL:
tao bang, view, thu tuc luu tru..
Chú ý: Dê có thê truy câp vào CSDL cua hê quan tri CSDL nào thì ban phai có trong
tay trình diêu khiên tuong ung.
2. Thiêt lâp kêt nôi
Dây là buoc quan trong nhât bao gôm hai buoc:
Trang 148
a) Nap trình diêu khiên
JDBC su dung môt bô trình quan lý diêu kiên (DiverManager), môi trình diêu khiên
(Driver) cho phép ta làm viêc voi môt CSDL cu thê, cho nên nêu ban có 3 CSDL do
3 nhà cung câp khác nhau cung câp thì ban cân phai có 3 trình diêu khiên khác nhau.
Dê nap và dáng ký trình diêu khiên ban su dung lênh Class.forName(URL)
Trong dó URL là môt chuôi mô ta các thông tin vê tên cua trình diêu khiên dùng kêt
nôi voi co so du liêu, cháng han lênh
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
dùng dê nap trình diêu khiên JDBC-ODBC
Chú ý: Vói môi trình diêu khiên khác nhau thì URL cua phuong thúc Class.forName()
së khác nhau. Nên dê có thê nap dúng trình diêu khiên ban nên thao khao tài liêu di kèm
cua các trình diêu khiên, dê biêt duoc URL tuong ung.
b) Tao môt kêt nôi
Buoc tiêp theo ban tao môt kêt nôi dên CSDL thông qua trình diêu khiên mà ban
vua nap o buoc trên. Doan mã dùng dê tao môt kêt nôi thông thuong nhu sau:
Connection con = DriverManager.getConnection(url, "myLogin", "myPassword");
Trong dó :
- url là chuôi chua thông tin kêt nôi dên CSDL, nêu ban su dung câu nôi JDBC-ODBC thì
url là “jdbc:odbc:DataSourceName”, cháng han tôi dã tao môt DNS tên là TestDB voi 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 dên CSDL là
Connection con = DriverManager. getConnection(“jdbc:odbc:TestDB”,"theht", "theht");
- myLogin là tên truy câp, nêu mât không có mât khâu ban 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 ban có thê truyên cho nó
môt xâu rông
Chú ý: Thông thuòng chuôi URL có dinh dang nhu sau:
jdbc:subprotocol:subname
Trong dó:
subprotocol là giao thuc con tuong ung voi loai CSDL
subname là tên cua nguôn du liêu (Thông thuong nó là tên cua CSDL)
Môt vài ví du:
Ví du 1: Nap trình diêu khiên và kêt nôi dên CSDL cua MySQL
Trang 149
Trình diêu khiên dê tury cap vào CSDL cua MySQL, ban có thê download tai dia chi
MySQL.com, sau khi download ban có mot têp tin duy nhat dã duoc nén theo chuan jar, dàt
classpath tro dên têp tin này
- Nap tình diêu khiên cua MySQL
Class.forName("com.mysql.jdbc.Driver");
- Kêt nôi dên CSDL
Connection conn = DriverManager.getConnection(
"jdbc:mysql://ServrName/DBName?user=UserName&password=Pass");
- ServerName: là tên cua máy chu CSDL
- DBName: là tên cua CSDL
- UserName: là tên truy câp CSDL
- Pass: là mât khâu truy câp
Ví du 2: Nap trình diêu khiên và kêt nôi dên CSDL cua SQL Server 7.0, 2000
Có rât nhiêu trình diêu khiên cho MS SQL Server, da phân các trình diêu khiên dêu là các
san phâm thuong mai, có môt trình diêu khiên mà ta nên su dung dó là trình diêu khiên do
chính hãng Microsoft cung câp, trình diêu khiên này hoàn toàn Free và hô tro dây du các
tính náng cua Sql Server.
- Dia chi download www.microsoft.com
- Sau khi download và tiên hành cài dát ban së có 3 têp tin trong thu muc cài dát:
install_dir/lib/msbase.jar
install_dir/lib/msutil.jar
install_dir/lib/mssqlserver.jar
install_dir: là thu muc cài dàt
- Dát classpath tro dên 3 têp tin trên
- Nap trình diêu khiên
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
- Kêt nôi dê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=Pass
word;DatabaseName=DBName");
Trang 150
+ ServerName: Là tên cua máy chu SQL
+ ServerPort: Sô hiêu công cua SQL, nêu trong quá trình cài dát mà ban không dát
lai thì giá tri này là 1433
+ UserName: Tài khoan dáng nhâp vào SQL
+ Password: Mât khâu tuong ung voi tài khoan dáng nhâp
- Chuyên CSDL làm viêc
conn.setCatalog("DBName");
+ DBName: là tên CSDL
Ví du hoàn chinh
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í du 3: Nap trình diêu khiên và kêt nôi dên CSDL cua Access voi câu nôi JDBC-ODBC
cua Sun System
Ðê truy cap vào CSDL cua Access ta không can phai tai xuong và cài dàt vào máy driver
nào ca vì nó duoc tích hop vào Java, trình diêu khiên này do sun cung cap nó có tên là cau
noi JDBC-ODBC
- Nap trình diêu khiên
Class.forName("sun.jdbc.odbc. JdbcOdbcDriver ");
- Mo kêt noi báng cách su dung DataSource Name
+ Vào control panel chay chuong trình ODBC DataSource 32 bit
+ Tao môt DataSource Name có tên là MyDB
Connection conn = DriverManager.getConnection(" jdbc:odbc:MyDB");
- Mo kêt noi báng cách su dung File DataSource
Connection conn = DriverManager.getConnection(“jdbc:odbc:Driver={Microsoft
Access Driver (*.mdb)};DBQ=C:/Path/DatabaseName.mdb";”)
MyDB: tên cua DataSource Name mà ban dã tao
Path: duong dân dên CSDL
Trang 151
DatabaseName: tên CSDL
Ví du hoàn chinh
import java.sql.*;
import java.util.*;
class Test {
public static void main(String a[]) {
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Properties props = new Properties(); //Charset dê làm viêc vói Unicode
props.put("charSet", "UTF8");
props.put("user", "guest");
props.put("password", "guest");
String url =
"jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=C:/MyDB.mdb";
Connection con = DriverManager.getConnection(url, props);
Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
//Tao báng
stmt.executeUpdate("Create Table tbl(a text(50), b text(50))");
//Chèn 1 bán ghi vào CSDL
stmt.execute("Insert Into tbl values('Xin chào'','Toi là Access')");
ResultSet rs = stmt.executeQuery("Select * from tbl");
if (rs.next()) {
System.out.println(rs.getString("a") + "\t" + rs.getString("b"));
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
Ví du 4: Nap trình diêu khiên và kêt nôi dên CSDL cua Oracle 8i, 9i
Trình diêu khiên dê tury cap vào CSDL cua Oracle, ban có thê tìm thay nó trong thu muc
%ORACLE_HOME%/JDBC/lib
Class.forName("oracle.jdbc.OracleDriver ");
// Lây vê kêt nôi dên CSDL
Connection conn = DriverManager.getConnection("jdbc:oracle:oci8:@theht",
"theht","abc");
- @theht là tên cua máy chu CSDL
- theht là tên truy câp CSDL
- abc là mât khâu truy câp
Trang 152
V. Tuong tác vói CSDL
Tât ca các lênh mà ta dùng dê tác dông lên CSDL dêu có thê thuc hiên thông qua
môt trong ba dôi tuong sau:
Dôi tuong Mô ta
Satement Dùng dê thuc thi các lênh SQL không có tham sô
PreparedStatement Dùng dê thuc thi các lênh SQL có chua tham sô
CallableStatement Dùng dê làm viêc voi thu tuc luu tru nôi
1. Tao ra môt JDBC Statements
Môt dôi tuong Statements së giúp ban gui môt lênh SQL dên hê quan tri CSDL, sau
khi tao dôi tuong Statements ban có thê thuc hiên các lênh SQL nhu SELECT dê lây
vê du liêu hay UPDATE dê câp nhât du liêu, dê tao dôi tuong Statements ban su
dung phuong thuc createStatement cua dôi tuong connection mà ban vua tao ra
trong buoc II.
Statement stmt = con.createStatement();
Tai thoi diêm này ban chua có phát biêu SQL nào dê truyên dên CSDL, bây gio
chúng ta së su dung phuong thuc execute cua dôi tuong này dê thuc thi môt lênh
SQL, cháng han nhu doan lênh sau su dung phuong thuc executeUpdate dê thuc 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)");
Trong java 2 ban có thê tao ra các tâp kêt qua có thê câp nhât và có thê cuôn con tro
theo ca hai chiêu, dê tao ra tâp kêt qua có thê câp nhât duoc và cho phép cuôn ca hai chiêu
ban su dung mâu sau:
Statement stmt = con.createStatement(ResultSetType, ConcurencyType);
Trong dó :
Tham sô ResultSetType cho biêt tâp kêt qua (ResultSet) nhân duoc khi thuc thi câu lênh
executeQuery() có cuôn duoc hay không.
Tham sô ConcurencyType tính chât cua tâp kêt qua (ResultSet) nhân duoc khi thuc thi
câu lênh executeQuery() có cho phép câp nhât hay không. Thuc ra viêc có câp nhât
duoc hay không còn phu thuôc vào trình diêu khiên và hê quan tri có hô tro câp nhât
hay không.
Sau dây là bang các giá tri mà tham sô ResultSetType có thê nhân
Trang 153
Kiêu ResultSet
TYPE_FORWARD_ONLY
Cho biêt ResultSet nhân duoc chi có thê duyêt theo môt
chiêu tu BOF dên EOF
TYPE_SCROLL_INSENSITIVE
Cho phép duyêt theo ca hai chiêu nhung không thây
duoc su thay dôi du liêu cua nguoi dùng khác
TYPE_SCROLL_SENSITIVE
Cho phép duyêt theo ca hai chiêu nhung thây duoc su
thay dôi du liêu cua nguoi dùng khác
Sau dây là bang các giá tri 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 duoc, hay chi doc
CONCUR_UPDATEABLE
Cho biêt ResultSet có thê câp nhât duoc
a) Thuc hiên các lênh DDL (Data Difinetion Language)
Dê thuc thi các lênh DDL ban su dung phuong thuc executeUpdate cua dôi tuong
Statement theo mâu:
stmt.executeUpdate(DDL_SQL_STRING);
Trong dó:
stmt là môt dôi tuong thuôc lop Statement
DDL_SQL_STRING là môt câu lênh DDL
Chú ý: Phuong thuc executeUpdate tra vê giá tri 0 nêu câu lênh mà nó thuc thi là môt câu
lênh DDL
b) Thuc thi các lênh câp nhât CSDL
Dê thuc thi các lênh câp nhât nhu: INSERT, UPDATE, DELETE ban su dung
phuong thuc executeUpdate() cua dôi tuong Statement theo mâu:
stmt.executeUpdate(DML_SQL_STRING);
Trong dó:
stmt: là môt dôi tuong thuôc lop Statement
DML_SQL_STRING là môt câu lênh câp nhât
Chú ý: Phuong thúc executeUpdate tra vê môt sô nguyên thê hiên sô ban ghi duoc anh
huong sau lênh này, dê biêt duoc sô ban ghi duoc anh huong ban có thê thuc hiên theo mâu
sau:
[int recordEffect=] stmt.executeUpdate(DML_SQL_STRING);
Ví du1: Thêm môt ban ghi vào bang sinhvien
stmt.executeUpdate(“INSERT INTO sinhvien(masv, tensv) values (\“01\”, \”Nguyên
vàn An”);
Ví du2: Xoá các ban ghi cua bang sinhvien có masv=01
stmt.executeUpdate(“DELETE sinhvien WHERE masv=01”);
Trang 154
Ví du 3: Sua lai tên cua 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 lai dû liêu
Dê câp nhât lai du liêu ban su dung mênh dê UPDATE SQL, thuc thi chúng thông
qua phuong thuc executeUpdate
Ví du 4: ban muôn công thêm phu câp cho tât ca các nguoi có trình dô dai hoc lên 10 dông
ban làm
stmt.executeUpdate( "UPDATE COFFEES " + "SET CP=PC+10 WHERE
td=’dh’”);
Thêm ban ghi vào bang CSDL
Dê chèn du liêu vào bang ban su dung phuong thuc executeUpdate cua dôi tuong
Statement, ví du ban muôn chèn thêm môt ban ghi vào bang COFFEES ban làm sau:
Statement stmt = con.createStatement();
stmt.executeUpdate("INSERT INTO COFFEES VALUES ('Colombian', 101, 7.99, 0,
0)");
Xoá ban ghi trong CSDL
Dê xoá du liêu tu bang CSDL ban su dung phuong thuc executeUpdate cua dôi
tuong Statement. Ví du ban muôn tât ca các ban ghi cua bang COFFEES ban làm
sau:
Statement stmt = con.createStatement();
stmt.executeUpdate( "DELETE FROM COFFEES");
c) Thuc thi câu lênh truy vân (Query Language)
Dê thuc thi câu lênh truy vân ban su dung phuong thuc executeQuery() cua dôi
tuong Statement theo mâu sau:
ResultSet rs=stmt.executeQuery(QUERY_SQL_STRING);
Trong dó:
stmt: là môt dôi tuong thuôc lop Statement
QUERY_SQL_STRING là môt câu lênh truy vân du liêu
rs là môt dôi tuong cua lop ResultSet
Chú ý: Phuong thuc executeQuery tra vê môt tâp kêt qua tu CSDL duoc chua trong dôi
tuong ResultSet, nên thông thuong ban së lây vê tham chiêu dên kêt tâp qua báng cách:
ResultSet rs=stmt.executeQuery(QUERY_SQL_STRING);
Trang 155
Ví du sau lây vê tât ca các ban ghi cua bang SinhVien và hiên thi ra màn hình
ResultSet rs=stmt.executeQuery(“SELECT * FROM SinhVien”);
While(rs.next())
{ //.. Xu lý tâp kêt qua
}
d) Xu lý tâp kêt qua ResultSet
Các phuong thúc dùng dê di chuyên con tro
Các phuong thuc sau dùng dê di chuyên con tro:
Phuong thúc Ý nghia
next
Di chuyên con tro sang ban ghi kê trong tâp ban ghi, phuong thuc tra
vê true nêu viêc di chuyên là thành công nguoc lai cho false
previous
Di chuyên con tro vê ban ghi truoc ban ghi hiên tai, phuong thuc tra vê
true nêu viêc di chuyên là thành công nguoc lai cho false
last
Di chuyên con tro vê ban ghi cuôi cùng trong tâp ban ghi, phuong thuc
tra vê true nêu viêc di chuyên là thành công nguoc lai cho false
first
Di chuyên con tro vê ban ghi dâu tiên trong tâp ban ghi, phuong thuc
tra vê true nêu viêc di chuyên là thành công nguoc lai cho false
afterLast
Di chuyên con tro vê truoc ban ghi dâu tiên trong tâp b¶n ghi
beforeFirst
Di chuyên con tro vê sau ban ghi cuôi cùng trong tâp ban ghi
absolute(int pos)
Di chuyên con tro vê ban ghi thu pos tính tu ban ghi dâu tiên nêu pos
là sô duong, hoác di chuyên vê ban ghi thu pos tính tu ban ghi cuôi
cùng nêu pos là sô â
relative(int pos)
Di chuyên con tro vê truoc ban ghi hiên tai pos ban ghi nêu pos là sô
âm, hoác di chuyên vê phía sau pos ban ghi so voi ban ghi hiên tai nêu
pos là sô duong
Su dung các phuong thúc getXXX
Ta su dung phuong thuc getXXX dê nhân vê giá tri hiên tai cua môt côt tuong ung, tuy
theo kiêu du liêu cua côt mà ban su dung phuong thuc getXXX tuong ung, ví du nêu
côt có kiêu là VARCHAR thì ban su dung phuong thu getString
Ví du: liêt kê tât ca các ban ghi cua bang COFFEES
String query = "SELECT COF_NAME, PRICE FROM COFFEES";
ResultSet rs = stmt.executeQuery(query);
while (rs.next())
{ // su dung phuong thuc getString vì côt //COF_NAME có kiêu VARCHAR
String s = rs.getString("COF_NAME");
float n = rs.getFloat("PRICE");
// Su dung phuong thuc getFloat vì côt PRICE có kiêu float
Trang 156
System.out.println(s + " " + n);
}
Chú ý: Ban có thê su dung thu tu côt khi lây vê du liêu thay cho tên côt
Cháng han trong ví du trên ban có thê thay
String s = rs.getString("COF_NAME"); boi
String s = rs.getString(1);
Và float n = rs.getFloat("PRICE"); boi
float n = rs.getFloat(2)
Sau dây là bang các phuong thúc tuong ú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 MN I E L O E U I H A O I A O A I I
N A T G A O U C MT A R N N R N T MM
Y L E I L A B I E R C G A B G E E E
I L G N T L MR 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
getDouble x x x x x X X x x x x x x
getBigDecimal 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
Trang 157
getTime x x x X x
getTimestamp x x x x x X
getAsciiStream x x X x x x
getUnicodeStream x x X x x x
getBinaryStream x x X
getObject x x x x x x x x x x x x x x x x x x x
Trong bang trên vi trí duoc dánh “x” trên hàng cua phuong thuc getXXX, thì ta có
thê su dung phuong thuc này dê nhân vê giá tri cua côt có kiêu du liêu tuong ung, vi
trí dánh “X” thì phuong thuc dó là phuong thuc su dung thích hop nhât
Câp nhât tâp ResultSet
Trong phân truoc ta dùng các lênh SQL- DML dê câp nhât truc tiêp vào bang cua
CSDL. Trong phân này ta su dung các phuong thuc trong JDBC 2.0 dê thuc hiên cung
công viêc dó.
Diêu ban cân phai chú ý là ta câp nhât du liêu cua bang thông qua các ResultSet, thê
nên các ResultSet này cân phai là các ResultSet câp nhât duoc.
Ta có các phuong thuc updateXXX() khác nhau ung voi các kiêu du liêu mà JDBC
hô tro. Tuong tu nhu phuong thuc getXXX() khi ta nhân thông tin tu bang. Nhu
updateFloat(),updateInt(),updateString(), …
Sau khi gán gía tri cho các truong báng các phuong thuc updateXXX() tuong ung,
ban xác nhân viêc câp nhât báng phuong thuc updateRow(). Phuong thuc này hoat dông
tuong tu nhu phuong thuc commit(), phuong thuc updateRow() có nhiêm vu ghi lai su thay
dôi dôi voi voi hàng hiên tai (dang sua) vào trong bang CSDL trên dia.
Nhu vây khác voi các lênh SQL-DML, co chê câp nhât này chi có tác dung dôi voi
ban ghi hiên hành. Thê nên dê sua lai ban ghi nào ban phai di chuyên con tro ban ghi vào
ban ghi cân sua báng môt trong các phuong thuc dã liêt trong phân truoc.
Ta cung có môt phuong thuc tuong tu nhu phuong thuc rollback() là phuong thuc
cancelRowUpdate(). Khi goi phuong thuc này các thay dôi do goi phuong thuc
updateXXX() kê tu sau câu lênh updateXXX() lân truoc së bi vô hiêu hoá.
Ví du: Câp nhât ResultSet
rs.first(); // Nhay dên ban ghi dâu tiên
rs.updateString(“tensv”, “Nguyên Van Hung”); // gán gía tri moi cho côt tensv
rs.updateRow(); // Xác nhân su thay dôi
rs.last(); // Nhay dên ban ghi cuôi cùng
rs.updateString(“tensv”, “Nguyên Van Dat”); // gán gía tri moi cho côt tensv
rs.cancelRowUpdate(); // Huy bo viêc câp nhât trên
Thêm ban ghi mói
Trang 158
Ngoài viêc su dung các lênh SQL-DML dê thêm các ban ghi trong bang. ta còn có
thê thêm chúng báng cách thông qua các phuong thuc cua dôi tuong ResultSet câp nhât
duoc.
Môt ResultSet câp nhât duoc luôn tôn tai môt ban ghi dác biêt goi là insertrow dê
dùng cho viêc thêm môt ban ghi moi. Ban ghi này không là môt thành phân cua ResultSet.
Thuc chât nó chi là môt vùng dêm dê thêm môt ban ghi moi.
Các buóc dê thêm môt ban ghi mói vào tâp ResultSet
Di chuyên con tro dên ban ghi tam insertrow báng phuong thuc moveToInsertRow();
Thuc hiên viêc diên các giá tri vào các côt tuong ung báng các phuong thuc
updateXXX();
Sau khi chác chán ráng các giá tri thêm vào là dúng. Ta goi phuong thuc insertRow()
dê xác nhân viêc thêm moi ban ghi vào bang và ResultSet.
Ví du: Thêm ban ghi vào ResultSet
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // Nap trình diêu khiên
Connection cn=DriverManager.getConnection("jdbc:odbc:t"); // Lây vê kêt nôi
Statement st=cn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE); //Tâp ResultSet có thê câp nhât duoc
ResultSet rs=st.executeQuery("SELECT * FROM sinhvien"); //Lây vê tâp ResultSet
rs.moveToCurrentRow(); //Buóc 1: Di chuyên con tro dên ban ghi tam dê thêm moi
rs.updateString("masv","005"); //Buóc 2: Gán gía tri cho các côt báng phuong
//updateXXX() tuong ung
rs.updateString("tensv","Nguyên Tu Hào");
rs.updateDate("namsinh",new Date(2004,5,30));
rs.insertRow(); //Buóc 3: Xác nhân su thêm moi
Chú ý:
+ Nêu khi gán giá tri cho các côt mà ta bo sót môt sô côt không gán giá tri khi dó các
côt dó së nhân các giá tri NULL. Khi dó nêu côt dó có thuôc tính không cho phép nhân gía
tri NULL thì ban së nhân duoc môt ngoai lê SQLException.
+ Không có phuong thuc dê ta huy bo viêc thêm moi ban ghi. Tuy nhiên dê huy bo
viêc thêm moi ban chi cân di chuyên con tro ban ghi ra khoi ban ghi tam báng môt trong
các phuong thuc di chuyên chuyên con tro.
Xoá ban ghi
Dê xoá môt ban ghi ban có thê su dung các lênh SQL-DML, ban có thê thuc hiên
viêc này báng các phuong thuc cua dôi tuong ResultSet.
Các buoc dê xoá môt ban ghi khoi ResultSet
Trang 159
Di chuyên con tro dên ban ghi cân xoá
Goi phuong thuc deleteRow();
Chú ý: Tuv vào trình diêu khíên mà viêc xoá duoc thuc hiên ngay hay chí là dánh dâu
xoá. dê biêt chác chán ban nên tham khao tài liêu di kèm voi Driver ban su dung.
Ví du: Xoá ban ghi
rs.first(); // Xóa ban ghi dâu tiên
rs.deleteRow();
rs.absolute(3); // Xoá ban ghi thu 3
rs.deleteRow();
rs.last(); // Xoá ban ghi cuôi cùng
rs.deleteRow();
2. Su dung dôi tuong Prepared Statements
Khi nào su dung dôi tuong Prepared Statements?, câu tra loi duoc phân tích sau:
- Môi khi thuc thi môt lênh SQL thì DBMS lai phai phân tích lai cú pháp cua lênh, sau dó
tôi uu lênh SQL, công viêc này mât rât nhiêu thoi gian, nêu ban cân chèn 100 dòng vào
CSDL, thê thì ban phai su dung 100 lênh executeUpdate dê chèn 100 dòng, do vây phai
mât 100 lân phân tích lênh, 100 lân tôi uu hoá lênh, ban së dát câu hoi có các nào mà chi
cân phân tích lênh, tôi uu lênh chi môt lân mà thôi, vâng cách dó chính là dôi tuong
Prepared Statements.
- Dôi khi ban muôn thuc hiên môt lênh SQL mà các thông sô cu thê lai chua biêt, trong
truong hop này bát buôc ban phai su dung truy vân tham sô hoá, tuy nhiên dôi tuong
Statement lai không hô tro truy vân tham sô hoá
Ví du: Sau câp nhât môt sô dòng cua bang COFFEES su dung dôi tuong 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();
Trang 160
}
Nhu ban thây qua ví du trên dê:
+ Lây vê dôi tuong PreparedStatement ban su dung phuong thuc prepareStatement
cua dôi tuong Connection và truyên vào môt câu lênh SQL chua tham sô
+ Gán giá tri cho các tham sô ban su dung phuong thuc setXXX(index, value)
+ Thuc thi truy vân voi các tham sô vua cung câp ban goi phuong thuc
executeUpdate() cua doi tuong prepareStatement.
3. Goi thu tuc luu trû báng JDBC
JDBC cho phép ban goi môt thu tuc luu tru trong CSDL, tu trong ung dung viêt
báng java, dê có thê goi môt thu tuc luu tru truoc tiên ban tao ra môt dôi tuong
CallableStatement dôi tuong này có phuong thuc prepareCall giúp ban có thê goi thu
tuc luu tru nôi
Các buoc: 1. CallableStatement cs = con.prepareCall("{call tên_thu_tuc_luu_tru}");
2. Goi thu tuc executeXXX() tuong ung dê thuc thi thu tuc luu tru.
VI. Quan lý giao dich
Khi môt kêt nôi duoc tao, nó duoc dát trong trang thái auto- commit, tuc là nó tu
dông commit sau khi thuc thi thành công môt lênh don, tuy nhiên ban có thê dát lai
chê dô auto- commit dê ban có thê quyêt dinh commit hay rollback lai môt nhóm
lênh. Nhu doan mã sau:
con.setAutoCommit(false);
Ví du:
// Tát chê dô auto-commit
con.setAutoCommit(false);
// tác dô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();
// dát lai chê dô auto-commit
con.setAutoCommit(true);
Ví du: Lóp truy câp AccessDriver
Trang 161
import java.sql.*;
import java.util.*;
import java.io.*;
public class AccessDriver {
public static void main(String[] args) throws SQLException,IOException{
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //Nap trinh dieu khien Access
}
catch (ClassNotFoundException ex) {
System.out.print("Error: " + ex.getMessage());
}
try {
Properties pro = new Properties();
pro.put("charSet", "UTF8"); //ma unicode
String urldb ="jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=c:/data.mdb";
Connection conn = DriverManager.getConnection(urldb, pro);
PreparedStatement pst = conn.prepareStatement("Insert into test(a,b) values (?,?)");
pst.setString(1, "0021");
pst.setString(2, "Tran Thi Hong Ha");
boolean yes = pst.execute(); //PreparedStatement interface thuc thi sql co tham so
dau vao
System.out.println(yes);
Statement st =
conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
//st.executeUpdate("Create Table Test (a text(10),b text(255))");
st.executeUpdate( "Insert Into Test(a,b) values ('1234','Nguyen Xuan Truong')");
// st.executeUpdate("update test set b='dhrhrtr' where a='0021'");
st.executeUpdate("Delete from test where a='12'");
String sql = "Select * from test";
ResultSet rs = st.executeQuery(sql); //lay ve tap ban ghi
//cap nhat du lieu bang ResultSet
// rs.moveToCurrentRow();
rs.moveToInsertRow();
rs.updateString("a", "rs.update");
rs.updateString("b", "Cap nhat du lieu bang 455454ResultSet");
//rs.updateRow();
rs.insertRow();
//Xoa du lieu bang ResultSet
rs.absolute(3); //System.out.println("Rs.absolute(1) " + rs.getString(1));
rs.deleteRow();
//Updatable test
ResultSetMetaData rd = rs.getMetaData();
if (rs.getConcurrency() == ResultSet.CONCUR_UPDATABLE)
System.out.println("Rs is Updatable");
else System.out.println("Rs is ReadOnly");
int cols = rd.getColumnCount();
System.out.println("Start----->rd.getColumnLabel");
for (int i = 1; i <= cols; i++) //return feildName
System.out.print(rd.getColumnLabel(i) + ( (i == cols) ? "\n" : "\t"));
Trang 162
System.out.println("End----->rd.getColumnLabel");
while (rs.next()) { //hien thi thong tin, in xuoi
System.out.println(rs.getString("a") + " " + rs.getString("b"));
}
System.out.println("--------------------------------");
rs.last(); //in nguoc lai
while (rs.previous()) {
System.out.println(rs.getString("a") + " " + rs.getString("b"));
}
rs.close();
conn.close();
}
catch (SQLException ex) {
System.out.print("Error: maxlenght 10 " + ex.getMessage());
}
}
}
Ví du: Lop truy câp SQLDriver
import java.sql.*;
public class SQLDriver {
public static void main(String []a){
try{ //Nap trinh dieu khien SQLServer
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
}
catch(ClassNotFoundException ex){
System.out.println("Can not load driver " +ex.getMessage());
System.exit(0);
} //jdbc:microsoft:sqlserver://server1:1433;user=test;password=secret
String
url="jdbc:microsoft:sqlserver://xuantruong:1433;DatabaseName=BOOK;user=sa;passwor
d=";
try{ Connection conn=DriverManager.getConnection(url);
Statement st=conn.createStatement();
ResultSet rs=st.executeQuery("Select * from tblSach");
while(rs.next()){
System.out.println(rs.getString(1)+"\t\t"+rs.getString(2));
}
rs.close();
conn.close();
}
catch(SQLException ex){
System.out.println("Can not connection to database " + ex.getMessage());
System.exit(0);
}
System.out.println("OK");
}
}
Ví du:Lóp truy câp JdbcOdbcDriver
Trang 163
package com.borland.samples.welcome;
import java.sql.*;
import javax.sql.*;
public class Connect {
public static void main(String args[]) throws ClassNotFoundException,SQLException {
System.out.println("Ket noi CSDL");
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String url="jdbc:odbc:myDatabase";
Connection conn=DriverManager.getConnection(url,"login","password");
Statement stmt=conn.createStatement();
//Them record vao bang
String sql0="INSERT INTO KhachHang(Id,TenKH,DiaChi,Luong) VALUES('8','Hoang
Anh','HP','900')";
stmt.executeUpdate(sql0);
//Cap nhat du lieu (Tang luong cho cac cong nhan)
String sql2="UPDATE Khachhang SET Luong=Luong+luong*0.1";
int n=stmt.executeUpdate(sql2);
if (n < 1) System.out.println("Khong co ban ghi nao duong cap nhat");
else System.out.println("Co "+ n +" ban ghi nao duong cap nhat");
//Doc Record ra mh
String sql="SELECT Id,TenKH,DiaChi,Luong FROM KhachHang";
ResultSet rs=stmt.executeQuery(sql);
while (rs.next())
{ int id=rs.getInt("Id");
double l=rs.getDouble("Luong");
String s=rs.getString("TenKH");
String d=rs.getString("DiaChi");
System.out.println("ID=" +id +" " + s+ " " + d + " Luong=" + l) ;
}
} catch(SQLException e) {System.out.println("Loi thao tac CSDL");}
}
}
Trang 164
Chuong 8: LAP TRÌNH SOCKET
I. Các kiên thúc liên quan
Truoc khi bát dâu hoc bài này các ban cân doc lai các kiên thuc liên quan sau:
- Giao thuc, yêu câu tôi thiêu các ban phai nám duoc 3 giao thuc : IP, TPC, UDP
- Cách dánh dia chi IP, dia chi dang tên miên, giao thuc chuyên dôi dia chi IP thành dia chi
tên miên, và nguoc lai
- Môt sô dia chi dác biêt: dia chi láp, dia chi broadcash, multicash…
- Công giao thuc
- Phân biêt duoc su khác nhau, giông nhau giua 2 giao thuc TCP và UDP
1. Giói thiêu Socket
Socket là môt giao diên lâp trình ung (API - Application Program Interface) dung
mang, thông qua giao diên này ta có thê lâp trình diêu khiên viêc truyên thông giua 2 máy
su dung các giao thuc muc thâp nhu TCP, UDP…, Socket là môt su truu tuong hoá o muc
cao, có thê tuong tuong, nó nhu là môt thiêt bi truyên thông 2 chiêu tuong tu nhu têp tin,
chúng ta gui/ nhân du liêu giua 2 máy, tuong tu nhu viêc doc/ ghi trên têp tin.
Dê liên lac thông qua Socket, ta cân tiên hành các thao tác:
- Tao lâp hay mo môt Socket
+ Gán môt Socket voi môt dia chi, dia chi này chính là dia chi cua máy mà nó cân liên lac
+ Thuc hiên viêc liên lac, có 2 kiêu liên lac tuy thuôc vào chê dô kêt nôi:
a) Liên lac trong chê dô không kêt nôi:
Hai tiên trình liên lac voi nhau không kêt nôi truc tiêp
môi thông diêp gui di phai kèm theo dia chi cua nguoi nhân
Hình thuc liên lac này có dác diêm:
nguoi gui không chác chán thông diêp cua ho có dên tay nguoi nhân không
môt thông diêp có thê gui nhiêu lân
thông diêp gui sau có thê dên dích truoc thông diêp gui truoc dó
b) Liên lac trong chê dô kêt nôi:
Có môt duong kêt nôi “ao” duoc thành lâp giua 2 tiên trình, truoc khi môt kêt nôi duoc
thành lâp thì môt trong 2 tiên trình phai doi tiên trình kia yêu câu kêt nôi, có thê su dung
Socket dê liên lac theo mô hình Client/Server. Trong mô hình này server su dung loi goi
listen và accept dê láng nghe và châp nhân môt yêu câu kêt nôi
2. Lâp trình Socket trong java
Java cung câp môt sô lop cho phép các ung dung mang có thê trao dôi voi nhau qua
co chê Socket, cu thê lop Socket cung câp cho ta co chê liên lac trong chê dô kêt nôi (su
dung giao thuc TCP) và lop DatagramSocket cho phép các ung dung mang liên lac voi
nhau trong chê dô không kêt nôi (su dung giao thuc UDP), tât ca các lop liên quan dên viêc
lâp trình Socket duoc java nhóm lai và dê trong gói java.net
II. Khao sát môt sô lóp trong gói java.net
1. Lóp InetAddress
Môi môt máy khi tham gia truyên thông cân phai có môt dinh danh, dinh danh này
phai là duy nhât, dinh danh này duoc thê hiên báng dia chi IP hoác dia chi duoi dang
Trang 165
tên miên. Lop InetAddress biêu thi cho môt dia chi cua môt máy nào dó, khi ta muôn
liên lac voi môt máy o xa, ta phai biêt duoc dia chi IP cua máy o xa, tuy nhiên dia
chi IP thì rât khó nho, dôi khi ta không thê biêt chính xác dia chi IP cua máy dó, boi
vì nhiêu nguyên nhân khác nhau nhu: máy dó khoi dông tu xa hoác duoc nôi vào
nhà cung câp dich vu Internet, do vây môi lân kêt nôi vào nhà cung câp dich vu ISP
ta lai có 1 dia chi IP khác nhau. Vây thê thì làm thê nào dê ta có thê liên lac voi máy
o xa khi ta chi biêt dia chi máy dó duoi dang tên miên?, câu tra loi là lop
InetAddress dã làm diêu dó cho ta, lop này tu dông chuyên dia chi dang tên miên
thành dia chi IP và nguoc lai.
Lop InetAddress cung câp môt sô phuong thuc tinh (static) dùng dê chuyên dôi dia chi
duoi dang tên miên thành dia chi IP và nguoc lai. Có môt sô phuong thuc sau mà ban cân
quan tâm:
Phuong pháp Mô ta
Public void equals( Object obj) So sánh 2 dôi tuong
Public byte[] getAddress() Lây vê dia chi IP duoi dang mang byte
public static InetAddress[]
getAllByName(String host)
throws UnknownHostException
Tra vê mang dôi tuong InetAddress, vì môt máy
có thê có nhiêu dia chi IP (do có nhiêu card
mang), nên phuong thuc này tra vê môt mang
chua tât ca các dia chi tuong ung voi tên miên.
public static InetAddress
getByName(String host)
throws UnknownHostException
Tra lai dôi tuong InetAddress có tên duoc chi
ra, tên này là môt xâu kí tu duoi dang tên miên
hoác dia chi IP
public String getHostAddress() Tra vê dia chi IP cua máy chu
public String getHostName() Tra vê tên cua máy chu
public static InetAddress
getLocalHost()
throws UnknownHostException
Tra vê dôi tuong InetAddress kêt hop voi chính
máy dó
public boolean isMulticastAddress() Kiêm tra xem dia chi này có phai là dia chi
Multicast không
Chú ý:
Trong gói java.net còn lop Inet4Address và lop Inet6Address hai lop này thê hiên cho
các dia chi IP version 4 và IP version 6, nó gôm tât ca các thành phân cua lop
InetAddress
Ta cân thêm mênh dê import lop java.net.InetAddress truoc khi có thê su dung nó.
Trang 166
Phuong thuc getByName së có gáng phân giai tên miên thành dia chi IP tuong ung báng
cách: Truoc tiên nó di 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 dên máy chu DNS dê yêu câu phân giai
tên này thành dia chi IP, nêu không thê phân giai duoc tên này thì nó së sinh ra môt
ngoai lê UnknownHostException, thê nên ban cân dát chúng vào môt khôi try ..catch.
Ví du 1: Minh hoa cách su dung các phuong thuc getByName dê tao ra môt InetAddress
import java.net.*;
class InetAddress1 {
public static void main(String[] args) {
try {
InetAddress address = InetAddress.getByName("www.theht.edu.vn");
System.out.println(address);
}
catch (UnknownHostException ex) {
System.out.println("Could not find www.theht.edu.vn");
}
}
}
Kêt qua chay chuong trình nhu sau:
www.theht.edu.vn/127.0.0.1Ngoài cách truyên vào phuong thuc getByName môt xâu ký tu
thê hiên tên máy ban ta thê truyên vào môt xâu thê hiên dia chi IP cua máy nhu sau:
InetAddress address = InetAddress.getByName("192.168.101.1");
Ví du 2: Tao ra môt InetAddress tuong ung voi máy cuc 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 qua chay chuong trình nhu sau:
Trang 167
theht1/192.168.101.1Ví du 3: Nêu máy ban có cài nhiêu card mang ban có thê lây vê môt
mang các InetAddess tuong ung voi dia chi IP cho tung card mang dó:
import java.net.*;
class AllAddressesOfTheht {
public static void main(String[] args) {
try {
InetAddress[] addresses =
InetAddress.getAllByName("www.theht.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.theht.edu.vn");
}
}
}
Kêt qua chay chuong trình nhu sau:
www.theht.edu.vn /192.168.101.1www.theht.edu.vn /10.0.0.2www.theht.edu.vn
/162.163.10.5www.theht.edu.vn /3.152.90.25so di cho kêt qua nhu trên là do máy cua tôi
có cài 4 card mang, tuong ung voi môi card mang tôi dát môt dia chi IP cho nó.
Nêu máy cua ban có nôi mang Internet ban có thê kiêm tra xem máy chu
www.microsoft.com cua Microsoft duoc cài bao nhiêu bô giao tiêp mang báng cách
thayInetAddress.getAllByName("www.theht.edu.vn"); boi
InetAddress.getAllByName("www.microsoft.com");
Ví du 4: Lây vê tên máy khi biêt dia chi IP cua nó, dê lây vê tên cua máy ta su dung
phuong thuc getHostName nhu 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);
}
}
}
Trang 168
Kêt qua ra nhu sau:
theht
Ví du 5: Lây vê dia chi IP cua máy khi biêt tên cua máy, dê lây vê dia chi IP cua máy ta su
dung phuong thuc getHostAddress nhu 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.");
}
}
}
Kêt qua in ra nhu sau:
My address is 192.168.101.1Ta có thê lây vê dia chi IP tuong ung voi môt tên miên bât ky
không nhât thiêt là máy cuc bô nhu trên, cháng han ban có thê lây vê dia chi IP cua máy
www.theht.edu.vn hoác www.microsoft.com nhu sau:
import java.net.*;
class GetHostAddress1 {
public static void main(String[] args) {
try {
InetAddress me = InetAddress.getByName("www.theht.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 qua in ra nhu sau:
Address is 192.168.101.1
Trang 169
Ví du 6: Kiêm tra xem hai dia chi tên miên có cùng môt dia chi IP hay không. dê kiêm tra
diêu này ta su dung phuon thuc equals nhu sau:
import java.net.*;
class Equal {
public static void main(String args[]) {
try {
InetAddress add1 = InetAddress.getByName("www.theht.edu.vn");
InetAddress add2 = InetAddress.getByName("www.theht.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");
}
}
catch (UnknownHostException ex) {
System.out.println("Khong the tim thay host.");
}
}
}
Kêt qua cho nhu sau:
Hai dia chi nay khac nhau
Ví du 7: Xây dung chuong trìn HostLookup tuong tu nhu chuong trình NSLookup cua
Windows, chuong trình này có nhiêm vu khi ban gõ vào dia chi IP thì nó së tra vê dia chi
tên miên và nguoc 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));
Trang 170
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);
}
}
}
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 dia chi host duói dang tên miên hay dia chi IP
private static boolean isHostname(String host) {
char[] ca = host.toCharArray();
for (int i = 0; i < ca.length; i++) {
Trang 171
if (!Character.isDigit(ca[i])) {
if (ca[i] != '.')return true;
}
}
return false;
}
}
2. Lóp URL và URI
Lop URL là môt lop rât don gian giúp ban trong viêc dinh vi và lây vê du liêu tu
mang, mà ban không cân phai quan tâm dên giao thuc duoc su dung, dinh dang cua du liêu
hoác không cân quan tâm dên cách giao tiêp voi máy chu.
Tao ra môt URL
Không giông nhu dôi tuong InetAddress ban có thê su dung hàm tao cua lop URL dê tao ra
môt dôi tuong URL moi. Có sáu hàm tao khác nhau cua lop URL cho phép ban tao ra các
URL voi các yêu câu khác nhau. Tât ca các hàm tao này dêu ném ra ngoai lê
MalformedURLException nêu ban tao ra môt URL tu môt giao thuc không duoc hô tro
hoác các thông tin cung câp trong URL không chính xác thì ban së nhân duoc môt ngoai lê
MalformedURLException
a) Tao ra môt URL tù môt xâu
public URL(String url) throws MalformedURLException
Giông nhu các hàm tao khác ban chi cân dùng toán tu new và cung giông các hàm tao khác
cua lop nó ném ra ngoai lê MalformedURLException.
Ví du 1: Tao ra môt URL tu môt xâu và bát ngoai lê sinh ra
try {
URL u = new URL("http://www.utehy.edu.vn/");
}
catch (MalformedURLException ex) {
System.err.println(ex);
}
Ví du 2: Ví du này tao ra môt sô URL và kiêm tra xem giao thuc tuong ung voi các URL
có duoc hô trõ trong virtual machine cua ban hay không
/* Which protocols does a virtual machine support? */
import java.net.*;
class ProtocolTester {
public static void main(String[] args) {
testProtocol("http://www.adc.org"); // hypertext transfer protocol
testProtocol("https://www.amazon.com/exec/obidos/order2/"); // secure http
// file transfer protocol
testProtocol("ftp://metalab.unc.edu/pub/languages/java/javafaq/");
testProtocol("mailto:elharo@metalab.unc.edu"); // Simple Mail Transfer Protocol
testProtocol("telnet://dibner.poly.edu/"); // telnet
testProtocol("file:///etc/passwd"); // local file access
testProtocol("gopher://gopher.anc.org.za/"); // gopher
testProtocol( // Lightweight Directory Access Protocol
Trang 172
"ldap://ldap.itd.umich.edu/o=University%20of%20Michigan,c=US?postalAddress");
testProtocol( // JAR
"jar:http://cafeaulait.org/books/javaio/ioexamples/javaio.jar!"
+ "/com/macfaq/io/StreamCopier.class");
testProtocol("nfs://utopia.poly.edu/usr/tmp/"); // NFS, Network File System
testProtocol("jdbc:mysql://luna.metalab.unc.edu:3306/NEWS");
// a custom protocol for JDBC
// rmi, a custom protocol for remote method invocation
testProtocol("rmi://metalab.unc.edu/RenderEngine");
testProtocol("doc:/UsersGuide/release.html"); // custom protocols for HotJava
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 qua chay trên máy cua tôi nhu sau:
http is supported
https is supported
ftp is supported
mailto is supported
b) Tao ra môt URL tù các phân riêng le
Hàm tao này cho gôm ba phân riêng biêt, chúng cho biêt: Giao thuc, tên máy chu,
têp tin mà URL này su dung.
public URL(String protocol, String hostname, String file)
throws MalformedURLException
Hàm tao này së tu dông dát port là giá tri mác dinh, tuy theo giao thuc mà ban chi
dinh nó së su dung mà giá tri mác dinh này là khác nhau: Ví du nhu : http thì port=80,
ftp=23...
Ví du:
try {
URL u = new URL("http", "www.microsoft.com", "/index.html");
}
catch (MalformedURLException ex) {
// All VMs should recognize http
}
Doan chuong trình trên tao ra môt URL chi dên http://www.microsoft.com/index.html,
công mác dinh là 80
Trang 173
Dê tao ra môt URL voi môt công chi dinh ban su dung hàm tao sau:
public URL(String protocol, String host, int port, String file) throws
MalformedURLException
Ví du: Tao ra môt URL gán voi máy localhost trên công 8080
try {
URL u = new URL("http", "localhost", 8080, "/index.html");
}
catch (MalformedURLException ex) {
System.err.println(ex);
}
Ví du này tao ra môt URL tro dên http://localhost: 8080/index.html
c) Tao ra môt URL tù môt URL khác
Hàm tao này cho phép ban tao ra môt URL tu môt URL khác, cú pháp nhu sau:
public URL(URL base, String relative) throws MalformedURLException
Ví du:
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í du này thì u1 dang tro dên http://www.ibiblio.org/javafaq/index.html còn u2 thì
dang tro dên http://www.ibiblio.org/javafaq/ mailinglists.html.
Môt vài phuong thúc cua lóp URL
- public String getHost( ) tra vê tên cua máy chu
- public int getPort( ) tra vê công duoc su dung
- public int getDefaultPort( ) tra vê công mác dinh cua giao thuc duoc su dung. Ví du nhu :
http=80, email=25, ftp=23...
- public String getFile( ) tra vê tên têp tin
- public String getPath( ) // Java 1.3 tra vê duong dân dên file, duong dân này thuong là
môt query string.
- public String getRef( ), trong ví du sau thì getRef së tra 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 tra vê môt query string trong URL
Ví du: Trong ví du này thì getQuery së tra 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( ));
- public String getUserInfo( ) // Java 1.3 tra vê user name
- public String getAuthority( ) // Java 1.3
Trang 174
Ví du sau minh hoa các phuong thuc 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 qua chay chuong trình nhu sau:
The URL is http://java.sun.comThe scheme is httpThe user info is nullThe host is
java.sun.comThe port is -1The path is The ref is nullThe query string is nullc) Nhân vê dû
liêu tù URL
Ban có thê nhân vê du liêu duoc chi dinh trong URL báng cách su dung cách phuon thuc
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
Phuong thuc này së kêt nôi dên máy chu và yêu câu lây vê môt InputStream gán voi tài
nguyên duoc chi dinh trong URL.
Trang 175
Ví du sau lây vê nôi dung cua trang web duoc chi dinh 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");
}
catch (IOException ex) {
System.err.println(ex);
}
} // end main
} // end SourceViewer
Kêt qua chay nhu 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 ban</font></p></body></html>
- Phuong thúc public URLConnection openConnection( ) throws IOException
Phuong thuc này mo môt socket kêt nôi dên máy chu. Nêu phuong thuc này thât bai
nó ném ra ngoai lê IOException.
Ví du:
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);
}
Trang 176
Trong java 1.5 còn môt phuong thuc duoc nap chông nhu sau:
public URLConnection openConnection(Proxy proxy) throws IOException
Phuong thuc này rât huu dung khi trong mang cua ban có su dung proxy
- Phuong thúc public final Object getContent( ) throws IOException
Ví du:
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 qua chay nhu sau:
I got a sun.net.www.protocol.http.HttpURLConnection$HttpInputStreamNêu thay URL
u = new URL("http://localhost:80/index.html"); boi URL u = new
URL("http://localhost:80/print.gif"); kêt qua thu duoc nhu sau:
I got a sun.awt.image.URLImageSource
3. Lóp Socket
Lop này duoc dùng cho ca máy chu và máy khách. Dôi voi máy khách nó thuong dùng dê
kêt nôi dên máy chu, còn dôi voi máy chu nó thuong dùng dê dáp lai kêt nôi tu máy khách.
Thông thuong ta tao ra môt Socket báng cách su dung hàm tao cua lop Socket. Sau dây là
môt sô hàm tao cua lop Socket.
3.1 Môt sô hàm tao cua lóp Socket
a) public Socket(String host, int port) throws UnknownHostException, IOException
Ta thuong su dung hàm tao này dê kêt nôi dên máy chu. Trong hàm tao này tên cua
máy là môt xâu ký tu, tên cua máy chu có thê là tên mìên hoác dia chi IP. Nêu nhu không
tôn tai máy này thì nó së ném ra môt ngoai lê UnknownHostException. Nêu Socket không
thê mo vì bât cu lý do nào thì nó ném ra ngoai lê IOException.
Trang 177
Ví du: Kêt nôi dên web server www.theht.edu.vn
try {
Socket toTheht= new Socket("www.theht.edu.vn", 80);
//~ Socket toTheht= 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 thuong su dung hàm tao này dê kêt nôi dên máy chu khi biêt môt InetAddress gán voi
nó.
Ví du sau kêt cung kêt nôi dên máy chu www.theht.edu.vn trên công 80
try {
InetAddress theht = InetAddress.getByName("www.theht.edu.vn");
//~ InetAddress theht = InetAddress.getByName("162.135.10.5");
Socket thehtSocket = new Socket(theht , 80);
// send and receive data...
}
catch (UnknownHostException ex) {
System.err.println(ex);
}
catch (IOException ex) {
System.err.println(ex);
}
- public Socket(String host, int port, InetAddress interface, int localPort) throws
IOException, UnknownHostException
Nêu máy cua ban có nhiêu bô giao tiêp mang thì khi kêt nôi dên máy chu ta cân chi
ra kêt nôi duoc thiêt lâp thông qua giao diên mang nào.
Nêu tham sô port nhân giá tri 0 thi java runtime së chon ngâu nhiên môt công nào dó chua
duoc su dung trong khoang 1024 à 65535.
Ví du:
try {
InetAddress inward = InetAddress.getByName("theht");
Socket socket = new Socket("www.theht.edu.vn", 80, inward, 0);
// work with the sockets...
}
catch (UnknownHostException ex) { System.err.println(ex);
}
catch (IOException ex) {
System.err.println(ex);
}
Trang 178
- public Socket(InetAddress host, int port, InetAddress interface, int localPort) throws
IOException
Hàm tao này cung tuong tu nhu hàm tao trên.
Ví du:
try {
InetAddress inward = InetAddress.getByName("theht");
InetAddress http= InetAddress.getByName("www.theht.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);
}
3.2. Lây vê thông tin gán vói Socket
- Phuong thuc public InetAddress getInetAddress( ) dùng dê lây vê dôi tuong InetAddress
tuong ung voi máy remote.
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);
}
- Phuong thuc public int getPort( ) dùng dê lây vê công cua máy remote.
Ví du:
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);
}
Trang 179
- Phuong thuc public int getLocalPort( ) dùng dê lây vê công cua máy cuc bô dùng dê
giao tiêp voi máy o xa.
Ví du:
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);
}
- Phuong thuc public InetAddress getLocalAddress( ) dùng dê lây vê dôi tuong
InetAddress gán voi card mang dùng dê giao tiêp.
Ví du:
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í du sau in ra màn hình môt sô thông tin gán voi Socket
import java.net.*;
import java.io.*;
public class SocketInfo {
public static void main(String[] args) {
try {
Socket theSocket = new Socket("www.theht.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");
}
Trang 180
catch (SocketException ex) {
System.err.println("Could not connect to host");
}
catch (IOException ex) {
System.err.println(ex);
}
} // end main
} // end SocketInfo
- Phuong thuc public OutputStream getOutputStream( ) throws IOException dùng dê lây
vê môt OutputStream. Viêc gui du liêu dên máy remote duoc thông qua OutputStream này.
- Phuong thuc public InputStream getInputStream( ) throws IOException phuong thuc này
dùng dê nhân vê môt InputStream. Viêc nhân du liêu tu máy remote duoc thuc hiên thông
qua InputStream này.
3.3. Dóng Socket
Khi kêt nôi không còn duoc su dung nua ban cân goi phuong thuc close() môt cách
tuong minh dê dóng Socket lai. Khi goi dên phuong thuc close java së tu dông dóng hai
luôn nhâp xuât gán voi nó. Viêc dóng Socket lai së giai phóng môt sô tài nguyên cua hê
thông.
public void close( ) throws IOException
Môt Socket së tu dông dóng lai nêu xây ra môt trong các tính huông sau:
- Ca hai luông nhâp xuât gán voi Socket dêu duoc dóng lai.
- Khi chuong trình kêt thúc.
- Hoác khi bô thu rác cua java duoc tiên hành.
Tuy các Socket cung tu dông dóng lai khi cân thiêt, nhung môt thói quen thuc hành
tôt là nên goi dên phuong thuc close() khi không còn dùng dên nó nua.
Dê dam bao Socket luôn duoc dóng lai cho dù có ngoai lê xây ra hay không. thì chô
hop lý nhât dê dóng Socket lai là trong khôi finally.
Ví du sau thê hiên diêu dó:
ocket connection = null;
try {
connection = new Socket("www.theht.edu.vn", 80);
// interact with the socket...
} // end try
catch (UnknownHostException ex) {
System.err.println(ex);
}
catch (IOException ex) {
System.err.println(ex);
}
finally {
// Dóng Socket lai
if (connection != null) connection.close( );
}
Trang 181
- Phuong thuc public boolean isClosed( ) (chi có trong java 1.4 tro lên) phuong thuc này
tra vê tru nêu nhu Socket dã duoc dóng lai, nhân vê false trong truong hop nguoc lai. Thê
nên dê dám bao các thao tác nhâp xuât không xây ra lôi ban nên su dung mâu chuong trình
sau:
if (socket.isClosed( )) {
// do something...
}
else {
// do something else...
}
Tuy nhiên nêu Socket chua bao gio duoc mo thì phuong thuc này tra vê false.
- Phuong thuc public boolean isConnected( ) (Chi có trong java 1.4 tro lên) phuong thuc
này tra vê true nêu ban dã tùng kêt nôi dên máy o xa hay chua và nhân vê false trong
truong hop nguoc lai.
Thê nên dê kiêm tra xem Socket có dang mo hay không ban cân su dung doan
chuong trình sau:
boolean connected = socket.isConnected( ) && ! socket.isClosed( );
- Phuong thuc public boolean isBound( ) (chi có trong java 1.4 tro lên) phuong thuc này
tra vê true nêu nhu Socket duoc liên kêt voi môt công cuc bô nào dó.
3.4. Truyên trong chê dô haft duplex
Kê tu phiên ban java 1.3 có thêm hai phuong thuc:
public void shutdownInput( ) throws IOException
public void shutdownOutput( ) throws IOException
Hai phuong thuc này cho phép ban dóng luông nhâp hoác xuât gán voi Socket lai.
khi này ban chi có thê truyên hoác nhân môt chiêu (haft duplex).
Ví du nhu khi ban kêt nôi dên web server dê yêu câu môt trang bât ky sau khi yêu câu xong
thì luông xuât là không còn cân thiêt nua. do vây ta nên dóng lai dê giai phóng tài nguyên.
Socket connection = null;
try {
connection = new Socket("www.theht.edu.vn", 80);
Writer out = new OutputStreamWriter(connection.getOutputStream( ));
out.write("GET / HTTP 1.0\r\n\r\n");
out.flush( );
/*
Dóng luông xuât lai. Sau khi dóng luông xuât ban vân có thê su dung luông nhâp môt cách
bình thuong
*/
connection.shutdownOutput( );
// read the response...
}
catch (IOException ex) {
}
finally {
try {
Trang 182
if (connection != null) connection.close( );
}
catch (IOException ex) {}
}
4. Lóp ServerSocket
Lop này chi dùng cho phía máy chu. Nó thuong duoc su dung dê láng nghe môt kêt nôi
dên.
4.1. Môt sô hàm tao cua 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 tao này xác dinh công, dô dài cua hàng doi dê luu tru các yêu câu kêt nôi
dên và giao diên mang duoc su dung. Bây gio ta xét cu thê tung hàm tao:
- Hàm tao public ServerSocket(int port) throws BindException, IOException
Hàm tao này së tao ra môt ServerSocket láng nghe trên công port. Nêu nhu port =0
thì hê thông së chon môt giá tri công còn rôi tiêp theo. Tuy nhiên trong truong hop này máy
khách khó có thê kêt nôi dên nó vì không biêt rõ công. Tuy nhiên trong môt sô truong hop
nó rât huu dung.
Ví du: Tao 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ê tao ra môt ServerSocket thì nó së ném ra ngoai lê IOException
- Nêu port dã duoc su dung cho môt chuong trình khác rôi thì ngoai lê BindException së
duoc ném ra.
Ví du tìm xem các công trên máy cua ban dã duoc su dung hay chua
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);
Trang 183
}
catch (IOException ex) {
System.out.println("There is a server on port " + port + ".");
} // end catch
} // end for
}
}
- Hàm tao public ServerSocket(int port, int queueLength) throws IOException,
BindException
Hàm tao này së tao ra môt ServerSocket láng nghe trên công port và tao ra môt hàng
doi cho phép queueLength kêt nôi nám trong hàng cho.
Ví du: Tao ra môt ServerSocket láng nghe trên công 3456 và cho phép tôi da 100
yêu câu kêt nôi dông thoi.
try {
ServerSocket httpd = new ServerSocket(3456, 100);
}
catch (IOException ex) {
System.err.println(ex);
}
- Hàm tao public ServerSocket(int port, int queueLength, InetAddress bindAddress)
throws BindException, IOException
Hàm tao này có nhiêm vu tuong tu hàm tao truoc dó. Tuy nhiên ServerSocket chi
láng nghe trên bô giao tiêp mang duoc chi ra trong tham sô thu 3. Nêu máy cua ban có
nhiêu bô giao tiêp mang thì ban cân phai chi ra ServerSocket này së láng nghe trên bô giao
tiêp nào.
Ví du: Gia su ráng máy cua ban có hai bô giao tiêp mang, môt bô giao tiêp mang có
dia chi 162.163.10.5 và môt bô giao tiêp mang khác có dia chi 192.168.101.1. Dê tao ra
môt ServerSocket láng nghe trên công 3456, bô giao tiêp mang 162.163.10.5 (chu không
phai 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 tao public ServerSocket( ) throws IOException // Java 1.4
Hàm tao này tao ra môt ServerSocket, tuy nhiên nó chua thuc su láng nghe trên công
nào ca. Thê nên ban cung chua thê goi phuong thuc accept dê châp nhân các kêt nôi. Dê
thu su liên kêt voi môt công nào dó ban cân goi phuong thuc bind(), dây là phuong thuc
chi có trong java 1.4 tro lên.
public void bind(SocketAddress endpoint) throws IOException // Java 1.4
public void bind(SocketAddress endpoint, int queueLength) // Java 1.4
throws IOException
Trang 184
Hàm tao này cung rât huu dung khi ban cân dát môt sô thuôc tính cho ServerSocket
truoc khi nó thuc su châp nhân các kêt nôi.
Thông thuong ban su dung mâu sau:
//Tao ra môt ServerSocket chua thuc su liên kêt voi môt công nào dó.
ServerSocket ss = new ServerSocket( );
// Thiêt dát môt sô thuôc tính cho Socket...
//Tao ra môt dôi tuong SocketAddress dê liên kêt
SocketAddress http = new InetSocketAddress(80);
//Liên kêt ServerSocket voi công 80
ss.bind(http);
4.2. Châp nhân và dóng kêt nôi
a) Châp nhân kêt nôi
Viêc tao ra môt ServerSocket chua thuc su châp nhân các kêt nôi dên. Dê châp nhân
kêt nôi dên ta cân goi dên phuong thuc accept() phuong thuc này së tam ngung tuyên thi
hành hiên tai cho dên khi có môt yêu câu kêt nôi dên. Khi có yêu câu kêt nôi dên thì tuyên
duoc tiêp tuc và hàm này tra vê cho ta môt dôi tuong Socket. Viêc giao tiêp voi máy khách
duoc tiên hành thông qua Socket này.
Chú ý: Phuong thuc accept() chi châp nhân môt kêt nôi dên mà thôi. do vây dê có thê châp
nhân nhiêu kêt nôi dên ban cân phai láp lai viêc goi dên phuong thuc accept() báng cách
dua chúng vào môt vòng láp nhu sau:
Ví du:
Chuong trình trên máy chu
//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();
}
}
}
Chuong trình trên máy khách
//Client.java
import java.net.*;
import java.io.*;
class Client {
public static void main(String[] args) throws IOException {
Socket sk = new Socket();
Trang 185
SocketAddress sv = new InetSocketAddress("theht1", 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);
}
}
Voi chuong trình trên ban chay Server môt lân sau dó ban có thê chay nhiêu chuong trình
máy khách.
b) Dóng kêt nôi
Khi kêt nôi không còn duoc su dung dên nua thì ta cân dóng lai dê giai phóng các
tài nguyên. Kêt nôi cung tu dông duoc dóng lai trong môt sô truong hop nhu: Chuong trình
kêt thúc, bô thu rác duoc tiên hành..., Tuy nhiên môt phong cách lâp trình tôt là luôn dóng
lai môt cách tuong minh khi không còn su dung dên nó nua.
Ví du:
ServerSocket server = new ServerSocket(port);
//Làm môt sô viêc
server.close( );
Trong java 1.4 bô sung thêm hai phuong thuc:
- public boolean isClosed( ) //Nêu kêt nôi dang mo thì tra vê tru và nguoc lai, tuy
nhiên nêu kêt nôi chua duoc mo thì nó cung tra vê false
- public boolean isBound( ) // Tra vê true nêu nó dã tung duoc liên kêt voi
môt công nào dó.
Thê nên dê kiêm tra xem ServerSocket có dang mo hay không ta phai làm nhu sau:
public static boolean isOpen(ServerSocket ss) {
return ss.isBound( ) && ! ss.isClosed( );
}
5. Lóp DatagramSocket
Lop này dùng dê tao ra môt Socket dê liên lac báng giao thuc UDP.
6. Lóp DatagramPacket
Lop này thê hiên cho môt gói du liêu duoc gui di báng giao thuc UPD. Nó duoc su dung
voi lop DatagramSocket.
III. TCP Socket
- Liên lac trong chê dô kêt nôi së có môt duong kêt nôi “ao” duoc thành lâp giua 2
tiên trình, truoc khi môt kêt nôi duoc thành lâp thì môt trong 2 tiên trình phai doi tiên trình
kia yêu câu kêt nôi. Trong mô hình này server phai láng nghe và châp nhân môt yêu câu kêt
nôi dên tu Client
Trang 186
- Dê viêt các chuong trình liên lac voi nhau trong chê dô kêt nôi ta cân phai viêt 2
chuong trình: môt cho server, môt cho client, chuong trình server có nhiêm vu láng nghe và
phan hôi kêt nôi moi, còn chuong trình phía client thì khoi xuong yêu câu kêt nôi
- Liên lac trong chê dô kêt nôi së su dung giao thuc TCP, dê gui và nhân du liêu
Viêt chuong trình phía server
Dê thiêt lâp môt server ta theo các buoc sau:
Buóc 1) tao ra môt dôi tuong ServerSocket và liên kêt nó voi môt công, ta có thê làm viêc
này thông qua hàm tao hoác khoi gán truc tiêp cho các truong
ví du:
ServerSocket s=new ServerSocket(port [, sequelLength]);
Hoác
ServerSocket s=new ServerSocket();
s.bind(InetAddress addr, port);
Buóc 2) châp nhân kêt nôi báng cách goi phuong thuc accept() cua dôi tuong
ServerSocket, sau khi goi phuong thuc, tuyên này së bi phong toa cho dên khi có môt kêt
nôi dên, phuong thuc này tra vê môt dôi tuong Socket, ta së su dung dôi tuong này dê “giao
tiêp” voi máy khách
Socket connectToClient=s.accept();
Buóc 3) nhân vê các dôi tuong outputStream và inputStream tu dôi tuong Socket nhân vê
tu phuong thuc accept o buoc 2, các dôi tuong này së giúp ta gui/nhân du liêu tu máy
client, dôi tuong outputStream cho phép ta gui du liêu dên client, dê nhân duoc các dôi
tuong này ta goi phuong thuc getOutputStream() trên dôi tuong Socket, dê nhân tham
chiêu dên dôi tuong outputStream vôn liên kêt voi dôi tuong này, và goi phuong thuc
getInputStream() dê nhân môt tham chiêu dên dôi tuong inputStream vôn liên kêt voi dôi
tuong Socket này.
Chúng ta có thê su dung dôi tuong inputStream và outputStream dê nhân/gui du liêu
duoi dang thô, hoác ta có thê nôi nó voi môt luông nhâp/xuât khác dê nhân vê du liêu mong
muôn.
Buóc 4) Xu lý du liêu gui dên tu client và gui gui tra du liêu.
Viêt chuong trình phía máy khách
Viêc viêt chuong trình cho client gôm môt sô buoc co ban sau:
Buóc 1) tao ra môt Socket dê kêt nôi dên máy chu, nôi kêt dên máy chu duoc thuc hiên
thông qua hàm tao cua lop Socket, thông thuong ta su dung hàm tao 2 dôi nhu sau:
Socket connectToServer=new Socket(serverName,port);
Hàm tao này có 2 dôi: dôi thu nhât cho biêt tên cua máy chu( tên này có thê là tên miên
hoác dia chi IP hoác có thê là môt dôi tuong InetAddress kêt hop voi máy chu) còn dôi thu
2 cho biêt sô hiêu công mà server dang láng nghe
Buóc 2) Nhân vê các dôi tuong inputStream và outputStream kêt hop voi dôi tuong Socket
connectToServer, buoc này tuong tu nhu buoc 3 trong phân viêt chuong trình cho server
Buóc 3) xu lý du liêu nhân vê/ gui di thông qua 2 dôi tuong outputStream và inputStream
Buóc 4) dóng kêt nôi dê giai phóng tài nguyên, thông thuong viêc dóng kêt nôi duoc khoi
xuong tu phía máy khách
Trang 187
Ví du 1: Nhân vê trang index.html tru máy chu web www.theht.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.theht.edu.vn", 80);
OutputStream raw = http.getOutputStream();
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í du 2: Xây dung chuong trình EchoClient và EchoServer.
Xây dung chuong trình phía máy chu
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
Trang 188
+" on port "+destPort+".");
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 dung chuong 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.theht.edu.vn", 3456);
client.requestServer();
client.shutdown();
}
}
class ClientConnect {
Socket connection;
DataOutputStream out;
BufferedReader in;
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); }
Trang 189
}
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':
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í du: ta viêt môt ví du don gian nhu sau:
Trang 190
* chuong trình phía client có giao diên sau:
khi ta kích chuôt vào nút kêt nôi chuong trình cua ta së kêt nôi voi máy chu
sau khi nhâp chiêu dài, chiêu rông và kích chuôt vào nút tính, du liêu gôm có chiêu dài và
chiêu rông së duoc gui dên máy chu, máy chu thuc hiên viêc tính diên tích và gui kêt qua
tra lai cho máy khách, du liêu nhân vê tu máy chu duoc hiên thi trong ô kêt qua
khi ta kích chuôt nút dóng, chuong trình cua ta së dóng kêt nôi và kêt thúc chuong trình
* chuong trình trên máy chu chi có nhiêm vu, láng nghe kêt nôi và tính toán diên tích cua
hình nhân duoc
Mã nguôn phía máy chu:
package net.theht;
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ê dôi tuong nhâp/xuât
DataInputStream in = new DataInputStream(connectToClient.getInputStream());
DataOutputStream out = new DataOutputStream(connectToClient.
getOutputStream());
//Vòng lãp vô tân dê phuc vu 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)
{
Trang 191
Server server1 = new Server();
}
}
Mã nguôn phía máy khách:
package net.theht;
import javax.swing.*;
import java.awt.*;
import java.io.*;
import java.net.*;
import java.awt.event.*;
public class Frame1 extends JFrame{
JLabel jLabel1 = new JLabel();
JLabel jLabel2 = new JLabel();
JTextField jtfDai = new JTextField();
JTextField jtfRong = new JTextField();
JLabel jLabel3 = new JLabel();
JTextField jtfKetQua = new JTextField();
JButton jtfConnect = new JButton();
JButton jtfCompute = new JButton();
JButton jtfClose = new JButton();
Socket connectToServer;
DataInputStream in; // luông nhâp
DataOutputStream out; //luông xuât
boolean isConnect = false; //biên kiêm tra xem dã kêt nôi chua
public Frame1() {
try { jbInit(); }
catch (Exception ex) { ex.printStackTrace(); }
}
void jbInit() throws Exception {
jLabel1.setFont(new java.awt.Font(".VnCourier New", 0, 13));
jLabel1.setToolTipText("");
jLabel1.setText("Chiêu dài");
jLabel1.setBounds(new Rectangle(16, 15, 77, 21));
this.getContentPane().setLayout(null);
jLabel2.setBounds(new Rectangle(16, 46, 86, 21));
jLabel2.setText("Chiêu rông");
jLabel2.setFont(new java.awt.Font(".VnCourier New", 0, 13));
jtfDai.setForeground(Color.red);
jtfDai.setBounds(new Rectangle(101, 12, 113, 25));
jtfRong.setBounds(new Rectangle(102, 44, 113, 25));
jtfRong.setForeground(Color.red);
jLabel3.setFont(new java.awt.Font(".VnCourier New", 0, 13));
jLabel3.setText("Kêt quá");
jLabel3.setBounds(new Rectangle(14, 78, 57, 21));
jtfKetQua.setBackground(Color.white);
jtfKetQua.setForeground(Color.red);
jtfKetQua.setDisabledTextColor(Color.red);
jtfKetQua.setEditable(false);
jtfKetQua.setText("");
Trang 192
jtfKetQua.setBounds(new Rectangle(102, 78, 113, 25));
jtfConnect.setBounds(new Rectangle(228, 10, 85, 30));
jtfConnect.setFont(new java.awt.Font(".VnCourier New", 0, 12));
jtfConnect.setHorizontalAlignment(SwingConstants.CENTER);
jtfConnect.setHorizontalTextPosition(SwingConstants.CENTER);
jtfConnect.setText("Kêt nôi");
jtfConnect.setVerticalAlignment(javax.swing.SwingConstants.CENTER);
jtfConnect.setVerticalTextPosition(javax.swing.SwingConstants.CENTER);
jtfConnect.addActionListener(new Frame1_jtfConnect_actionAdapter(this));
jtfCompute.setText("Tính");
jtfCompute.addActionListener(new Frame1_jtfCompute_actionAdapter(this));
jtfCompute.setFont(new java.awt.Font(".VnCourier New", 0, 12));
jtfCompute.setBounds(new Rectangle(229, 44, 86, 30));
jtfClose.setText("Ðóng");
jtfClose.addActionListener(new Frame1_jtfClose_actionAdapter(this));
jtfClose.setFont(new java.awt.Font(".VnCourier New", 0, 12));
jtfClose.setBounds(new Rectangle(230, 78, 87, 30));
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setTitle("Test Client/Server");
this.getContentPane().add(jLabel1, null);
this.getContentPane().add(jtfKetQua, null);
this.getContentPane().add(jtfRong, null);
this.getContentPane().add(jtfDai, null);
this.getContentPane().add(jLabel2, null);
this.getContentPane().add(jLabel3, null);
this.getContentPane().add(jtfCompute, null);
this.getContentPane().add(jtfConnect, null);
this.getContentPane().add(jtfClose, null);
}
public static void main(String[] args) {
Frame1 frame1 = new Frame1();
frame1.setBounds(100, 100, 350, 130);
frame1.show();
}
void jtfConnect_actionPerformed(ActionEvent e) {
if (isConnect == false) // nêu chua kêt nôi thì kêt nôi
{ try {
// lãng nghe kêt nôi dê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);
}
Trang 193
catch (IOException ex) {
JOptionPane.showMessageDialog(this, "co loi ve nhap xuat", "loi",
JOptionPane.ERROR_MESSAGE);
}
}
}
void jtfCompute_actionPerformed(ActionEvent e) {
if ( (in == null) || (out == null)) // nêu chua 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(); // dây hêt dü liêu ra
jtfKetQua.setText(String.valueOf(in.readDouble())); // nhân vê kêt quá và
// hiên thi 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ú tuc dáp úng biên cô khi kích chuôt vào nút dóng
void jtfClose_actionPerformed(ActionEvent e) {
try { connectToServer.close(); // dóng kêt nôi }
catch (IOException ex) { }
System.exit(0); // thoát khói chuong trình
}
}
// tao ra lóp diêu hop, dê dáp úng su 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); }
}
// tao ra lóp diêu hop, dê dáp úng su kiên kích chuôt vào nút tính
class Frame1_jtfCompute_actionAdapter implements java.awt.event.ActionListener
{ Frame1 adaptee;
Trang 194
Frame1_jtfCompute_actionAdapter(Frame1 adaptee)
{ this.adaptee = adaptee; }
public void actionPerformed(ActionEvent e) {
adaptee.jtfCompute_actionPerformed(e);
}
}
// tao ra lóp diêu hop, dê dáp úng su kiên kích chuôt vào nút dó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) {
adaptee.jtfClose_actionPerformed(e);
}
}
Vân dê môt nguôn nhiêu khách
Trong ví du trên ta nhân thây, máy chu chi có thê phuc vu duy nhât môt khách. Trong thuc
tê dôi voi môt sô bài toán yêu câu môt máy chu phai phuc vu nhiêu máy khách tai môt thoi
diêm, ví du nhu Web server, Database server,… các máy chu này cho phép nhiêu máy
nhiêu máy khách kêt nôi dông thoi, ta có thê làm duoc viêc này báng kÿ thuât da luông.
Thât don gian, ban chi cân tao ra môt luông phuc vu cho môi khách, và dua thêm vào doan
mã tua nhu sau:
ServerSocket s = new ServerSocket(port);
while (true) {
Socket connectToClient = s.accept();
new HandleClient(connectToClient);
}
Ta sua lai ví du trên dê có thê phuc vu duoc nhiêu máy khách, chuong trình phía máy
khách vân giu nguyên, ta chi thay dôi chuong trình trên máy chu nhu sau:
package net.theht;
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);//chay môt luông phuc vu
}
}
catch (IOException ex) { }
}
Trang 195
}
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 dê phuc vu 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 qua
out.writeDouble(kq); // tra vê kêt qua cho máy khách
out.flush(); // dôn hêt DL ra
}
catch (IOException ex1) { }
}
}
}
sau khi sua lai ban cho khoi dông server, sau dó cho chay 2 tiên trình client, ban së thu
duoc màn hình kêt qua nhu sau:
Liên lac trong chê dô phi kêt nôi
Viêc liên lac trong chê dô không kêt nôi, không yêu câu phai có 1 server luôn láng
nghe kêt nôi, khi liên lac trong chê dô không kêt nôi java su dung giao thuc UDP trong viêc
diêu khiên truyên và nhân du liêu. Do vây không có xác nhân vê du liêu gui, không thê biêt
duoc du liêu gui di có dên duoc dích không, không thê biêt duoc du liêu nhân vê có bi
trùng láp không… Ban là nguoi lâp trình, ban phai giai quyêt diêu dó, chu không phai lop
giao thuc mang hay java, Trong thuc tê ho mác kê cho lôi sây ra, boi ho không du náng luc
Trang 196
dê làm diêu dó, thê nên giai pháp an toàn cho ban là Socket dòng, boi lë Socket dòng su
dung giao thuc TCP, nên nhung diêu lo láng dó không bao gio sây ra.
Dê liên lac trong chê dô không kêt nôi ta su dung lop DatagramSocket và lop
DatagramPacket, lop DatagramSocket cho phép ta gui/ nhân vê các gói du liêu tu máy o
xa, lop DatagramPacket cho cung câp cho ta công cu dóng gói du liêu UDP, dê dôi tuong
DatagramSocket gui di hoác nhân vê.
Ta giai thích thông qua chuong trình chat, chuong trình gôm có 2 chuong trình, hai
chuong trình này là ngang hàng không có chuong trình nào là chu ca, các lênh cân thiêt dê
liên lac duoc trong chê dô không kêt nôi duoc in dâm
Mã chuong trình thu nhât:
package net.theht;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.io.*;
import java.net.*;
public class Frame2 extends JFrame{
private JTextArea jtaSend = new JTextArea();
private JButton jbtSend = new JButton();
private JButton jbtExit = new JButton();
private JTextArea jtaRev = new JTextArea();
// khai báo các biên cân thiêt
private DatagramSocket s;
private DatagramPacket sen,rev;
private boolean isFirstLine=true;
private JSplitPane jSplitPane1 = new JSplitPane();
private JScrollPane jScrollPane1 = new JScrollPane();
private JScrollPane jScrollPane2 = new JScrollPane();
public Frame2()
{ try {
jbInit();
}
catch (Exception ex) { ex.printStackTrace(); }
}
void jbInit() throws Exception {
this.getContentPane().setLayout(null);
jtaSend.setText("");
jbtSend.setBounds(new Rectangle(315, 205, 69, 24));
jbtSend.setFont(new java.awt.Font(".VnCourier New", 0, 12));
jbtGúid.seGúixt(Gúiu");
jbtSend.addActionListener(new Frame2_jbtSend_actionAdapter(this));
jbtExit.setText("Thoat");
jbtExit.addActionListener(new Frame2_jbtExit_actionAdapter(this));
jbtExit.setFont(new java.awt.Font(".VnCourier New", 0, 12));
jbtExit.setBounds(new Rectangle(314, 174, 71, 25));
jtaRev.setDisabledTextColor(Color.gray);
jtaRev.setEditable(false);
jtaRev.setText("");
Trang 197
jSplitPane1.setOrientation(JSplitPane.VERTICAL_SPLIT);
jSplitPane1.setBounds(new Rectangle(6, 7, 300, 224));
this.setDefaultCloseOperation(HIDE_ON_CLOSE);
this.setTitle("Chuong trinh chat su dung giao thuc UDP");
this.addWindowListener(new Frame2_this_windowAdapter(this));
this.getContentPane().add(jSplitPane1, null);
jSplitPane1.add(jScrollPane1, JSplitPane.TOP);
jScrollPane1.getViewport().add(jtaRev, null);
jSplitPane1.add(jScrollPane2, JSplitPane.BOTTOM);
this.getContentPane().add(jbtSend, null);
this.getContentPane().add(jbtExit, null);
jScrollPane2.getViewport().add(jtaSend, null);
jSplitPane1.setDividerLocation(150);
//user code
try {
// tao ra dôi tuong DatagramSocket dôi tuong này së nhân dü //liêu tù công 2004
s = new DatagramSocket(2004);
}
catch (SocketException ex) { }
}
private void nhan() {
while (true) {
// vùng dêm dê nhân dü liêu
byte[] dat = new byte[100];
// tao ra dôi tuong DatagramPacket dê 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();// dóng kêt nôi
}
catch (Exception ex) { }
System.exit(0);
}
public static void main(String[] args) {
Frame2 frame2 = new Frame2();
Trang 198
frame2.setBounds(100, 100, 400, 280);
frame2.show();
frame2.nhan();
}
void jbtSend_actionPerformed(ActionEvent e) {
byte dat[] = jtaSend.getText().getBytes();
InetAddress local = null;
try {
local = InetAddress.getLocalHost();
}
catch (UnknownHostException ex) { }
// Tao ra dôi tuong DatagramPacket dê gúi gói dü liêu
sen = new DatagramPacket(dat, dat.length, local, 4002);
try {
s.send(sen); // Gúi dü liêu di
}
catch (IOException ex1) {
JOptionPane.showMessageDialog(this, "khong the gui 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{
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);
}
Trang 199
}
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);
}
}
Chuong trình thu hai:
package net.theht;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
public class Frame3 extends JFrame{
private JTextArea jtaRev = new JTextArea();
private JScrollPane jScrollPane1 = new JScrollPane();
private JButton jbtSend = new JButton();
private JScrollPane jScrollPane2 = new JScrollPane();
private JButton jbtExit = new JButton();
private JTextArea jtaSend = new JTextArea();
private DatagramSocket s;
private DatagramPacket sen, rev;
private boolean isFirstLine = true;
private JSplitPane jSplitPane1 = new JSplitPane();
public Frame3() {
try {
jbInit();
}
catch (Exception ex) { ex.printStackTrace(); }
}
void jbInit() throws Exception {
jtaRev.setEditable(false);
jtaRev.setText("");
this.getContentPane().setLayout(null);
jbtSend.setBounds(new Rectangle(315, 183, 69, 24));
jbtSend.setFont(new java.awt.Font(".VnCourier New", 0, 12));
jbtGúid.seGúixt(Gúiu");
jbtSend.addActionListener(new Frame3_jbtSend_actionAdapter(this));
jbtSend.addActionListener(new Frame3_jbtSend_actionAdapter(this));
jbtExit.setText("Thoat");
jbtExit.addActionListener(new Frame3_jbtExit_actionAdapter(this));
Trang 200
jbtExit.setFont(new java.awt.Font(".VnCourier New", 0, 12));
jbtExit.setBounds(new Rectangle(314, 156, 71, 24));
jSplitPane1.setOrientation(JSplitPane.VERTICAL_SPLIT);
jSplitPane1.setBounds(new Rectangle(5, 7, 296, 219));
this.setDefaultCloseOperation(HIDE_ON_CLOSE);
this.setTitle("Chuong trinh chat su dung giao thuc UDP");
this.addWindowListener(new Frame3_this_windowAdapter(this));
this.getContentPane().add(jSplitPane1, null);
jSplitPane1.add(jScrollPane1, JSplitPane.TOP);
jScrollPane1.getViewport().add(jtaRev, null);
jScrollPane1.getViewport().add(jtaRev, null);
jSplitPane1.add(jScrollPane2, JSplitPane.BOTTOM);
this.getContentPane().add(jbtExit, null);
this.getContentPane().add(jbtSend, null);
jSplitPane1.setDividerLocation(150);
//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) { }
}
}
private void dong() {
try {
s.close();
}
catch (Exception ex) { }
System.exit(0);
}
public static void main(String[] args) {
Trang 201
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");
}
}
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) {
Trang 202
this.adaptee = adaptee;
}
public void windowClosing(WindowEvent e) {
adaptee.this_windowClosing(e);
}
}
Tóm lai dê liên lac trong chê dô 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:
tao ra dôi tuong DatagramSocket dê nhân và gui du liêu, báng hàm tao cua nó nhu sau:
s = new DatagramSocket(port);
Hàm tao này së tao ra dôi tuong DatagramSocket hoat dông trên công duoc chi ra.
tao các dôi tuong DatagramPacket dùng dê làm gói du liêu trong viêc gui/nhân du liêu,
báng cách su dung ham tao cua lop DatagramPacket
+ DatagramPacket(byte[] buf, int length) thuong dùng hàm tao này khi nhân du liêu
+length.DatagramPacket(byte[] buf, int length, InetAddress address, int port) hàm tao này
thuong dùng khi doc du liêu tu máy tính và công duoc chi ra
+ DatagramPacket(byte[] buf, int offset, int length) hàm tao này thuong dùng trong viêc
nhân du liêu có dô dài length , bát dâu tu diêm offset
+ DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port) nhân vê
du liêu trên máy, công duoc chi ra, và cât vào trong vùng dêm buf
-gui du liêu báng phuong thuc send, cua lop DatagramSocket
datagramSocket.sen(datagramSocket)
- Nhân du liêu báng phuong thuc receive, cua lop DatagramSocket
datagramSocket.receive(datagramSocket)
Ví du ChatApp.java
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
public class ChatApp extends Frame {
TextField msgText = new TextField();
TextArea replyText = new TextArea();
Button sendButt = new Button();
Label label1 = new Label();
TextField addrText = new TextField();
Sender sender=new Sender();
public ChatApp(){
this.setLayout(null);
this.setSize(new Dimension(297, 214));
this.setTitle("Java Chat");
msgText.setBounds(new Rectangle(15, 34, 277, 21));
replyText.setBounds(new Rectangle(16, 93, 274, 89));
label1.setBounds(new Rectangle(17, 183, 55, 23));
label1.setText("talking with");
addrText.setBounds(new Rectangle(84, 187, 208, 19));
Trang 203
addrText.setText("127.0.0.1");
sendButt.setBounds(new Rectangle(15, 61, 94, 28));
sendButt.setLabel("Send");
sendButt.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
sendButt_actionPerformed(e);
}
});
this.add(msgText, null);
this.add(replyText, null);
this.add(sendButt, null);
this.add(label1, null);
this.add(addrText, null);
}
void sendButt_actionPerformed(ActionEvent e) {
sender.sendData(addrText.getText(),msgText.getText());
}
public static void main(String args[]){
ChatApp app = new ChatApp();
ListenerThread listener=new ListenerThread(app.replyText);
listener.start();
app.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent event){
System.exit(0);
}
});
app.show();
}
}
class Sender{
DatagramSocket listenerSocket;
InetAddress serverAddress;
String localHost;
int bufferLength = 256;
byte outBuffer[];
byte inBuffer[] = new byte[bufferLength];
DatagramPacket outDatagram;
DatagramPacket inDatagram;
public void sendData(String DestAddr, String data){
try{
serverAddress = InetAddress.getByName(DestAddr);
outBuffer = new byte[bufferLength];
outBuffer = data.getBytes();
outDatagram = new
DatagramPacket(outBuffer,outBuffer.length,serverAddress,2345);
listenerSocket.send(outDatagram);
} catch (Exception e){ System.out.println(e); }
}
Trang 204
public Sender(){
try{
listenerSocket = new DatagramSocket();
inDatagram = new DatagramPacket(inBuffer,inBuffer.length);
} catch (Exception e){ System.out.println("connect error!"); }
}
}
class ListenerThread extends Thread{
TextArea text;
DatagramSocket socket;
InetAddress serverAddress;
String localHost;
int bufferLength = 256;
byte outBuffer[];
byte inBuffer[] = new byte[bufferLength];
DatagramPacket outDatagram;
DatagramPacket inDatagram;
public ListenerThread(TextArea text){
this.text=text;
try{
socket = new DatagramSocket();
inDatagram = new DatagramPacket(inBuffer,inBuffer.length);
} catch (Exception e){
System.out.println("connect error!");
}
}
public void run() {
try{
DatagramSocket socket = new DatagramSocket(2345);
String localAddress = InetAddress.getLocalHost().getHostName().trim();
int localPort = socket.getLocalPort();
int bufferLength = 256;
byte outBuffer[];
byte inBuffer[] = new byte[bufferLength];
DatagramPacket outDatagram;
DatagramPacket inDatagram = new DatagramPacket(inBuffer,inBuffer.length);
while (true) {
socket.receive(inDatagram);
InetAddress destAddress = inDatagram.getAddress();
String destHost = destAddress.getHostName().trim();
int destPort = inDatagram.getPort();
String data = new String(inDatagram.getData()).trim();
text.append(destHost+" say: "+data+"\n");
}
}catch (IOException ex){ System.out.println("IOException occurred."); }
}
}
Trang 205
Chuong 9: JAVA MAIL
I. Các khái niêm MAIL
Ngày nay e-mail hay thu diên tu dã tro nên phô biên và hâu nhu không thê thiêu
trong thê gioi Internet. E-mail cho phép gui thông diêp tu noi này dên noi khác tuong tu
nhu cách gui thu truyên thông thông qua buu diên. Trong cách thông thuong ban phai cung
câp dia chi nguoi gui (sender), dia chi nguoi nhân (reciept) sau dó nguoi gui mang thu dên
buu diên nho buu diên chuyên thu di. Buu diên së chuyên thu dên hôp thu cua nguoi nhân.
Dôi voi thu diên tu e-mail gui qua hê thông Internet hay mang thì co chê gui/nhân
cung hoàn toàn tuong tu. Các máy chu (mail server) cung câp cho ban dia chi mail (còn goi
là e-mail address). Ban ghi dia chi mail cua ban và cua nguoi nhân, sau dó nhâp vào nôi
dung cân gui. Mail server së gui thu cua ban dên môt máy chu hay mail server cua dia chi
nguoi nhân. Mail server noi nhân së cât thu vào môt noi thích hop (mail box hay còn goi là
hôp thu) trên máy chu. Nguoi nhân së tiên hành dáng nhâp (hay còng goi là login) vào hôp
thu cua máy chu dê doc nôi dung e-mail gui cho mình.
Dê thông nhât giua các máy chu mail trên toàn thê gioi vê cách thuc gui nhân mail
dòi hoi hình thành các chuân vê mail. Diêu này giúp cho viêc goi nhân các thông diêp duoc
dam bao, làm cho nhung nguoi o các noi khác nhau có thê trao dôi thông tin voi nhau.
Có 2 chuân vê Mail thuong duoc các máy chu mail hô tro là X.400 và SMTP
(Simple Mail Transfer Protocol). SMTP thuong di kèm voi chuân POP3 và do han chê cua
SMTP mà ngày nay nguoi ta dùng chuân mo rông cua nó là ESMTP (Extended SMTP).
Muc dích chính cua X.400 là cho phép các mail có thê duoc truyên nhân thông qua các loai
mang khác nhau bât châp câu hình phân cung, hê diêu hành mang, giao thuc truyên dân
duoc dùng. Còn muc dích cua chuân SMTP miêu ta cách diêu khiên các thông diêp trên
mang Internet. Diêu quan trong cua chuân SMTP là gia dinh máy nhân phai dùng giao thuc
SMTP gui Mail cho môt Server luôn luôn hoat dông. Sau dó, nguoi nhân së dên lây Mail
cua ho tu Server khi nào ho muôn dùng giao thuc POP (Post Office Protocol), ngày nay
POP duoc cai tiên thành POP3 (Post Officce Protocol vertion 3). Các giao thuc Mail thông
dung : chuân X.400, chuân MAIP, SMTP (ESMTP), POP3. Trong chuong này ta së su
dung hai giao thuc :POP3 và SMTP dê gui nhân mail.
Mô hình gui nhân mail
Truoc khi di vào phân chính chúng ta cùng ôn lai môt sô khái niêm co so sau:
Sende
r
Reveicer
Mail Server t rung
gian
Mail Server nguòi
gúi
Mail Server nguòi
nhân
Mang Mang
Trang 206
Mail server: là môt chuong trình chay duoi dang môt dich vu. dich vu này có nhiêm vu
nhân mail tu máy khách gui dên, phân phôi mail dên máy chu khác, cho phép máy
khách truy câp vào dê lây mail, luu tru mail… Chính vì vây truoc khi ban gui nhân mail
ban phai biêt dia chi cua máy chu mail (máy dang chay dich vu mail). Dia chi này
thuong duoc goi là mail host.
Giao thúc gui mail (Mail transport protocol): Dê gui mail dên máy chu, trình khách
phai su dung môt giao thuc trò chuyên voi mail server. Tuong tu nhu trình duyêt su
dung giao thuc HTTP dê trò chuyên voi Web server. Các máy khách muôn bát tay voi
trình chu và gui mail lên máy chu së su dung giao thuc SMTP (Simple Mail Transport
Protocol). SMTP khá nôi tiêng và duoc hâu các máy chu mail trên thê gioi hô tro. Dia
chi cua máy chu nhân mail gui di duoc goi là outgoing mail address. Trình chu tiêp
nhân mail theo giao thuc SMTP duoc goi là SMTP Server. Trình khách su dung giao
thuc SMTP dê gui thu di duoc goi là SMTP Client.
Giao thúc luu trû và nhân mail (mail store protocol): Khi trình chu mail tiêp nhân
duoc mail. Nó tiên hành luu tru mail theo môt cách thuc nào dó dê trình khác có thê dê
dàng truy câp vào và nhân mail vê. Hiên nay POP3 (Post Office Protocol) và IMAP
(Internal Message Access Protocol) là hai giao thuc luu tru và lây mail tu hôp thu
(Inbox) duoc nhiêu mail server su dung. Dia chi cua máy chu luu tru mail cho phép
máy khách truy câp vào dê nhân mail vê duoc goi là incoming mail address. Các
chuong trình mail Client thuong su dung giao thuc POP3 dê nhân mail tu trình chu.
Trình chu tiêp nhân yêu câu cua trình khách theo giao thuc POP3 duoc goi là POP
Server.
SMTP Relay: Các mail server nêu nhân duoc mail không thuôc dia chi do mình quan
lý, khi dó nó có trách nhiêm gui mail dên máy chu khác voi cùng giao thuc SMTP.
Trong truong hop này mail server (noi chuyên tiêp thu di) dóng vai trò nhu môt trình
khác (mail client) dôi voi máy chu noi nhân. Cu thê. Internet mail là môt hê thông
chuyên mail liên tuc giua các máy chu mail voi nhau cho dên khi nào mail dên duoc
máy chu dích. Các mail server da phân hô tro tính náng Relay.
POP before SMTP (Chúng thuc quyên truy câp theo giao thúc POP truóc khi su
dung SMTP): Dê tránh tình trang máy chu mail duoc loi dung dê gui mail môt cách ô
at. Co chê POP before SMTP yêu câu máy khách muôn su dung dich vu mail cua máy
chu phai truoc hêt phai dáng nhâp (login) vào tài khoan (account) theo giao thuc POP.
Nêu quá trình dáng nhâp thành công, co chê gui mail báng SMTP moi có thê thuc hiên
duoc.
Mail client, Web mail: là chuong trình dùng dê nhân mail vê tu trình chu và cho phép
gui mail lên trình chu. Nêu mail client duoc viêt duoi giao diên Web thì nó duoc goi là
Web mail.
II. Gui mail vói thu viên có sàn cua java
Java cung câp cho ban môt thu viên nho gon giúp ban có thê guu mail môt cách dê
dàng, tuy nhiên voi thu viên này ban không có duoc các tính náng cao câp nhu gui
file dính kèm…, Dê su dung các tính náng cao câp ban xu thu viên Mail API (gioi
thiêu trong phân sau). Thu viên này có lop SmtpClient dùng dê gui mail.
Dê gui mail ban cung câp dia chi cua nguoi gui (from), dia chi cua nguoi nhân (to),
dia chi cua mail server (máy chu tiêp nhân mail do ban gui lên) cùng voi nôi dung
mà ban muôn gui. Duoi dây là môt chuong trình don gian dùng dê gui mail dên dia
Trang 207
chi thek44a2@yahoo.com nho vào máy chu mail utehy.edu.vn (máy chu mail cua
truong DHSP KT Hung Yên). Dia chi nguoi gui có thê dát tuy ý. Nhung thuong là
dia chi cua ban dê nguoi nhân sau khi doc thu xong có thê hôi âm (Reply) lai cho
ban.
//SendMailApp.java
import sun.net.smtp.*;
import java.io.*;
public class SendMailApp {
public static void main(String[] args) throws Exception {
String host = "utehy.edu.vn";
String from = "theth@utehy.edu.vn";
String to = "thek44a2@yahoo.com";
String subject = "Test Message";
String body = "Hello this is test message for mail";
/* Tao dôi tuong gúi mail theo giao thúc SMTP, host là dia chi cúa máy chú nhân mail do ta
gúi lên */
SmtpClient mailer = new SmtpClient(host);
// Thiêt lâp dia chi cúa nguòi gúi và nguòi nhân
mailer.from(from);
mailer.to(to);
//Lây vê luông xuât gãn vói mail
PrintStream ps = mailer.startMessage();
//Diên các thông tin khác
ps.println("From:" + from);
ps.println("To:" + to);
ps.println("Subject:" + subject);
ps.println();// Thêm CRLF vào truóc phân nôi dung
ps.println(body);
//Kêt thúc quá trình gúi mail
mailer.closeServer();
System.out.println("Mail has been sent");
}
}
Chú ý: Hãy thay dia chi From, To báng dia chi e-mail mà ban muôn gui.
III. Giói thiêu java mail API
Lop SmtpClient cua java mà chúng ta su dung trên dây chi giúp ban gui mail o muc
don gian nhât voi nôi dung mail o dang thuân ván ban. Môt ung dung mail phía máy khách
thuong có các chuc náng phuc tap hon nhu : Gui file dính kèm, du liêu duoc nhúng ca hình
anh, âm thanh…Dê thuc hiên nhung chuc náng này java dua ra môt thu viên riêng chuyên
xu lý các thao tác gui nhân mail.
1. Cài dát thu viên java mail
Mác dinh các thu viên java mail API không duoc cài dát khi ban cài JDK. Thu viên
này gôm ba phân:
Phân thu nhât là hat nhân cua các tác vu xu lý mail, nó duoc dóng gói trong têp mail.jar.
Ban có thê download tu dia chi http://java.sun.com/javamail/index.html
Trang 208
Phân thu hai là JavaBean Activation FrameWork cân cho moi phiên ban cua java mail.
Thu viên này mang tên activation.jar. voi thu viên này ban có thê tai xuông tu
http://java.sun.com/products/javabean/glasgow/jar.html
Phân thu ba là các lop doc hay nhân mail tu trình chu. Trong java 1.4 thu viên này có
tên mail.jar
Ban dát biên môi truong classpath=%CLASSPATH%; C:\JBuilderX\lib\mail.jar;
C:\JBuilderX\lib\activation.jar;
Chú ý: Khi ban cài JBuilder hai thu viên này cung duoc tu dông cài dát vào máy, ban có
thê tìm thây nó trong thu muc Jbuilder_Home/lib
2. Các buóc gui nhân mail
Các buóc dê nhân mail:
Tao dôi tuong mail Session.
Tao dôi tuong store chuân bi lây mail vê. Dê tao dôi tuong Store ban yêu câu nguoi
dùng nhâp vào tên và mât khâu chung thuc quyên truy câp hop pháp.
Su dung dôi tuong Store dê lây vê dôi tuong Folder. Môi Folder së chua môt loai mà
ban muôn lây. Nhu Folder Inbox chua các thu viên gui dên. Folder trash chua các thu
vua bi xoá. Folder sent chua các thu vua gui di…
Duyêt dôi tuong Folder dê lây vê danh sách các thu.
Các buóc dê gui mail
Yêu câu nguoi gui chon giao thuc dê gui (SMTP) và nhân (POP3 hay IMAP…). Luu
các thông tin này vào dôi tuong Session.
Tao dôi tuong Message. Dôi tuong này së chua các thông tin vê mail cân gui di nhu dia
chi nguoi gui, dia chi nguoi nhân, tiêu dê mail, nôi dung mail…
Goi phuong thuc Transport.send() hoác phuong thuc sendMessage cua dôi tuong
Transport dê gui thu di.
3. Các lóp co ban xu lý thao tác gui nhân mail
Ta tìm hiêu các gói trong thu viên java mail. Hâu hêt các ung dung mail client cân
import các thu viên javax.mail, javax.mail.interner, javax.mail.activation.
3.1. Các lóp liên quan dên viêc gui mail
3.1.1. Lóp Session
Lop này thê hiên môt phiên kêt nôi toi mail server. Truoc khi truy câp (gui/nhân)
ban cân phai tao ra môt dôi tuong Session thê hiên cho môt phiên làm viêc. ví du:
//Tao dôi tuong Properties chua thông tin khoi tao nêu có
Properties props=new Properties();
/*gán giá tri cho các thuôc tính báng phuong thuc
props.setProperty(PropertyName, PropertyValue) */
//Tao dôi tuong Session
Session session =Session.getDefaultInstance(props,null);
Hoác ban có thê goi phuong thuc getInstance() cua lop Session thay cho
getDefaultInstance() dê tao ra thê hiên cua dôi tuong Session nhu sau:
//Tao dôi tuong Properties chua thông tin khoi tao nêu có
Properties props=new Properties();
Trang 209
/*gán giá tri cho các thuôc tính báng phuong thuc
props.setProperty(PropertyName, PropertyValue)*/
//Tao dôi tuong Session
Session session =Session.getInstance(props,null);
Trong ca hai phuong thuc khoi tao dôi tuong Session nêu trên. các thuôc tính câu
hình duoc dát trong dôi tuon Properties nên truoc khi ban ban gui nhân mail ban cân thiêt
dát các thuôc tính này. ví du:
props.setProperty("mail.host","utehy.edu.vn");
props.setProperty("mail.from","theht@utehy.edu.vn");…
O dây thuong thì ban truyên null cho tham sô thu hai voi ý nghia su dung co chê
chung thuc (authentication) mác dinh cua mail server.
Su khác nhau giua hai phuong thuc này là getInstance() thì luôn tao ra môt Session
moi còn getDefaultInstance() thì không tao ra môt thê hiên moi cua Session nêu nhu nó dã
duoc tao ra trong cùng java virtual machine.
3.1.2. Lóp Message
Sau khi có dôi tuong Session ban, dê gui mail ban ban cân tao ra dôi tuong Message.
Tuy nhiên ít khi ban làm viêc truc tiêp voi dôi tuong này mà ban thuong làm viêc voi các
lop con cua nó, lop MimeMessage. ví du, ban tao thông diêp mail dê chuân bi gui di nhu
sau:
MimeMessage message =new MimeMessage(mailsession);
Nêu nôi dung cua thông diêp là thuân ván ban, ban có thê thiêt dát nôi dung thu gui báng
lênh:
message.setText(content);
Nêu ban chi dinh Mime cho nôi dung cân gui nêu nó không phai là thuân ván ban nhu sau:
message.setContent(content,"text/html");
Nêu nôi dung không phai thuân ván ban thì ban phai chi dinh Mime cho nó, dê noi nhân
mail së cán cu vào Mime dê hiên thi dúng nôi dung cua thông diêp nhân duoc.
Môt thói quen tôt nên có là dát cho mail môt tiêu dê (subject). Nguoi nhân cán cu
vào tiêu dê thu dê biêt duoc nôi dung ván tát mô ta trong thu. Phuong thuc setSubject() së
giúp ta làm viêc dó. Ví du:
Session.setSubject("Xin chao");
3.1.3. Lóp Address
Sau khi ban tao ra dôi tuong Session và Message, tiêp dên ta su dung lop Address dê
tao ra dia chi cua nguoi guu và nguoi nhân. Lop Address là lop truu tuong, ban su
dung lop con cua nó là InternetAddresss. Ví du ban tao dia chi mail tu lop này nhu
sau:
Address address =new InternetAddresss("theht@utehy.edu.vn");
Hoác
InternetAddresss address =new InternetAddresss("theht@utehy.edu.vn");
Nêu ban muôn dia chi e-mail có thêm thông tin diên giai ban thêm su dung cú pháp
nhu sau:
Address address =new InternetAddresss("theht@utehy.edu.vn", "Hoang Trong The");
Thông tin diên giai này së duoc hiên thi thay khi nguoi nhân doc thu thay cho dia
chi mail from.
Trang 210
Sau khi tao xong dia chi cua nguoi gui, dia chi cua nguoi nhân ban cán gán nó vào
thông diêp cân gui di. Java cung câp cho ban ba loai dia chi phô biên:
Kiêu dia chi ý nghia
Message.RecipientType.TO Dia chi noi dên
Message.RecipientType.CC Dia chi nguoi gui cân luu ý
Message.RecipientType.BCC Dia chi nguoi gui cân tham khao
Ban goi phuong thuc addRecipient() cua dôi tuong Message dê gán dia chi cân gui.
Ví du:
//Tao dia chi
Address toAddress=new InternetAddresss(“thek44a2@yahoo.com”);
Address ccAddress=new InternetAddresss(“theht@walla.com”);
//Gán dia chi cho nguoi nhân
message.addRecipient(Message.RecipientType.TO, toAddress);
message.addRecipient(Message.RecipientType.CC, ccAddress);
Dê dát dia chi cua nguoi gui ban goi phuong thuc setFrom(). Ví du:
Address myAddress=new InternetAddresss(“theht@utehy.edu.vn”);
message.setFrom(myAddress);
Dia chi cua nguoi gui không quan trong, ban có thê dát cho nó môt dia chi e-mail
không có thuc, nêu ban dát dia chi cua nguoi gui không có thuc thì nguoi nhân không thê
phan hôi (reply) lai cho ban.
Ta có thê dát dia chi cua nguoi gui là môt danh sách (mang) dê nguoi nhân có thê
phan hôi lai cho nhiêu nguoi cùng môt lúc. Ban goi phuong thuc addFrom() nhu
sau:
Address address[]=…
Message.addFrom(address);
Chú ý: java mail không cung câp co chê kiêm tra xem dia chi cua nguoi gui có hop lê hay
không. Dê kiêm tra môt dia chi mail có hop lê hay không không phai là dê, thông thuong
don gian nhât ban kiêm tra xem trong dia chi dó có kí tu @ hay không?
3.1.4. Lóp Transport
Lop Transport cung câp các phuong thuc gui mail dên mail server. Don gian ban goi
phuong thuc tinh send() cua lop Transport dê gui dôi tuong thông diêp di. Ví du:
Transport.send(message);
Hoác ban có thê chon giao thuc gui mail tu dôi tuong Session, tao kêt nôi dên trình
chu mail và goi phuong thuc sendMessage() dê gui mail di:
Transport transport;
transport =mailSession.getStransport("smtp");
transport.connnect(host, user, password);
// hoác ban có thê goi phuong thúc transport.connnect();
transport.sendMessage(message, message.getAllRecipients());
transport.close();
Trang 211
Cách thu hai này nhanh hon cách thu nhât trong truong hop ban muôn gui môt sô
luong lon các mail, kêt nôi vân duoc duy trì cho dên khi ban goi phuong thuc
transport.close(), trong khi kêt nôi vân còn mo ban có thê gui bao nhiêu thu tuy ý mà
không phai kêt nôi lai voi mail server. Trong khi phuong thuc transport.send() phai
kêt nôi, dóng kêt nôi môi khi có môt thông diêp duoc gui di, do vây mât thoi gian.
3.2. Các lóp liên quan dên viêc nhân mail
Lóp Store và lóp Folder: Là hai lop này phuc vu chu yêu cho viêc nhân và doc
mail chua trong hôp thu cua mail server. Dê su dung hai lop này truoc tiên ban cân chi dinh
giao thuc nhân mail. Có hai giao thuc nhân mail chính là POP3 và IMAP.
Ví du nêu su dung giao thuc POP3 thì ban khai báo gói com.sun.mail.pop3 nhu sau:
import com.sun.mail.pop3.*;
Còn nêu ban su dung giao thuc IMAP thì ban khai báo gói com.sun.mail.imap nhu
sau:
import com.sun.mail.imap.*;
Tuong tu nhu lop Transport trong thao tác gui mail, ban dùng dôi tuong Session, goi
phuong thuc getStore() dê lây vê dôi tuong Store phuc vu cho muc dích kêt nôi voi
mail server dê nhân mail.
Store store =mailSession.getStore("pop3");
Dê kêt nôi vào mail server ban goi phuong thuc connect() nhu sau:
store.connect(host, user, password);
Trong dó:
host là dia chi cua mail server mà ban muôn lây thu
user/password là tài khoan dáng nhâp vào hôp thu cua ban.
Nêu kêt nôi thành công ban lây vê dôi tuong Folder dê duyêt mail.
Folder folder = store.getFolder(“INBOX”);
folder.open(Folder.READ_ONLY);
Message message[]=folder.getMessages();
Các thông diêp mail duoc luu tru trên mail theo môt câu trúc cây, tuong tu nhu câu trúc cây
thu muc cua hê diêu hành. INBOX ám chi thu muc chua thu gui dên.
Chú ý: Voi giao thuc POP3 ban chi có thê lây mail tu INBOX voi giao thuc IMAP (mo
rông cua giao thuc POP3) ban có thê nhân mail trong các thu muc TRASH, SENT…
Phuong thuc getMessages() tra vê môt mang các dôi tuong Message. Ban goi
phuong thuc getConten() dê lây vê nôi dung cua mail nhu sau:
for(int i=0;i<message.lenth();i++)
System.out.println(((MimeMessage)message[i]).getConten());
Môt dã doc xong thu ban dóng hôp thu và ngát kêt nôi:
folder.close(true);
store.close();
Dôi sô true cho biêt có câp nhât các lênh xoá mail hay không (së dê câp trong phân
sau).
Trang 212
III. Gui mail
1. Gui mail don gian
Chuong trình SendMailAPI duoi dây së goi mail di theo giao thuc SMTP,
SendMailAPI là chuong trình java thuân tuý su dung thu viên java mail. Nó tuong tu
chuong trình SenMailApp chúng ta dã tìm hiêu trong phân truoc. Mác dù vây thay vì su
dung lop SmtpClien ban su dung các lop Session, Transport cua java mail API.
//SendMailAPI.java
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
import java.util.*;
public class SendMailAPI {
public static void main(String args[]) throws Exception {
String smtpHost = "utehy.edu.vn";
int smtpPort = 25;
String from = "theht@utehy.edu.vn";
String to = "thek44a2@yahoo.com";
String subject = "Xin chao";
String content = "";
// Create a mail session
Properties props = new Properties();
props.put("mail.smtp.host", smtpHost);
props.put("mail.smtp.port", "" + smtpPort);
Session session = Session.getDefaultInstance(props, null);
// Construct the message
Message msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(from));
msg.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
msg.setSubject(subject);
msg.setText(content);
// Send the message
Transport.send(msg);
}
}
Truoc tiên ban tao ra môt dôi tuong Properties dê chua các thông tin: tên máy chu mail,
công cua mail server.. báng câu lênh
Properties props = new Properties();
props.put("mail.smtp.host", smtpHost);
props.put("mail.smtp.port", "" + smtpPort);
mác dinh công cua mail së là 25, nêu mail hoat dông trên môt công không phai là 25 thì ban
phai chi rõ công cua mail server báng dòng lênh:
props.put("mail.smtp.port", "" + smtpPort);
Tiêp theo ban lây vê môt phiên kêt nôi báng dòng lênh:
Session session = Session.getDefaultInstance(props, null);
Trang 213
Tiêp theo ban tao ra dôi tuong thông diêp và diên các thông tin cân thiêt vào:
Message msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(from));
msg.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
msg.setSubject(subject);
msg.setText(content);
Cuôi cùng dê gui thu di ban goi phuong thuc:
Transport.send(msg);
Ban có thê thay dòng lênh này báng doan lênh sau:
Transport tp= session.getTransport("smtp");
tp.connect();
tp.sendMessage(msg,msg.getAllRecipients());
tp.close();
Nêu ban chua gán dia chi mail server và công cua nó thì ban phai goi phuong thuc:
tp.connect(host,user,password);
Do ban dang gui mail nên các thông tin dáng nhâp user,password không cân thiêt,
ban có thê cung câp cho nó môt xâu rông nhu sau:
tp.connect(host,””,””);
2. Gui thu vói nôi dung có dinh dang HTML
Nêu nôi dung thu là thuân ván ban ban goi phuong thuc
Message.setText(StringMsg) dê gán nôi dung cho dôi tuong thông diêp cân gui di. Nêu nôi
dung thu không phai là dang thuân ván ban ban cân goi phuong thuc
Message.setConten(StringMsg, MimeType) voi MimeType là môt xâu cho biêt kiêu nôi
dung duoc chua trong mail.
Ví du sau minh hoa cách gui thu voi nôi dung có dinh dang HTML:
// SendMailAPIFromat.java
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
import java.util.*;
public class SendMailAPIFromat{
public static void main(String args[]) throws Exception {
String smtpHost = "utehy.edu.vn";
int smtpPort = 25;
String from = "theht@utehy.edu.vn";
String to = "thek44a2@yahoo.com";
String subject = "Xin chao";
//Gán nôi dung là môt xâu có dinh dang HTML
String content = "<p><b><font face=\".VnArialH\" size=\"8\">Xin chào các
ban</font></b></p><p><font face=\".VnTimeH\">Chúc môt ngày vui vé</font></p>";
// Create a mail session
Properties props = new Properties();
props.put("mail.smtp.host", smtpHost);
props.put("mail.smtp.port", "" + smtpPort);
Session session = Session.getDefaultInstance(props, null);
// Construct the message
Trang 214
Message msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(from));
msg.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
msg.setSubject(subject);
//Gán kiêu nôi dung MimeType là text/html
msg.setContent(content, "text/html");
// Send the message
Transport tp = session.getTransport("smtp");
tp.connect("utehy.edu.vn", "", "");
tp.sendMessage(msg, msg.getAllRecipients());
tp.close();
}
}
Trong ví du trên ban gán nôi dung là môt xâu có dinh dang HTML, dê báo cho
nguoi nhân biêt nôi dung bên trong thu có dinh dang HTML ban goi phuong thuc
msg.setContent(content, "text/html");
3. Gui thu vói file dính kèm
Thu viên java mail API cho phép ban gui mail voi các file dính kèm. Nhung file này
thuong duoc nhúng vào phân nôi dung mail gui di o dang mã hoá tung phân doan
(Multi – part MIME). Môt Message duoc xem là gôm nhiêu phân doan. Môi phân
doan duoc goi là môt BodyPart, Tât ca các BodyPart duoc goi là MultiPart. Dua vào
hai lop BodyPart và MultiPart ta có thê tao ra môt mail phuc tap có thê phân tích boi
noi nhân. Chuong trình SendMailAttachAPI.java duoi dây së cho thây kÿ thuât gui
mail voi file dính kèm.
//SendMailAttachAPI.java
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
import java.util.*;
public class SendMailAttachAPI {
public static void main(String args[]) throws Exception {
String smtpHost = "utehy.edu.vn";
int smtpPort = 25;
String from = "theht@utehy.edu.vn";
String to = "thek44a2@yahoo.com";
String subject = "Xin chao";
String content = "Chuc mot buoi sang tot lanh";
//Tên cúa file dính kèm
String fileName = "C:/test.txt";
//tao dôi tuong session
Properties props = new Properties();
props.put("mail.smtp.host", smtpHost);
props.put("mail.smtp.port", "" + smtpPort);
Session session = Session.getDefaultInstance(props, null);
//Tao dôi tuong thông diêp
Trang 215
Message msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(from));
msg.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
msg.setSubject(subject);
/* Tao dôi tuong Multipart, dôi tuong này dùng dê chúa các BodyPart */
Multipart multiPart = new MimeMultipart();
//Tao ra dôi tuong BodyPart dê chúa nôi dung mail
BodyPart msgBodyPart = new MimeBodyPart();
msgBodyPart.setText(content);
//Thêm dôi tuong msgBodyPart vào multiPart
multiPart.addBodyPart(msgBodyPart);
/*Tao dôi tuong BodyPart thú hai, dôi tuong này dùng dê chúa phân file dính kèm */
msgBodyPart = new MimeBodyPart();
DataSource source = new FileDataSource(fileName);
msgBodyPart.setDataHandler(new DataHandler(source));
//Gán tên têp tin cho BodyPart
msgBodyPart.setFileName(fileName);
//Cho biêt dây là phân chúa file dính kèm
msgBodyPart.setDisposition("attachment");
//Thêm dôi tuong msgBodyPart vào multiPart
multiPart.addBodyPart(msgBodyPart);
//Gán multiPart cho dôi tuong thông diêp
msg.setContent(multiPart);
//Gúi thông diêp di
Transport tp = session.getTransport("smtp");
tp.connect("utehy.edu.vn", "", "");
tp.sendMessage(msg, msg.getAllRecipients());
tp.close();
}
}
Chú ý: Ban có thê dính kèm bao nhiêu file tuy ý, báng cách tao ra nhiêu BodyPart khác
nhau.
IV. Nhân mail
1. Nhân mail don gian
Dê nhân mail, ban kêt nôi vào mail server dê lây vê các Message trong thu muc
INBOX. Ví du GetMailAPI sau minh hoa cách nhân mail tu trình chu và hiên thi ra màn
hình.
//GetMailAPI.java
import java.util.*;
import javax.mail.*;
import com.sun.mail.pop3.*;
public class GetMailAPI {
public static void main(String[] args) throws Exception {
String smtpHost = "utehy.edu.vn";
int smtpPort = 25;
//Tao dôi tuong Session
Trang 216
Properties props = new Properties();
props.put("mail.smtp.host", smtpHost);
props.put("mail.smtp.port", "" + smtpPort);
Session session = Session.getDefaultInstance(props, null);
//Tao dôi tuong Store
Store store = session.getStore("pop3");
store.connect(smtpHost, "thek44a2", "abc");
//Lây vê thu muc INBOX
Folder folder = store.getFolder("INBOX");
if (folder == null) {
System.out.println("No folder");
System.exit(1);
}
//Mó thu muc INBOX vói chê dô chi doc
folder.open(Folder.READ_ONLY);
//Lây vê các dôi tuong Message và hiên thi ra màn hình
Message[] messages = folder.getMessages();
for (int i = 0; i < messages.length; i++) {
printMessage(messages[i]);
}
/*Ðóng kêt nôi nhung không xoá các Message tù mail server */
folder.close(false);
store.close();
}
public static void printMessage(Message m) throws Exception {
//In phân tiêu dê thu
//Lây vê các dia chi gúi
Address[] from = m.getFrom();
if (from != null) {
for (int i = 0; i < from.length; i++) {
System.out.println("From: " + from[i]);
}
}
//Lây vê các dia chi nhân TO
Address[] to = m.getRecipients(Message.RecipientType.TO);
if (to != null) {
for (int i = 0; i < to.length; i++) {
System.out.println("To: " + to[i]);
}
}
//Lây vê tiêu dê thu
String subject = m.getSubject();
if (subject != null) {
System.out.println("Subject: " + subject);
}
//Lây vê ngày thu duoc gúi
Date d = m.getSentDate();
if (d != null) {
System.out.println("Date: " + d);
Trang 217
}
//Thêm môt hàng xuông dòng dê phân cách phân tiêu dê và phân chính cúa thu
System.out.println();
//In nôi dung cúa thu
Object content = m.getContent();
if (content instanceof String) {
System.out.println(content);
}
else if (content instanceof InputStream) {
InputStream in = (InputStream) content;
int c;
while ( (c = in.read()) != -1) System.out.write(c);
}
else {
//Ðinh dang này së duoc giói thiêu trong phân sau
System.out.println("Unrecognized Content Type");
}
}
}
Chú ý: Ban có thê không cân dùng dôi tuong Store, ban có thê thay doan chuong trình sau:
Store store = session.getStore("pop3");
store.connect(smtpHost, "thek44a2", "abc");
//Lây vê thu muc INBOX
Folder folder = store.getFolder("INBOX");
Boi doan chuong trình
URLName urlName=new
URLName("pop3","utehy.edu.vn",110,"INBOX","thek44a2","abc");
Folder folder = session.getFolder(urlName);
Báng cách này ban không cân phai tao ra dôi tuong Store
2. Lây vê các thông tin di kèm vói mail
Ban có thê lây vê các thông tin di kèm voi thu nhu: ngày gui, tiêu dê…
phuong thuc printInfo sau së in ra màn hình các thông tin di kèm voi thu.
public static void printInfo(Message m)throws Exception
{ //Lây vê dia chi cúa nguòi gúi
String from = InternetAddress.toString(m.getFrom());
if (from != null) System.out.println("From: " + from);
//Hoãc
Address[] from = m.getFrom();
if (from != null) {
for (int i = 0; i < from.length; i++) {
System.out.println("From: " + from[i]);
}
}
//Lây vê các dia chi dã phán hôi
String replyTo = InternetAddress.toString(m.getReplyTo());
Trang 218
if (replyTo != null)
System.out.println("Reply-to: "+ replyTo);
//Hoãc
Address[] reply = m.getReplyTo();
if (reply != null) {
for (int i = 0; i < reply.length; i++) {
System.out.println("Reply: " + reply[i]);
}
}
//Lây vê các dia chi TO
String to = InternetAddress.toString(m.getRecipients(Message.RecipientType.TO));
if (to != null) System.out.println("To: " + to);
//Lây vê các dia chi CC
String cc = InternetAddress.toString(m.getRecipients(Message.RecipientType.CC));
if (cc != null) System.out.println("Cc: " + cc);
//Lây vê các dia chi BCC
String bcc = InternetAddress.toString(m.getRecipients(Message.RecipientType.BCC));
if (bcc != null) System.out.println("Bcc: " + to);
//Lây vê tiêu dê cúa thu
String subject = m.getSubject();
if (subject != null) System.out.println("Subject: " + subject);
//Lây vê ngày thu duoc gúi
Date sent = m.getSentDate();
if (sent != null) System.out.println("Sent: " + sent);
//Lây vê ngày thu duoc nhân
Date received = m.getReceivedDate();
if (received != null) System.out.println("Received: " + received);
}
3. Nhân mail vói các file dính kèm
Nêu nôi dung thu có chua file dính kèm ban có thê tách phân dính kèm, phân thu ra.
Ví du GetMailAttach.java minh hoa cách kiêm tra mail có file dính kèm hay không?, nêu
có thì ghi nôi dung cua file dính kèm xuông thu muc C:\data.
//GetMailAttach.java
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
import com.sun.mail.pop3.*;
import java.net.*;
import java.io.*;
public class GetMailAttach {
public static void main(String[] args) throws Exception {
String smtpHost = "utehy.edu.vn";
int smtpPort = 25;
//tao ra môt mail Session
Properties props = new Properties();
props.put("mail.smtp.host", smtpHost);
props.put("mail.smtp.port", "" + smtpPort);
Trang 219
Session session = Session.getDefaultInstance(props, null);
//Lây vê Store
Store store = session.getStore("pop3");
//Kêt nôi vói mail server
store.connect(smtpHost, "thek44a2", "abc");
//Lây vê thu muc INBOX
Folder folder = store.getFolder("INBOX");
//Nêu không có thu muc này thì thoát
if (folder == null) {
System.out.println("No folder");
System.exit(1);
} //Mó thu muc dê lây thu theo chê dô chi doc
folder.open(Folder.READ_ONLY);
//Lây vê các thu trong Mail Box
Message[] messages = folder.getMessages();
//Xú lý tùng thu môt
for (int i = 0; i < messages.length; i++) {
//Lây vê nôi dung cúa thu
Object body = messages[i].getContent();
//Kiêm tra xem nôi dung thu có nhiêu phân hay không?
if (body instanceof Multipart) {
//Nôi dung thu gôm nhiêu phân
processMultipart( (Multipart) body);
}
else { //Nôi dung thu chi có môt phân
processPart(messages[i]);
}
}
// Ðóng kêt nôi, nhung không xoá các thu
folder.close(false);
store.close();
}
//Phuong thúc xú lý thu gôm nhiêu Part
public static void processMultipart(Multipart mp) throws MessagingException {
for (int i = 0; i < mp.getCount(); i++) {
processPart(mp.getBodyPart(i));
}
}
//Phuong thúc xú lý môt Part
public static void processPart(Part p) {
try {
//Thú lây vê tên file cúa Part
String fileName = p.getFileName();
/* ây vê dâu hiêu cho biêt Part có phái là phân file dính kèm không */
String disposition = p.getDisposition();
/* Kiêm tra xem Part có phái là file dính kèm không?
Chú ý không nên sú dung disposition.equals(Part.ATTACHMENT), vì disposition có thê
nhân giá tri null khi dó phuong thúc equals së nhân môt ngoailê
*/
Trang 220
if (Part.ATTACHMENT.equals(disposition)) {
//Nêu Part là phân chúa file dính kèm
if (fileName == null) fileName = "data.txt";
File f = new File("C:/data/" + fileName);
for (int i = 0; f.exists(); i++) {
f = new File("C:/data/" + fileName + " " + i);
}
//Lây vê luông xuât gãn vói têp tin
FileOutputStream out = new FileOutputStream(f);
//Lây vê luông nhâp gãn vói Part
InputStream in = new BufferedInputStream(p.getInputStream());
//Khai báo vùng nhó tam dê doc nôi dung tù Part
byte buffer[] = new byte[in.available()];
in.read(buffer); //Ðoc nôi dung tù part vào vùng nhó dêm
out.write(buffer); //Ghi vùng nhó dêm ra têp
out.flush(); //Ghi dôn hêt vùng dêm ra têp
out.close(); //Ðóng luông gãn vói têp
in.close();//Ðóng luông gãn vói Part
}
else { //Part không phái là phân chúa file dính kèm
System.out.println(p.getContent());
}
}
catch (Exception e) {
System.err.println(e);
e.printStackTrace();
}
}
}
Trang 221
V. Xoá mail
1. Xoá mail
Dê xoá mail ban mo hôp thu voi quyên doc/ghi nhu sau:
Folder folder = store.getFolder("INBOX");
folder.open(Folder.READ_ONLY);
Message[] messages = folder.getMessages();
Tiêp dên dát co xoá:
Messages[i].setFlag(Flags.Flag.DELETE,true);
Tiêp dên dóng kêt nôi, mail server së tu dông xoá mail
folder.close(true);//Chú ý bát buôc phai là tham sô true
2. Kiêm tra trang thái cò cua mail
// Kiêm tra trang thái cua các cò :
//Dã dánh dâu xoá
if (messages[i].isSet(Flags.Flag.DELETED)) {
System.out.println("Deleted");
}
//Dã tra loi
if (messages[i].isSet(Flags.Flag.ANSWERED)) {
System.out.println("Answered");
}
//Dã vào thùng rác
if (messages[i].isSet(Flags.Flag.DRAFT)) {
System.out.println("Draft");
}
//Dã duoc gán co
if (messages[i].isSet(Flags.Flag.FLAGGED)) {
System.out.println("Marked");
}
if (messages[i].isSet(Flags.Flag.RECENT)) {
System.out.println("Recent");
}
//Dã doc
if (messages[i].isSet(Flags.Flag.SEEN)) {
System.out.println("Read");
}
if (messages[i].isSet(Flags.Flag.USER)) {
// We don't know what the user flags might be in advance
// so they're returned as an arrya of strings
String[] userFlags = messages[i].getFlags().getUserFlags();
for (int j = 0; j < userFlags.length; j++) {
System.out.println("User flag: " + userFlags[j]);
}
}
Trang 222
Chuong 10: LAP TRÌNH PHÂN TÁN VÓI
JAVA RMI ( REMOTE METHOD INVOKE)
Lâp trình phân tán voi RMI là môt trong nhung vân dê nóng bong cua nên công
nghiêp phân mêm ngày nay. Dê giúp các ban có các kiên thuc co ban vê lâp trình phân tán
và công nghê lâp trình phân tán RMI. Chuong này ta thao luân vê các khía canh dó.
Sau khi hoc xong chuong này nguoi hoc có thê:
Hiêu duoc khái niêm vê lâp trình phân tán và công nghê RMI
ung dung công nghê RMI dê xây dung các ung dung phân tán
Chuyên tham sô cho phuong thuc triêu goi tu xa và nhân kêt qua tra vê tu phuong thuc
triêu goi tu xa
I. RMI và lâp trình phân tán dôi tuong
Thông thuong mã lênh cua môt chuong trình khi thuc thi duoc tâp trung trên cùng
môt máy, dây là cách lâp trình truyên thông. Su phát triên nhu vu bão cua mang máy tính
dác biêt là mang Internet toàn câu, dã khiên các chuong trình truyên thông này không còn
dáp ung duoc yêu câu nua. Các chuong trình bây gio yêu câu phai có su hop tác xu lý, tuc
là mã lênh cua nó dã không tâp trung trên môt máy mà duoc phân tán trên nhiêu máy. Khi
môt ung dung có mã lênh thuc thi duoc phân tán trên nhiêu máy thì chuong trình dó duoc
goi là chuong trình phân tán và viêc lâp trình dê tao ra các chuong trình này duoc goi là lâp
trình phân tán. Có rât nhiêu công nghê lâp trình phân tán nhu: DCOM, CORBA, RMI,
EJB.. trong dó RMI là công nghê thuân Java và dê lâp trình nhât.
Thông thuong nêu các dôi tuong duoc tâp trung trên cùng môt máy thì ban có thê
triêu goi các phuong thuc cua nó báng cách guu cho nó môt thông báo, câu hoi dát ra là
làm thê nào dê có thê triêu goi các phuong thuc cua môt dôi tuong nám trên môt máy khác.
dây chính là nôi dung cua lâp trình phân tán mã lênh RMI (Remote Method Invoke – tam
dich là triêu goi phuong thuc tu xa). RMI là cách thuc giao tiêp giua các dôi tuong Java có
mã lênh cài dát (bao gôm ca phuong thuc và thuôc tính) nám trên các máy khác nhau có thê
triêu goi lân nhau.
Hình sau mô hình triêu goi dôi tuong phân tán. Trên máy A các dôi tuong A1, A2
goi các phuong thuc cua nhau duoc goi là triêu goi phuong thuc cuc bô (local method
invoke) dây là cách lâp trình huong dôi tuong truyên thông vân su dung, tuong tu các dôi
tuong B1, B2, B3 là các dôi tuong cuc bô.
Tuy nhiên các dôi tuong Java có thê triêu goi phuong thuc cua môt dôi tuong nám
trên môt máy khác dua vào giao thuc triêu goi tu xa RMI. Trong mô hình duoi dây thì loi
triêu goi phuong thuc cua dôi tuong B2 ( nám trên máy B) tu dôi tuong A1 ( nám trên máy
A) là loi goi phuong thuc tu xa.
Trang 223
II. Goi phuong thúc tù xa và các vân dê phát sinh
Viêc triêu goi môt phuong thuc tu xa thoat nhìn có ve don gian nhung thuc tê lai
phuc tap hon triêu goi phuong thuc cuc bô. Các dôi tuong trên hai máy khác nhau hoat
dông trên hai tiên trình khác nhau (có hai không gian dia chi khác nhau) nên viêc tham
chiêu biên dia chi dôi tuong là khác nhau. Ví du khi ban truyên môt dôi tuong cho môt
phuong thuc triêu goi tu xa thì thuc su ban truyên môt tham chiêu dôi tuong dên phuong
thuc tu xa, tuy nhiên vùng nho thuc su cua dôi tuong lai nám trên môt máy khác. Loi goi
phuong thuc cuc bô luôn tra vê kêt qua thông qua ngán xêp trong khi loi goi phuong thuc
tu xa kêt qua tra vê phai thông qua kêt nôi mang chính vì vây các su cô vê truyên thông
luôn có thê sây ra, nhu vây viêc bát và kiêm soát lôi trong các ung dung phân tán là rât dát.
III. Vai trò cua các lóp trung gian
Dôi voi loi goi phuong thuc cuc bô, các tham sô truyên vào phuong thuc cung nhu
kêt qua tra vê tu phuong thuc duoc thuc hiên thông qua ngán xêp (stack) trong khi loi goi
phuong thuc tu xa phai duoc dóng gói và chuyên qua mang.
Dê don gian và trong suôt dôi voi nguoi lâp trình dôi tuong Java trên hai máy khác
nhau không triêu goi phuong thuc cua nhau môt cách truc tiêp mà thông qua lop trung gian.
Lop trung gian tôn tai o ca hai phía: phía máy khách (noi goi phuong thuc cua dôi tuong o
xa) và máy chu (noi dôi tuong thuc su duoc cài dát). Phía máy khác lop trung gian này
duoc goi là stub (lop móc), phía máy chu lop trung gian duoc goi là skeletion (lop nôi).
Ta có thê hình dung lop trung gian stub và skel là hai nguoi trung gian giúp các dôi
tuong o xa có thê giao dich duoc voi nhau.
Máy A
A1
A2
Máy B
B1
B2
B3
Máy C
C
Hình 1: Mô hình triêu goi các phuong thuc tu xa
Trang 224
Trong hình trên ban có dôi tuong C1 duoc cài dát trên máy C. trình biên dich Java
giúp ta tao ra hai lop trung gian C1_stub và C1_skel. Lop C1_stub duoc mang vê máy A.
Khi A1 trên máy A triêu goi phuong thuc cua dôi tuong C1 nó së chuyên loi goi phuong
thuc cho lop trung gian C1_stub. Lop trung gian C1_stub có trách nhiêm dóng gói các tham
sô chuyên tham sô qua mang dên phuong thuc duoc triêu goi cua dôi tuong C1. Trên máy
C lop trung gian C1_Skel có nhiêm vu nhân các tham sô và chuyên vào vùng dia chi thích
hop sau dó goi phuong thuc tuong ung. Kêt qua tra vê (nêu có) cua phuong thuc do C1 tra
vê së duoc lop C1_Skel dóng gói và chuyên nguoc vê cho trình khách. Trên máy khách lop
trung gian C1_Stub chuyên giao kêt qua cuôi cùng lai cho A1. Báng co chê này A1 luôn
nghi ráng dôi tuong C1 dang tôn tai ngay trên cùng máy voi nó nhu các dôi tuong cuc bô
khác. Hon nua nho có lop trung gian C1_Stub mà khi kêt nôi mang gáp su cô thì lop trung
gian stub së luôn biêt cách thông báo lôi dên dôi tuong A1.
Thuc tê làm cách nào A1 tham chiêu duoc dên C1, môt khi không có dôi tuong C1 duoc
cài dát trên máy A? C1_Stub trên máy A chi thuc hiên viêc chuyên tham sô, nhân kêt qua
tra vê nêu có và thuc hiên các giao thuc mang, nó không phai là hình anh cua C1. Dê làm
duoc diêu này dôi tuong C1 cân cung câp môt giao diên tuong ung voi các phuong thuc mà
các dôi tuong trên máy khác có thê triêu goi. Chúng ta tiêp tuc làm sáng to dìêu này khi nói
vê giao diên tu xa.
IV. Cài dàt dôi tuong phân tán
1. Giao diên tù xa
Khi ban muôn tao ra môt su vât tu xa thì ban che mat na cài dát nên báng cách
truyên qua môt giao diên. Vây khi khách thu duoc môt tham chiêu dên dôi tuong tu
xa thì thuc chât dó là môt giao diên.
Máy A
C
1
_
s
t
u
b
A1
A1
B1_st ub
Máy C
C
1
_
s
k
e
l
C1
Máy B
B1
B1_skel
Hình 2: Goi phuong t húc cúa dôi t uong t hông qua lóp t rung gian
Trang 225
Khi tao ra môt giao diên tu xa, thì ban phai tuân theo các huong dân sau:
Giao diên tu xa phai là môt giao diên public, tuc là khi tao ra môt giao diên tu xa ta phai
thêm tu khoá public vào truoc dinh nghia giao diên. Báng không, khi ban tham chiêu
dên dôi tuong tu xa ban së thu duoc môt ngoai lê
Giao diên tu xa phai là giao diên duoc kê thua tu giao diên Remote
Môi phuong pháp trong giao diên tu xa phai khai báo RemoteException trong mênh dê
throws bên bât cu ngoai lê nào khác, tuc là tât ca các phuong thuc trong giao diên tu xa
dêu phai ném ra ngoai lê RemoteException
Nêu tham sô truyên cho phuong thuc hoác giá tri nhân vê tu thuc triêu goi tu xa là môt
dôi tuong thì dôi tuong dó phai triên khai giao diên Remote hoác giao diên Serializable
Thông thuong ban thuong thây môt giao diên tu xa có câu trúc nhu sau:
import java.rmi.*;
public interface RemoteInterface extends Remote{
[public] ReturnDataType method1([DataType arg1,][ DataType arg2,.] ) throws
RemoteException;
[public] ReturnDataType method2() throws RemoteException;
}
Ví du 1-1: Sau dây là môt giao diên tu xa don gian cua ung dung HelloRMI
HelloRMI.java
import java.rmi.*;
public interface HelloRMI extends Remote{
public String sayHello() throws RemoteException;
}
Nhìn vào giao diên này ta thây nó giông bât ky giao diên nào khác ngoai tru nó duoc
mo rông tu giao diên Remote và tât ca các phuong thuc trong giao diên này dêu phai nem
ra ngoai lê RemoteException, ban hãy nho ráng tât ca các phuong thuc duoc khai báo trong
giao diên së tu dông là public, thê nên trong giao diên trên ban có thê bo tu khoá public khi
khai báo phuong thuc sayHello.
Ban tiên hành biên dich javac HelloRMI.java ban së thu duoc têp tin HelloRMI.class
2. Triên khai giao diên tù xa
Sau khi ban tao ra giao diên tu xa, công viêc tiêp theo mà ban cân phai làm là triên
khai tât ca các phuong thuc trong giao diên tu xa.
Ví du 1-2: Sau dây là cài dát cua giao diên tu xa HelloRMI
HelloRMIImpl.java
import java.rmi.*;
public class HelloRMIImpl implements HelloRMI {
public String sayHello() throws RemoteException
{
return "Hello RMI";
}
}
Vân dê dát ra là làm thê nào dê cài dát dôi tuong HelloRMI lên môt máy (máy 2) và goi
phuong thuc sayHello() cua HelloRMI tu máy khác (máy 1)? Nhu dã nêu o trên ta không
goi duoc phuong thuc sayHello cua HelloRMI môt cách truc tiêp mà cân có thêm hai lop
trung gian là HelloRMIImpl_Stub và HelloRMIImpl_Skel. Dua vào lop
Trang 226
HelloRMIImpl.class, trình biên dich rmic.exe cua Java së giúp ta tao ra hai lop trung gian
Stub và Skel. Ban mo cua sô DOS – Prompt và gõ vào dòng lênh
Rmic HelloRMIImpl.class
Kêt qua ban së thu duoc hai têp HelloRMIImpl_Stub.class và HelloRMIImpl_Skel.class
3. Cài dát, dáng kí dôi tuong tù xa
Buoc tiêp theo sau khi ban cài dát giao diên tu xa là công viêc dáng ký nó voi trình
rmiregistry theo mâu sau:
Ví du 1-4: Ví du sau là chuong trình dáng ký và cài dát doi tuong HelloRMIImpl voi trình
chu rmiregistry.
Setup.java
import java.rmi.server.*;
import java.rmi.*;
import java.net.*;
public class Setup {
public static void main(String[] args) {
// tao ra môt thê hiên cúa dôi tuong tù xa
HelloRMI h=new HelloRMIImpl();
try {
// Khai báo dôi tuong có khá näng triêu goi tù xa
UnicastRemoteObject.exportObject(h);
// däng ký nó vói trình rmiregistry
Naming.bind("//localhost/hello", h);
// có thê thay phuong thúc bind bói phuong thúc rebind nhu sau:
// Naming.rebind("//localhost/hello", h);
}
catch (MalformedURLException ex) {
}
catch (AlreadyBoundException ex) {
}
catch (RemoteException ex) {
}
}
}
Công viêc dâu tiên ban phai làm khi cài dát dôi tuong tu xa là tao ra môt thê hiên
cua dôi tuong tu xa.
HelloRMI h=new HelloRMIImpl(); ban có thê thay báng dòng lênh
HelloRMIImpl h=new HelloRMIImpl();
Tiêp theo ban goi phuong thuc tinh exportObject cua lop UnicastRemoteObject dê máy ao
java biêt dôi tuong h (HelloRMI) là dôi tuong có kha náng truy xuât tu xa.
UnicastRemoteObject.exportObject(h);
Luu ý dê su dung duoc lop UnicastRemoteObject ban phai khai báo import
java.rmi.server.*; o dâu chuong trình
Trang 227
Buoc cuôi cùng là ban dát cho dôi tuong h môt cái tên goi nho và dáng ký tên này
voi bô dáng ký rmiregistry. Phuong thuc tinh cua lop Naming së thuc hiên diêu này
Naming.bind("[rmi:]//hostname[:port]/name", h);
Phuong thuc bind có hai tham sô: tham sô thu nhât là môt chuôi dinh vi URL, dôi sô
thu hai là ban thân dôi tuong cân dáng ký
Chuôi dinh vi URL có dinh dang nhu sau:
[rmi:]//hostname[:port]/name
Trong dó:
mri là tên giao thuc,dây là phân tuy chon, mác dinh giao thuc là rmi nên ban có thê bo
qua.
Hostname là tên cua máy chu hoác dia chi IP cua máy chu noi dôi tuong phân tán dang
tôn tai.
Port là sô hiêu công cua chuong trình rmiregistry, dây là tham sô tuy chon, nêu bo qua
tham sô này thì công mác dinh là 1009
Name là tên goi nho cua dôi tuong phân tán
Phuong thuc bind së di vào vòng láp vô han cho kêt nôi tu máy kách.
Các chuong trình phía máy khách së dua vào chuôi dinh vi URL mà ta dáng ký voi trình
rmiregistry dê truy tìm tham chiêu dên dôi cân dùng.
Ban có thê khoi dông bô dáng ký rmiregistry này o dâu? Ban mo cua sô DOS-Prompt
và cho chay chuong trình rmiregistry này tu dòng lênh nhu sau:
C:\JDK1.4\bin\rmiregistry.exe
Nêu trong WintNT thì ban có thê chay nó nhu môt dich vu báng dòng lênh start
C:\JDK1.4\bin\rmiregistry.exe
Sau khi khoi dông chuong trình rmiregistry báng môt trong hai cách ban không thây
phan hôi gì ca boi vì dây là chuong trình chay duoi dang dich vu (service).
Mác dinh rmiregistry láng nghe các kêt nôi trên công 1009. Ban có thê chi dinh
công khác cho nó. Ví du lênh sau së khoi dông rmiregistry trên công 2004
C:\Jdk1.4\bin\rmiregistry.exe 2004
Chú ý:
Trong java 1 hostname không thê là localhost, nghia là nêu ban muôn thu nghiêm trên
máy cuc bô thì ban phai truyên cho nó môt dia chi IP cháng han nhu 127.0.0.1 hoác tên cua
máy (dê biêt tên cua máy cua mình ban vào Control Panel\Net Work chon the
Indentification và ban së thây tên máy cua mình trong phân Computer Name)
RMI së không làm viêc chung nào ban chua cài ho giao thuc TCP/IP.
Nêu ban dang kiêm thu trên máy cuc bô thì ban có thê dáng ký voi trình rmiregistry don
gian nhu sau:
Naming.bind(“hello”,h);
Nêu ban dáng ký môt dôi tuong moi voi môt cái tên goi nho dã duoc su dung cho môt
dôi tuong khác ban së nhân duoc môt ngoai lê AlreadyBoundException. Dê ngán can diêu
này ban nên dùng phuong thuc Naming.rebind() thay cho phuong thuc Naming.bind() vì
Naming.rebind() bô sung môt cái tên moi nêu nó chua có và thay thê môt cái tên dã tôn tai
voi môt dôi tuong moi.
Cho dù phuong thuc main() kêt thúc thì dôi tuong tu xa ban tao ra và dáng ký cho nó
môt cái tên vân còn dó chung nào mà rmiregistry vân còn dang chay và ban không goi
Trang 228
phuong thuc Naming.unbind() thì su vât này vân còn dó. Boi lý do này, khi ban phát triên
ung dung cua mình thì ban cân phai tát rmiregistry và cho chay lai nó môi khi ban biên dich
lai dôi tuong tu xa.
Ban không nhât thiêt phai khoi dông rmiregistry nhu môt tiên trình ngoài. Nêu ban biêt
ráng ung dung cua mình là ung dung duy nhât së dùng sô dáng ký. Thì ban có thê bát dâu
nó o bên trong chuong trình cua mình báng dòng lênh:
LocateRegistry.createRegistry(Port);
o dây Port là sô hiêu công. Diêu này là tuong duong voi viêc chay rmiregistry Port tu dâu
nhác cua DOS-Prompt
4. Viêt trình khách triêu goi phuong thúc cua dôi tuong cài dát tù xa
Trình khách triêu goi dôi tuong phân tan RMI có thê là môt trong các kiêu ung dung
sau: ung dung console
ung dung có giao diên dô hoa
ung dung Servlet
trang JSP

Diêu duy nhât ban phai làm trong chuong trình khách là tra cuu và lây vê giao diên
tu xa tu trình chu. Tu dó tro di viêc triêu goi phuong thuc tu xa giông nhu là triêu
goi phuong thuc cua bât ky dôi tuong cuc bô nào khác.
Sau dây là mâu chuong trình phía trình khách triêu goi dôi tuong phân tán RMI
import java.rmi.*;
import java.rmi.registry*;
public Client
{
public static void main(String args[]) throws RemoteException
{
// lây vê tham chiêu dôi tuong phân tán báng phuong thuc Naming.lookup()
RemoteInterface r=(RemoteInterface)Naming.lookup(“[rmi:]//hostname[:port]/name”);
// triêu goi các phuong thuc cua dôi tuong tu xa
}
}
Ví du 1-5: Sau dây là trình khách triêu goi dôi tuong HelloRMI
Client.java
import java.rmi.*;
import java.rmi.registry*;
public Client
{ public static void main(String args[]) throws RemoteException
{// lây vê tham chiêu dôi tuong phân tán báng phuong thuc Naming.lookup()
HelloRMI r=( HelloRMI)Naming.lookup(“//localhost/hello”);
// triêu goi phuong thuc sayHello cua dôi tuong tu xa
System.out.println(HelloRMI.sayHello());
}
}
Trang 229
Dê truy tìm dôi tuong o xa, chuong trình máy khách goi phuong thuc
Naming.lookup(); Phuong thuc này chi yêu câu dôi sô là chuôi cho biêt dia chi cua máy
chu và tên dáng ký cua dôi tuong.
RemoteInterfacer=(RemoteInterface)Naming.lookup(“[rmi:]//hostname[:port]/name”);
Mác dinh phuong thuc Naming.lookup() tra vê môt tham chiêu Object nên ban cân phai
ép kiêu sang giao diên tu xa.
Ban có thê hình dung phuong thuc Naming.lookup() dóng vai trò nhu môt dich vu tìm
kiêm dôi tuong trên máy chu, nó liên lac voi trình rmiregistry trên máy chu và yêu câu tra
vê tham chiêu dôi tuong cho ban su dung. Còn Naming.bind() dóng vai trò nhu dich vu
dáng ký.
Biên dich và chay trình khách
Javac Client.java
Tât ca dá sán sàng, ban hãy chay chuong trình khách nhu sau:
Java Client
Kêt qua thu duoc là loi chào “Hello RMI”
Hình 3 diên dat co chê goi phuong thuc tu xa cua các dôi tuong RMI môt cách tông quát:
Dáng ký dôi tuong voi trình rmiregistry báng cách goi phuong thuc Naming.bind() hoác
Naming.rebind().
Máy khách muôn goi phuong thuc cua dôi tuong trên máy chu truoc hêt cân phai goi
phuong thuc Naming.lookup() dê truy tìm tham chiêu dên dôi tuong o xa theo tên.
Bô dáng ký së tra vê tham chiêu cua dôi tuong o xa thông qua giao diên tu xa.
Dua vào giao diên tu xa mà trình khách có thê goi các phuong thuc cua dôi tuong o xa.
Khi môt phuong thuc duoc goi, loi goi së duoc chuyên dên lop trung gian _Stub. Lop
trung gian này có nhiêm vu dóng gói các tham sô và chuyên dên lop trung gian _Skel
trên trình chu.
Lop trung gian trên máy chu së tiêp nhân các tham sô gui dên tu trình khách và truc tiêp
yêu câu dôi tuong thuc thi phuong thuc và chuyên kêt qua (nêu có) vê cho trình khách.
.
Ví du 2: Viêt lop Calculator, lop này có các phuong thuc add, less, mul, div dùng dê thuc
hiên các phép toán tuong ung công, tru, nhân và chia
Buóc 1: tao ra giao diên tù xa
- Mo môt trình soan thao bât ky gõ vào nôi dung nhu sau:
M¸ y kh¸ ch M¸ y chñ
rmiregist ry
HelloRMI I m
pl
Naming. bin
d
Naming. rebi
nd
Client
Naming. looku
p
1
2
3
HelloRMI
HelloRMI I mpl_St ub HelloRMI I mpl_Skel
4
5
6
Trang 230
//Calculator.java
import java.rmi.*;
public interface Calculator extends Remote {
float add(float a, float b) throws RemoteException;
float less(float a, float b) throws RemoteException;
float mul(float a, float b) throws RemoteException;
float div(float a, float b) throws RemoteException;
}
- Ghi lai vào thu muc C:\NetWork\Server
- Mo cua sô DOS-Prompt và gõ vào dòng lênh biên dich nhu sau:
Buóc 2: Cài dàt giao diên tù xa
- Mo trình soan thao bât ky gõ vào nôi dung sau:
// CalculatorImpl.java
import java.rmi.RemoteException;
public class CalculatorImpl implements Calculator {
public float add(float a, float b) throws RemoteException {
return a+b;
}
public float less(float a, float b) throws RemoteException {
return a-b;
}
public float mul(float a, float b) throws RemoteException {
return a*b;
}
public float div(float a, float b) throws RemoteException {
return a/b;
}
}
- Ghi lai voi cái tên CalculatorImpl.java
- Mo cua sô DOS_Prompt và gõ vào dòng lênh sau dê biên dich
Trang 231
sau khi biên dich ban thu duoc têp tin CalcultatorImpl.class
Buóc 3 Tao ra các lóp trung gian _Stub và _Skel
Ban mo cua sô DOS_Prompt và gõ vào dòng lênh
Sau khi thuc hiên xong lênh này ban së thu duoc hai lop trung gian là
CalcultatorImpl_Stub và CalcultatorImpl_Skel trong cùng thu muc C:\network\server
Buóc 4: Dàng ký dôi tuong tù xa vói trình rmiregistry
- Ban mo trình soan thao bât ky và gõ vào nôi dung nhu sau:
// CalculatorSetup.java
import java.rmi.server.*;
import java.rmi.*;
public class CalculatorSetup {
public static void main(String[] args) throws Exception{
Calculator c=new CalculatorImpl();
UnicastRemoteObject.exportObject(c);
Naming.rebind("rmi://localhost/Cal",c);
}
}
- Ghi lai voi cái tên CalculatorSetup.java trong vào thu muc c:\network\server
- Mo cua sô DOS_Prompt gõ vào dòng lênh sau:
Trang 232
Buóc 5: Khoi dông dich vu dàng ký tên rmiregistry
Ban mo cua sô DOS-Prompt, chuyên vào thu muc C:\NetWork\Server và gõ vào dòng lênh
sau:
Chuong trình dang ký dã duoc khoi dông
Buóc 6: Khoi dông trình setup
Ban mo cua sô DOS-Prompt khác gõ vào dòng lênh
Chú ý: Nêu ban không chuyên vào thu muc C:\NetWork\Server truoc khi khoi dông dich
vu dang ký thì ban së nhân duoc môt lôi
Trang 233
Chuong 11: JAVA JSP (JAVA SERVLET)
Trang 234
Chuong 12: EJB (ENTERPRISE JAVA BEANS)
Chuong này ta së nghiêm cuu và xây dung môt trong nhung thành phân thú vi cua
java dó là JavaBean môt mô hình quan trong trong kiên trúc cua Java.
Các vân dê chính së duoc dê câp trong chuong này
JavaBean và công nghê phân mêm
Tìm hiêu các thành phân cua JavaBean
Tìm hiêu bô phân tích Introspector cua java
Xây dung và su dung JavaBean
Tích hop JavaBean voi các công nghê thành phân khác
I. Tông quan vê JavaBean
JavaBean là môt công nghê lâp trình huong thành phân cua Sun dua trên nên tang
cua ngôn ngu Java. JavaBean là môt giao diên lâp trình dùng dê tao ra nhung khôi mã xây
dung sán và có thê dùng lai duoc. Nhung thành phân JavaBean có thê duoc “nhúng” vào
môt ung dung, liên kêt voi thành phân JavaBean khác hay duoc dùng dê kêt nôi voi các
ung dung. Báng cách su dung JavaBean các nhà phát triên ung dung có thê giam khôi
luong mã mà ho phai viêt. Ho có thê tu viêt ra chúng hoác có thê mua lai cua môt hãng
phát triên thu ba khác (third party).
JavaBean thuc chât là môt lop Java nhu các lop Java thông thuong khác, nhung nó
duoc viêt theo môt quy tác quy dinh truoc, Ban không cân phai viêt thêm bât cu mã
phu nào hay su dung nhung mo rông ngôn ngu dác biêt nào dê tao ra môt Bean.
Diêu duy nhât ban phai làm hoi sua cách dát tên cho các phuong thuc cua mình.
Chính tên phuong thuc moi báo cho công cu xây dung biêt dây có là môt thuôc tính
hay môt su kiên hay chi là môt phuong thuc thông thuong.
II. Xây dung thành phân JavaBean
Nhu dã gioi thiêu o trên JavaBean thuc chât là môt lop java thông thuong. Nhu vây
môt JavaBean cung có các thuôc tính và các phuong thuc. Môt câu hoi ban dát ra là làm thê
nào dê nguoi dùng Bean cua ban có thê biêt duoc trong Bean dó có nhung thuôc tính,
phuong thuc nào, kiêu cua chúng ra làm sao? Diêu này dã duoc các nhà thiêt kê java giai
quyêt môt cách rât don gian. Dê biêt duoc các thuôc tính và các phuong thuc cua môt Bean
ban chi cân tuân thu theo quy tác dát tên sau:
Voi môt thuôc tính có tên là xxx, thì ban tao ra hai phuong thuc: getXxx() và setXxx().
Luu ý ráng ký tu thu nhât sau “get” hay “set” phai viêt hoa. Kiêu tra vê cua phuong
thuc “get” cung chính là kiêu cua dôi phuong thuc “set” và thuong thì chúng cung là
kiêu cua thuôc tính xxx. Ban cung chú ý cho là tên cua thuôc tính và kiêu cho “get” và
“set” là không liên quan.
Voi môt thuôc tính boolean, ban có thê dùng cách tiêp cân “get” và “set” o trên, nhung
ban cung có thê dung “is” thay cho “get”.
Các phuong thuc thông thuong cua Bean không tuân theo quy tác trên, nhung chúng
phai là phuong thuc public.
Nêu Bean cho phép dáng ký thính gia thì voi môt thính gia (listener) XxxListener ban
phai có hai phuong thuc tuong ung di kèm là addXxxListener(XxxListener) và
Trang 235
removeXxxListener(XxxListener). Phân lon các biên cô và thính gia là có sán ban có
thê tu tao ra các biên cô và thính gia riêng cua mình.
1. Thuôc tính cua Bean
Thuôc tính thuc chât là môt biên nám bên trong môt lop, thông thuong các thuôc
tính thuong duoc dát muc truy câp là private. dê truy câp dên các thuôc tính private này ta
thuong dùng hai phuong thuc: “get” mang nghia là lây giá tri cua thuôc tính và “set” hàm
nghia gán giá tri cho thuôc tính. Ví du voi môt Bean don gian có tên là xBean nhu sau:
public class xBean
{
private String myName;
public String getName() { return myName;}
public void setName(String newName) { myName=newName;}
}
Thuôc tính myName trong lop xBean duoc lây và gán gián tri thông qua phuong
thuc getName và setName. Nhu ban thây giua tên thuôc tính và tên phuong thuc “get” và
“set” là không liên quan dên nhau. Khi Bô phân tích (Instrospector) cua java thây trong
Bean có hai phuong thuc tên là getName và setName nó së hiêu ráng bên trong Bean này
có môt thuôc tính tên là name (vì có hai phuong thuc tên là getName và setName).
Ví du: Trình bày cách tao ra các thuôc tính và cách xây dung các phuong thuc “get” và
“set”
public class Bean1 {
private String str; // thuôc tính kiêu String
private int i; // thuôc tính kiêu int
private int[] arr; // thuôc tính kiêu máng int
private boolean b; // thuôc tính kiêu logic
private float f; // thuôc tính kiêu float
private java.io.DataInputStream is; // thuôc tính kiêu dôi tuong
private java.io.DataOutputStream os;
public String getStr() { //Phuong thúc get cho thuôc tính str
return str;
}
public void setStr(String str) { //Phuong thúc set cho thuôc tính str
this.str = str;
}
public int getI() { //Phuong thúc get cho thuôc tính i
return i;
}
public void setI(int i) { //phuong thúc set cho thuôc tính i
this.i = i;
}
//Phuong thúc get cho thuôc tính arr thuôc tính này là môt //máng nên giá tri trá vê là môt
máng
public int[] getArr() { return arr; }
//Phuong thúc set cho thuôc tính arr, thuôc tính này là môt //máng nên tham sô là môt
náng
public void setArr(int[] arr) { this.arr = arr; }
Trang 236
//Phuong thúc get cho thuôc tính b, do thuôc tính này kiêu //logic nên ban có thê sú dung
is thay cho get
public boolean isB() { return b; }
public void setB(boolean b) { this.b = b; }
public float getF() { return f; }
public void setF(float f) { this.f = f; }
//nêu thuôc tính là môt dôi tuong thì phuong thúc get trá //vê môt dôi tuong kiêu dôi
tuong
public java.io.DataInputStream getIs() { return is; }
public void setIs(java.io.DataInputStream is) { this.is = is; }
public java.io.DataOutputStream getOs() { return os; }
public void setOs(java.io.DataOutputStream os) { this.os = os; }
}
a) Các thuôc tính thê hiên su thay dôi (Bound Property)
JavaBean là các thành phân riêng biêt nhung nó vân có thê tuong tác voi các dôi
tuong khác thông qua co chê truyên thông diêp (message). Khi môt thuôc tính cua môt
Bean A thay dôi nó có thê thông báo cho các dôi tuong khác biêt là thuôc tính cua A dã
thay dôi dê dôi tuong này thuc hiên công viêc gì dó cháng han nhu câp nhât lai giá tri cua
nó theo thuôc tính cua A.
Co chê cài dát dê môt thuôc tính có thê thông báo cho các dôi tuong khác biêt khi nó
thay dôi rât don gian chi cân cài dát hai phuong thuc dùng dê dáng ký và loai bo môt
dôi tuong listener nhu sau:
public void add<PropertyName>Listener(PropertyChangeListener lst)
public void remove<PropertyName>Listener(PropertyChangeListener lst)
Ví du: ban có môt JavaBean A có môt thuôc tính size cho biêt kích cõ gì dó. Khi thuôc tính
size thay dôi dê các dôi tuong khác dêu biêt su thay dôi này ta cài dát nhu sau:
public class BeanA
{float size;
private PropertyChangeSupport changeSize=new PropertyChangeSupport(this);
public void addSizeListener(PropertyChangeListener lst){.}
public void removeSizeListener(PropertyChangeListener lst){.}
}
Các dôi tuong muôn nhân duoc thông báo tu JavaBean này dêu phai cài dát giao
diên PropertyChangeListener , sau dó dáng ký voi thành phân BeanA nho các phuong
thuc mà ban xây dung o buoc trên. Phuong thuc duy nhât mà ban phai ghi dè khi cài dát
giao diên PropertyChangeListener là public void propertyChange(PropertyChangeEvent
evt) {..}
Các thu tuc trên dây chi thuc hiên nhiêm vu dáng ký và tao dôi tuong Listener mà
thôi. Dê các dôi tuong Listener này có thê nhân biêt duoc su thay dôi cua thuôc tính size ta
phai goi phuong thuc firePropertyChange cua dôi tuong PropertyChangeSupport tu thành
phân BeanA nhu sau:
public void firePropertyChange (String propertyName, Object oldValue, Object
newValue)
Phuong thuc này së thông báo dên moi dôi tuong listener (báng cách goi phuong
thuc propertyChange cua listener) dã dáng ký voi thành phân JavaBean. Su thay dôi bao
Trang 237
gôm giá tri truoc khi thay dôi (oldValue) và giá tri sau khi thay dôi (newValue) và tên
thuôc tính duoc thay dôi.
Duoi dây là cài dát lop BeanA và môt lop dê thu nghiêm thuôc tình nhân biêt su
thay dôi size
//BeanA.java
import java.beans.*;
public class BeanA {
//Khai báo thuôc tính size
private float size;
// changeSize có nhiêm vu quán lý các dôi tuong listener dã dãng //ký và gúi thông báo
dên chúng môi khi thuôc tính size thay dôi
PropertyChangeSupport changeSize = new PropertyChangeSupport(this);
public float getSize() { return size; }
//Phuong thúc gán giá tri cho cho thuôc tính size
public void setSize(float newSize) {
float oldSize = size; size = newSize;
//Nêu có thay dôi vê kích thuóc thì thông báo dên tât cá các dôi //tuong dã dãng ký lãng
nghe
if(oldSize!=newSize)
changeSize.firePropertyChange("size", new Float(oldSize), new Float(newSize));
}
public void addSizeListener(PropertyChangeListener lst) {
changeSize.addPropertyChangeListener(lst);
}
public void removeSizeListener(PropertyChangeListener lst) {
changeSize.removePropertyChangeListener(lst);
}
}
Ví du sau thu nghiêm BeanA vua cài dát o trên
// TestBeanA.java
import java.beans.*;
public class TestBeanA {
public static void main(String[] args) {
// tao ra môt dôi tuong BeanA
BeanA ba = new BeanA();
//Ðãng ký dôi tuong lãng nghe vói dôi tuong ba
ba.addSizeListener(new MyListener());
//thay dôi giá tri cúa thuôc tính size
ba.setSize(333);
} }
//Tao ra dôi tuong có khá näng läng nghe su thay dôi cúa thuôc tính
class MyListener implements PropertyChangeListener {
//Phuong thúc duy nhât cân phái cài dãt, phuong thúc này //duoc triêu goi môi khi
thuôc tính thay dôi
public void propertyChange(PropertyChangeEvent evt) {
float oldSise = ( (Float) evt.getOldValue()).floatValue();
float newdSise = ( (Float) evt.getNewValue()).floatValue();
String propertyName = evt.getPropertyName();
Trang 238
System.out.println("Change " + propertyName + " old value " + oldSise +
" new value " + newdSise);
}
}
Kêt qua khi chay chuong trình nhu sau:
Change size old value 1.0 new value 333.0
Chú ý:
Trong ví du trên tên cua phuong thuc dùng dê dáng ký là addSizeListener và tên cua
phuong thuc dùng dê gõ bo dáng ký là removeSizeListener tuy nhiên ban có thê dát
cho nó môt cái tên thuy thích cháng han nhu dangKyLangNghe dê dáng ký dôi
tuong láng nghe hay huyBoLangNghe dê huy bo dôi tuong láng nghe.
Các dôi tuong së không biêt dên su thay dôi cua thuôc tính size cho dên khi ban goi
phuong thuc firePropertyChange cua dôi tuong PropertyChangeSupport.
b) Các thuôc tính ràng buôc (Constrain Property)
Han chê cua các thuôc tính bound o trên là các dôi tuong chi phan ung lai khi giá tri
cua thuôc tính dã bi thay dôi. Java cung câp môt kha náng khác manh hon dó là tao ra các
thuôc tính bi ràng buôc (constrain property). Tuong tu nhu thuôc tính bound môi khi thuôc
tính constrain dinh thay dôi giá tri (chi du dinh chu chua thay dôi) nó së thông báo dên tât
ca các dôi tuong dang láng nghe. Dôi tuong láng nghe có thê tu chôi su thay dôi và nhu vây
giá tri cua thuôc tính vân giu nguyên giá tri ban dâu. Nguoc lai nêu tât ca các dôi tuong
láng nghe dêu không phan dôi su thay dôi thì lúc dó thuôc tính này moi nhân duoc giá tri
moi.
Dê môt thuôc tính có thê thông báo cho các dôi tuong khác biêt khi nó sáp thay dôi
giá tri rât don gian ban chi cân cài dát hai phuong thuc dùng dê dáng ký và loai bo
môt dôi tuong listener nhu sau:
public void add<PropertyName>Listener(VetoableChangeListener lst)
public void remove<PropertyName>Listener(VetoableChangeListener lst)
Các dôi tuong muôn nhân duoc thông báo tu JavaBean này dêu phai cài dát giao
diên VetoableChangeListener, sau dó dáng ký, loai voi thành phân BeanA nho các
phuong thuc mà ban xây dung o buoc trên. Phuong thuc duy nhât mà ban phai ghi
dè khi cài dát giao diên VetoableChangeListener là
public void vetoableChange(PropertyChangeEvent evt) throws PropertyVetoException
{.. }
Dôi tuong láng nghe không dông ý cho thay dôi thuôc tính nó chi cân ném ra môt
ngoai lê PropertyVetoException, thành phân JavaBean có thuôc tính constrain së bát
lây và huy bo viêc thay dôi giá tri cho thuôc tính.
Cung nhu thuôc tính bound, khi thuôc tính constrain có du dinh thay dôi giá tri trong
phuong thuc “set” nó cân thông báo dên các dôi tuong dã dáng ký láng nghe
(listener) voi nó báng phuong thuc fireVetoableChange cua dôi tuong
VetoableChangeSupport tu thành phân JavaBean nhu sau:
public void fireVetoableChange (String propertyName, Object oldValue, Object
newValue)
Trang 239
Phuong thuc này së thông báo dên moi dôi tuong listener (báng cách goi phuong
thuc vetoableChange cua listener) dã dáng ký voi thành phân JavaBean.
Nhân xét: Dôi tuong VetoableChangeSupport cung tuong tu nhu dôi tuong
PropertyChangeSupport dùng dê quan lý các dôi tuong listener. PropertyChangeSupport
duoc dùng voi các thuôc tính bound còn VetoableChangeSupport dùng cho thuôc tính
constrain.
Duoi dây là môt cài dát cho môt JavaBean B có thuôc tính size. Môi khi size thay dôi nó së
thông báo cho các thành phân khác biêt thông qua dôi tuong listener. Dôi tuong listener
này së tu chôi không cho thay dôi nêu size >100.
// BeanB.java
import java.beans.*;
public class BeanB {
//Khai báo thuôc tính size
private int size = 0;
// vetoAgent vó nhiêm vu quán lý tât cá các dôi tuong listener //dã dãng ký
private VetoableChangeSupport vetoAgent = new VetoableChangeSupport(this);
//Phuong thúc lây vê giá tri cúa thuôc tính size
public int getSize() { return size; }
//Phuong thúc dùng dê thay dôi giá tri cúa thuôc tính size
public void setSize(int newSize) {
int oldSize = size;
try { // Thông báo dên tât cá các dôi tuong dã dãng ký lãng nghe
vetoAgent.fireVetoableChange("size", oldSize, newSize);
}
catch (PropertyVetoException ex) {
// Nêu có môt listener nào dó phán dôi không cho phép thay dôi //giá tri cúa thuôc
tính size thì kêt thúc phuong thúc
return;
}
//Nêu tât cá các listener dêu không phán dôi su thay dôi thì // tiên hành gán giá tri mói
cho thuôc tính size
size = newSize;
}
//Phuong thúc dùng dê dãng ký dôi tuong lãng nghe
public void addSizeListener(VetoableChangeListener lst) {
vetoAgent.addVetoableChangeListener(lst);
}
//Phuong thúc dùng dê gõ bó dôi tuong lãng nghe
public void removeSizeListener(VetoableChangeListener lst) {
vetoAgent.removeVetoableChangeListener(lst);
}
}
Ví du sau dùng dê test thu BeanB vua tao
// TestBeanB.java
import java.beans.*;
public class TestBeanB {
public static void main(String[] args) {
Trang 240
//Tao ra môt dôi tuong BeanB
BeanB b = new BeanB();
//Ðãng ký dôi tuong lãng nghe
b.addSizeListener(new MyListener());
//Gán giá tri 10 (10<100) cho thuôc tính size
b.setSize(10);
System.out.println("size=10");
System.out.println(">Sau khi gan thuoc tinh size= "+b.getSize());
//Gán giá tri 123 (123>100) cho thuôc tính size
b.setSize(123);
System.out.println("size=123");
System.out.println(">Sau khi gan thuoc tinh size= "+b.getSize());
//Gán giá tri 234 (234>100) cho thuôc tính size
b.setSize(234);
System.out.println("size=234");
System.out.println(">Sau khi gan thuoc tinh size= "+b.getSize());
//Gán giá tri 56 (56>100) cho thuôc tính size
b.setSize(56);
System.out.println("size=56");
System.out.println(">Sau khi gan thuoc tinh size= "+b.getSize());
}
}
//Cài dãt lóp lãng nghe biên cô VetoableChangeListener
class MyListener implements VetoableChangeListener {
//Ghi dè phuong thúc vetoableChange
public void vetoableChange(PropertyChangeEvent evt) throws
PropertyVetoException {
int oldSize = ( (Integer) evt.getOldValue()).intValue();
int newSize = ( (Integer) evt.getNewValue()).intValue();
String propName = evt.getPropertyName();
//Nêu newSize>100 thì không cho thay dôi bãng cách ném ra môt //ngoai lê
PropertyVetoException
if (newSize > 100)
throw new PropertyVetoException(
"Gia tri gan cho Size lon hon 100", evt);
}
}
Kêt qua khi chay chuong trình
size=10
>Sau khi gan thuoc tinh size= 10
size=123
>Sau khi gan thuoc tinh size= 10
size=234
>Sau khi gan thuoc tinh size= 10
size=56
>Sau khi gan thuoc tinh size= 56
Trang 241
2. Xây dung các phuong thúc cho JavaBean
Các phuong thuc cua JavaBean duoc xây dung nhu các phuong thuc thông thuong.
3. Tao ra JavaBean có kha náng láng nghe biên cô
Môt JavaBean có thê duoc thiêt kê dê láng nghe môt sô biên cô do các dôi tuong
khác gui dên. Dê có thê láng nghe và xu lý các biên cô do các dôi tuong khác gui dên
JavaBean cua ban chi cân triên khai các giao diên tuong ung và cài dát các phuong thuc
cân thiêt trong các giao diên dó, sau dó dáng ký nó voi các dôi tuong nguôn.
Ví du: Dê JavaBean cua ban có thê xu lý các biên cô vê chuôt do các dôi tuong khác gui
dên, JavaBean cua ban chi cân cài dát giao diên MouseListener nhu sau:
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
public class Bean3
implements MouseListener {
public void mouseClicked(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
}
}
Nhân xét: Nhu ban thây viêc tao ra môt JavaBean có thê láng nghe các biên cô hoàn toàn
tuong tu nhu viêc tao ra các dôi tuong láng nghe biên cô khác.
4. Tao ra JavaBean có thê dáng ký dôi tuong láng nghe biên cô
Ngoài viêc ban có thê tao ra các JavaBean có thê láng nghe biên cô do các dôi tuong
khác gui dên ban còn có thê tao ra các JavaBean có kha náng dáng ký và gui di các biên cô
dên các dôi tuong láng nghe khác. Lúc này JavaBean cua ban duoc coi là dôi tuong nguôn
(dôi tuong phát sinh biên cô- Event Source). Các dôi tuong khác muôn láng nghe và xu lý
biên cô do JavaBean cua ban gui dên nó phai cài dát giao diên láng nghe tuong ung và phai
dáng ký nó voi JavaBean cua ban.
4.1. Dáng ký dôi tuong listener vói thành phân JavaBean
Dê các thành phân khác có thê dáng ký duoc dôi tuong listener voi thành phân
JavaBean thì ban thân thành phân JavaBean cua ban phai cài dát hai phuong thuc theo
khuôn mâu (pattern) sau:
public synchronized void add<EventListener>(<EventListener> lst)
public synchronized void remove<EventListener>(<EventListener> lst)
Ví du: Dê các dôi tuong khác có thê dáng ký dôi tuong listener cho tình huông nhân chuôt
thì JavaBean cua ban phai cài dát hai phuong thuc dáng ký nhu sau:
Trang 242
public synchronized void addMouseListener(MouseListener l)
public synchronized void removeMouseListener(MouseListener l)
Thành phân JavaBean cân luu lai danh sách các listener dã dáng ký. Khi muôn
chuyên giao tình huông. JavaBean së goi dên tung phuong thuc tuong ung cua các listener
này. Nêu có nhiêu listener cùng dáng ký thì JavaBean cua ban thuong luu lai danh sách các
dôi tuong listener dã dáng ký báng môt Vecto nhu sau:
//Tao ra môt Vecto dê luu lai danh sách các listener dã dáng ký
private transient Vector mouseListeners=new Vector();
//Phuong thuc dáng ký dôi tuong listener
public synchronized void addMouseListener(MouseListener l) {
//Nêu listener dáng ký chua có trong danh sách thì thêm nó vào
if (!mouseListeners.contains(l)) {
mouseListeners.addElement(l); // Thêm vào danh sách
}
}
//Phuong thuc dùng dê loai bo môt listener
public synchronized void removeMouseListener(MouseListener l) {
if (mouseListeners != null && mouseListeners.contains(l)) {
mouseListeners.removeElement(l);
}
}
Hai phuong thuc trên chi là hình thuc dùng dê dáng ký và loai bo các dôi tuong láng
nghe mà thôi. Thuc chât nó chua gui di bât cu thông báo nào dên dôi tuong láng nghe. Khi
môt JavaBean muôn thông báo dên các dôi tuong láng nghe nó chi cân duyêt trong danh
sách các dôi tuong dã dáng ký láng nghe biên cô và goi phuong thuc tuong ung mà dôi
tuong listener dã cài dát.
Duoi dây là môt ví du minh hoa, ta xây dung thành phân JavaBean có kha náng tiêp
nhân các dôi tuong listener dùng dê xu lý tình huông chuôt.
// MouseBean.java
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.*;
public class MouseBean
extends JPanel {
// Môt Vecto luu trü các dôi tuong listener
private transient Vector mouseListeners = new Vector();
// Tao ra môt nút lênh
JButton jButton1 = new JButton();
public MouseBean() {
jButton1.setText("Mouse JavaBean");
jButton1.addMouseListener(new MyListener(this));
this.setLayout(new BorderLayout());
this.add(jButton1, BorderLayout.CENTER);
}
//Phuong thúc dùng dê loai bó dôi tuong lãng nghe biên cô
Trang 243
public synchronized void removeMouseListener(MouseListener l) {
if (mouseListeners != null && mouseListeners.contains(l)) {
mouseListeners.removeElement(l);
}
}
//Phuong thúc dùng dê dãng ký dôi tuong lãng nghe biên cô
public synchronized void addMouseListener(MouseListener l) {
if (!mouseListeners.contains(l)) {
mouseListeners.addElement(l);
}
}
/*Phuong thúc này dùng dê thông báo dên tât cá các dôi tuong lãng nghe biên cô khi có
su kiên mouseClick sây ra trên dôi tuong jbutton1*/
protected void fireMouseClicked(MouseEvent e) {
if (mouseListeners != null) {
int count = mouseListeners.size();
for (int i = 0; i < count; i++) {
( (MouseListener) listeners.elementAt(i)).mouseClicked(e);
}
}
}
/*Khi chuôt duoc kích trên nút lênh thì thông báo dên tât cá các dôi tuong dã dãng ký
lãng nghe bãng cách goi phuong thúc fireMouseClicked */
void jButton1_mouseClicked(MouseEvent e) {
fireMouseClicked(e);
}
}
//Tao ra lóp lãng nghe su kiên chuôt cúa nút lênh
class MyListener
extends java.awt.event.MouseAdapter {
MouseBean adaptee;
MyListener(MouseBean adaptee) {
this.adaptee = adaptee;
}
public void mouseClicked(MouseEvent e) {
adaptee.jButton1_mouseClicked(e);
}
}
Sau dây là ung dung dê test thu thành phân MouseBean. Có môt thính gia láng nghe biên
cô click trên MouseBean. Khi ban kích chuôt trên MouseBean thì thính gia này së xuât hiên
môt hôp thông báo (message).
// Frame1.java
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Frame1
extends JFrame {
//tao ra dôi tuong MouseBean
Trang 244
MouseBean mouseBean1 = new MouseBean();
public Frame1() {
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setLocale(java.util.Locale.getDefault());
this.getContentPane().setLayout(null);
mouseBean1.setBounds(new Rectangle(61, 34, 137, 48));
//Ðäng ký dôi tuong läng nghe vói dôi tuong MouseBean
mouseBean1.addMouseListener(new MouseBeanListener(this));
this.getContentPane().add(mouseBean1, null);
}
public static void main(String[] args) {
Frame1 f = new Frame1();
f.setBounds(100, 100, 270, 150);
f.setVisible(true);
}
//Khi kích chuôt vào MouseBean thì hiên thi hôp thông báo
void mouseBean1_mouseClicked(MouseEvent e) {
JOptionPane.showMessageDialog(this, "Ban vua kich chuot vao MouseBean","Test
MouseBean",JOptionPane.INFORMATION_MESSAGE);
}
}
//Tao ra dôi tuong läng nghe
class MouseBeanListener
extends java.awt.event.MouseAdapter {
Frame1 adaptee;
MouseBeanListener(Frame1 adaptee) {
this.adaptee = adaptee;
}
public void mouseClicked(MouseEvent e) {
adaptee.mouseBean1_mouseClicked(e);
}
}
Kêt qua chay chuong trình sau khi ban kích chuôt vào MouseBean
Trang 245
4.2. Kha náng dáng ký môt listener (unicast) và nhiêu listener (milticast) cua thành phân
JavaBean
Thông thuong môt JavaBean cho phép dáng ký nhiêu dôi tuong láng nghe biên cô.
Co chê cho phép nhiêu listener cùng duoc dáng ký dê xu lý cùng môt tình huông duoc goi
là milticast. Tuy nhiên, voi co chê này dôi lúc së dân dên truong hop xâm pham lân nhau,
cháng han listener này thì cho phép thay dôi giá tri cua thuôc tính trong khi listener khác lai
ngán can. Chính vì vây môt vài thành phân JavaBean chi cho phép dáng ký môt listener mà
thôi (unicast), nêu có nhiêu hon môt listener duoc dáng ký thì phuong thuc dáng ký cua
JavaBean cân duoc thiêt kê dê ném ra môt ngoai lê là: TooManyListenerException nhu
sau:
public void add<EventListenerType>(< EventListenerType> lst) throws
TooManyListenerException
Doan chuong trình sau tao ra hai phuong thuc add và remove chi cho phép dáng ký
môt listener mà thôi:
MouseListener saveListener=null;
/* Phuong thuc dáng ký dôi tuong listener*/
public void addMouseListener(MouseListener lst) throws TooManyListenerException
{ if(saveListener==null){
saveListener=lst;
} else{
/*
Nêu dã có môt listener nào dó duoc dáng ký thì ném ra môt ngoai lê
*/
throw new TooManyListenerException();
}
//Phuong thuc này dùng dê loai bo dôi tuong listener
public void removeMouseListener(MouseListener lst)
{
saveListener=null;
}
Dê hiêu rõ hon, duoi dây ta së viêt môt ví du minh hoa cho su tranh châp khi có
nhiêu dôi tuong listener cùng dáng ký xu lý môt tình huông. Chuong trình này dùng lai
thành phân BeanB dã thiêt kê o phân dâu (xem ví du vê thuôc tính ràng buôc –contrain
property). Thuôc tính size cua thành phân BeanB là thuôc tính ràng buôc, truoc khi thay dôi
giá tri cua thuôc tính nó cân hoi ý kiên cua tât ca listener. Dê minh hoa ta së tao ra hai dôi
tuong listener là MyListener21 chi cho phép thay dôi thuôc tính size khi giá tri moi lon hon
50 còn MyListener22 chi cho phép thay dôi thuôc tính size khi giá tri moi lon hon 100.
Chuong trình su dung hai dôi tuong listener cùng xu lý môt tình huông.
//UseBean2.java
import java.beans.VetoableChangeListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyVetoException;
public class UseBean2 {
public static void main(String[] args) {
Trang 246
BeanB b = new BeanB();
b.addSizeListener(new myListener21());
b.addSizeListener(new myListener22());
System.out.println("old size:" + b.getSize() + " set new size 30");
b.setSize(30);
System.out.println("size after setting:" + b.getSize());
System.out.println("old size:" + b.getSize() + " set new size 90");
b.setSize(90);
System.out.println("size after setting:" + b.getSize());
}
}
class myListener21
implements VetoableChangeListener {
public void vetoableChange(PropertyChangeEvent evt) throws
PropertyVetoException {
int newSize = ( (Integer) evt.getNewValue()).intValue();
if (newSize > 50)
throw new PropertyVetoException("Gia tri lon hon 50 Listener 1 reject",
evt);
}
}
class myListener22
implements VetoableChangeListener {
public void vetoableChange(PropertyChangeEvent evt) throws
PropertyVetoException {
int newSize = ( (Integer) evt.getNewValue()).intValue();
if (newSize > 100)
throw new PropertyVetoException("Gia tri lon hon 100 Listener 2 reject",
evt);
}
}
Kêt qua chay chuong trình:
old size:0 set new size 30
size after setting:30
old size:30 set new size 90
size after setting:30
Quan sát kêt qua chay chuong trình ta thây tât ca giá tri lon hon 50 dêu không thê
gán duoc cho thuôc tính size, mác dù listener thu hai là myListener22 cho phép gán
giá tri >50 và <100 nhung listener thu nhât là myListener22 lai không cho phép, nhu
vây trong truong hop listener thu hai myListener22 cài dát mà không biêt ráng
myListener21 dã duoc cài dát truoc dó thì nguoi dùng cuôi së bi nhâm lân.
Chính vì vây java phân biêt hai cách dáng ký listener là unicast và multicast. Tuy
nhiên theo khuyên khích thì các thành phân JavaBean nên duoc xây dung dê hô tro co chê
dáng ký nhiêu dôi tuong listener (multicast).
Trang 247
III. Tìm hiêu Instrospector
1. Instrospector là gì?
Môt câu hoi ban dát ra là khi ban kéo môt JavaBean tu thanh công cu và tha vào
Form (trong môt môi truong phát triên truc quan nào dó cháng han nhu Jbuilder cháng
han), làm thê nào dê môi truong phát triên truc quan này có thê biêt duoc trong JavaBean
cua ta có nhung thuôc tính, phuong thuc, su kiên nào,..?.
Vân dê này dã duoc giai quyêt báng tính phan xa (reflect), co chê phan xa giúp ta có
thê phát hiên ra các thuôc tính, phuong thuc, su kiên cua môt lop bât ky (kê ca lop vô
danh). Diêu này là hoàn hao dê giai quyêt vân dê Bean mà không yêu câu ban phai làm
thêm bât cu thu thuât ngôn ngu nào nhu vân bi yêu câu trong các ngôn ngu lâp trình truc
quan khác.
Trong thuc tê, môt trong nhung lý do chính mà phan xa duoc thêm vào cho java là
dê hô tro JavaBean (mác dù nó còn duoc dùng trong tuân tu hoá và goi các phuong
thuc dông tu xa). Nhung nhung nguoi thiêt kê java lai muôn cung câp môt công cu
chuân, không nhung làm cho JavaBean don gian hon trong su dung mà còn cung câp
môt ngõ cua chuân dê tao ra các JavaBean phuc tap hon. Công cu này chính là lop
Instrospector, phuong pháp quan trong nhât cua lop này là static getBeanInsfo().
Ban truyên tham chiêu Class cho lop này và nó hoàn toàn di hoi lop dó và cho lai
môt dôi tuong BeanInfo, dua vào BeanInfo này ban có thê mô xe dê tìm ra các
thuôc tính, phuong thuc, su kiên cua JavaBean.
2. Cách mà Instrospector làm viêc
Ví du khi ra có hai phuong thuc nhu sau:
public int getSize()
public void setSize(int newSize)
Theo cách này java hiêu ráng ban muôn tao ra môt thuôc tính có tên là size có kiêu int. Hay
khi tao ra các thuôc tính ràng buôc (contrain property) ta viêt:
public addSizeListener(VetoableChangeListener lst)
public removeSizeListener(VetoableChangeListener lst)
java së hiêu là có môt thuôc tính size cân goi dên hai phuong thuc này môi khi muôn dáng
ký hay loai bo môt dôi tuong listener dùng dê quan sát su thay dôi cua thuôc tính.
Tóm lai nêu các phuong thuc duoc thiêt kê theo môt mâu (pattern) nào dó thì nó së
duoc dem dùng vào muc dích riêng. Thuong thì ta dùng các mâu sau khi xây dung các
phuong thuc dành cho thuôc tính và su kiên.
Thiêt kê các phuong thúc mâu dùng cho thuôc tính
Dôi voi môi thuôc tính ban cân xây dung hai phuong thuc “get” và “set” theo mâu
sau dây:
public <propertyType> get<PropertyName>()
public void set<PropertyName>(<propertyType> newValue)
Trong dó:
propertyType là bât cu kiêu du liêu nào nguyên thuy hay dôi tuong
PropertyName là tên cua thuôc tính
Chú ý:
Nêu thuôc tính có kiêu boolean thì phuong thuc “get” có thê thay báng phuong thuc
“is”
Trang 248
Java chi hiêu là ban dinh tao ra môt thuôc tính nêu nhu có du ca hai phuong thuc “get”
và “set”
Kiêu tra vê cua phuong thuc “get” thuong là kiêu cua dôi phuong thuc “set
Thiêt kê các phuong thúc mâu dùng cho su kiên
Dê xây dung môt su kiên nào dó cho môt thành phân JavaBean ta cân xây dung hai
phuong thuc “add” và “remove” theo mâu sau dây:
public void add<EventListenerType> (<EventListenerType> evt)
public void remove<EventListenerType> (<EventListenerType> evt)
Trong dó EventListenerType là dôi tuong tình huông mà JavaBean muôn các thành phân
khác tuong tác duoc voi mình. Ví du dê thành phân JavaBean có thê dáng ký duoc các tình
huông Action ta viêt
public void addActionListener (ActionListener lst)
public void removeActionListener (ActionListener lst)
3. Tìm hiêu lóp BeanInfo
Khi ban tao ra BeanB (xem lai lop này trong phân thuôc tính ràng buôc) ban có thê
tao ra môt lop phu khác là BeanBBeanInfo.java lop này duoc dân xuât tu lop
SimpleBeanInfo có nhiêm vu cung câp các thông tin vê thành phân JavaBean mà ta xây
dung:
import java.beans.*;
public class BeanBBeanInfo extends SimpleBeanInfo {
Class beanClass = BeanB.class;
String iconColor16x16Filename;
String iconColor32x32Filename;
String iconMono16x16Filename;
String iconMono32x32Filename;
public BeanBBeanInfo() { }
public PropertyDescriptor[] getPropertyDescriptors() {
try {
PropertyDescriptor _size = new PropertyDescriptor("size", beanClass, "getSize",
"setSize");
PropertyDescriptor[] pds = new PropertyDescriptor[] { _size};
return pds;
}
catch(IntrospectionException ex) { ex.printStackTrace(); return null; }
}
public java.awt.Image getIcon(int iconKind) {
switch (iconKind) {
case BeanInfo.ICON_COLOR_16x16:
return iconColor16x16Filename != null ? loadImage(iconColor16x16Filename) : null;
case BeanInfo.ICON_COLOR_32x32:
return iconColor32x32Filename != null ? loadImage(iconColor32x32Filename) : null;
case BeanInfo.ICON_MONO_16x16:
return iconMono16x16Filename != null ? loadImage(iconMono16x16Filename) : null;
case BeanInfo.ICON_MONO_32x32:
return iconMono32x32Filename != null ? loadImage(iconMono32x32Filename) : null;
}
return null;
}
}
Trang 249
Các phuong thuc quan trong mà ban cân quan tâm là:
Phuong thuc getIcon() phuong thuc này duoc goi khi các môi truong phát triên truc
quan muôn lây vê biêu tuong cho JavaBean.
Phuong thuc getPropertyDescriptors() phuong thuc này giúp cho Instrospector dê dàng
lây vê các thuôc tính cua JavaBean.
Phuong thuc getMethodDescriptors() phuong thuc này giúp cho Instrospector dê dàng
lây vê các phuong thuc cua JavaBean…
Báng cách xây dung lop BeanInfo di kèm voi JavaBean cua ban. Trình biên dich dê
dàng tìm ra các thuôc tính, phuong thuc, su kiên. Truoc khi muôn biêt JavaBean cua
ban có nhung thành phân nào trong Bean cua ban truoc tiên nó di tìm trong lop
BeanInfo tuong ung, nêu không tìm thây BeanInfo di kèm voi lop lúc dó nó mây su
dung co chê phan xa hay di tìm các phuong thuc duoc thiêt kê theo mâu.
IV. Dóng gói JavaBean
Truoc khi xuât ban JavaBean ban thuong dóng gói nó vào trong môt têp .jar chuân.
Dê các công cu xây dung truc quan biêt trong têp dóng gói này là môt JavaBean ban cân
tao têp mô ta dóng gói báng cách sau:
Su dung môt trình soan thao bát ky dê tao ra têp tin BeanB.mf nhu sau:
Manifest-Version: 1.0
Name BeansDir/BeanB.class
Name BeansDir/BeanBInfo.class
Java-Bean: True
Ghi lai voi cái tên gì dó cháng han BeanB.mf
Dòng thu nhât cho biêt phiên ban, tu dòng thu hai tro di cho biêt trong tên cua các lop
có trong têp dóng gói, dòng cuôi cùng cho biêt don vi dóng gói này là môt JavaBean.
Ban tiên hành dóng gói báng lênh jar hoàn toàn tuong tu nhu ban dóng gói các lop
khác.

CL C
Ch ng 1: CÁC KHÁI NI M C B N.................................................................. 5 BÀI 1. LÀM QUEN V I JAVA................................................................................... 5 I. L ch s java ........................................................................................................... 5 II. Java em là ai ......................................................................................................... 5 II. M t s c tr ng c a java ..................................................................................... 5 III. Các ki u ng d ng Java........................................................................................ 7 IV. Máy o Java (JVM-Java Virtual Machine) .......................................................... 7 BÀI 2 N N T NG C A JAVA ................................................................................ 9 I. T p ký t dùng trong java ...................................................................................... 9 II. T khoá c a Java .................................................................................................. 9 III. nh danh (tên) ................................................................................................. 10 IV. C u trúc m t ch ng trình java ......................................................................... 10 V. Ch ng trình JAVA u tiên .............................................................................. 12 VI. Chú thích trong ch ng trình ............................................................................ 14 VII. Ki u d li u ..................................................................................................... 15 VII. M t s phép toán trên ki u d li u nguyên thu ............................................... 17 IX. Toán t chuy n ki u .......................................................................................... 23 X. Các hàm toán h c ............................................................................................... 24 XI. Các phép toán trên ki u kí t ............................................................................. 26 BÀI 3. I U KHI N LU NG CH NG TRÌNH .................................................... 27 I. C u trúc r nhánh ................................................................................................. 27 II. C u trúc l p while và do-while ........................................................................... 30 III. C u trúc for ....................................................................................................... 32 IV. L nh break và continue ..................................................................................... 34 Ch ng 2: L P TRÌNH H NG IT NG ......................................................... 37 BÀI 1. NH NGH A L P ....................................................................................... 38 I. Khai báo l p ........................................................................................................ 38 II. Chi ti t v khai báo m t ph ng th c ................................................................. 40 III. T khoá this ...................................................................................................... 43 IV. T khoá super ................................................................................................... 43 V. S d ng l p ........................................................................................................ 44 VI. i u khi n vi c truy c p n các thành viên c a m t l p .................................. 44 BÀI 2. KH I U VÀ D N D P ............................................................................ 47 I. Ph ng th c t o d ng (constructor) ..................................................................... 47 II. Kh i kh i u vô danh và kh i kh i u t nh ...................................................... 49 III. D n d p: k t thúc và thu rác .............................................................................. 51 BÀI 3. CÁC THÀNH PH N T NH ........................................................................... 52 I. Thu c tính t nh .................................................................................................... 52 II. Ph ng th c t nh ................................................................................................ 52 BÀI 4. N P CH NG PH NG TH C .................................................................. 53 I. Khái ni m v ph ng th c b i t i ........................................................................ 53 Trang 2

II. Yêu c u c a các ph ng th c b i t i ................................................................... 53 BÀI 5. K TH A (INHERITANCE) ........................................................................ 54 I. L p c s và l p d n xu t .................................................................................... 54 II. Cách xây d ng l p d n xu t ................................................................................ 54 III. Th a k các thu c tính ...................................................................................... 54 IV. Th a k ph ng th c ........................................................................................ 54 V. Kh i u l p c s ............................................................................................. 54 VI. Ghi è ph ng th c ( Override ) ....................................................................... 56 VI. Thành ph n protected ........................................................................................ 56 VII. T khoá final ................................................................................................... 56 BÀI 6. L P C S TR U T NG ......................................................................... 61 BÀI 7. A HÌNH THÁI ............................................................................................ 62 BÀI 8. GIAO DI N, L P TRONG, GÓI ................................................................... 63 I. Giao di n ............................................................................................................. 63 II. L p trong ............................................................................................................ 65 Bài 9. M NG, XÂU KÝ T , T P H P ................................................................... 67 I. M ng ................................................................................................................... 67 II. Xâu ký t ............................................................................................................ 70 III. L p StringTokenizer ......................................................................................... 75 IV. M t s l p c b n c a Java ............................................................................... 77 V. Các l p t p h p .................................................................................................. 83 Ch ng 3: X LÝ NGO I L ............................................................................ 92 I. M c ích c a vi c x lý ngo i l .......................................................................... 92 II. Mô hình s lý ngo i l c a java .......................................................................... 92 III. c t ngo i l ................................................................................................... 93 III. Ném ra ngo i l ................................................................................................. 93 IV. B t ngo i l ....................................................................................................... 93 V. Kh i ‘finally’ ...................................................................................................... 95 VI. M t s l p ngo i l chu n c a Java ................................................................... 96 Ch ng 4: L P TRÌNH A TUY N ........................................................................ 97 I. Các ki n th c liên quan ........................................................................................ 97 II. L p trình a tuy n trong Java .............................................................................. 98 Ch ng 5: NH P XU T (Input/Output) ............................................................... 104 I. L p lu ng .......................................................................................................... 105 II. L p File ............................................................................................................ 113 Ch ng 6: L P TRÌNH HO AWT ................................................................ 120 I. Gi i thi u v h th ng ho c a Java .............................................................. 120 II. Trình qu n lý hi n th trong Java ...................................................................... 124 III. X lý s ki n trong Java .................................................................................. 125 Ch ng 7 L P TRÌNH C S D LI U .............................................................. 143 I. T ng quan 143 II. Các k u trình i u khi n JDBC......................................................................... 143 Trang 3

III. Các l p trong JDBC API dùng truy c p CSDL ........................................... 146 IV. K t n i CSDL v i JDBC ................................................................................. 147 V. T ng tác v i CSDL ........................................................................................ 152 VI. Qu n lý giao d ch ............................................................................................ 160 Ch ng 8: L P TRÌNH SOCKET .............................................................................. 164 I. Các ki n th c liên quan ...................................................................................... 164 II. Kh o sát m t s l p trong gói java.net .............................................................. 164 2. L p URL và URI .............................................................................................. 171 3. L p Socket........................................................................................................ 176 4. L p ServerSocket.............................................................................................. 182 5. L p DatagramSocket ......................................................................................... 185 6. L p DatagramPacket ......................................................................................... 185 III. TCP Socket ..................................................................................................... 185 Ch ng 9: JAVA MAIL .............................................................................................. 205 I. Các khái ni m MAIL ......................................................................................... 205 II. G i mail v i th vi n có s n c a java ............................................................... 206 III. Gi i thi u java mail API .................................................................................. 207 III. G i mail .......................................................................................................... 212 IV. Nh n mail ....................................................................................................... 215 V. Xoá mail ........................................................................................................... 221 Ch ng 10: L P TRÌNH PHÂN TÁN V I ................................................................. 222 JAVA RMI ( REMOTE METHOD INVOKE)............................................................. 222 I. RMI và l p trình phân tán i t ng .................................................................. 222 II. G i ph ng th c t xa và các v n phát sinh ................................................. 223 III. Vai trò c a các l p trung gian .......................................................................... 223 IV. Cài t i t ng phân tán .............................................................................. 224 Ch ng 11: JAVA JSP (JAVA SERVLET) ................................................................. 233 Ch ng 12: EJB (ENTERPRISE JAVA BEANS) ........................................................ 234 I. T ng quan v JavaBean ..................................................................................... 234 II. Xây d ng thành ph n JavaBean ........................................................................ 234 III. Tìm hi u Instrospector ..................................................................................... 247 IV. óng gói JavaBean ......................................................................................... 249

Trang 4

th nên kh u hi u c a các nhà thi t k Java là “Write One. Java là ngôn ng v a biên d ch v a thông d ch. Ngày nay. Java t a nh C++. LÀM QUEN V I JAVA I. M c tiêu c a các nhà thi t k Java là cho phép ng i l p trình vi t ch ng trình m t l n nh ng có th ch y trên b t c ph n c ng c th . Run Any Where”.h). 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 u hành. Java c s d ng r ng rãi vi t ch ng trình ch y trên Internet. Java kh i thu tên là Oak. 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. C u trúc “struct” và “union” c ng c lo i b kh i Java. PDA. â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 Trang 5 . u tiên mã ngu n c biên d ch b ng công c JAVAC chuy n thành d ng ByteCode. n tho i. Tuy nhiên v i s mãnh m c a Java ã khi n nó n i ti ng n m c v t ra ngoài s t ng t ng c a các nhà thi t k ra nó. … II. không ph thu c vào h u hành. Java là tên c a m t quán cafe mà nhóm thi t k java hay n ó u ng. Java c xây d ng trên n n t ng c a C và C++. không c n thi t.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. . do v y không th dùng Java vi t m t ch ng trình h ng ch c n ng. “Java” là cái tên c ch n. âu âu c ng là s v t. t t c c trong java u là s v t.. Sau ó c th c thi trên t ng lo i máy c th nh ch ng trình thông d ch JAVA. do v y nhóm thi t k quy t nh i tên. Nó là ngôn ng l p trình h ng i t ng c l p thi t b . 3. T ó. nh ng ã l c b i các c tr ng ph c t p. ng ý b o java là C++ nh ng ã b i nh ng th ph c t p. Do v y nó s d ng các cú pháp c a C và các c tr ng h ng i t ng c a C++. Nên có ng i b o Java là “C++--“.Ch ng 1: CÁC KHÁI NI M C B N BÀI 1. không c n thi t c a C và C++ nh : thao tác con tr . L ch s java Java là m t ngôn ng l p trình c Sun Microsystems gi i thi u vào tháng 6 n m 1995. Java em là ai Java là ngôn ng l p trình h ng i t ng. Java không ch dùng vi t các ng d ng ch y n l hay trong m ng mà còn xây d ng các trình i u khi n thi t b cho n tho i di ng. nó ã tr thành m t công c l p trình c a các l p trình viên chuyên nghi p. II. Ban u Java c thi t k làm ngôn ng vi t ch ng trình cho các s n ph m i n t dân d ng nh u video.… Java không s d ng l nh “goto” c ng nh file header (. máy nh n tin. Java có th gi i quy t h u h t các công vi c mà các ngôn ng khác có th làm c. tivi. M t s c tr ng c a java 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. sau này ông th y r ng ã có ngôn ng l p trình tên Oak r i. thao tác nh ngh a ch ng toán t (operator overloading).

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 ó. 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ì. 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 n mã l nh c ch y song song v i nhau. trình biên d ch s chuy n t p l nh thành mã máy (machine code). ch y m i n . Trong ch ng trình Java. sáng s a. Nh ng l nh này ph thu c vào CPU hi n t i trên máy b n. Java ki m tra t t c các truy nh p n m ng. 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. 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. Trong các môi tr ng l p trình truy n th ng. hay l nh c a b vi x lý. nh d ch v thu nh t nh ng i t ng không còn s d ng n a (garbage collection). 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++. gi i phóng c th c hi n t ng. l p trình viên ph i t mình c p phát b nh . l p trình viên không ph i b n tâm n vi c c p phát b nh . i u này là không th có v i các ngôn ng l p trình khác. CORBA. pascal … 6. Trang 6 . 5. v l p trình web phía máy khách java có công ngh java applet. Web Service. C++ nay c h n ch trong Java. 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.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 m t m t s lo i l i l p trình nh t 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 u hành. i v i các ch ng trình vi t b ng C. v l p trình web phía máy khách java có công ngh servlet/JSP. v i java ta có th vi t các ch ng trình s d ng các giao th c TCP.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. 4. u này làm ch ng trình rõ ràng.Java không s d ng con tr và các phép toán con tr . 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. UDP m t cách d dàng. Tính c l p v i h 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 u hành. Qúa trình c p phát. H tr internet M c tiêu quan tr ng c a các nhà thi t k java là t o 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 có kh n ng ch y song song m t cách d dàng. Tr c khi ch ng trình k t thúc thì ph i t gi i phóng b nh ã c p. M nh m Java là ngôn ng yêu c u ch t ch v ki u d li u. chúng ta ph i biên d ch l i ch ng trình. C++ ho c m t ngôn ng nào khác. 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. g i th t c t xa… 7. v l p trình phân tán java có công ngh RMI. ít l i n. vi c ép ki u t ng b a bãi c a C. EJB. 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. Nên khi mu n ch y trên lo i CPU khác.

Applet s c t i v và th c thi t i trình duy t. 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 u hành o. Máy o Java (JVM-Java Virtual Machine) 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). CORBA. Applet là ch ng trình h a ch y trên trình duy t t i máy tr m. 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. Các ng d ng trên máy ch này c g i là các JSP/Servlet. JSP/Servlet Java thích h p phát tri n ng d ng nhi u l p. Web Service 8. 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. ng d ng Applets 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. Chúng có th là Applet hay ng d ng. 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. u này khi n java ch m ch p i ph n nào. ây là m t ki u ng d ng khá h p dãn. 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. Khi trang Web hi n th trong trình duy t. 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. 3. 6. ho c Applet t i máy ch . c bi t là các ng d ng mang tính ch t gi i trí nh game IV. ng d ng h a â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. máy tr m g i yêu c u t i máy ch . 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. 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 ó. Applet c nhúng bên trong trang Web. 5. 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. 4. X lý Form c a HTML là cách s d ng n gi n nh t c a JSP/Servlet. máy tr giúp cá nhân… u h tr Java. Các thông tin nh p xu t c th hi n t i d u nh c l nh. V i th vi n Socket b n có th l p trình v i hai giao th c: UDP và TCP. h u hành Trang 7 . ng d ng nhi u t ng 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. Thông d ch Các ch ng trình java c n c thông d ch tr c khi ch y. nh ng Applet b gi i h n b i tính b o m t.8. 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 . 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. th c thi các giao d ch và th ng c th c thi thông qua máy ch Web. 7. 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. EJB. các ng d ng Web. Chúng còn có th c dùng x lý d li u. 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: 1. Máy ch x lý và g i k t qu tr l i máy tr m. 2. III.

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. Ø Các bi n c c b . 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”. 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 u hành c th . Khi JVM th c thi mã. có th thay i n i dung thanh ghi i h ng th c thi c a ch ng trình. Khi c n thi t. h u hành.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. 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. Thanh ghi này tr t i l nh ang th c hi n. Ø Các tham s truy n cho ph ng th c. m t thanh ghi c c b có tên “Program Counter” c s d ng. Nó thi t l p các l p tr u t ng cho: Ph n c ng bên d i. Các trình duy t thông d ng nh Netscape hay IE u có JIT bên trong t ng t c th c thi ch ng trình Java.o). 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 toán h ng c a mã bytecode. 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 . Các l nh này s c l u tr và s d ng m i khi g i n. mã ã biên d ch. Trang 8 .

ph ng th c không th ghi è.BÀI 2 N N T NG C A JAVA I. Sau ây là m t s t khoá th ng g p: T khóa Mô t S d ng khai báo l p. hàm. T p ký t dùng trong java M i ngôn ng nói chung. nh s d ng nó t tên bi n. m t ch ng trình máy tính tính là m t t p các câu l nh c b trí theo m t tr t t mà ng i vi t ra chúng s p t Ngôn ng java c c xây d ng trên b ng ch cái unicode. ho c l p không final th k th a finally ph n cu i c a kh i x lý ngo i l ki u s th c float Câu l nh l p for Ch a c dùng goto Câu l nh l a ch n if ch r ng m t l p tri n khai t m t giao di n implements Khai báo s d ng th vi n import ki m tra m t i t ng có ph i là m t th hi n c a l p hay không instanceof s d ng khai báo giao di n interface ki u s nguyên long Khai báo ph ng th c c vi t b ng ngông ng biên d ch C++ native t o m t i t ng m i new Trang 9 . ph ng th c tr u t ng abstract Ki u d li u logic boolean c s d ng k t thúc vòng l p ho c c u trúc switch break ki u d li u s nguyên byte c s d ng trong l n switch case Ch a c s d ng ( dành cho t ng lai) cast c s d ng trong x lý ngo i l catch ki u d li u ký t char Dùng khai báo l p class Ch a c dùng const c dùng trong vòng l p b t u m t vòng l p m i continue c s d ng trong l nh switch default c dùng trong vòng l p u ki n sau do ki u d li u s th c double kh n ng l a ch n th hai trong câu l nh if else ch r ng m t l p c k th a t m t l p khác extends Gía tr logic false Dùng khai báo h ng s . các kí t c nhóm l i theo m t cách nào ó t o thành các t . do v y ta có th dùng các kí t unicode t tên cho các nh danh. II.. ngôn ng l p trình nói riêng u ph i xây d ng trên m t t p h p ch cái (hay còn g i là b ng ch cái). ta không th nh ngh a l i ngh a c a 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. T khoá c a Java M i ngôn ng l p trình có m t t p các t khoá. các t l i c nhóm l i thành các câu (trong ngôn ng l p trình g i là câu l nh).

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. tên ph i b t u b ng kí t ho c b t u b ng kí $.M i n v biên d ch bao g m m t ho c nhi u l p Trang 10 n v biên d ch ./. ph ng th c sao cho ngh a c a chúng rõ ràng. vi t hoa kí t u tiên c a m i t theo sau trong tên. ví d l p WhileTest.. d hi u.Không ch a d u cách._ . java có phân bi t ch hoa ch th ng . .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. C u trúc m t ch ng trình java .Tên nên t sao cho có th mô t c i t ng trong th c t . %. ghi t u tiên ch th ng. *. ch th ng nên ta ph i c n th n và chú ý. ví d area. ví d PI. Do java có phân bi t ch hoa. Circle . 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. thu c tính t nh Truy xu t n l p cha l nh l a ch n m t ph ng th c c quy n truy xu t trên m t i t ng Ám ch chính l p ó Ném ra ngo i l Khai báo ph ng th c ném ra ngo i l Giá tr logic s d ng b t ngo i l Dùng khai báo m t ph ng th c không tr v giá tr Dùng trong c u trúc l p III. khoa h c và mang tính c l qu c t .Gi ng nh C/C++. radius. -.Không trùng v i m t nh danh khác trong cùng m t ph m vi Chú ý: .Không trùng v i t khoá . giao di n ta vi t hoa các kí t u tiên c a m i t trong tên. readInteger… i v i tên l p.Trong java ta có th t tên v i dài tu ý . 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 ‘_’. l p.M i ng d ng Java bao g m m t ho c nhi u n v biên d ch (m i là m t t p tin có ph n m r ng Java) . Trong java tên c t theo quy t c sau: .null package private protected public return short static super switch synchronized this throw throws true try void while m t i t ng không t n t i Dùng khai báo m t gói c t truy xu t c t truy xu t c t truy xu t Quay t ph ng th c v ch g i nó ki u s nguyên Dùng khai báo bi n.Không b t u b ng m t s . nh danh (tên) Tên dùng xác nh duy nh t m t i l ng trong ch ng trình.Tên h ng bao gi c ng vi t hoa. h ng. các kí t toán h c nh +. MAX_VALUE IV.

i t ng là các th hi n (instance) c a l p.M i n v biên d ch có nhi u nh t m t l p c khai báo là public. 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 . 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) . M i l nh u c k t thúc b ng d u ch m ph y “.M i ng d ng c l p ph i có duy nh t m t ph ng th c main ( m b t u c a ng d ng) . nh d li u và các ph ng th c c a l p ó.Bên trong thân c a m i l p ta khai báo các thu c tính. //Xây d ng các l p public class clsMain{ public static void main(String args[]) { // mb t u c a ch ng trình } } class l p1 { } class l p2 { } - Trong ngôn ng Java. . th c ch t b n ang t o ra m t m t ki u d li u.java //Nh p kh u các th vi n import th _vi n. ph ng th c c a l p ó. 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 ó. do v y mã l nh ph i n m trong l p nào ó. Khi xây d ng m t l p. 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 ng”. t n v biên d ch là m t t p tin . Java là ngôn ng h ng i t ng.”. b n c n xác V c b nm tl p c khai báo nh sau: Trang 11 . 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..Khi ban khai báo m t l p.

} .Cú pháp: class classname { var_datatype variablename.ki u d li u c a bi n variablename .. + 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ó. ..Tên c a l p var_datatype . } Trong ó: class ..... Nó chi ph i vi c truy nh p n các thành ph n c a l p bao ph chúng. 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ó.Tên c a bi n met_datatype ...4\BIN\javac TênT p.Ki u d li u tr v c a ph ng th c methodname .4) ta s nh n c m t c u trúc th m c nh sau: V.. 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....T khoá xác nh l p classname .. song không th ng c l i...... ây là l p x p l ng nhau.. ng trình JAVA u tiên có th biên d ch và ch y các ch ng trình java ta ph i cài .. 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... 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) L p trong t nh c nh ngh a v i t khoá “static”..JRE (Java Runtime Enviroment) môi tr ng th c thi c a java.Tên c a ph ng th c parameter_list – Các tham s c c a ph ng th c .. Ch - biên d ch m t ch ng trình java sang mã byte code ta dùng l nh C:\JDK1.. .. <met_datatype> methodname (parameter_list){..B n còn có th nh ngh a m t l p bên trong m t l p khác..java thông d ch và ch y ch ng trình ta s d ng l nh Trang 12 ..B công c biên d ch và thông d ch JDK c a Sun Microsystem Sau khi cài t JDK (gi s th m c cài t là C:\JDK1...

th y c tác d ng c a các bi n môi t ng ta c n ph i kh i ng l i máy .4\lib\dt.C:\jdk1.jar..4\jre\lib\rt.jar.i v i dòng Win9X: M t p C:\Autoexec.4\BIN\java TênT p biên d ch và ch y ch ng trình Java n gi n ta nên thi t t hai bi n môi tr ng “paht” và “classpath” nh sau: .C:\jdk1.c:\jdk1.i v i dòng WinNT: + R-Click vào My Computerà ch n Propertiesà ch n AdvancedàEnviroment Variables + Trong ph n System variables ch n new thêm bi n môi tr ng m i.jar.4\lib\tools.bat sau ó thêm vào hai dòng sau: +classpath=.jar.C:\jdk1. m c ích cho d nhìn mà thôi) + C ng trong ph n System variables tìm n ph n path trong danh sáchàch n edit s a l i giá tr hi n có.C:\jdk1..C:\jdk1.C:\jdk1.4\jre\lib\rt.4\bin Kh i ng l i máy th y c tác d ng c a các bi n môi tr ng này Ví d u tiên: ch ng trình Hello World (ch ng trình khi ch y s in ra màn hình l i chào Hello World) Các b c: Trang 13 . trong h p tho i hi n ra gõ “classpath” vào ô Variable Name và “.C:\jdk1.4\lib\tools.4\lib\dt.jar” trong ô variable value (chú ý không gõ d u “ vào.jar + path=….C:\JDK1.4\bin” Công vi c t các bi n môi tr ng ã xong. trong ô value ta thêm vào cu i “.

n u trong ch ng trình còn l i cú pháp thì trong b c này ta s nh n c m t thông báo l i và lúc này t p HelloWorld. 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. nó dùng t o ra tài li u chú thích cho ch ng trình.java (chú ý tên t p ph i trùng v i tên l p. wordpad. ph n m r ng là java) .println("Hello World"). ây là ki u chú thích tài li u (không có trong C/C++). v i cách chú thích hai ta ch có th chú thích trên m t dòng.java biên d ch ch ng trình. Sau khi thông d ch và ch y ta nh n c - VI.- M m t ch ng trình so n th o v n b n h EditPlus… và gõ vào các dòng sau: public class HelloWorld { public static void main(String[] args){ System. Chú ý: Trong java ta có th t chú thích âu?. câu tr l i là: âu có th t cm t d u cách thì ó có th t chú thích. n u vi c biên d ch thành công (ch ng trình không có l i cú pháp) thì ta s thu c t p HelloWorld. Trang 14 .M c a s DOS Prompt + Chuy n vào th m c C:\ + Gõ l nh javac HelloWorld.out.class trong cùng th m c. } } tr asciii. 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.class c ng không c t o ra + Gõ l nh java HelloWorld (chú ý không gõ ph n m r ng) ch y ch ng trình HelloWorld. Ghi l i v i cái tên C:\HelloWorld. nh notepad. 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. k c ch hoa ch th ng. C++ Cách 3: s d ng c p /** và */.

m c a các bi n ki u tham chi u là nó ch a ng mà nó tr . Các ki u d li u nguyên thu u nguyên thu ki u logic boolean Ki u kí t Ki u s Ki u s Ki u s th c boolean char byte short int long float doubl e T khoá byte short int long float double char boolean void Kích c T i thi u (ki u s nguyên) s nguyên m t byte 8 bit -128 s nguyên ng n 16 bit -215 s nguyên 32 bit -231 s nguyên dài 64 bit -263 (ki u s th c) ki u th c v i chính 32 bit IEEE754 xác n Double-precision 64 bit IEEE754 floating point (ki u khác) ki u kí t 16 bit Unicode 0 ki u logic true ho c false - Mô t T i a 127 215-1 231-1 -263-1 L p bao Byte Short Integer Long IEEE75 Float 4 IEEE75 Double 4 Unicode Character 216-1 Boolean Void ph n c m c a các bi n có ki u nguyên th y là vùng nh c a chúng c c p phát stack. Trang 15 Mô t T p h p các d li u cùng ki u. Ki u d li u 1. c t o ra cho phép cài a ch c a it t Là m t l p thu n tr u t a th a k trong Java. 2. Do v y vi c truy xu t vào m t bi n ki u nguyên th y r t nhanh. Ki u tham chi u Trong Java có 3 ki u d li u tham chi u Ki u d li u M ng (Array) L p (Class) Giao di n (Interface) c n. Là s cài t mô t v m t ng it ng trong bài toán.VII.

N u c n khai báo nhi u bi n có cùng m t ki u d li u ta có th t các khai báo các bi n trên m t dòng. trong ó: .name là tên c a bi n.Java s x lý các bi n không c kh i u giá tr nh sau: + i v i thu c tính (bi n c khai báo trong ph m vi c a l p) thì Java s t ng kh i gán giá tr cho các bi n theo quy t c sau: + giá tr 0 cho ki u d li u s + false cho ki u logic + kí t null (mã 0) cho kí t + giá tr null cho ki u i t ng + i v i các bi n c c b thì bi n không c kh i gán giá tr m c nh. Trang 16 .InitValue là giá tr kh i t o cho bi n.type là ki u d li u cu bi n . VIII. ây là ph n tu ch n. tên bi n là m t xâu kí t c t theo quy t c t tên c a java . các bi n này c phân cách nhau b i d u ph y . tuy nhiên Java s báo l i n u ta s d ng m t bi n ch a c nh n giá tr 2.Bi n tham chi u it ng Vùng nh c a bi n tham chi u c c p phát vùng nh stack còn vùng nh c a i t ng c c p phát vùng nh heap. ph m vi c a bi n là n i mà bi n có th c truy c p. u này xác nh c tính th y c và th i gian s ng c a bi n. Khai báo bi n ng t ngôn ng C/C++. Vi c truy x t vào vùng nh heap ch m h n truy x t vào vùng nh stack tuy nhiên java có c ch cho phép truy c p vào vùng nh heap v i t c x p x b ng t c truy c p vào vùng nh stack. khai báo bi n trong java ta s d ng cú pháp sau: type name [=InitValue]. Ph m vi bi n M i bi n c khai báo ra có m t ph m vi ho t ng. Khai báo bi n 1. n u b qua ph n này thì giá tr ban u c a bi n c kh i t o giá tr m c nh Chú ý: .

Phép gán c th c hi n b ng toán t ‘=’.Ø Bi n ph m vi l p là bi n c khai báo bên trong l p nh ng bên ngoài các ph ng th c và hàm t o. tuy nhiên vi c khai báo ph i xu t hi n tr c khi bi n c s d ng Ø Bi n ph m vi c c b là bi n c khai báo bên trong m t kh i. VII. ph m vi c a bi n tính t m bi n c khai báo cho n cu i kh i mà bi n c khai báo Ví d : { int i=1. nó có ngh a là “ hãy tính toán giá tr bi u th c bên ph i d u gán. do v y h ã quy t nh không cho phép che gi u m t bi n ph m vi l n h n. M t s phép toán trên ki u d li u nguyên thu 1. sau ó a giá tr ó vào ô nh có tên n m bên trái d u gán’ Chú ý: + Câu l nh gán g m m t d u ‘=’ + Ki u c a bi u th c bên ph i d u gán ph i t ng thích v i ki u d li u c a bi n + Trong java ta có th th c hi n m t d y gán nh sau: i = j = 10. // c i và j u s n sàng } // ch có i s n sàng // j không s n sàng vì n m ngoài ph m vi } Chú ý: Ta không th làm i u sau cho dù nó có th trong C/C++ { int i=1. Phép gán Cú pháp Bi n=Bi uTh c. { int i=10. // c i và j u có giá tr 10 Trang 17 . Chú ý: th i gian s ng c a các i t ng không tuân theo quy lu t th i gian s ng c a các bi n ki u nguyên thu . // ch có i s n sàng s d ng { int j=10.// không c phép vì ã có m t bi n cùng tên v i nó } } Nh ng ng i thi t k java cho r ng u ó có th gây l n l n.

Ta tóm t t các phép toán qua b ng sau: Phép toán > >= < <= == != S d ng op1 > op2 op1 >= op2 op1 < op2 op1 <= op2 op1 == op2 op1! = op2 Nh n v giá tr true khi op1 l n h n op2 op1 l n h n ho c b ng op2 op1 nh h n op2 op1 nh h n ho c b ng op2 op1 b ng op2 op1 khác op2 Phép toán S d ng Ví d : S d ng các phép toán quan h public class RelationalDemo { public static void main(String[] args) { // a few numbers Trang 18 .2.op2 op1 * op2 op1/ op2 op1 % op2 Mô t C ng op1 v iop2 Tr op1 cho op2 Nhân op1 v i op2 chia op1 cho op2 Tính ph n d c a phép chia op1 cho op2 3. java c ng có phép toán t ng. nó xác nh m i quan h gi a chúng. . giá tr c a op c gi m xu ng tr c khi -op-bi u th c ch a nó c tính Gi m op xu ng1 n v ./ ( phép chia ). ta có th mô t tóm t t qua các b ng sau: Mô t ng op lên 1 n v . t ng sau(gi m tr c. Toán t toán h c Ngôn ng java c ng có các phép toán s h c nh các ngôn ng khác: + ( phép c ng). giá tr c a op c t ng lên tr c khi bi u ++ op++ th c ch a nó c tính ng op lên 1 n v . Phép toán quan h Phép toán quan h bao gi c ng cho k t qu boolean. * ( phép nhân ). ví d ! = s tr v true n u 2 toán h ng là khác nhau.( phép tr ). giá tr c a op c gi m xu ng sau khi ---op bi u th c ch a nó c tính Chú ý: n u toán t t ng tr c. Toán t t ng. gi m Gi ng nh ngôn ng C/C++. gi m. gi m sau) ng m t mình(không n m trong bi u th c ) thì chúng ho t ng nh nhau. chúng ch khác nhau khi chúng n m trong bi u th c 4. % ( phép toán chia l y ph n nguyên) Ta mô t tóm t t các phép toán s h c qua b ng t ng k t sau: Phép toán + * / % S d ng op1 + op2 op1 . giá tr c a op c t ng lên sau khi bi u th c ++ ++op ch a nó c tính Gi m op xu ng1 n v . phép toán quan h s so sánh 2 giá tr .

int j = 42..out.out.// false //less than or equal to System. System....println(" k <= j = " + (k <= j))..out.println(" k < j = " + (k < j)).out.println(" i <= j = " + (i <= j))...out..println(" k > j = " + (k > j)).").println("Greater than..out.println(" i == j = " + (i == j)).println(" i = " + i).")..println("Less than or equal to.println(" i! = j = " + (i! = j)).// true System. System.out.println(" j < i = " + (j < i)).println(" j >= i = " + (j >= i)).out.// true //not equal to System.out.println(" k == j = " + (k == j)).println("Variable values.out.out. Trang 19 ..out. System.").out.// true System..println(" k! = j = " + (k! = j)).out.out. //greater than System. System.println(" k >= j = " + (k >= j)).// true System.println("Greater than or equal to.// true //less than System...int i = 37.// false System.out.println("Equal to.out.// false System.// false System.// false.// true System. i >= j = false j >= i = true k >= j = true Less than.println(" j > i = " + (j > i)).out.println(" i < j = " + (i < j)). System. System. i = 37 j = 42 k = 42 Greater than.").out.. i > j = false j > i = true k > j = false Greater than or equal to.. int k = 42.println(" i >= j = " + (i >= j)).// false System."). System..// true System.out.println("Less than. System..out.// false } } ây là u ra c a ch ng trình Variable values.println(" j <= i = " + (j <= i)).println(" i > j = " + (i > j)).out.println(" k = " + k)..out.out. System.println("Not equal to..out.// true //equal to System..println(" j = " + j).").. // false System. System.out. they are equal //greater than or equal to System.").

i <= j = true j <= i = false k <= j = true Equal to. Phép toán d ch bit Ta s mô t phép toán d ch chuy n qua b ng sau: Phép toán S d ng K t qu D ch chuy n op1 sang ph i op2 bit.1.... << op1 << op2 op2 bit n m bên trái s c n b ng các bít 0 >>> op1>>> op2 D ch chuy n op1 sang ph i op2 bit.. giá tr c a op2 ch c tính khi op1 là true Ho c op1 ho c op2 là true.i < j = true j < i = false k < j = false Less than or equal to. giá tr c a op2 luôn c tính k c khi op1 là false Ho c op1 ho c op2 là true. giá tr c a op2 ch c tính khi op1 là false op là false C op1 và op2 u là true. phép toán thao tác trên bit 6. op2 bit phía bên ph i s >> op1 >> op2 c n b ng các bít 0 D ch chuy n op1 sang trái op2 bit(gi nguyên d u c a op1). giá tr c a op2 luôn luôn c tính k c khi op1 là true N u op1 khác op2 Nh n xét: + Phép toán && ( & ) ch nh n giá tr true khi và ch khi c hai toán h ng u là true + Phép toán || ( | ) ch nh n giá tr false khi và ch khi c hai toán h ng là false + Phép toán ^ ch nh n giá tr true khi và ch khi hai toán h ng khác nhau 6.. i == j = false k == j = true Not equal to.. i! = j = true k! = j = false 5. op2 bit Sau ây là hình minh ho phép toán d ch bít Trang 20 . Phép toán logic Java h tr 6 phép toán logic Phép toán S d ng && || ! & | ^ op1 && op2 op1 || op2 ! op op1 & op2 op1 | op2 op1 ^ op2 c ch ra trong b ng sau: Nh n v giá tr true khi C op1 và op2 u là true.

Ví d : 13>>1=6 vì 13=11012 do v y khi d ch ph i m t bit ta s c 1102=6 5<<1=10 vì 5=1012 do v y khi d ch trái 1 bit ta s c 10102=10 5<<2=100 vì 5=1012 do v y khi d ch trái 2 bit ta s c 101002=100 Nh n xét: phép toán d ch trái m t bit chính là phép nhân v i 2, còn d ch ph i chính là phép chia cho 2 6.2. Phép toán logic trên bit Các phép toán thao tác bit cho phép ta thao tác trên t ng bit riêng l trong m t ki u d li u thích h p, các phép toán thao tác bit th c hi n i s boolean trên các bit t ng ng c a 2 toán h ng t o ra k t qu Ta tóm t t các phép toán trong b ng sau: Phép toán S d ng & op1 & op2 Th c hi | op1 | op2 Th c hi ^ op1 ^ op2 Th c hi ~ ~op2 Th c hi B ng giá tr chân lý c a các phép toán Th c hi n n phép and các bit t ng ng c a op1 v i op2 n phép or các bit t ng ng c a op1 v i op2 n phép xor các bit t ng ng c a op1 v i op2 n phép l t not các bit c a op2 ái s boolean:

Trang 21

Phép AND op1 op2 0 0 0 1 1 0 1 1

Result 0 0 0 1

Phép XOR op1 op2 Result 0 0 0 0 1 1

Phép NOT op1 Result 0 1 1 0 op1 0 0 1 1 op2 0 1 0 1 Result 0 1 1 1

1 1

0 1

1 0

Ví d : 1101// 13 & 1100// 12 -----1100// 12 1101// 13 | 1100// 12 -----1101// 13 1101// 13 ^ 1100// 12 -----0001// 1 ! 10101=01010 7. Toán t gán t t Gi ng nh C/C++ java c ng có toán t gán, ta tóm t t các toán t gán qua b ng sau: Phép gán += -= *= /= %= S d ng op1 += op2 op1 -= op2 op1 *= op2 op1/ = op2 op1 %= op2 ng op1 = op1 + op2 op1 = op1 - op2 op1 = op1 * op2 op1 = op1/ op2 op1 = op1 % op2 Trang 22 ng

&= |= ^= <<= >>= >>>=

op1 &= op2 op1 |= op2 op1 ^= op2 op1 <<= op2 op1 >>= op2 op1 >>>= op2

op1 = op1 & op2 op1 = op1 | op2 op1 = op1 ^ op2 op1 = op1 << op2 op1 = op1 >> op2 op1 = op1 >>> op2

8. Th t u tiên c a các phép toán Th t u tiên c a các phép toán xác nh trình t tính toán giá tr c a m t bi u th c, java có nh ng quy t c riêng xác nh trình t tính toán c a bi u th c, ta ph i nh quy t c sau: Ø Các phép toán m t ngôi bao gi c ng c th c hi n tr c tiên Ø Trong m t bi u th c có nhi u phép toán thì phép toán nào có u tiên cao h n s c th c hi n tr c phép toán có u tiên th p Ø Trong m t bi u th c có nhi u phép toán có u tiên ngang nhau thì chúng s c tính theo trình t t trái qua ph i Ta có b ng tóm t t th t u tiên c a các phép toán trong b ng sau: postfix operators unary operators creation or cast multiplicative additive shift relational equality Bitwise AND Bitwise exclusive OR Bitwise inclusive OR Logical AND Logical OR Conditional Assignment []. (params) expr++ expr-++expr --expr +expr -expr ~! new (type)expr */ % +<< >> >>> < > <= >= instanceof ==! = & ^ | && || ?: = += -= *=/ = %= &= ^= |= <<= >>= >>>=

Trong b ng trên th t u tiên c a các phép toán c gi m t trên xu ng d i, trên cùng m t hàng thì chúng có u tiên ngang nhau. • Toán t d y Không gi ng nh C/C++, trong java ch duy nh t mà ta có th t toán t d y là bên trong c p ngo c tròn c a c u trúc for( s c mô t chi ti t trong ch ng sau ) IX. Toán t chuy n ki u 9.1 Chuy n i ki u không t ng minh Vi c chuy n i ki u th ng c di n ra m t cách t ng trong tr ng h p bi u th c g m nhi u toán h ng có ki u d li u khác nhau. u này ôi khi làm cho b n khá ng c nhiên vì nh n c m t k t qu không theo ý mu n. Ví d ta xét n trình sau: int two=2, three=3; Trang 23

float result=1.5 +three/two; k t qu nh n c c a result là 2.5. i u mà b n mong mu n là 3.0 ch không ph i là 2.5. K t qu 2.5 nh n c là do three và two là hai giá tr nguyên nên k t qu c a phép chia three/two cho ta m t giá tr nguyên bàng 1 ch không ph i là 1.5. nói r ng k t qu c a phép chia three/two là m t giá tr th c ch không ph i là m t giá tr nguyên thì m t trong hai toán h ng c a phép chia này ph i là m t s th c. Do v y ta c n ph i chuy n ki u c a m t trong hai toán h ng này ho c c hai thành s th c. nh n c k t qu úng trong tr ng h p này b n c n vi t nh sau: float result=1.5 + (float) three/two; ho c float result=1.5 + three/ (float)two; ho c float result=1.5 +(float)three/(float)two; Lý do mà ta vi t nh trên là n u trong m t phép toán có s tham gia c a nhi u toán h ng có ki u khác nhau thì java s chuy n ki u t ng cho các toán h ng m t cách t ng theo quy t c sau: byte -> short -> int -> long -> float -> double 9.2. Chuy n i ki u t ng minh chuy n i ki u m t cách t ng minh ta s d ng cú pháp sau: (type) bi u_th c; khi g p câu l nh này java s tính toán giá tr c a bi u th c sau ó chuy n i ki u giá tr c a bi u th c thành ki u type. Ví d : (int) 2.5 * 2 = 4 (int) 2.5 * 2.5 = 5 (int)(2.5 * 2.5) = 6 1+(float)5/2=1+5/(float)2=1+(float)5/(float)2=3.5 Chú ý: Phép toán chuy n ki u là phép toán có u tiên cao, nên (int)3.5*2≠(int)(3.4*2) C n chú ý khi chuy n m t bi u th c ki u d li u có mi n giá tr l n sang m t ki u có mi n giá tr nh h n. Trong tr ng h p này có th b n s b m t thông tin. X. Các hàm toán h c Các hàm toán h c nh sin, cos, sqrt c java vi t s n trong l p Math. L p này n m trong gói java.lang (gói m c nh) do v y b n không c n ph i thêm câu l nh import u ch ng trình có th s d ng l p này. Các hàm này c vi t là các ph ng th c t nh do v y ta không c n ph i t o ra th hi n c a l p Math. B ng sau li t kê m t s ph ng th c t nh trong l p Math: Tên ph ng th c Mô t ý ngh a tính sin c a arg sin(arg) Ki u tham s arg là m t bi u th double th hi n m theo radians tính cos c a arg arg là m t bi u th double th hi n m theo radians tính tang c a arg arg là m t bi u th double th hi n m theo radians tính sin-1 (arcsin) arg là m t bi u th Trang 24 Ki u tr v c ki u double t cung c ki u double t cung c ki u double t cung c ki u double trong h

cos(arg)

tan(arg)

asin(arg)

double th hi n m t cung radians theo radians tính cos-1 arg là m t bi u th c ki u double trong h acos(arg) (arccosin) c a arg double th hi n m t cung radians theo radians tính tan-1 arg là m t bi u th c ki u double trong h atan(arg) (arctang) c a arg double th hi n m t cung radians theo radians tính tan-1 arg1,arg2 là các bi u th c double trong h atan2 (arg1,arg2) (arctang) c a ki u double th hi n m t radians cung theo radians arg1/arg2 tính tr tuy t i arg là m t bi u th c ki u The same type as abs(arg) c a arg int, long, float, ho c double the argument ki u Nh n v giá tr l n arg1, arg2 là m t bi u th c Nh n v max (arg1,arg2) trong hai tham s ki u int, long, float, ho c cùng kiùu v i tham s double Nh n v giá tr arg1, arg2 lµ mét biùu thøc Nh n v ki u min (arg1,arg2) nh trong hai tham kiùu int, long, float, hoÆc cùng kiùu v i s double tham s Nh n v giá tr arg là bi u th c ki u float double ceil(arg) nguyên nh h n ho c double ho c b ng arg Nh n v giá tr arg là bi u th c ki u float double floor(arg) nguyên l n h n ho c double ho c b ng arg Tr v giá tr arg là bi u th c ki u float Nh n v ki u int round(arg) n u arg kiêu float, nguyên g n arg ho c double nh n v kiùu long nh t, giá tr này n u arg ki u chính là giá tr c a double arg sau khi ã làm tròn Gi ng nh arg là bi u th c ki u double double rint(arg) round(arg) tính c n b c hai arg là bi u th c ki u double double sqrt(arg) c a arg tính arg1arg2 C arg1 và arg2 là các bi u double pow (arg1,arg2) th c ki u double tính earg arg là bi u th c ki u double double exp(arg) tính logarithm s arg là bi u th c ki u double double log(arg) e c a arg double Nh n v m t s Không có tham s random() gi ng u nhiên n m trong kho n [0, 1) Ví d v các hàm toán h c trong l p Math, b n hãy gõ o n ch ng trình sau và cho ch y th th y c k t qu tính toán c a các hàm toán h c. Trang 25

arg

XI. Các phép toán trên ki u kí t i v i ki u kí t ta có th th c hi n các phép toán s h c (nh : +, -, *,/ ) và các phép toán quan h . Ví d : char kt1=’A’; char kt2=tk1+a;// kt2 nh n ký t B char kt3=(char)33*2;// kt3 nh n ký t B (kt1>kt2)= false; (kt2=kt3)= false;

Trang 26

BÀI 3.

U KHI N LU NG CH

NG 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 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 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 L p Quy t nh X lý l i R nhánh while, do-while, for if-else, switch-case try-catch-finally, throw break, continue, label:, return T khoá

I. C u trúc r nhánh 1.1. Phát bi u if a) D ng khuy t Cú pháp if (Boolean-expression) statement; s ho t ng c a c u trúc if thi u
T statement

c mô ta qua s

sau:

i u ki n
F

b) D ng Cú pháp if (Boolean-expression) statement1; else statement2; s ho t ng c a c u trúc if thi u

c mô ta qua s

sau:

úng
Statement 1

sai u ki n
Statement2

Trang 27

1.2. Bi u th c u ki n Cú pháp: Variable=booleanExpression? true-result-expression: false-result-expression; 1.3. c u trúc switch a) D ng khuy t Cú pháp 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;] } Sau ây là s kh i mô t s ho t ng c a c u trúc r nhánh switch d ng thi u

bi u_th c ng gt_1

Yes nh 1 break;

No
bi u_th c ng gt_2

Yes nh 2 break;

No .....................................................................

bi u_th c ng gt_n

Yes nh n break;

No

Trang 28

.... kh i mô t s ho t ng c a c u trúc switch trong tr ng h p có l nh break Trang 29 .. ... ........] default: l nh n+1.. byte..Bi u_th c ph i là m t bi u th c có ki u char....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.........] case gt_2: l nh 2..b) D ng Cú pháp switch(bi u_th c) { case gt_1: l nh 1................ bi u_th c ng gt_n Yes nh n No nh n+1 Chú ý: . int nh ng không th là ki u long. [ break.... [ break...Câu l nh break thoát ra kh i c u trúc switch.] … case gt_n: l nh n....... ....... [ break. 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..... short. } Sau ây là s kh i mô t s ho t ng c a c u trúc switch d ng bi u_th c ng gt_1 Yes No bi u_th c ng gt_2 nh 1 Yes nh 2 No ....

L p ki m tra u ki n tr c Ta có th s d ng c u trúc while l nh trong khi u ki n úng Cú pháp: while (BooleanExpression) { statement. Ví d : Trang 30 .1. Toán t u ki n là m t lo i toán t bi u th c u ki n. 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. } ta có th th y c lu ng th c hi n c a ch : a là s l . th c thi l p i l p l i m t l nh ho c m t kh i ng trình thông qua s kh i sau: sai i u ki n l p úng L nh tr c tiên phát bi u while s tính giá tr c a bi u th c logic. Toán t u ki n c bi t vì nó g m ba thành ph n c u thành u ki n là toán t 3 ngôi. 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.4. C u trúc l p while và do-while 1. Ví d : n bi u th c 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. String result=a%2==0 ? a là s ch II. 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. Trong ó bi u th c 1: Bi u th c 1 là m t bi u th c logic. hay nói cách khác toán t Cú pháp : Bi u th c 1? bi u th c 2 : bi u th c 3. sau khi th c hi n xong nó tính l i giá tr c a bi u th c logic. 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 . 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.

char c = copyFromMe. + 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.charAt(i). L p ki m tra u ki n sau Cú pháp: do { statement(s). int i = 0.". Th c hi n l nh b2.println(copyToMe).out. } } 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 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. } System. 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.append(c). StringBuffer copyToMe = new StringBuffer(). s ho t ng c a c u trúc này c th hi n qua s sau: L nh úng u ki n l p sai Nhìn vào s này ta th y s ho t ng c a nó nh sau: b1.public class WhileDemo { public static void main(String[] args) { String copyFromMe = "Copy this string until you " + "encounter the letter 'g'. while (c! = 'g') { copyToMe. Sau khi th c hi n l nh xong nó tính giá tr c a bi u th c logic Trang 31 .charAt(++i). n u không chúng ta s r i vào vòng l p vô h n. } while (expression). c = copyFromMe.

cú pháp c a nó nh sau: for (initialization. kh i di n gi i s ho t ng c a c u trúc for sau: c th c hi n duy Trang 32 .initialization là giá tr kh i t o tr c khi vòng l p b t u.charAt(++i). n u không chúng ta s r i vào vòng l p vô h n.b3. char c = copyFromMe.append(c).".println(copyToMe). N u bi u th c logic úng nó quay tr l i b1.termination là i u ki n dùng k t thúc quá trình l p . } } 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 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. termination. n u sai thì b4 b4. C u trúc for ây la c u trúc l p ph bi n nh t trong các ngôn ng l p trình. 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'. int i = 0.out. c = copyFromMe.increment là câu l nh dùng u khi n quá trình l p . StringBuffer copyToMe = new StringBuffer(). + 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 III. System. nó ch nh t m t lân tr c khi vòng l p b t u .statement là câu l nh mà ta c n ph i th c hi n l p i l p l i. do { copyToMe. } while (c! = 'g').charAt(i). 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. increment) { statement } Trong ó: .

i++.println("i= " + i + " j= " + j). } }// /:~ 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).out. c++) if (c! = 26 ) // ANSI Clear screen System. termination.initialization termination úng statement increment 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.out. } } } K t qu ch y ch i= 1 j= 11 ng trình sau: Trang 33 . 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. 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. 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. 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 (.) statement. c < 128. Boolean_Expression. 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.println( "value: " + (int)c +" character: " + c). j = i + 10. 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. j = i * 2) { System. i < 5.

L nh break và continue Bên trong thân c a các c u trúc l p ta có th u khi n lu ng th c hi n b ng cách s d ng l nh break và continue.// Next iteration System.i= 2 j= 4 i= 3 j= 6 i= 4 j= 8 IV. 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. if(j == 1269) break.out. } } } k t qu ch y ch 0 9 18 27 36 45 54 63 72 10 20 30 40 ng trình sau: Bên trong c u trúc l p for giá tr c a i không th t c giá tr 100 vì phát bi u break s k t thúc vòng l p khi i=74 Chú ý: Java không có l nh nh y goto.out.// Top of loop System. int j = i * 27. th c hi n l n l p ti p theo.// Out of for loop if(i % 9! = 0) continue. 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 Trang 34 . i++) { if(i == 74) break. i < 100.println(i).// Out of loop if(i % 10! = 0) continue.println(i). // An "infinite loop": while(true) { i++. 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. } int i = 0. continue s ng ng th c thi ph n còn l i c a thân vòng l p và chuy n u khi n v m b t u c a vòng l p.

continue inner. // Otherwise i never // gets incremented. // Otherwise i never // gets incremented. outer: // Can't have statements here for(. 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. 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 ó. 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. i++. } if(i == 8) { prt("break outer"). i++) { prt("i = " + i).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. k++) { if(k == 3) { prt("continue inner"). 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. i++. k < 5. true. continue outer. 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. m c l ng nhau không h n ch . ta mô t s ho t ng. i < 10. } if(i == 7) { prt("continue outer"). break. } for(int k = 0. if(i == 2) { prt("continue"). câu tr l i là nó thoát ra kh i vòng l p mà l nh break c t. } if(i == 3) { prt("break"). ) { // infinite loop inner:// Can't have statements here for(. break outer. th thì câu h i t ra là l nh break s thoát ra kh i vòng l p nào. } } } } // Can't break or continue // to labels here Trang 35 . continue.

println(s).out.} static void prt(String s) { System. } } k t qu ch y c 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 ng trình nh sau: Trang 36 .

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. Trang 37 . vì v y ng i ta còn g i l p là ki u d li u 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. ta có th xem l p là m t ki u d li u. java là ngôn ng l p trình h ng 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.Ch ng 2: L P TRÌNH H NG IT NG L p là khái ni m tr ng tâm c a l p trình h ng i t ng. hành vi ). l p còn có các hàm ( ph ng th c. do v y có th quan ni m l p là t p h p các i t ng cùng ki u. ngoài các thành ph n d li u. m t ch ng trình java g m m t t p các i t ng. hay struct c a C.

M t l p c nh ngh a theo m u sau: [pbulic][final][abstract] class <tên_l p>{ // khai báo các thu c tính // khai báo các ph ng th c } sau âu là ví d n gi n nh ngh a l p ng n x p: T ng quát: m t l p c khai báo d ng 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. final là b t cho java bi t ây là m t l p không th k th a Trang 38 .BÀI 1. do v y ta không th t o ra m t th hi n c a l p này 3. abstract là b t cho java bi t ây là m t l p tr u t ng.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 ó. 2. Khai báo l p 1. NH NGH A L P I. 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. bao g m: thu c tính và ph ng th c> } Trong ó: 1.

– Các thành ph n protected ng t nh các thành ph n private. e) 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. Khai báo thu c tính Tr l i l p Stack public class Stack { private Vector items. ây là m t d ng t ng t nh k th a b i c a java. } } Trong l p Stack trên ta có m t thu c tính private Vector items. public. ch th ng 1. Chú ý: a) Thu c tính c a l p là m t bi n có ki u d li u b t k . 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 ó: Trang 39 . l p này có tên là NameOfClass 5. c) 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.class là t khoá cho ch ng trình bi t ta ang khai báo m t l p. nh ng có th truy c p c t b t c l p con nào k th a t nó. và tên l p public này ph i trùng v i tên c a t p k c ch hoa. // a method with same name as a member variable public Vector items() { . c nh ngh a nh sau: 4. private. implements là t khoá cho java bi t l p này s tri n khai giao di n Interfaces. d) Các ph ng th c th ng khai báo là public. 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. chúng có th truy c p t b t c âu. public thì s truy c p là b n bè.2... – Ccác thành ph n private ch có th s d ng c bên trong l p. – 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. nó có th l i là m t bi n có ki u là chính l p ó b) 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. extends là t khoá cho java bi t l p này này c k th a t l p super 6. protected gi o h n s truy c p n thành ph n ó. 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 ó.

Ø accessLevel có th là m t trong các t public. nó không là c a riêng m t i t ng nào.Ph n thân c a ph ng th c g m các l nh này c vi t b ng các l nh c a java. ý ngh a c a các b t này c mô t ph n trên Ø . nó là m t thu c tính s d ng chung cho c l p. 1. private. các hành vi ng th c c khai báo nh sau: //mô t m c truy c p n ph ng th c // ây là ph ng th c l p // ây là ph ng th c không có cài t //ph ng th c này không th ghi è //ph ng th c này c vi t trong m t ngôn ng khác // ây là ph ng th c ng b //giá tr tr v c a ph ng th c //tên c a ph ng th c //khai báo các ngo i l có th c nem ra t ph ng th c Trang 40 .type là m t ki u d li u nào ó Ø 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.transient và volatile ch a c dùng Ø . 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. protected ho c có th b tr ng. II. m t ph ng th c c ng g m có 2 ph n: ph n khai báo và ph n thân . T ng quát m t ph ng th c accessLevel static abstract final native synchronized returnType MethodName throws exception Trong ó: mô t hành vi c a ph ng th c. Chi ti t v khai báo m t ph 1.3. Ø . khai báo nh ng ch khác s cho ta bi n. 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.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): . nó c nh ngh a nh sau: C ng gi ng nh m t l p.static là t khoá báo r ng ây là m t thu c tính l p.

m nh return ôi khi còn c dùng k t thúc m t ph ng th c. ph ng th c này c khai báo nh sau: public double tongHaiSo(double a. 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) 2.MethodName là tên c a ph ng th c.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. nó không có cài t. 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.synchronized ây là m t ph ng th c ng b . . 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 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++.accessLevel có th là m t trong các t khoá public.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 . ây là ki u tr v c a ph ng th c. nh n v k t qu . bên trong thân c a ph ng th c ta ph i s d ng phát bi u return value. 2. Truy n tham s cho ph ng th c Khi ta vi t các ph ng th c. private. 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. 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 . m t s ph ng th c yêu c u ph i có m t s tham s . khi ph ng th c không tr v d li u thì ph i dùng t khoá void ..returnType là m t ki u d li u. 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. t ki u d li u nguyên thu cho n tham chi u i t ng.abstract t khoá cho bi t ây là m t l p tr u t ng. 3. n u hàm c khai báo ki u void thì ta ch s d ng phát bi u return. ý ngh a c a các b t này c mô t trong ph n khai báo l p . tên c a ph ng th c c t theo quy t c t tên c a java . 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. java b t bu c b n ph i khai báo giá tr tr v cho ph ng th c. 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 . Ví d : ta có m t ph ng th c dùng tính t ng c a hai s . protected ho c b tr ng.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++) . chúng ph i c khai báo chi ti t có bao nhiêu tham s .static là t khoá báo cho java bi t ây là m t ph ng th c l p . double b){ return (a + b). 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. Trang 41 . } 1.

by – value ). System. 3. } public static void main(String[] args) { int t = 10. 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ì khi nh c n cái tên ó có ngh a là nh c n tham s .lang. ngh a là ph ng th c không th thay i giá tr c a các tham s truy n vào.out. System.println("Gia tri c a t truoc khi g i ham = " + t).out.*.*. ây là c tính truy n theo tr ( pass. public class Man ng th c pop c in m và Trang 42 . boolean isEmpty() { if (topelement == STACK_EMPTY) return true. } Object pop() { if (topelement == STACK_EMPTY) return null. else return false.println("Gia tri c a t tru?c khi g i ham = " + t). Object[] stackelements.io. else { return stackelements[topelement--]. Ta ki m tra u này qua ví d sau: public class TestPassByValue { public static void test(int t) { t++. khi ó tên c a tham s s “che” i tên c a ph ng th c. int topelement = STACK_EMPTY. ..*. System. } } Ví d : Xây d ng l p man import java. import java.Chú ý: Tên c a tham s có th trùng v i tên c a thu c tính. Thân c a ph ng th c Trong ví d sau thân c a ph ng th c isEmpty và ph có m u class Stack { static final int STACK_EMPTY = -1.util.println("Gia tri c a t bi?n trong ham sau khi tang len 1 la " + t).. test(t). 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ì b n sao giá tr c a tham s th c s s c chuy n n ph ng th c. import java. } } Ta s nh n c k t qu ra nh sau: 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 4.out.

namsinh). th thì làm th nào có th g i ph ng th c trùng tên ó c a l p cha. } public void hienthi() {System. System.get(Calendar. public Man(String name. System. 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.get(Calendar.YEAR)). System.YEAR) .println("Nam hien tai=" +now. return (now. T khoá 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 ó. t khoá this dùng ch i t ng này. System.MONTH)).HOUR)).brightness = brightness.get(Calendar. HSBColor (int hue. System.get(Calendar. int saturation. } } Trang 43 .out. java cung c p cho ta t khoá super dùng ch i t ng c a l p cha Ta xét ví d sau class ASillyClass { boolean aVariable.get(Calendar. } public int tuoi() {Calendar now=Calendar. 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. this. saturation. T khoá super 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. int brightness) { this.out.out. } III. int namsinh.println("Ho va ten:"+tuoi()).println("Phut hien tai=" +now.out. } IV.out.println("Thang hien tai=" +now. } public void HienThiNgay() { Calendar now=Calendar.out. this.println("Gio hien tai=" +now.saturation = saturation.out.DATE)).println("Ho va ten:"+ten).SECOND)).getInstance().println("Ngay hien tai=" +now. System.get(Calendar.getInstance().{protected String ten. void aMethod() { aVariable = true.int birthday){ ten=name. brightness.hue = hue. lúc ó ch các thành viên c a i t ng ó ta dùng t khoá this.namsinh=birthday.

V. 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 Trang 44 . 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. } } 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. m ng c a ki u d li u nguyên thu Vi c khai báo m t bi n. m ng các i t ng.println(super.out. void aMethod() { aVariable = false.println(aVariable). vùng nh dành cho con tr này thì c c p phát trên stack.4). System. Chú ý: Ta không th dùng nhi u t khoá này ch l p ông.class ASillierClass extends ASillyClass { boolean aVariable. super. S d ng l p Sau khi khao m t m t l p ta có th xem l p nh là m t ki u d li u. Ta tóm t t qua b ng sau: T khoá Truy c p trong chính l p ó X private X protected X public X default Truy c p trong l p con cùng gói X X X Truy c p trong l p con khác gói X X Truy c p trong Truy c p trong l p khác cùng gói l p khác khác gói X X X X - 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. <Tên_L p> <tên_mang>[kích th c m ng]. 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. 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. m ng c khai báo theo m u sau: <Tên_L p> < tên_bi n>. t m t i t ng khác.aMethod(). l p c … ch ng h n vi t nh sau là sai: super.super.aVariable).add(1. VI. <Tên_L p>[kích th c m ng] <tên_mang>. nên ta có th t o ra các bi n. vùng nh này chính là vùng nh dùng l u tr các thu c tính. V b n ch t m i i t ng trong java là m t con tr t i m t vùng nh . vi c khai báo m t bi n. 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. m ng các i t ng c ng ng t nh khai báo m t bi n. System.out.

out. a.// không h p l } } 2.out. } } class Beta { void accessMethod() { Alpha a = new Alpha().publicMethod(). class Beta { Trang 45 . // h p l } } 4.} } package Greek.out. a.// không h p l a. private.println("publicMethod"). Ví d package Greek. ta se xem ví d sau: package Greek. private void privateMethod() { System.} } package Roman.println("packageMethod"). public class Alpha { public int iampublic.privateMethod().iamprivate = 10. public void publicMethod() { System. // h p l a.{ private int iamprivate. class Alpha { int iampackage.iampublic = 10. 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. protected thì java m c nh thành viên ó có m c truy c p gói. Các thành ph n public Các thành viên public có th truy c p t b t c âu. class Beta { void accessMethod() { Alpha a = new Alpha(). void packageMethod() { System.println("privateMethod").*. Các thành ph n protected Các thành viên protected s c th o lu n trong ch ng sau 3. import Greek.

// legal} } Trang 46 .a.// legal a.iampackage = 10.packageMethod().void accessMethod() { Alpha a = new Alpha().

n u trình biên d ch không tìm th y hàm t o ng ng nó s thông báo l i. u này th ng x y ra khi chúng ta không xây d ng hàm Trang 47 .// call constructor } } Ví d 2: s d ng hàm t o có i class Rock2 { Rock2(int i) { System. 2. KH I U VÀ D N D P I. i++) new Rock2(i).BÀI 2. } } public class SimpleConstructor2 { public static void main(String[] args) { for(int i = 0. 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. Ph ng th c t o d ng (constructor) 1.println("Creating Rock").println( "Creating Rock number " + i). i++) new Rock(). i < 10.out. i < 10.out. } } public class SimpleConstructor { public static void main(String[] args) { for(int i = 0.// g i hàm t o có i } }// /:~ 3. khi ta t o ra m t i ng thì s có m t hàm t o nào ó c g i. Cách vi t hàm t o a) c 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 b) 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 System. 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. 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. 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.

} } Chú ý: a) bên trong c u t ta ch có th g i c t i a m t c u t . 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.// không th g i hai hàm t o tr lên bên trong m t hàm t o this(10).t o không i nh ng khi t o d ng ra trong ví d sau: it ng ta l i không truy n vào tham s . // không v n gì } } 4. // l i vì l p này không có hàm t o không i TestPassByValue thu1 = new TestPassByValue("Hello World"). Cú pháp this(danh sách i s ). System.println("Day la ham tao khong doi").out.out.out.println("hàm t o không i").println("Day la ham tao doi so nguyen").out. nh c ch public class TestPassByValue { public TestPassByValue(String s) { System.// 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). 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. 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ã. } public TestPassByValue(String s) { this(). có th g i n hàm t o ta s d ng t khoá this. Ví d : public class Test { public Test () { System. } public static void main(String[] args) { TestPassByValue thu = new TestPassByValue(). } Trang 48 . } public TestPassByValue(int i) { System.out. } public Test ( int i) { this().println("Day la ham tao doi so xau").println(s).

} } u n u cho d ch ví d trên trình biên d ch s phàn nàn "Test. 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. } public Test (String s) { System. }//k t thúc kh i vô danh // b t u kh i vô danh { Trang 49 . 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. column 9 II. 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. } // b t u kh i vô danh { System.// TestPassByValue thu1 = new TestPassByValue("Hello World"). khi ó kh i l nh này c g i là kh i vô danh.public static void main(String[] args) { TestPassByValue thu = new TestPassByValue(). Kh i kh i u vô danh và kh i kh i u t nh 1.out.out. 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. this(). kh i vô danh này c java g i th c thi khi m t i t ng ct o ra. 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. nên ví d sau s b báo l i public class Test{ public Test () { System.println ( "khoi khoi dau thu 3 ").println("Day la ham tao khong doi").println("Day la ham tao doi so xau").out.out. }// k t thúc kh i vô danh //b t u kh i vô danh { System.println ( "Day la ham tao" ).java": call to this must be first statement in constructor at line 7.// 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 ). các kh i vô danh c g i tr c c hàm t o.out.// } } b) 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 tiên trong thân ph ng th c.println ( "khoi khoi dau thu 1 ").

out. } {// ây là kh i vô danh System.println("Kh i này ch c g i 1 l n khi th hi n u tiên c a l p o ra")./ / t o ti p th hi n th 2 c a l p } } c 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 Trang 50 c t o ra .println ( " ây là kh i kh i u t nh"). 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.out. 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. System.println ( " ây là kh i vô danh ").out.out. } } 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 2. t khoá này báo cho java bi t ây là kh i kh i u t nh.System. }//k t thúc 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 (). thông t ng ta s d ng kh i kh i u t nh kh i u các thu c tính t nh ( static ). } static {// ây là kh i kh i u t nh System. } public static void main ( String[] args ) { Untitled1 dt1 = new Untitled1 (). Untitled1 dt2 = new Untitled1 ().println ( "khoi khoi dau thu 2 ").println ( " ây là hàm t o" ). 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. 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. tr c kh i l nh này ta t t khoá static. k c hàm t o. sau ây là m t ví d có 1 kh i kh i u t nh và m t kh i vô danh.out.

Ph ng th c finalize Java không có ph ng th c h y b . hàm này c g i là hu t hay còn g i là hàm hu . D n d p: k t thúc và thu rác 1.â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 ng u tiên c a l p này c t o. qu th t âu là m t u t i t . Trong java ta không c n quan tâm n u ó. còn kh i vô danh c g i m i khi m t i t ng m i c t o ra III. it hu nh làm Trang 51 . 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. java có m t c ch thu rác 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. 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. tuy nhiên trong m t s tr ng h p thì hàm hu m c l i không th áp ng c. do v y ng i l p trình C++. 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. 2. 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 . r i nó t ng thu h i vùng nh dành cho i t ng ó. tuy nhiên nó không ph i là ph ng th c h y b . Do v y ph ng th c finalize có th không c g i n. ph i vi t ra hàm hu riêng vi c ó. s có m t hàm cg ng. 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. nó thông minh bi t i t ng t ng nào không dùng n a. Trong ngôn ng C++ khi m t i t ng b phá hu . thông th ng hàm hàm m c nh là là d n d p. Ph ng th c finalize t ng t nh ph ng th c h y b c a C++.

tên_ph ng_th c_t nh(tham s ). tên c a i t ng: tên_ i_t ng. + Thành ph n t nh là chung c a c l p.// ây là thu c tính th ng … } + Các thu c tính t nh c c p phát m t vùng b nh c nh. + Ta không th s d ng t khoá this bên trong ph ng th c t nh Trang 52 . tên_ i_t ng. 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 : tên c a l p: tên_l p.println ( i ). + truy xu t n thu c tính t nh ta có th dùng m t trong 2 cách sau: tên_l p. } } c g i là ph ng th c t nh + Ph ng th c t nh là chung cho c l p. 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 thành ph n t nh c kh i gán b ng m t trong 2 cách sau: Ø S d ng kh i kh i u t nh (xem l i bài tr c ) Ø 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. tên_ph ng_th c_t nh(tham s ).tên_thu c_tính_t nh. 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. CÁC THÀNH PH N T NH I. 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ó. b i vì hàm t o không ph i là ph ng th c t nh.out.// ây là thu c tính t nh // ph ng th c t nh static void println (){ System. Thu c tính t nh Thu c tính c khai báo v i t khoá static g i là thu c tính t nh Ví d : class Static{ static int i = 10. nó không là c a riêng m t i t ng nào c .BÀI 3.// ây là thu c tính t nh int j = 10. + 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ên_thu c_tính_t nh. II. Ph ng th c t nh M t ph ng th c c khai báo là static Ví d : class Static{ static int i.

vì nó quá ph c t p. nh ng nh ng ng i thi t k java cho r ng u này là không c n thi t. 11). int i) { System. String s) { System. 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. } public static void main(String[] args) { print("String first".BÀI 4.out. } }// /:~ Chú ý: 1) N u n u java không tìm th y m t hàm b i t i 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 b i t i 3) Không nên quá l m d ng các ph ng th c b i t i 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. Khái ni m v ph ng th c b i t i Java cho phép ta xây d ng nhi u ph ng th c trùng tên nhau.println( "String: " + s + ".out. Trang 53 . 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. Ví d : public class OverloadingOrder { static void print(String s. String: " + s). có th ây là m t khuy t m. 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 ó. II.println( "int: " + i + ". N P CH NG PH NG TH C I. trong cùng m t l p. print(99. int: " + i). } static void print(int i. hi n 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. 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++. "Int first").

th thì l p c s ph i c b o m kh i u úng. nó còn c k th a t t c các thành ph n c a l p cha II. Khi ta t o ra m t i t ng c a l p suy d n. ngh a là java luôn t ng thêm l i g i c u t c a l p c s vào c u t c a l p d n xu t n u nh ta quên làm i u ó. i u này d n ta n m t hình dung. 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 . Kh i u l p c s L p d n xu t k th a m i thành ph n c a l p c . có th g i c u t c a l p c s ta s d ng t khoá super 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. K TH A (INHERITANCE) I. 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ó. } Trang 54 . 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 al pc s IV. cú pháp nh sau: class b extends a { // ph n thân c a l p b } III. 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. l p h u du ).out. 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 . n u b n không làm i u này thì java s làm giúp ban. thì nó ch a bên trong nó m t s v t con c a l p c s .println ( "Ham tao c a lop co so" ). nh ng th c t không ph i v y. 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.} } 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. th c hi n 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 c u t c a l p c s bên trong c u t c a l p d n xu t.out. 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. L p c s và l p d n xu t -M tl 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.println ( "Ham tao c a lop dan xuat" ). Th a k ph ng th c L p d n xu t k th a t t c các ph Ø Ph ng th c t o d ng Ø Ph ng th c finalize ng th c c a l p c s tr : V.BÀI 5. k th a không ch là sao chép giao di n c a l p c a l p c s . Th a k các thu c tính Th c tính c a l p c s c th a k trong l p d n xu t.

out. } } 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 c u t c a l p c s m t cách t ng minh class B { public B () { System. } } u tiên.println ( "Ham tao c a lop co so" ). 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.out.} } 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 System. ví d ch ra sau ã b báo l i class B { public B (){System. super ().out.public static void main ( String arg[] ) { A thu = new A (). } public static void main ( String arg[] ) { A thu = new A ().} Trang 55 .println ( "Ham tao c a lop co so" ).println ( "Ham tao c a lop co so" ). } } public class A extends B { public A () { super().out.// g i t o c a l p c s m t cách t ng minh System.out. thì l i g i này ph i là l nh n u ví d trên i thành class B { public B () {System.println ( "Ham tao c a lop dan xuat" ).out.println ("Ham tao c a lop dan xuat"). } public static void main ( String arg[] ) { 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 c u t c a l p c s .java": call to super must be first statement in constructor at line 15.println ( "Ham tao c a lop co so" ).} public B ( int i ) {System. u tiên N u biên d ch n mã này ta s nhân c m t thông báo l i nh sau: "A.

có th g i ph ng th c b ghi è c a l p c s ta dùng t khoá super truy c p n l p cha.println ( "Ham tao c a lop dan xuat" ). cú pháp sau: super. } } 1. G i ph ng th c b ghi è c a l p c s Bên trong l p d n xu t.} public class A extends B { public A () {super (). Thành ph n protected Trong m t vài bài tr c ta ã làm quen v i các thành ph n private. 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á 2. 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 VII. 1.out. VI. 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 c u t c a l p c s tr c sau ó m i n c u t c a l p suy d n. 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. 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++. thì nó không th b ghi è ( Override ) l p d n xu t. super ( 10 ). t c là tr t t thu rác thì ng c l i so v i tr t t kh i u. public. ngh a c a nó tu thu c vào ng c nh c th . } public static void main ( String arg[] ) { A thu = new A (). T khoá final T khoá final trong java có nhi u ngh a khác nhau. VI. Ghi è ph ng th c ( Override ) Hi n t ng trong l p c s và l p d n xu t có hai ph ng th c gi ng h t nhau ( c tên l n b tham s ) g i là ghi è ph ng th c ( Override )./ / không th g i nhi u h n 1 hàm t o c a l p c s System. n u có hi n t ng ghi è thì ph ng th c b ghi è c a l p c s s b n i. chú ý Override khác Overload. sau khi ã h c v k th a thì t khoá protected cu i cùng ã có ý ngh a. public static void main ( String arg[] ) Trang 56 . nh ng nói chung nó mu n nói “cái này không th thay i c”.overridden MethodName(). Chú ý: N u m t ph ng th c c a l p c s b b i t i ( Overload ). Tr t t d n d p M c dù java không có khái ni m hu t nh c a C++.

nên cho dù b n có cho m t ph ng th c private là final thì b n c ng ch th y m t hi u ng nào 4.{ } } A thu = new A (). do v y ta không th thay i giá tr c a nó 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 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. i giá tr c a tham s final ch ng trình này s b báo l i: "A. Xây d ng l p c s package JavaContent.*. Chú ý: 1) Khi ã khai báo m t thu c tính là final thì thu c tính này la h ng. 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.. import java. thu ( i ). } public static void main ( String arg[] ) { int i = 100.println ( i ).out.println("MAX_VALUE= " +thu.MAX_VALUE).//không cho phép thay System. 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. System.out. ô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ì ó. ngh a là bên trong thân c a ph ng pháp này.java": variable i might already have been assigned to at line 5. m c ích ch y u c a các ph ng th c final là tránh ghi è. } } 2.util. class HocSinh { //Khai bao du lieu thanh phan protected Trang 57 . 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. column 9 3. do v y ng c g ng cho m t ph ng th c c a l p final là final Ví d v tính k th a 1. 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. 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 lên chúng không th b ghi è. 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.

YEAR)-namSinh).4.int birthday. import java. //-----------------Khai bao Contructor. Xây d ng l p d n xu t package JavaContent.} //-------------------------------------------------public void hienThi1() {System.0.} //----------------Xay dung cac phuong thuc public double tongDiem() {return (dToan+dLy+dHoa+dTin). double d1. birthday. } } 2. String diaChi.} public void hienThi() {System.7). double dLy. d2.String Address.println("CAC THONG SO VE CAN BO").println("Tuoi="+tinhTuoi()). int namSinh.getInstance().in)). static private BufferedReader br=new BufferedReader(new InputStreamReader(System. System."Quang Ninh". double d3.out. d3). int birthday.*.dLy=d2.6. String Address. d1. System.io.out.out. import java.println("Diem Toan="+dToan).out. double dHoa.dToan=d1.lang. System.*.double d2. } //Khai bao cac phuong thuc cua lop Man public int tinhTuoi() {Calendar now=Calendar.out.diaChi=Address.double d2. public HocSinhCD(String name.9.double d1. protected double dToan. return (now. } public static void main(String args[]) {HocSinh ng1=new HocSinh("Nguyen Tam Hung".} //-------------------------------------------------public double diemTBUT() {return (dToan*2+dLy+dHoa+dTin*2)/6. //Khai bao Contructor & Detructor public HocSinh(String name.hienThi(). System.String hoTen.get(Calendar.1977.println("Dia chi ="+diaChi).6.println("Diem Hoa="+dHoa).double d3) {hoTen=name. Address. public class HocSinhCD extends HocSinh {//-------------------Khai bao du lieu thanh phan cho lop CanBo protected double dTin.namSinh=birthday.out. Trang 58 .Detructor.println("Ho va ten nhan su="+hoTen).out.println("Tong diem cac mon="+tongDiem()).double d4) { super(name.println("Diem Ly="+dLy). } public double tongDiem() {return (dToan+dLy+dHoa).dHoa=d3. ng1. System.out.dTin=d4. System.

d4=readDouble().print("Nhap vao diem Toan:").hienThi().parseLong(str).0).ht=readString().d3=0. } //----------------Xay dung cac phuong thuc nhap du lieu public static int readInt() {int d=0.out.readLine(). System. try{ String str=br. d=Float.//Khai bao mot mang hoc sinh trong 1 lop TK1[0]=hs1.print("Nhap vao diem Ly:").7.print("Nhap vao diem Hoa:").7.out.out.out. System.d4=0.hienThi().println("Diem TBC co uu tien=" +diemTBUT()).print("Nhap vao nam sinh:").d1."Ha Tay".println("Loi IO "+ex. d=Long.readLine().parseInt(str). try{ String str=br.d2. hs1.out.println("Diem mon Tin=" +dTin).dc=" ". System.d2=0.ns=readInt().println("Loi IO "+ex. System.toString()).out.toString()).print("Nhap vao diem in:").d3=readDouble().hienThi().out.readLine(). try{ String str=br.0.out.print("Nhap vao dia chi:"). HocSinhCD hs1=new HocSinhCD(ht. //Goi phuong thuc Hie Thi cua lop co so //Doi hpuong thuc readDoube hs1.d4).out. System.} return d. System.7.toString()). int ns=0.ns. } //-------------------------------------------------public static float readFloat() { float d=0.print("Nhap vao ho ten:"). TK1[0].hienThi1().} Trang 59 . d=Integer.d2=readDouble().dc=readString().d1=readDouble().out.0. }catch(IOException ex){System.println("Loi IO "+ex. System. } //-------------------------------------------------public static void main(String args[]) {String ht=" ". System. // HocSinhCD hs1=new HocSinhCD("Nguyen Van Thanh".out. } //-------------------------------------------------public static long readLong() { long d=0. double d1=0. }catch(IOException ex){System.parseFloat(str). System.7.} return d. }catch(IOException ex){System.d3. HocSinhCD TK1[]=new HocSinhCD[100].out.0.1980.dc.

}catch(IOException ex){System.} return str.toString()). } } Trang 60 . try{ str=br.} return d.readLine().parseDouble(str). }catch(IOException ex){System. try{ String str=br.println("Loi IO "+ex.readLine().return d.toString()).out. } //-------------------------------------------------public static double readDouble() { double d=0. } //------------------------------------------------------public static String readString() { String str=" ".println("Loi IO "+ex.out. d=Double.

ta không th t o ra th hi n c a l p này. 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. 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. ng th c tr u t ng M t l p tr u t ng có th ch a m t vài ph ng th c tr u t ng. 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. Không th t o ra i t ng c a l p tr u t ng Ph Trang 61 . b i vì nó c dùng nh ngh a m t giao di n chung cho các l p khác. ho c l p ó ph i là l p tr u t ng 3. 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.BÀI 6.

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). 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. do v y khi t o khuôn xu ng ta không c n ph i ép ki u t ng minh. các ph ng th c khác nhau. a hình thái cho phép các v n khác nhau. 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. k t ghép ng. vi c t o khuôn lên là an toàn. ho c tri n khai chi ti t ( i v i giao di n ). 2) Xây d ng các l p d n xu t t l p c s v a t o. ho c là m t giao di 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. Trang 62 .. th c hi n hành vi a hình thái Khái ni m v t o khuôn lên. các cách gi i quy t khác nhau theo cùng m t l c chung. l p này s c các l p con m r ng( i v i l p th ng. Ø 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. các i t ng 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.BÀI 7. vi c t o khuôn xu ng luôn c java ch p thu n. thông qua l p s . 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. 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. 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. 3) Th c hi n vi c t o khuôn xu ng. ho c l p tr u t ng).

Giao di n T khoá interface ã a khái ni m abstract i xa thêm m t b c n a. final String oracleTicker = "ORCL". ph n khai báo cho bi t m t s thông tin nh : tên c a interface. 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. nó có k th a t m t giao di n khác hay không. u này cho phép ta có th t o ra các l p c c b . 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. Ta không th t o ra m t l p trong. th m chí ta còn có th t o l p trong. 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. 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ó. 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. khai báo ph ng th c ( nh ng không có cài t). void valueChanged(String tickerSymbol. bên trong thân c a m t ph ng th c. L P TRONG. final String ciscoTicker = "CSCO". Ph n thân ch a các khai báo h ng. do v y ta có th nh ngh a l i giao di n nh sau: 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 public interface StockWatcher { final String sunTicker = "SUNW". M t interface g m có 2 ph n: ph n khai báo và ph n thân. ta dùng t khoá interface thay vì t khoá class. m t interface c ng có th có các tr ng. 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.BÀI 8. nó cho phép ta t o ra m t l p thu n o. b i trong java không có khái ni m k th a b i. GIAO DI N. double newValue). trong ngôn ng C++ I. trong java ta có th nh ngh a m t l p bên trong m t l p khác. Sau ây là hình nh c a m t interface. 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. ch cs d ng n i b bên trong m t n v ó. Ta có th ngh nó nh là m t l p abstract “thu n tuý”. } Trang 63 .

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 1 public class StockApplet extends Applet implements StockWatcher { . T t c các tr ng t ng là final và static. b i vì chúng không có ph n cài t Chú ý: 1. các giao di n c nh ngh a cho các l p d n xu t tri n khai. } } } Ví d 2 public interface MyInterface{ public void add(int x. . Trang 64 .equals(oracleTicker)) { . 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. Ph n thân Ph n thân khai báo các các h ng. 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 ph n khác là tu ch n. protected tr c các khai báo thì ta s nh n c m t l i lúc d ch 3. public void valueChanged(String tickerSymbol. Java yêu c u t t c các thành ph n c a giao di n ph i là public. 2.. . } else if (tickerSymbol. public void volume(int x. các ph ng th c này ph i k t thúc v i d u ch m ph y ‘. double newValue) { if (tickerSymbol.1. Ph n khai báo c a giao di n 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 interface InterfaceName Extends SuperInterface { InterfaceBody } //giao di n này là công c ng //tên c a giao di n //giao di n này là m r ng c a 1 giao di n khác //thân c a giao di n Trong c u trúc trên có 2 ph n b t bu c ph i có ó là ph n interface và InterfaceName.. nên ta không c n ph i cho b t này vào. int z). 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. } else if (tickerSymbol. int y.equals(sunTicker)) { ..equals(ciscoTicker)) { . int y). 3. . . 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.’. 2. các ph ng th c r ng ( không có cài t ). n u ta thêm các b t khác nh private..

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. n u nh l p ó không tri n khai. } public static void main(String args[]) {Use_MyInterface uu=new Use_MyInterface(). System. int z) { System. u này c g i là l p trong. b ng hình th c k th a II. public static final int counter = 5.out. int y) {System. } class StackEnum implements Enumeration { int currentItem = items.} public void volume(int x.add(4. 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. do v y ta có l i d ng u này th c hi n hành vi k th a b i. uu.println("Gia tri hang so price="+price).0.size() .println("Gia tri hang so counter="+counter).println("Tong cua 2 so "+x+" + " + y+" la:"+ (x+y)). v n không c java h tr + M t giao di n có th m r ng m t giao di n khác.9). int y..out.Interface_Const { public void add(int x. .//code for Stack's methods and constructors not shown. public boolean hasMoreElements() { Trang 65 . public class Use_MyInterface implements MyInterface.} //Ho c interface Interface_Const{ public static final double price = 100.8). . } + S d ng Interface trên package JavaContent. uu.out.1.15. public Enumeration enumerator() { return new StackEnum()..out. 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. System.println("Tich cua 3 so "+x+" * " + y+"*"+z+" la:"+ (x*y*z)). ho c tri n khai không h t thì nó ph i c khai báo là abstract + 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 + M t l p có th tri n khai nhi u giao di n.’ + 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.. } } Chú ý: + 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 ‘.volume(20.

return (currentItem >= 0). } public Object nextElement() { if (!hasMoreElements()) throw new NoSuchElementException(). else return items.elementAt(currentItem--). } } } L p trong r t h u hi u khi b n b n mu n t o ra các l p thi t k giao di n ng i dùng ) uh p( c bàn k khi nói v Trang 66 .

//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. kh i t o t ng ph n t c a m ng ta ph i làm nh sau: arraySinhVien[0]=new SinhVien(“sv01”. …. 3. “Hà Nam”). m ng ph i c t o ra b ng toán t new nh sau: Tên_m ng=new KDL[spt]. Ví d 2: Gi s ta có l p SinhVien ã c nh ngh a. XÂU KÝ T .//nh trên . 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. “B c Giang”). 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. 7. Chú ý: Ø M ng trong Java là m t i t ng Ø C ng nh các i t ng khác. 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 m ng . 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]. M NG. “Nguy n V n An”.KDL tên_m ng[]. T P H P I. “Nguy n Th Bình”. Ø 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.KDL tên_m ng[] = new KDL[spt]. 7. 9}. “H ng Yên”). 9 Trang 67 . các ph n t c a m ng l n l t c gán các giá tr là: 1. 3. arraySinhVien[1]=new SinhVien(“sv02”. Ø Spt là s ph n t c a m ng. //T o ra m ng Cách 2: int mangInt[]=new int[100]. M ng 1. T o ra m t m ng g m 5 ph n t . //Khai báo m t con tr n m ng các s nguyên mangInt=new int[100]. 5. “ ào Th M n”.KDL []tên_m ng. arraySinhVien[99]=new SinhVien(“sv100”. 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 ó. M ng 1 chi u a) Khai báo Cú pháp khai báo: . 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.Bài 9. 5. 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.

length. “HY”) mangSinhVien [1]=new SinhVien(“sv02”. int n=Keyboard. 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. for (int i = 0.out. a[i]=Keyboard. Ví d : int a[]=new int [3].Keyboard.SinhVien[] mangSinhVien = { new SinhVien(“sv01”. “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.length. “HY”). “HN”).out.out. “Nguy n V n A”. //Nh p d li u cho m ng for(int i=0. new SinhVien(“sv03”. null }.i++){ System.print("Nh p s ph n t c a m ng:"). “ Th Q”. “HN”) mangSinhVien [2]=new SinhVien(“sv03”. 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”. “ Th Q”. “Nguy n Th B”. Khai báo m t m ng g m 4 ph n t .readInt(). “Nguy n Th B”.length Ví d 1: Nh p vào m t m ng và in ra màn hình import com. } } Trang 68 .out.i<a. “BG”). i < a.Ph n t u tiên c a m ng là a[0] . } //In m ng ra màn hình System.theht. “Nguy n V n A”.Ph n t th 2 c a m ng là a[1] . new SinhVien(“sv02”. i++) System. //Khai báo m ng v i s ph n t b ng n int a[]=new int[n].print(a[i] + " "). //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: .println("M ng v a nh p là").print("a[" + i + "]="). class ArrayDemo{ public static void main(String[] args) { //Nh p s ph n t c a m ng System. l y v s ph n t c a m ng ta s d ng thu c tính length nh sau: Tên_m ng.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.readInt().

class ArrayDemo2{ public static void main(String[] args) { //Nh p s ph n t c a m ng System. //Nh p d li u cho m ng for(int i=0. 3 c t Trang 69 . N Ví d : .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? import com..println("Dãy không ph i t ng d n").//Thoát kh i vòng l p } if(kt) System. M ng nhi u chi u a) Khai báo Khai báo m ng N chi u trong Java KDL [][]…[] tên_m ng.. …. for (int i = 0. i < a. else System.out. // Ma tr n g m 2 hàng.length-1. a[i]=Keyboard. i++) if(a[i+1]-a[i]<0){ kt=false.//thay i tr ng thái c break.readInt().i<a.out.readInt(). N l nN l n Trong ó: Ø KDL là m t ki u d li u b t k : nguyên thu ho c l p Ø sp1. . sptN l n l t là s ph n t trên chi u th 1. } } 2. sp2.println("Dãy t ng d n"). Ø Khai báo và t o ra m ng 2 chi u: int[][] a = new int[2][3].Keyboard.out. //Khai báo m ng v i s ph n t b ng n int a[]=new int[n].i++){ System.length.theht. 2.print("Nh p s ph n t c a m ng:"). ho c int a[][].print("a[" + i + "]="). } //Ki m tra dãy t ng boolean kt=true. KDL ng [][]…[] =new [] .Khai báo m t con tr c a m ng 2 chi u int[][] a . int n=Keyboard. Nl n ho c c ti n hành nh sau: KDL tên_m tên_m ng [][]KDL[spt1][spt2]…[sptN].out.

L p StringBuffer c s d ng i v i nh ng xâu ký t ng. 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. 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. a[0][1].readFloat().length.print("a[" + i + ". } //In m ng hai chi u ra màn hình for (int i = 0.. i++) for (int j = 0. a[1][2]. } } } 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.out. 5}. i++) { for (int j = 0. //Nh p li u cho ph n t hàng i. 7}.length. a[1][1]. a[1][3]. //Các ph n t trên hàng th hai {1.out. c t j a[i][j] = Keyboard. //Các ph n t trên hàng th nh t {2. 4. j++) System. 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 import com.print("Nh p s c t:").readInt(). 9}. j++) { System. Trang 70 .out. c th là: trên hàng th nh t có 3 ph n t . nh ng trên m i hàng l i có s ph n t khác nhau. j < a[i].theht. h ng 2 g m 4 ph n t và hàng th 3 g m 2 ph n t .print("Nh p s hàng:"). j < a[i]. int sh = Keyboard.println().length.print(a[i][j] + " ").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.out. System. i < a. 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]. //Nh p d li u cho m ng hai chi u for (int i = 0. int sc = Keyboard.Keyboard. II.length. class MaTram { public static void main(String[] args) { //Nh p s hàng và s c t System. 2. t c là có th thay i cn i dung bên trong c a xâu. System. a[2][0]. a[1][0]. //Các ph n t trên hàng th ba } Khai báo trên s t o ra m t m ng hai chi u g m: 3 hàng.readInt()." + j + "]="). //Khai báo m ng hai chi u g m sh hàng và sc c t float a[][] = new float[sh][sc]. i < a.out. 7. L p String dùng cho nh ng xâu ký t b t bi n. a[0][2].

Toán t “+” c s d ng c ng chu i khác vào chu i ang t n t i.’B’.2).’C’. 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. char ch = name. //str1 ch a m t chu i r ng. Không gi ng nh toán t “+”. Các ph thao tác v i Trong ph n này. Nó cung c p các ph ng th c kh i t o (constructor) khác nhau: String str1 = new String( ).’D’.0. ng th c này tr v m t ký t t i v trí index trong chu i. StrFinal = strFirst. Trang 71 . . StrSecond = “Chaplin”.là s l ng ký t k t ký t b t u. //…. String str2 = new String(“Hello World”). Toán t “+” này c g i nh là “n i chu i”. Ph ng th c “concat( )” c a l p String c ng có th th c hi n vi c n i chu i.char charAt(int index ) Ph Ví d : String name = new String(“Java Language”).charAt(5). t ó v trí các s b t u t 0. Ví d : String strname = “Java Language”. Bi n “ch” ch a giá tr “L”. chu i m i ó s ch a giá tr c a c hai. //str2 ch a “Hello World” char ch[] = {‘A’. ph ng th c này tr v m t chu i m i. Ví d : String strFirst.tính t ký t b t u.b ng cách s d ng ph Ph ng th c concat( ) gán v i m t chu i ang t n t i.startsWith(“Java”). //str3 ch a “ABCDE” String str4 = new String(ch. strFinal. m. ph thu c vào chu i có b t u v i m t chu i con c th nào ó không. chúng ta s xem xét các ph . Thay vào ó. n i chu i c th c hi n thông qua l p “StringBuffer”. String str3 = new String(ch). ây. //str4 ch a “AB” vì 0. ng th c concat( ) ch làm vi c v i hai chu i t i m t th i ng th c c a l p String ng th c c a l p String. i u này có th c gán cho chu i ang t n t i. L p String cung c p các ph ng th c các chu i. L p String Chu i là m t dãy các ký t . 2.boolean startsWith(String s ) Ph ng th c này tr v giá tr ki u logic (Boolean). strSecond.1.’E’}.concat(strSecond). Chúng ta s th o lu n v l p này trong ph n sau. boolean flag = strname. StrFirst = “Charlie”.

//ch a –1 n u “z” không tìm th y t i v trí 2.println(“Uppercase: ”+lower. .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 . System. Ví d : char name[] = {‘L’.indexOf(‘n’).indexOf(‘z’.endsWith(“Java”). . và tham s th hai ch nh s ký t c rút ra t m ng. //ch a m c 0 .int indexOf(String sunString ) Ph ng th c này tr v th t c a m t ký t nào ó.boolean endsWith(String s ) Ph ng th c này tr v m t giá tr ki u logic (boolean).out. .’u’.Edited by Foxit Reader Copyright(C) by Foxit Software Company.’g’.toCharArray( ).2).2).’a’. Ví d : String text = new String(“Hello World”).’e’}. Hãy th s khác nhau tr c và sau khi c t b kho ng tr ng. Bây gi bi n “subname” ch a chu i “ag”. .String trim() Ph ng th c này c t b kho ng tr ng hai u chu i. String day = new String(“Sunday”).toUpperCase( )).toLowerCase( )).String toUpperCase( ) Ph ng th c này tr v ch hoa c a chu i. Trang 72 n mã sau th y Ten lop .String toLowerCase( ) Ph ng th c này tr v ch th ng c a chu i. Ví d : String strname = “Java Language”. ph thu c vào chu i k t thúc b ng m t chu i con nào ó không.copyValueOf(name.2005-2008 For Evaluation Only.’a’. .indexOf(“Sun”). Tham s u tiên ch nh v trí t n i các ký t ph i c rút ra. 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.println(“Lowercase: “+upper. String subname = String . Ph ng th c này c ng l y hai tham s nguyên. int index1 = day. char textArray[] = text. boolean flag = strname. Bi n “flag” ch a giá tr false. Bi n “flag” ch a giá tr true. String upper = new String(“JAVA”).char [] toCharArray( ) Ph ng th c này chuy n chu i thành m t m ng ký t .’g’. . //ch a 2 int index2 = day. ho c m t chu i trong ph m vi m t chu i.out. System. String lower = new String(“good morning”).’n’.5. int index3 = day.

println(s3.boolean equals(String s) Ph ng th c này so sánh n i dung c a hai it ng chu i.capacity()). System. Bi n “flag” ch a giá tr false. name2 = “JAVA”. //ch a 28 } } “length()” và “capacity()” c a StringBuffer là hai ph ng th c hoàn toàn khác nhau.out. String space = new String(“ Spaces “).out. //ch a 12 System.length()). i c tính toán nh sau: . static String valueOf(boolean b)//Chuy n m t giá tr logic thành xâu. .println( s3 = + s3). ó là các ký t và các chu i có th c chèn vào gi a i t ng StringBuffer.println(s2. 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.out. 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.out. L p này cung c p nhi u ph ng th c kh i t o.Edited by Foxit Reader Copyright(C) by Foxit Software Company. và dung l ng m i NewCapacity = OldCapacity * 2 + 2 Trang 73 “ensureCapacity()”.2005-2008 For Evaluation Only.println(space.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. boolean flag = name1.out. StringBuffer s2 = new StringBuffer(20). Ph ng th c “length()” c p n s các ký t mà i t ng th c ch a.length()). 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 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 2. //Sau khi c t b kho ng tr ng . //ch a 20 System. Các i t ng c a l p này r t m m d o. //ch a 16 System.println(s1. class StringBufferCons{ public static void main(String args[]){ StringBuffer s1 = new StringBuffer().capacity()).println(s3. 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. System.out. String name1 = “Java”.out. ho c n i thêm d li u vào t i v trí cu i.capacity()). Dung l ng c a StringBuffer có th thay i v i ph ng th c s int ã c truy n n ph ng th c này. //ch a 0 System. StringBuffer s3 = new StringBuffer( StringBuffer ). 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.println(space).equals(name2).println(s2. System.out.trim()). System.

V trí chèn s l n h n hay b ng 0. str.append(“evening”). hay m t giá tr s th c (float) c chèn vào. 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 ng c tính toán (12*2+2). thì dung l ng c t b ng giá tr tham s truy n vào. dung l StringBuffer str = new StringBuffer(“James Gosling”). System. //ch a 5 m = +s1. c chuy n sang chu i và sau ó m i c chèn vào. .out. char letter = str. System.capacity()). Ví d : StringBuffer str = new StringBuffer(“Java sion”).ensureCapacity(30). Ch ng trình sau minh ho dung l ng c tính toán và c t nh th nào. . Bi n “str” ch a chu i “Jbava sion”. //ch a 30 ng ban u c a s1 là 5. Tham s u tiên là v trí chèn. System. và nh h n hay b ng chi u dài c a i t ng StringBuffer. .Ví d : it ng StringBuffer t i v trí c ch Trong o n mã trên. //ch a 12 m = +s1.insert(1. Câu l nh s1. 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()”.’b’).ensureCapacity(30). m t ký t (char).charAt(6).println( Dung l ng c a b nh } } Tr m = +s1.N u dung l ng m i nh h n i s c truy n cho ph ng th c “ensureCapacity()”. . class test{ public static void main(String args[]){ StringBuffer s1 = new StringBuffer(5). 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 ng StringBuffer.void insert() Ph ng th c này có hai tham s .ensureCapacity(8). tr ký t ho c chu i. 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 .out.out.ensureCapacity(8). //ch a “G” Trang 74 . Ví d : StringBuffer s1 = new StringBuffer(“Good”).capacity()). s1. s1. Tham s th hai có th là m t chu i. m t giá tr nguyên (int).char charAt() Ph ng th c này tr v m t giá tr ký t trong nh.capacity()). B t k i s nào. thì dung l ng m i (NewCapacity) c t.println( Dung l ng c a b nh s1.println( Dung l ng c a b nh s1.c khi dung l ng c a StringBuffer c t l i. Giá tr trong s1 bây gi là “goodevening”.

char value) Ph ng th c này khác t i m t v trí c s d ng c ch nh. n i mà các ký t c sao chép. tab. thì các ký t th a s b c t b t. *. Ví d ..void reverse() Ph ng th c này o ng c n i dung c a m t ng StringBuffer khác. . 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). /.char [] getChars() Ph ng th c này c s d ng trích ra các ký t t i t ng StringBuffer.0). Ch s k t thúc: v trí k t thúc M ng: M ng ích. 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.setLength(str. Bi n “strrev” ch a “lived”. và tr v m t i StringBuffer str = new StringBuffer(“devil”). m i t trong m t câu có th coi nh là m t token.void setCharAt(int index. Ví d : StringBuffer str = new StringBuffer(“Leopard”). StringBuffer strrev = str. Ví d : it ng StringBuffer.6. và -) trong khi phân tích m t bi u th c. l p StringTokenizer ã i xa h n vi c phân tách các t trong câu.void setLength() Ph ng th c này thi t l p chi u dài c a i t ng StringBuffer.. 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.length() +10). Bi n “name” ch a “Java”. Ph ng th c getChars() có b n tham s sau: Ch s u: v trí b t u.ch. thay th ký t trong m t StringBuffer b ng m t ký t StringBuffer name = new StringBuffer(“Jawa”).getChars(3.). str. t n i mà ký t c l y ra. III. . 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.. char ch[] = new char[10]. Tuy nhiên. name. Bây gi bi n “ch” ch a “par” .setCharAt(2. B ng sau tóm t t 3 ph ng th c t o d ng c a l p StringTokenizer: Ý ngh a T o ra m t Trang 75 it ng StringTokenizer m i Ph ng th c xây d ng StringTokenizer(String) . str. Ta c ng có th s d ng t p các toán t toán h c (+.’v’). 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. 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ó.reverse(). . và sao chép chúng vào m t m ng.

StringTokenizer c a “st3” s d ng d u ph y nh m t d u phân cách. Nó gi ng h t nh hasMoreElements. “st1” c s d ng phân tách m t bi u th c toán h c. Trong ví d này.StringTokenizer(String.bbbb. String) chu i c ch nh và m t t p các d u phân cách. Th hai. “. Tr v True n u còn có token ang c ánh d u trong chu i. Trang 76 . L p StringTokenizer cài t giao di n Enumeration. C hai tokenizer. “+-*/”. Vì th . StringTokenizer st2 = new StringTokenizer(“4*3/2-1+4”. Nó thì gi ng nh nextToken. và hi n th các token.util. ph ng th c hasMoreTokens() và nextToken() c s d ng duy t qua t p các token. các ký t xu ng dòng. T o ra m t i t ng StringTokenizer m i d a trên (String. Nó thì gi ng h t nh hasMoreTokens. và -. StringTokenizer st3 = new StringTokenizer(“aaa. Hãy xem xét ch ng trình ã cho bên d i.”). Các d u phân cách này thì ch s d ng khi phân tách v n b n. 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. nó bao g m các ph ng th c hasMoreElements() và nextElement(). D u phân cách m c nh là kho ng tr ng. trên c minh h a trong các ví d sau: Các ph ng th c t o d ng StringTokenizer st1 = new StringTokenizer(“A Stream of words”). m t t p các d u phân cách. Câu l nh th 3. hai i t ng StringTokenizer ã c t o ra. boolean) d a trên chu i c ch nh. u tiên. +. “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. T o ra m t i t ng StringTokenizer d a trên chu i c ch nh. 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 ó. Nó thì gi ng nh nextElement. Tr v True n u còn có token ang c ánh d u trong chu i. 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 *. Strìng) StringTokenizer(String. tab.ccc”.*. Tr v token k ti p trong chu i. và sau ó tr v token k ti p trong chu i. import java. 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 countTokens() hasMoreElements() hasMoreTokens() nextElement() nextToken() nextToken(String) M c ích Tr v s các token còn l i. Thay i b d u phân cách b ng chu i c ch nh. Trong câu l nh u tiên. String. Tr v Token k ti p trong chu i. 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. /. true).

field3.. *+/.lang (gói m c nh c a Java. các l p Wrapper (l p bao c a các ki u d li u nguyên th y).out.false). IV. Object Boolea Characte Voi Numbe Math Strin StringBuff . String và l p StringBuffer. M i l p trong Java u là l p con c a l p Object . //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.hasMoreTokens()) System. hay s d ng c a Java nh : Object. khi c n s d ng các l p trong gói này ta không c n ph i import nó).nextToken()). Nh ng l p này c xây d ng trong gói java.println( Tokens of mathExpr: ).. . //trong khi v n còn các token. //trong khi v n còn token. hi n th System.nextToken()). StringTokenizer st2 = new StringTokenizer(commas. while (st2.hasMoreTokens()) System. System. StringTokenizer st1 = new StringTokenizer(mathExpr.out.and field4 . hi n th .println( Comma-delimited tokens : ). String commas = field1. } } K t qu ch y ch ng trình c mô t nh hình d i. true).String mathExpr = 4*3+2/4 . Math. Byte Short Integer Long Float Double Trang 77 ..out.println(st1. M t s l p c b n c a Java Các l p c b n.field2.out. while(st1.println(st2.

Các l p bao ki u nguyên th y (Wrapper class) Các giá tr nguyên th y không ph i là i t ng trong Java. Object cung c p các ph ng th c sau: int hashCode() Khi các i t ng c l u vào các b ng b m (hash table). Trang 78 .C u trúc phân c p m t s l p trong gói java. String toString() N u các l p con không vi t è hàm này thì nó s tr l i d ng bi u di n v n b n (textual) c a i t ng. Integer intObj = new Integer(2002). Float floatObj = new Float(3. protected void finalize() throws Throwable Hàm này c g i ngay tr c khi i t ng b d n vào “thùng rác”. Hàm này th ng c vi t è các l p con cho phù h p v i ng c nh so sánh b ng nhau trong các l p m r ng ó. ngh a là t o ra b n copy m i c a i t ng hi n th i. Các l p bao có nh ng c tính chung sau: Các toán t t o l p chung. ây là l p c s nh t. Các toán t này s ném ra ngo i l NumberFormatException khi giá tr String truy n vào hàm t o không h p l . u này m b o tính nh t quán c a h th ng khi th c hi n ch ng trình.lang 1. Integer intObj = new Integer(“2002”). kí t và logic) thì gói java.14F). Các l p bao (tr l p Character ch có m t toán t t o l p) u có hai toán t t o l p: Toán t t o l p s d ng giá tr nguyên th y t o ra i t ng t ng ng Character charObj = new Character(‘a’). Hàm println() l p PrintStream s chuy n các i s c a nó sang d ng v n b n khi s d ng hàm toString(). Class getClass() Tr l i tên l p c a i t ng hi n th i. Double doubleObj = new Double(3. protected Object clone() throws CloneNotSupportedException i t ng m i c t o ra có cùng các tr ng thái nh i t ng hi n th i khi s d ng clone(). có th thao tác c trên các giá tr nguyên th y (giá tr s .14). nh ngh a h u nh t t c nh ng ph ng th c ph n c b n các l p con cháu c a nó s d ng tr c ti p ho c vi t è. 2.lang cung c p các l p bao gói (Wrapper) cho t ng ki u d li u nguyên th y (g i t t là l p bao). Boolean boolObj = new Boolean(“true”). hàm này có th s d ng xác nh duy nh t giá tr cho m i i t ng. ngh a là tr c khi i ng ó b hu b . Boolean boolObj = new Boolean(true). Toán t th hai: chuy n các i t ng l p String bi u di n cho các giá tr nguyên th y v các l p t ng ng. L p Object T t c các l p c xây d ng trong các ch ng trình Java u ho c là tr c ti p ho c gián ti p c m r ng t l p Object. boolean equals(Object obj) Cho l i k t qu true khi i t ng hi n th i và obj là cùng m t i t ng.

// “2002” String doubleStr = doubleObj. Boolean boolObj = Boolean.valueOf(“2010”).valueOf(“3. Double doubleObj= new Double(“3. Character.toString().MAX_VALUE và các giá tr ki u ký t Unicode.valueOf(“2002”).TRUE.doubleValueOf(). Character charObj = new Character(‘a’).14F”). // true int i = intObj. Có các hàm ti n ích chung: valueOf(String s).booleanValue().equals(‘b’). Double doubleObj= Double.toString().intValue().MIN_VALUE. boolean b = boolObj.14F double d = doubleObj. // false Integer intObj1 = Integer. // “true” String intStr = intObj. Float floatObj = Float. M i l p (tr l p Character) u nh ngh a hàm static valueOf(String s) tr l i i ng t ng ng. // 2002 float f = floatObj.toString(). Integer intObj = Integer. boolean charTest = charObj. // “3. Các l p vi t è hàm toString() tr l i là các i t ng String bi u di n cho các giá tr nguyên th y d ng xâu.14” Các l p nh ngh a hàm typeValue() tr l i các giá tr nguyên th y t các i t ng nguyên th y. L p Character L p Character nh ngh a hai giá tr c c ti u.charValue().14”). typeValue(). Boolean. // 3. c c i Character.valueOf(“true”). toString().floatValueOf(). // “a” String boolStr = boolObj. Các hàm này ném ra ngo i l NumberFormatException khi giá tr String truy n vào ph ng th c không h p l .Float floatObj = new Float(“3.FALSE bi u di n cho hai giá tr nguyên th y true và false t ng ng. // false L p Boolean L p này nh ngh a hai i t ng Boolean. String charStr = charObj.14 char c = charObj.14F”). boolean intTest = intObj.toString(). Ngoài ra l p này còn nh ngh a m t s hàm static x lý trên các ký t : static boolean isLowerCase(char ch)// true n u ch là ký t th ng static boolean isUpperCase(char ch)// true n u ch là ký t vi t hoa static boolean isDigit(char ch) // true n uch là ch s static boolean isLetter(char ch)// true n u ch là ch cái static boolean isLetterOrDigit(char ch) // true n u ch là ch ho c là s static char toUpperCase(char ch)// Chuy n ch v ch vi t hoa Trang 79 . // ‘a’ ng ng v i Các l p vi t è hàm equals() th c hi n so sánh b ng nhau c a các i t ng nguyên th y.valueOf(“3. equals(). // 3.equals(intObj1).14”).

Long.print(k + ": ). Double là các l p con c a l p Number. class SapXep{ static int[] day. Ví d . double value3 = Double.out.parseDouble(“3. Trang 80 . for (int k = 0.println().intValue(). Short.err. Ví d : Vi t ch ng trình nh p vào m t dãy s tùy ý và s p x p theo th t t ng d n.length.static char toLowerCase(char ch)// Chuy n ch v ch vi t th ng static char toTitleCase(char ch) // Chuy n ch v d ng tiêu .valueOf(str). k < n.parseInt(“2002”).out.println("I/O Error!"). } } } static void hienThi(){ int n = day.io.*. DataInputStream stream = new DataInputStream(System. str = stream. Float. day[k] = Integer. // 2147483647 Trong m i l p bao có hàm typeValue() chuy n các giá tr c a các i t ng nguyên th y v giá tr s : byte byteValue() short shortValue() int intValue() long longValue() float floatValue() double doubleValue() Trong m i l p bao còn có hàm static parseType(String s) chuy n các giá tr c bi u di n d i d ng xâu v các giá tr s : byte value1 = Byte. static void nhap(){ String str. import java. System. for (int k = 0. }catch(IOException e){ System.MAX_VALUE là các gi i h n c a các s trong ki u ó. Các l p bao ki u s Các l p Byte.in). System.MIN_VALUE. byte minByte = Byte.out. Integer.readLine().14”). k < n.print(day[k] + " "). int value2 = Integer. Trong các l p này u xác nh hai giá tr : <L p bao>.out. k++) System.println("Nhap vao " + n + " so nguyen").length.parseByte(“16”). int n = day. // -128 int maxInt = Integer.MAX_VALUE. k++){ try{ System.MIN_VALUE <L p bao>.

println("Day so duoc sap xep: ").valueOf(str).v.in).k = i. Các hàm làm tròn và x lý các giá tr gi i h n static int abs(int i) static long abs(long l) static float abs(float f) static double abs(double d) + Hàm abs() c n p ch ng tr l i giá tr tuy t i c a i s . tìm s c c i. nhap().out. 3. max. str = "0".out. System.err. try{ str = stream. sinh s ng u nhiên.} static void sapXep(){ int x. j++) if (max < day[j]){ max = day[j]. } } public static void main(String[] args){ String str. i > 0.PI. hienThi().intValue(). for (int j = 0. L p Math L p final class Math nh ngh a m t t p các hàm t nh th c hi n các ch c n ng chung c a toán h c nh các phép làm tròn s . System. DataInputStream stream = new DataInputStream(System. int n. for(int i =day. static double ceil(double d) Trang 81 .length-1. i--){ max = day[i]. k. v. j < i. L p final class Math còn cung c p nh ng h ng s nh s e (c s c a logarithm).print("\nCho biet bao nhieu so nhap vao: "). sapXep(). } } L p Void L p này ký hi u cho i t ng c a l p Class bi u di n cho giá tr void.day = new int[n].println("I/O Error!"). day[i] = max. }catch(IOException e){ System. } day[k] = day[i].E và Math. } n = Integer. s pi thông qua Math. k = j. SapXep. c c ti u.readLine().

double b) + Hàm min() c n p ch ng tr l i giá tr c c ti u c a hai Các hàm l y th a static double pow(double d1. static double log(double d) + Hàm log() tr l i giá tr là lô-ga-rit t nhiên (c s e) c a d. int b) max(long a. static double exp(double d) + Hàm exp() tr l i giá tr là lu th a c s e và s m d (ed). static double floor(double d) + Hàm floor() tr l i giá tr l n nh t ki u double mà không l n h n s nguyên. i d ng radian. max(int a.0 n 1.0 là s tr n trên c a i s . long b) static float min(float a. Trang 82 . long b) max(float a.14) cho giá tr 3. float b) max(double a. static int min(int a. is . ho c giá tr NaN n u Các hàm ng giác static double sin(double d) + Hàm sin() tr l i giá tr là sine c a góc d static double cos(double d) + Hàm cos() tr l i giá tr là cose c a góc d static double tan(double d) + Hàm tan() tr l i giá tr là tangent c a góc d Hàm sinh s ng u nhiên c cho d c cho d c cho d i d ng radian. double b) c n p ch ng tr l i giá tr c c i c a hai is . double d2) + Hàm pow() tr l i giá tr là l y th a c a d1 và d2 (d1d2). float b) static double min(double a. Ví d floor(3.+ Hàm ceil() tr l i giá tr nh nh t ki u double mà không nh h n s nguyên. static int round(float f d) static long round(double d) + Hàm round() c n p ch ng static int static long static float static double + Hàm max() i s và l i b ng i s và l i b ng tr l i s nguyên g n nh t c a is .0 là s sàn d i c a i s . static double random() + Hàm random() cho l i giá tr là s ng u nhiên trong kho ng t 0. i d ng radian. int b) static long min(long a. i s âm. Ví d ceil(3.14) cho giá tr 4.0. static double sqrt(double d) + Hàm sqrt() tr l i giá tr là c n b c hai c a d .

<<interface >> <<interface >> <<interface >> <<interface >> <<interface >> <<interface >> Các giao di n lõi c a c u trúc Collection interface Mô t Collection Set SortedSet List Map SortedMap c mô t trong b ng sau: interface c s nh ngh a t t c các phép toán c b n cho các l p c n duy trì th c hi n và cài t chúng M r ng Collection cài t c u trúc t p h p. m r ng thành các giao di n khác nh Set. HashTable. trong ó các ph n t c s p x p theo th t . Các i t ng b t k có th c l u tr . LinkedList. Trang 83 .V. Các l p t p h p T p h p (Collection) trong Java cho phép l u l i tham chi u n các i t ng.v. Nh ng l p này và giao di n lõi c xây d ng theo c u trúc phân c p nh trong hình H6-3. TreeSet.util cung c p t p các l p cài t các giao di n lõi t o ra nh ng c u trúc d li u th ng s d ng nh : Vector. trong ó không có ph n t c l p và chúng c s p x p theo th t M r ng Collection cài t c u trúc danh sách. tìm ki m và c thao tác nh là các ph n t c a t p h p. SortedSet và Map và giao di n c s m r ng thành SortedMap. HashSet. Hình sau mô t c u trúc phân c p theo quan h k th a c a các giao di n lõi. List. v. trong ó không có ph n t c l p và chúng không cs px p M r ng Set cài t c u trúc t p h p c s p. Ph n giao di n Giao di n (interface) Collection là c s phát tri n. và có l p interface c s nh ngh a các phép toán các l p s d ng và cài t các ánh x t khoá sang các giá tr M r ng c a Map cài t các ánh x khoá theo th t Ph n cài t Gói java.

Xác nh kích th c c a t p h p. boolean add(Object obj).Tr l i true n u t p h p r ng. k c s p x p. 1.Tr l i true n u t p h p ch a obj. static void fill(List list. Gói java. Object obj) Thay th t t c các ph n t trong danh sách list b ng obj.util. Các phép toán c s int size(). // Tùy ch n Trang 84 . ng c l i false.util cung c p các l p t p h p và cài t h u h t các hàm c a Collection. boolean isEmpty(). ng c l i false. Object key) S d ng thu t toán tìm ki m nh phân xác nh ch s c a ph n t key trong danh sách list.Collection (c n phân bi t v i giao di n Collection) cung c p m t s hàm static th c hi n nh ng thu t toán a x cho nh ng phép toán khác nhau trên t p h p. static void sort(List list) S p x p các ph n t trong danh sách list theo th t t ng d n. tìm ki m và d ch chuy n các ph n t .<< interface>> Collection HashMap HasTable << interface>> Map << interface>> Set << interface>> List << interface>> Sorted Map Tree Map Hash Set << interface>> Sorted Set Array List Vector LinkedList Tree Set Các giao di n lõi và các l p cài t chúng Trong hình trên ký hi u à bi u di n cho quan h k th a gi a các giao di n và --> bi u di n cho s cài t các giao di n. M t s hàm trong s ó là: static int binarySearch(List list. static void shuffle(List list) Hoán v các ph n t c a danh sách list m t cách ng u nhiên. Collection Giao di n Collection c xây d ng nh là m u h p ng cho t t c các c u trúc t p h p có th d a vào ó mà th c thi và cài t. boolean contains(Object obj). Ph n thu t toán L p java.

retainAll(b) a.addAll(b) a. M t s phép toán khác Nh ng phép toán sau th c hi n trên t p h p nh m t n v c u trúc d li u. b có th mô t nh trong b ng sau: Các hàm trong Các phép h p t Set a.addAll(b) a. // Tùy ch n Th c hi n phép giao hai t p h p void clear() // Tùy ch n H yb i t ng trong t p h p các phép trên tr l i true n u th c hi n thành công và cho k t qu th c hi n c minh h a nh trong hình H6-4. // Tùy ch n Tr l i true n u t p h p th c hi n thành công vi c b sung (lo i b ) obj. boolean cotainAll(Collection c). Sau ây chúng ta xét m t s l p th c thi cài HashSet M t d ng cài t nguyên th y c a Set là l p HashSet. a b a a a a a. trong ó không có s l p l i và không có s s p x p c a các ph n t . boolean addAll(Collection c).clear() ng ng b ⊆ a ? (T p con) a = a ∪ b (H p t p h p) a = a . b là hai t p h p (hai i t ng c a các l p cài t Set).// Tùy ch n Th c hi n phép h p hai t p h p boolean removeAll(Collection c). // Tùy ch n Ki m tra xem t p h p hi n th i có ch a c t p h p c hay không.containsAll(b) a. Set (t p h p) T p h p Set là c u trúc d li u. // Tùy ch n Th c hi n phép tr hai t p h p boolean retainAll(Collection c). HashSet(Collection c) Trang 85 .b (Hi u t p h p) a = a ∩ b (Giao t p h p) a = ∅ (T p r ng) t giao di n Set. ng c l i false. L p này có các toán t t o l p: HashSet(): o ra m t t p m i không có ph n t nào c (t p r ng). Giao di n Set không nh ngh a thêm các hàm m i mà ch gi i h n l i các hàm c a Collection không cho phép các ph n t c a nó c l p l i.boolean remove(Object obj). b là hai t ph pb tk .removeAll(b) a. Gi s a.retainAll(b) Hình Các phép toán trên các t p h p 2. trong ó các ph n t c a nó là không c s p. K t qu th c hi n trên a. trong ó a.removeAll(b) a.

out.println(tap2+" la tap cha cua "+tap1).// h p tap2 vào tap1 } } } D ch và th c hi n ch ng trình v i các i s nh sau: java TapKT em voi em anh s cho k t qu : [m.length. // L y t ng i s c a ch ng trình Set tap2 = new HashSet().T o ra m t t p m i ch a các ph n t c a t p h p c nh ng không cho phép l p. i++){ String arg = args[i]. // S i s c a ch ng trình Set tap1 = new HashSet().charAt(j))).length().util. tapChung. // tap1 có ph i là t p con c a tap2? boolean isSuperset = tap2. else if (isSuperset) System. HashSet(int initCapacity) T o ra m t t p m i r ng có kích th c (kh n ng ch a) là initCapacity.4 Khi th c hi n các i s c a vào sau tên ch ng trình theo dòng l nh.out. j < size. // tap1 có b ng tap2? if (isSuperset && isSubset) System. import java.// tapChung = tap1 ∩ tap2 boolean b = tapChung. i < nArgs. else if (isSubset) System.add(new Character(arg.println(tap2 + " bang tap " + tap1). j++)// T p th 2 ch a các ký t c a arg tap2. Ví d 6. float loadFactor) T o ra m t t p m i r ng có kích th c (kh n ng ch a) là initCapacity và y u t c n p vào là loadFactor.out. // T o ra t p tapChung chính b ng tap1 Set tapChung = new HashSet(tap1). So sánh hai t p ó.out. else System. thông báo k t qu ra màn hình.// T o ra t p th 2 int size = arg. // T o ra t p th nh t là r ng for (int i = 0.containsAll(tap2). Ch ng trình b t u v i tap1 là r ng và l y các ký t c a i s u tiên t o ra tap2.size() == 0. // S ký t trong m i i s for (int j = 0.out.println(tap2+" la tap con cua "+tap1). if (b) System. HashSet(int initCapacity.*. else { // tap2 có ph i là t p con c a tap1? boolean isSubset = tap1. public class TapKT { public static void main(String args[]) { int nArgs = args.retainAll(tap2).println(tap2 + " va " + tap1 + " co " + tapChung + " la phan chung"). e] va [ ] la roi nhau Trang 86 . sau ó c ng d n tap2 vào tap1 và l i ti p t c nh th i v i i s ti p theo cho n h t.println(tap2+" va "+tap1+" la roi nhau").addAll(tap2).containsAll(tap1). } tap1.

[v. Các l p ArrayList. e] la roi nhau [m. i. List còn b sung thêm nh ng hàm nh : Object get(int index) Cho l i ph n t c xác nh b i index. int indexOf(Object elem) Cho bi t v trí l n xu t hi n u tiên c a elem trong danh sách. ListIterator listIterator(int index) Cho l i các ph n t liên ti p b t u t ph n t c xác nh b i index. import java. Ví d 6. Object elem) // Tùy ch n Thay th ph n t c xác nh b i index b ng elem. Object remove(int index) // Tùy ch n B i ph n t c xác nh b i index. Object set(int index. Vector và ArrayList là hai l p ki u m ng ng (kích th c thay i c). h. return. Vector và LinkedList Ba l p này có nh ng toán t t o l p t o ra nh ng danh sách m i r ng ho c có các ph n t l y theo các t p h p khác. e] la tap con cua [m. n] va [m. } List biMat = new ArrayList().err.lang. public class NhapDoanSo { final static int N_DIGIT = 5.5 H th ng có m t dãy N_DIGIT (5) ch s bí m t. Hi u su t s d ng hai l p này là t ng ng nhau. e. void add(int index. int toIndex) L y ra m t danh sách con t v trí fromIndex n toIndex . v. public static void main(String args[]){ if(args. Trong ó ListIterator là giao di n m r ng giao di n Iterator ã có trong java. ListIterator listIterator() Cho l i các ph n t liên ti p b t u t ph n t u tiên. tuy nhiên n u xét theo nhi u khía c nh khác thì ArrayList là c u trúc hi u qu nh t cài t c u trúc danh sách List. boolean addAll(int index. Collection c) // Tùy ch n Chèn các ph n t c a t p h p c vào v trí c xác nh b i index. v. Object elem) // Tùy ch n Chèn elem vào sau ph n t c xác nh b i index. int lastIndexOf(Object elem) Cho bi t v trí l n xu t hi n cu i cùng c a elem trong danh sách. i.println("Hay doan " + N_DIGIT + " chu so!"). o] la roi nhau 3.util. Ngoài nh ng hàm mà nó c k th a t Collection. o] [a. List (danh sách) C u trúc List là d ng t p h p các ph n t c s p theo th t (còn c g i là dãy tu n t ) và trong ó cho phép l p (hai ph n t gi ng nhau). e. Hãy vi t ch ng trình nh p vào N_DIGIT ch s oán xem có bao nhiêu ch s trùng và có bao nhiêu v trí các ch s trùng v i dãy s cho tr c. List subList(int fromIndex.*.// T o danh sách biMat là r ng Trang 87 . i. o] va [m.length != N_DIGIT) { System.

ListIterator thu = doan. i++) doan. ngh a là th c hi n c phép b i remove() for(int i = 0.listIterator(). Map (ánh x ) Map nh ngh a các ánh x t các khoá (keys) vào các giá tr . // Tùy ch n Lo i b ánh x c xác nh b i key. biMat. biMat.equals(thu. System.add(args[i]).add("2"). // a các s t i s ch ng trình vào doan List lap = new ArrayList(biMat)."). // Tìm nh ng v trí oán trúng trong hai dãy có l p while (kiemTra.add("5"). M i koá c ánh x sang nhi u nh t m t giá tr .next(). value> Object get(Object key).// biMat.listIterator().remove(doan. Giao di n Map khai báo nh ng hàm sau: Object put(Object key. } } D ch và th c hi n ch ng trình: java NhapDoanSo 3 2 2 2 7 s cho k t qu : 4 chu so doan trung 1 vi tri doan trung 4.next())) nViTri++.add("2"). m s các ch s trùng nhau. ng c l i là false. Object remove(Object key). Song.add("3"). // Thông báo k t qu ra màn hình System.// L u l u biMat sang lap int nChua = 0. // B sung các s vào dãy biMat biMat. c giá tr c xác nh b i key n u có ánh x . // Tùy ch n Chèn vào m t c p <key. i < N_DIGIT."). Cho giá tr true n u key c ánh x sang m t giá tr nào ó. i < N_DIGIT. boolean containsValue(Object value).out. i++) if (lap. Cho giá tr true n u value c ánh x b i m t key nào ó. phép ánh x có th xem nh là m t lo i t p h p theo ngh a: các khoá (key) t o thành t p h p và t p h p các giá tr (value) ho c t p các c p <key. L u ý: các khóa ph i là duy nh t (không cho phép l p). Object value). int nViTri = 0.get(i))) ++nChua. ng c l i cho null n u không có ánh x ng v i key.hasNext())// Khi còn ph n t ti p theo // Ki m tra xem l n l t các v trí c a hai dãy có trùng nhau hay không if (kiemTra.println(nViTri + " vi tri doan trung. Các ánh x không ph i là các t p h p. boolean containsKey(Object key). List doan = new ArrayList(). ListIterator kiemTra = biMat. value>.println(nChua + " chu so doan trung.out. ng c l i là false. biMat. Trang 88 .// T o danh sách doan là r ng for(int i = 0. giao di n Map c ng không ph i là m r ng c a các Collection.add("7"). c g i là ánh x n.

Các l p HashMap và HashTable Hai l p này cài t giao di n Map và c xây d ng trong java. Integer demCu = (Integer)demNhom. void clear(). Xác nh t p các khoá.hasNext()) { Integer nhom = (Integer) keyIterator. // Tùy ch n Xoá i t t c các ánh x .intValue().keySet()).next().length. Cho s các c p ánh x <key. Xác nh t p các ánh x <key. Cho giá tr true n u ánh x r ng. // Tìm t n su t c a các tr ng l ng c nh p vào trong các nhóm while(keyIterator.intValue()+1). Integer demMoi = (demCu == null)? new Integer(1): new Integer(demCu.round(trongL/5)*5). demNhom. Integer dem = (Integer) demNhom. // S p x p l i theo các nhóm tr ng l ng Collections. for(int i = 0. // c các tr ng l ng c nh p vào t i s và chia nhóm cách nhau 5 nv.put(nhomTL.listIterator(). Integer nhomTL=new Integer((int)Math.sort(keys). ng c l i là false. Set entrySet().parseDouble(args[i]). value>.get(nhomTL). ListIterator keyIterator = keys. } // L y ra t p các giá tr t ánh x demNhom List keys = new ArrayList(demNhom. i < nArgs.*.util.lang.6 Vi t ch ng trình nh p vào các tr ng l ng và in ra t n su t c a các tr ng l ng ó trong các nhóm cách nhau 5 n v (kg). // S d ng hàm fill() c a l p Array t o ra xâu g m demInt các d u char[] bar = new char[demInt]. int demInt = dem. i++){ double trongL = Double.int size(). Xác nh t p h p các giá tr . // T ng s l n tr ng lu ng trong cùng nhóm. boolean isEmpty(). n u là l n âu (demCu = null) thì t là 1. Collection values(). import java. // Tùy ch n Sao l i các ánh x t t. Trang 89 . Set keySet(). Chúng cho phép t o ra các ánh x m i có th r ng ho c có nh ng kích th c tùy ý. Ví d 6. public class NhomTrongluong { public static void main(String args[]){ // T o ra m t ánh x l u t n su t c a m i nhóm Map demNhom = new HashMap(). value>. int nArgs = args. M t s phép toán th ng dùng void putAll(Map t).get(nhom). demMoi).

Cho l i t p c s p g m nh ng ph n t cu i ng sau fromElem.fill(bar. cho null n u các ph n t c s p theo th t t nhiên (t ng d n) Giao di n SortedMap SortedMap là giao di n m r ng c a Map cung c p các hàm x lý các ánh x c s p theo th t c a khoá (key).println(nhom+"\t" + new String(bar)).Cho l i ánh x c s p g m nh ng ph n t k t fromKey n toKey. Cho l i t p c s p g m nh ng ph n t k t fromElem n toElem. Object first(). SortedSet tailSet(Object fromElem).Arrays. nhóm 10 kg có 1. ** 95 * Nh v y. 75 kg có 2 và 95 kg có 1. Object firstKey(). SortedSet headSet(Object toElem).Cho l i ph n t cu i cùng (c c i) c a t p c s p.Cho l i ph n t cu i cùng (c c i) c a ánh x c s p.Cho l i ph n t u tiên (c c ti u) c a ánh x c s p. Object toKey). } } } D ch và ch y ch ng trình NhomTrongLuong v i các tham s : java NhomTrongLuong 75 72 93 12 34 s cho k t qu : * * 1. TreeSet và TreeMap Hai l p này cài t hai giao di n SortedSet và SortedMap t toán t t o l p nh sau: TreeSet() TreeMap() Trang 90 ng ng. System. Cho l i t p c s p g m nh ng ph n t ng tr c toElem. 4. Object toElem). SortedMap subMap(Object fromKey. SortedMap headMap(Object toKey). Object last().Cho l i ánh x c s p g m nh ng ph n t cu i ng sau fromKey. 35 kg có 1. Object lastKey(). SortedSet (t p c s p) và SortedMap (ánh x c s p) Các c u trúc t p h p (set) và ánh x (map) có giao di n c bi t là SortedSet và SortedMap nh trong hình H6-5 cài t nh ng c u trúc có các ph n t c s p theo th t ch nh. SortedMap tailMap(Object fromKey).Cho l i ph n t u tiên (c c ti u) c a t p c s p. Comparator comparator() Cho l i th t so sánh c a c u trúc c s p. Chúng có b n lo i . Giao di n SortedSet SortedSet là giao di n m r ng c a Set cung c p các hàm x lý các t p c s p. SortedSet subSet(Object fromElem.out. '*').Cho l i ánh x c s p g m nh ng ph n t ng tr c toKey.

Trang 91 . TreeSet(Comparator c) TreeMap(Comparator c) T o ra nh ng t p ho c ánh x m i c s p và xác nh th t so sánh theo c. TreeSet(Collection c) TreeMap(Map m) T o ra nh ng t p ho c ánh x m i c s p và có các ph n t l y t c ho c t m ng ng. TreeSet(SortedSet s) TreeMap(SortedMap m) T o ra nh ng t p ho c ánh x m i c s p và có các ph n t l y t s ho c t m t ng ng.T o ra nh ng t p ho c ánh x m i và r ng. c s p theo th t t ng d n c a các ph n t ho c c a khoá.

u này gây lãng phí tài nguyên.L i lúc th c thi ( runtime error) i v i l i cú pháp ng i l p trình có th phát hi n và s a l i. . trong bài hôm nay ta s bàn v v n s lý ngo i l trong java. b t u t ph ng th c hi n t i.L i logic thu t toán . i v i l i lúc th c thi. ném ra ngo i l . II. N u vi c chuy n i ki u d li u không th c hi n úng. hay th c hi n phép chia nh ng m u s l i b ng 0. tuy nhiên trong bài này ta không bàn lu n v v n này. m t ngo i l s x y ra và ch ng trình b h y mà không óng t p tin l i. các ngo i l có th phát sinh c n c mô t chi ti t trong l nh khai báo c a ph ng th c. vi c này c g i là ném ra bi t l . Ch ng trình s k t thúc n u không tìm th y mã x lý bi t l . t t c các ngu n tài nguyên mà h th ng c p nên c thu h i l i. .Sau khi JVM ném ra m t ngo i l . thì ngo i l c chuy n n ph ng th c g i ph ng th c ó. . ta có th t o ra l p ngo i l riêng b ng cách m r ng l p Throwable I. tránh tr ng h p này. k t n i v i máy tính xa nh ng máy ó l i không t n t i…. tuy nhiêmn ây c ng là l i gây khó kh n và chán n n i v i ng i m i h c l p trình.M i l p bi t l trong java u c d n xu t t l p c s Throwable. N u không. và b t ngo i l . M c ích c a vi c x lý ngo i l M t ch ng trình nên có c ch x lý ngo i l thích h p.M i ph ng th c u có th phát sinh các ngo i l . java runtime s tìm mã x lý l i b ng cách l n ng c tr l i chu i các ph ng th c g i nhau. ta có th ném ra bi t l m t cách t ng minh ( i u này s c gi i thi u sau). Trong tr ng h p ó. n u m t ch ng trình không cung c p mã s lý ngo i l có th k t thúc không bình th ng.Khi m t câu l nh trong ph ng th c gây l i. ch ng trình s b ng t khi m t ngo i l x y ra. thông th ng l i runtime th ng do nguyên nhân khách quan nh : truy c p vào m t a nh ng a này l i ch a s n sàng. vi c khai báo này c g i là c t ngo i l .L i cú pháp (syntac error) . t t c các ngu n tài nguyên mà h th ng ã c p không c gi i phóng. Ti n trình này òi h i c ch x lý ngo i l thích h p. Mô hình s lý ngo i l c a java Mô hình s lý ngo i l c a java d a trên ba ho t ng chính: c t ngo i l . Quá trình tìm ki m này g i là b t bi t l . Mã x lý l i hay còn g i là mã x lý bi t l . xét thao tác vào ra (I/O) trong m t t p tin. ây là l i khó phát hi n và s a ch a nh t. ta hoàn toàn có th ki m soát c chúng. Lúc ó t p tin d b h h i và các ngu n tài nguyên c c p phát cho t p tin không c tr l i cho h th ng.Ch ng 3: X LÝ NGO I L i v i ng i l p trình h có th g p m t trong các l i sau: . Trang 92 . Ví d . ây là l i d phát hi n và s a ch a. i v i l i thu t toán. d a vào trình biên d ch. . khi m t l i runtime x y ra JVM s phát sinh m t ngo i l . thì h th ng thi hành java b t u ti n trình tìm mã x lý l i. mà ng i l p trình không cung c p mã x lý l i.

ví d : public void myMethod() throws IOException. } Trang 93 . và t n mã x lý l i trong kh i catch ( b t gi ). n u m t ph ng th c ném ra nhi u ngo i l thì các ngo i l c khai báo cách nhau b i d u ph y ‘. Chú ý: . thì ph n vi c quan tr ng nh t là b t và x lý bi t l . catch ( TypeExceptionN ex){ // Mã c th c thi khi m t ngo i l TypeExceptionN c phát sinh trong kh i try } finally{ // kh i l nh nay luôn c th c hi n cho dù ngo i l có x y ra trong kh i try hay không. thì b n (ho c ch ng trình th c thi java) có th ném ra các i t ng bi t l . Cú pháp c a l nh ném ra ngo i l : throw ExceptionObject. Các ngo i l này có th là m t ngo i l chu n c a Java ho c có th là m t ngo i l do ta t o ra.B n ph i chú ý gi a l nh khai báo bi t l và l nh ném ra ngo i l . i t ng này ch a thông tin chi ti t v ngo i l . khai báo bi t l ta s d ng t khoá throws trong khai báo ph ng th c. i t ng này sau ó c truy n cho ph ng th c là n i mà ngo i l x y ra. Khi h ã khoanh vùng c n mã có th gây ra l i h s t n mã. Khuôn d ng t ng quát nh sau: try{ // Các l nh có kh n ng gây l i } catch ( TypeException1 ex){ // Mã c th c thi khi m t ngo i l TypeException1 c phát sinh trong kh i try } catch ( TypeException2 ex){ // Mã c th c thi khi m t ngo i l TypeException2 c phát sinh trong kh i try } . III. Thông tin này có th c nh n v và c x lý. Khi m t ngo i l x y ra. có kh n ng gây ra l i ó trong kh i try ( th làm).c t ngo i l c t ngo i l là khai báo cho trình biên d ch bi t là ph ng th c này có th gây ra ngo i l lúc thi hành. i t ng t ng ng v i ngo i l ó c t o ra. B t ngo i l M t ngo i l (exception) trong ch ng trình Java là d u hi u ch ra r ng có s xu t hi n m t u ki n không bình th ng nào ó. Ném ra ngo i l M t ph ng th c sau khi ã khai báo các bi t l . L p ‘Throwable’ c Java cung c p là cha c a t t c các ngo i l trong Java (l p u tiên trong cây th a k ). RemoteException t khoá throws ch cho trình biên d ch java bi t r ng ph ng th c này có th ném ra ngo i l IOException và RemoteException. V n i v i ng i l p trình java là ph i bi t c n mã nào c a anh ta có th gây ra l i. có ki u mà ta ã khai báo trong danh sách throws.M t ph ng th c ch có th ném ra các ngo i l mà nó c khai báo IV. Sau khi b n ã bi t cách khai báo và ném ra bi t l .’ III...

ch ng trình có th ch m d t và in thông báo l i ra lu ng l i chu n System. n u không tìm th y m t ki u ng i l nào c so kh p java s k t thúc ph ng th c ó và chuy n bi t l ó ra ph ng th c ã g i ph ng th c này quá trình này c ti p t c cho n khi tìm th y mã x lý bi t l . thì java s b qua các câu l nh còn l i trong kh i try i tìm mã x lý ngo i l .Th c hi n kh i try yes Tìm kh i x lý l i (kh i catch) th c hi n Có ngo i x y ra trong kh i try no u ngo i l sinh ra trong kh i try là m t th hi n c a l p ngo i l false true Th c hi n kh i catch ng v i ngo i l 1 u ngo i l sinh ra trong kh i try là m t th hi n c a l p ngo i l false ………… true Th c hi n kh i catch ng v i ngo i l 2 Th c hi n kh i finally u ngo i l sinh ra trong kh i try là m t th hi n c a l p ngo i l true Th c hi n kh i catch ng v i ngo i l 1 N u không có m t ngo i l nào phát sinh trong kh i try thì các m nh catch s b b qua. thì mã l nh trong kh i catch ó s c th c thi. n u ki u ngo i l so kh p v i ki u ngo i l trong m nh catch. trong tr ng h p m t trong các câu l nh bên trong kh i try gây ra m t ngo i l thì. n u không tìm th y mã x lý bi t l trong chu i các ph ng th c g i nhau.err Ví d : Trang 94 .

Thông th ng kh i ‘finally’ ch a các câu l nh mang tính ch t d n d p nh : óng k t n i CSDL. ây ex là m t i t ng c a l p ArithmeticException ch a các thông tin v ngo i l x y ra. nh các l nh óng t p vi t cu i ph ng th c) s không bao gi c g i. óng t p tin. ta có th l y cá thông tin v ngo i l ch ng h n nh l y v mô t ngo i l nh sau: System. } catch(ArithmeticException ex) {System. try{ //Các l nh có kh n ng ném ra ngo i l } catch(Exception1 ex1){ … } catch(Exception2 ex2){ … } catch(Exceptionn exn){ … } finally{ //Mã l nh d n d p } Kh i ‘finally’ là tu ch n. Java cung c p kh i finally gi i quy t vi c này. Ch ng trình s th c thi câu l nh u tiên c a kh i ‘finally’ ngay sau khi g p câu l nh ‘return’ hay l nh ‘break’ trong kh i ‘try’.getMessage()).….out.} } } Khi ch y ch ng trình này ta se thu Loi chia cho 0 c m t dòng in ra màn hình nh sau: Trong o n ch ng trình trên khi chia m t s cho 0 s g p ngo i l ArithmeticException. thì các o n mã phía sau (ví d nh o n mã có ch c n ng thu h i tài nguyên.out.class TryClass{ public static void main(String args[]) { int n=0. V. ph ng th c ang c th c thi có th b d ng mà không c hoàn thành.println(a. Trang 95 . Kh i này c t sau kh i ‘catch’ cu i cùng. try { System. Kh i ‘finally’ Khi m t ngo i l xu t hi n.println(1/n). N u u này x y ra. bi t c ngo i l này có th x y ra do v y ta b t nó và x lý trong kh i catch(ArithmeticException ex). không b t bu c ph i có.println( Loi chia cho 0 ).out.

lang L i v s h c. Ngo i l v AWT L p cha c a các l p ngo i l I/O Không th nh v t p tin K t thúc m t t p tin. ch b o m t không cho phép th c hi n. L p không th truy c p. ví d nh ‘chia cho 0’. try block No Exception Exception occurs finally block catch block finally block VI.Kh i ‘finally’ b o không. ‘catch’ và ‘finally’. Không th n p l p yêu c u. Khi m t lu ng b ng t. m lúc nào c ng c th c thi. Khi truy c p i t ng null. Ph ng th c yêu c u không t n t i. M t s l p ngo i l chu n c a Java Danh sách m t s l p ngo i l Tên l p ngo i l Throwable Exception Ý ngh a ây là l p cha c a m i l p ngo i l trong Java ây là l p con tr c ti p c a l p Throwable. Vi c chuy n i t chu i sang s không thành công. RuntimeException ArthmeticException IllegalAccessException IllegalArgumentException ArrayIndexOutOfBoundsExeption NullPointerException SecurityException ClassNotFoundException NumberFormatException AWTException IOException FileNotFoundException EOFException NoSuchMethodException InterruptedException Trang 96 . L i truy c p ra ngoài m ng. nó mô t m t ngo i l t ng quát có th x y ra trong ng d ng L p c s cho nhi u ngo i l java. b t ch p có ngo i l x y ra hay Hình minh h a s th c hi n c a các kh i ‘try’. i s không h p l .

M t ti n trình s h u nhi u ti u trình. T o m i: ti n trình ang c thành l p 2. S h u m t con tr l nh. các thi t b ngo i vi. H u hành n nhi m. M t ti u trình c ng có th có các tr ng thái gi ng n các tr ng thái c a m t ti n trình. m t t p các thanh ghi và m t vùng nh stack riêng. M i ti u trình x lý tu n t các n code c a nó. Chúng c gi 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.. s h u m t con tr l nh. Ø H a nhi m cho phép nhi u ti n trình ch y t i m t th i m. b 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. 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. 3. 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ý.Ch ng 4: L P TRÌNH A TUY N I. ch a các ch th u khi n máy tính th c hi n m c ích gì ó. Running: các ch th c a ti n trình ang c x lý. hay ch m t s ki n nào ó x y ra 4. Các ki n th c liên quan 1. 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 u hành và c qu n lý thông qua m t s hi u g i là th 2. K t thúc: ti n trình ã hoàn t t vi c x lý Trang 97 . ph i ch m t s ki n nào ó x y ra. và i u ph i CPU qua l i gi a các ti n trình. C n phân bi t c gi a ti n trình và ch ng 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. Linux là các H H a nhi m Ø 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 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 . hay nói cách khác ti n trình ang s h u CPU 3. Ready: ti n trình ang ch c p CPU x lý 5. ví d H H DOS là H H n nhi m. 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. 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 m c xác nh b i ho t ng hi n th i c a ti n trình ó. t p các thanh ghi và các bi n. 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. 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 chia s CPU v i nhau gi ng nh cách chia s gi a các ti n trình. Nên thông th ng s a ch ng ch là gi l p. Unix. các t p tin. Blocked: ti n trình ang ch c c p tài nguyên. ví d H H windows. a nhi m Ø H n nhi m là H H ch cho phép 1 ti n trình ch y t i m t th i m. M t ch ng trình là m t th hi n th ng. hay i m t thao tác nh p/xu t hoàn t t… T i m t th i m m t ti n trình có th nh n m t trong các tr ng thái sau ây: 1. hoàn thành tác v c a mình. nên không th có nhi u ti n trình ch y t i m t th i m. m t ti n trình còn c n n m t s tài nguyên khác nh : CPU.

II. 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 . nh v y B ã tr A 300$. 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 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. M i lu ng c gán m t công vi c c th . 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 tài nguyên cho các ti n trình khác s d ng. do v y B c p nh t vào trong tài kho n c a A là 800$ ( =500$ +300$). B tr A 300$. 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. nh ng A không nh n c. sau ó A ti p t c công vi c 2. t t c các ti n trình trong t p h p u b khoá v nh vi n!. 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 } Trang 98 . chúng c th c thi ng th i v i các lu ng khác. thao tác c a A g m 2 b c: 1) l y ra 100$ 1 50 2) gi m s tài kho n i 100$ A 500 Ø Tình hu ng gi a 2 thao tác 1 và 2 500$ 2. M t ng d ng có th bao g m nhi u lu ng. 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 ) 6.Míi t¹o KÕt thóc Ready Running Blocked S¬ ®å chuyÓn tr¹ng th¸i cña mét tiÕn tr×nh 5. nó c p nh t l i trong tài kho n là 400$.

u tiên c xác nh là m t s nguyên thu c o n [1. 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. ph ng th c này không an toàn. Ø 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. n u tuy n ang thi hành thì ph ng th c này b b qua. ph ng th c start() c g i. do v y có th nguy c d n n deadlock ( khoá ch t ). ghi è ph class MyThread implements Runnable{ public void run(){ //Mã l nh c a tuy n } } ng th c run 1. thay vì s d ng ph ng th c stop() Ø public void suspend() Có ch c n ng t m ng ng tuy n. 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. chú ý sleep() là ph ng th c t nh. khi start() c g i thì ph ng th c run() c ng c kích ho t Ø public void stop() có ch c n ng ng ng tuy n thi hành.} Cách 2: T o ra m t l p tri n khai t giao di n Runnable. 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 . b i vì ph ng th c này không nh tài nguyên mà nó l m gi . b n nên dùng ph ng th c wait(). trong kho ng th i gian xác nh b ng mili giây. trong java 2. kh i ng. ph ng th c này ít c s d ng.10] Ø public final void wait() throws InterruptException Trang 99 . 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. b n ph i ghi è ph ng th c này th c thi nhi m v c a tuy n. 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. thông th ng ph ng th c này c dùng k t h p v i ph ng th c suspend(). b n nên gán null vào bi n Thread d ng tuy n. ti p t c. gián n và ng ng tuy n. t m ng ng. k t java 2 ph ng th c này cùn v i ph ng th c suspend()b t ch i. 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.

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 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 …………. Trang 100 .start (). i++ ) System. } } khi ta ch y ch ng trình th y k t qu xen k nhau nh ………………. } } class ChaoDH extends Thread{ public void run (){ for ( int i = 1. new ChaoJV ().out. 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”. i <= 200.. ây là ph ng th c c a l p c s Object public final void notify () ánh th c tuy n ang ch .out.. 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.println ( " i h c s ph m k thu t H ng Yên" ). i <= 200.println ( "chào m ng b n n v i java" ). cho n khi có m t tuy n khác thông báo thì nó l i ti p t c. 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 isAlive() Tr v True. i++ ) System.Ø Ø Ø Ø Ø Ø Ø t tuy n vào tr ng thái ch m t tuy n khác. 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 ().. } } class ChaoJV extends Thread{ public void run (){ for ( int i = 1.

nh ng l n này ta không k th a l p Thread. Thread t1 = new Thread ( new ChaoJV () ). khi ó ch còn duy nh t lu ng deamon v n còn s ng. Trong Java có hai lo i lu ng: . t. Máy o Java th c hi n ti n trình thoát.Lu ng ch y ng m (deamon) Ng i s d ng t o ra các lu ng ng i s d ng. n u ch ng trình c a b n v a mu n k th a t m t l p nào ó. thì b n v a ph i k th a t l p Applet. java không h tr k th a b i.start (). L p lu ng có hai ph ng th c làm vi c v i lu ng deamon: .2. chúng khác gì nhau?. b n v a mu n nó là Applet. 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 3. trong khi các lu ng deamon là các lu ng ch y n n. l i v a mu n th c thi nhi u tuy n. Ta vi t l i ví d trên. } Trang 101 . t1. thì b n không th k th a t l p Thread n a.public boolean isDaemon() 4.start (). 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. ã có l p Thread r i t i sao l i còn có giao di n Runnable n a. Ch c b n s t h i. Lu ng deamon cung c p các d ch v cho các lu ng khác.Lu ng ng i s d ng . Nó là m t lu ng có quy n u tiên th p. 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. ch ng h n nh b n vi t các Applet. Máy o Java có ít nh t m t lu ng deamon là lu ng “garbage collection” (thu 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. 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. mà ta tri n khai giao di n Runnable public class Hello{ public static void main ( String[] args ){ Thread t = new Thread ( new ChaoDH () ).public void setDaemon(boolean on) . l i v a mu n a tuy n thì b n b t bu c ph i dùng giao di n Runnable. nh ng n u ã k th a t l p Applet r i. câu tr l i ch .

khi ta tác ng n nhóm tuy n ( ch ng h n nh t m ng ng. Ø t o m t nhóm tuy n ta c n: + t o ra m t nhóm tuy n b ng cách s d ng ph ng th c t o d ng c a l p ThreadGroup() ThreadGroup g=new ThreadGroup(“ThreadGroupName”). 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 ). + 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. i <= 200.Nhóm tuy n là m t t p h p g m nhi u tuy n. i++ ) { System. Nhóm tuy n (Thread Group) . for ( int i = 1. ThreadGroup g= new ThreadGroup(ParentThreadGroup. n m ngoài kho ng này 2. 5.println(" i h c s ph m k thu t H ng Yên"). ta có th ki m tra u này b ng cách g i ph ng th c getPriority() 6. // Tuy n này có u tiên là 1 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 n h n u tiên c a tuy n t Chú ý: 1. th t n gi n. i++ ) { System. 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: t.setPriority(10). u tiên c a m t tuy n bi u th b i m t s nguyên n m trong n t 1 n 10. 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.out. i <= 200.out. } } } Cho ch y ví d này ta th y k t qu ra không khác gì v i ví d tr c. Thi t l p u tiên cho tuy n Khi m t tuy n c t o ra. } } } class ChaoJV implements Runnable{ public void run (){ for ( int i = 1.setPriority(1). //Tuy n này có u tiên là 1 t1.println ( "chào m ng b n n v i java" ).} class ChaoDH implements Runnable{ public void run (){ ChaoDH thu = new ChaoDH ().“ThreadGroupName”). ôi khi ta mu n u ch nh u tiên c a tuy n t c m c ích c a ta. lý do là ta ã t u tiên c a tuy n t1. 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. new ThreadClass(). 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. …) thì t t c các tuy n trong nhóm u nh n c cùng tác ng ó.”ThisThread”). Trang 102 . m t l i s phát sinh n u ta gán cho nó u tiên. Dòng l nh trên t o ra m t nhóm tuy n g có tên là “ThreadGroupName”. nó nh n m t u tiên m c nh.

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 . cho n khi lu ng u tiên thoát kh i monitor. 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ó. T t c các lu ng khác c g ng thâm nh p vào monitor s b trì hoãn. m t lu ng có th c g ng c d li u. M t lu ng có th monitor m t i t ng nhi u l n. Ch m t lu ng có th có monitor t i m i th i m. do v y java cung c p t khoá synchronized. B i trong java không có bi n toàn c c. Trong tr ng h p này. d li u có th b sai. Các lu ng khác c báo ch i monitor. hay còn g i “semaphore” (c hi u). cho nhi u tuy n. chúng ta ch có thu c tính c a i t ng. mà tài nguyên này l i không th chia s . Ví d . 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. 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 .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 i i t ng s có m t b qu n lý khoá. Trang 103 . khi ó tài nguyên dùng chung có th b h ng. và r i thì m i cho phép các lu ng k ti p th c thi. 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. trong khi lu ng khác c g ng thay i d li u. M t “monitor” là m t i t ng mà c khóa c quy n. 7. 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 m M u ch t c a s ng b hóa là khái ni m “monitor” (giám sát).

a CD mà nó có th là d li u c a m t ch ng trình khác. thì thu t toán c/ghi tu n t u t a nh sau: c c vào t âu ho c ghi Trang 104 . kí t . b nh . d i d ng th c nh th nào.Ch ng 5: NH P XU T (Input/Output) M t ch ng trình th ng xuyên làm vi c v i d li u. l u tr âu thì java u tr u t ng hoá thành các lu ng. ho c có th là c l u tr trên m ng… dù chúng c l u tr âu chúng c ng ch có 1 s d ng nh : i ng. hình nh ho c âm thanh. do v y b t k d li u ra âu. m t ch ng trình m m t lu ng liên k t v i i t ng ngu n( t p tin. nó ng nh t m i ngu n d li u v i nhau: nh n v các thông tin. u này là r t tinh vi nó làm cho ta không c n ph i quan tâm d li u c l u tr âu. ngu n thông tin ngoài không ch g m d li u c l u tr trên a t . Socket) và c các thông tin tu n t . có th l u tr lâu dài chúng ta ph i l u tr và nh n l i d li u t thi t b l u tr ngoài. ng t ghi thông tin ra các thi t b ngoài b ng cách m m t lu ng n i t ng ích và ghi thông tin ra m t cách tu n t nh Lu ng là s tr u t ng hoá m c cao. dù d li u c l u tr i hình th c nào.

1. ta ph i s d ng lu ng h ng byte. Hình sau th hi n m i quan h phân c p gi a l p c/ ghi h ng byte Trang 105 . xu t h ng kí t Reader và Writer là hai l p c s tr u t ng cho lu ng h ng kí t .1. L p nh p. và l p Reader/ Writer là hai l p c s cho vi c c ghi h ng kí t . p RandomAccessFile k th a t l p Object và tri n khai giao di n. java chia lu ng ra thanh 2 lo i: lu ng byte ( byte stream) và lu ng kí t (character stream). m i l n c/ ghi ra lu ng là c 2 byte t ng ng v i m t kí t unicode.2. hai l p này cung c p t giao di n chung cho t t c các l p c/ ghi h ng kí t . l p InputStream và OutputStream là hai l p c s cho m i lu ng nh p xu t h ng byte. ây là l p duy nh t h tr c c l n ghi. hai l p InputStream và OutputStream là hai l p c s tr u t ng cho các lu ng h ng byte. L p lu ng Java a ra nhi u l p lu ng. Sau ay là mô hình phân c p các l p c/ ghi ng kí t 1. m i lân c/ ghi ra lu ng là c/ ghi 8 bit d li u ra lu ng. Lu ng h ng byte có th c ghi 1 byte.I. InputStream và OutputStream. x lý m i lo i d li u.

m t m ng các kí t ra lu ng int write(int c) int write(char cbuf[]) int write(char cbuf[]. ghi m t byte. ta s d ng các lu ng liên quan n t p tin nh FileInputStream và FileOutputStream cho vi c c ghi t p h ng byte. int offset. int length) C ng t ng t v y l p Writer và OutputStream c ng có m t giao di n t ng t nhau. int offset. thông th ng mu n s d ng lu ng t p tin ta s ng hàm t o c a các l p t ng ng liên k t lu ng v i m t t p tin c th . chúng ch khác nhau v ki u d li u c vào. int offset. FileReader và FileWriter cho vi c c ghi h ng kí t . m t ng byte ra lu ng int write(int c) int write(byte cbuf[]) int write(byte cbuf[]. ví d l p Writer nh ngh a các ph ng th c ghi m t kí t .t ng t gi a hai lu ng h ng byte và h ng kí t p Reader và InputStream có m t giao di n gi ng nhau. int length) Thì l p OutputStream c ng có các ph ng th c t ng ng. int length) Thì trong l p InputStream c ng có các ph ng th c v i tên t ng t cho vi c c t byte ho c m t m ng các byte int read() int read(byte cbuf[]) int read(byte cbuf[]. int length) lý t p tin x lý t p tin ngo i trú. int offset. ví d l p Reader có các ph ng th c sau giúp cho vi c c m t kí t ho c t m ng các kí t int read() int read(char cbuf[]) int read(char cbuf[]. Trang 106 .

ta s d ng lu ng DataInputStream và DataOutputStream.read())! = -1) out.close(). while ((c = in.io. } } import java. int c. in. l p DataInputStream tri n khai giao di n DataInput. while ((c = in. File outputFile = new File("C:/out.txt"). // Ch ng trình copy s d ng lu ng h ng byte public class CopyBytes { public static void main(String[] args) throws IOException { File inputFile = new File("farrago.close().txt").close(). Trang 107 . File outputFile = new File("outagain. FileOutputStream out = new FileOutputStream(outputFile). out.*.write(c).io.write(c). // ch ng trình copy s d ng lu ng h ng kí t public class CopyCharacter { public static void main(String[] args) throws IOException { File inputFile = new File("C:/in. FileReader in = new FileReader(inputFile). ta s vi t ch d ng c 2 lu ng h ng byte và h ng kí t import java. th c hi n vi c copy m t t p.*.txt").txt"). int off. FileWriter out = new FileWriter(outputFile). in. } } ng trình này Lu ng d li u c/ ghi các ki u d li u nguyên thu .public void FileInputStream ( String FileName) public void FileInputStream ( File file) public void FileOutputStream ( String FileName) public void FileOutputStream (File file) public void FileWriter ( String FileName) public void FileWriter (File file) public void FileReader ( String FileName) public void FileReader (File file) Ví d : Vi t ch ng trình file copy. out. còn l p DataOutputStream tri n khai giao di n DataOuput Các ph ng th c sau c nh ngh a trong giao di n DataOutput void write(byte[] b) void write(byte[] b. FileInputStream in = new FileInputStream(inputFile).close(). int len) Ghi m t m ng byte ra lu ng Ghi m t m ng byte ra lu ng k t v trí off. int c.read())! = -1) out.

// ghi s long Trang 108 . out.writeInt(10). public class DataIODemo { public static void main(String[] args) throws IOException { // write the data out DataOutputStream out = new DataOutputStream(new FileOutputStream( c:/TestIO.255 c m t s nguyên không d u trong n t 0. int off.. // ghi s nguyên out.void write(int b) void writeBoolean(boolean v) void writeByte(int v) void writeBytes(String s) void writeChar(int v) void writeChars(String s) void writeDouble(double v) void writeFloat(float v) void writeInt(int v) void writeLong(long v) void writeShort(int v) void writeUTF(String str) Các ph ng th c sau c boolean readBoolean() byte readByte() char readChar() double readDouble() float readFloat() void readFully(byte[] b) voidreadFully(byte[] b.*.txt"))..writeLong(123456789).io.65535 c m t xâu kí t Unicode qua n byte t lu ng c Sau ây là m t ví d nh v lu ng nh p xu t d li u. ví d này ghi d li u ra t p r i l i lai: import java. int len) int readInt() String readLine() long readLong() short readShort() int readUnsignedByte() in treadUnsignedShort() String readUTF() int skipBytes(int n) len byte Ghi m t byte ra lu ng Ghi m t giá tr logic ra lu ng Ghi ra lu ng ph n th p c a v Ghi m t xâu ra lu ng Ghi m t kí t ra lu ng Ghi m t xâu kí t ra lu ng Ghi m t s double ra lu ng Ghi m t s th c ra lu ng Ghi m t s nguyên ra lu ng Ghi m t s long ra lu ng Ghi m t s short ra lu ng Chi m t xâu kí t Unicode ra lu ng nh ngh a trong giao di n DataInput: c m t giá tr logic t lu ng c m t byte t lu ng c m t kí t t lu ng c m t s double t lu ng c m t s float t lu ng c m t m ng byte t lu ng và ghi vào ng c len byte t lu ng và ghi vào m ng v trí off c m t s nguyên c m t xâu kí t cho n khi g p kí t xu ng dòng và b qua kí t xu ng dòng c m t s long c m t s short c m t s nguyên không d u trong kho ng 0.

out.out.456789). // c l i s nguyên System. // ghi s th c chính xác n out.readDouble()). // c l i giá tr logic System.out.out. // read it in again DataInputStream in = new DataInputStream(new FileInputStream("c:/TestIO.writeFloat(123.readUTF()). Lu ng in n Vì các lu ng xu t ghi d li u ra d i d ng nh phân do v y b n không th dùng l nh type.readFloat()).close().writeDouble(123. Hai l p này th c hi n ch c n ng nh nhau.println("loi").println("Gia tri xau " + in.writeUTF("Day la mot xau ki tu").readBoolean()). t s ph ng th c c a l p PrintStream: boolean checkError() n h t d li u ra và ki m tra l i lu ng void close() void flush() void print(boolean b) void print(char c) void print(char[] s) void print(double d) void print(float f) void print(int i) void print(long l) void print(Object obj) void print(String s) void println() void println(boolean x) void println(char x) óng lu ng n d li u trong vùng ghi giá tr logic ra lu ng ghi kí t ghi m t mange kí t ghi m t s th c ghi m t s th c ghi m t s nguyên ghi m t s nguyên dài ghi m t it ng ghi m t xâu o ra m t dòng tr ng ghi giá tr logic ra lu ng và xu ng dòng ghi kí t và xu ng dòng Trang 109 chính xác kép m ra . // c l i s nguyên dài System.3.out.456789f).close().txt")). // ghi s th c chính xác kép out.readLong()). ho c các ch ng trình so n th o asciii xem c. // ghi giá tr logic out.println("Gia tri double " + in. trong java có th s d ng lu ng in n xu t d li u ra d i d ng asciii. // c l i s th c chính xác n System. L p PrintStream và PrintWriter s giúp ta làm vi c này.readInt()).println("Gia tri boolean " + in.println("Gia tri long " + in. // ghi m t xâu out. u xu t ra d li u d ng asciii.out.println("Gia tri float " + in.out. } } 1.} in.println("Gia tri nguyen " + in.// c l i s th c chính xác kép System.out.writeBoolean(true). try { System. // c l i m t xâu unicode } catch (EOFException e) { System.

boolean autoFlush) t o ra m t lu ng m i v i ch c n ng AutoFlush ( t d n) t s ph ng th c c a l p PrintWriter boolean checkError() void close() void flush() void print(boolean b) void print(char c) void print(char[] s) void print(double d) void print(float f) void print(int i) void print(long l) void print(Object obj) void print(String s) void println() void println(boolean x) void println(char x) void println(char[] x) void println(double x) void println(float x) void println(int x) n h t d li u ra và ki m tra l i lu ng óng lu ng n d li u trong vùng ghi giá tr logic ra lu ng ghi kí t ghi m t mange kí t ghi m t s th c ghi m t s th c ghi m t s nguyên ghi m t s nguyên dài ghi m t it ng ghi m t xâu o ra m t dòng tr ng ghi giá tr logic ra lu ng và xu ng dòng ghi kí t và xu ng dòng ghi m t mange kí t và xu ng dòng ghi m t s th c chính xác kép và xu ng dòng ghi m t s th c và xu ng dòng ghi m t s nguyên và xu ng dòng Trang 110 chính xác kép m ra . int len) ghi m t mange kí t và xu ng dòng ghi m t s th c chính xác kép và xu ng dòng ghi m t s th c và xu ng dòng ghi m t s nguyên và xu ng dòng ghi m t s nguyên dài và xu ng dòng ghi m t it ng và xu ng dòng ghi m t xâu và xu ng dòng t tr ng thái l i c a lu ng là true ghi m ng byte t v trí off len kí byte ra lu ng void write(int b) ghi m t byte ra lu ng Hàm t o c a l p PrintStream: PrintStream(OutputStream out) t o ra m t lu ng m i PrintStream(OutputStream out.void println(char[] x) void println(double x) void println(float x) void println(int x) void println(long x) void println(Object x) void println(String x) protected void setError() void write(byte[] buf. int off.

txt")). BufferOutputStream. ví d này in ra m t t p m t s nguyên. k thu t ó chính là vùng m. boolean autoFlush) t o ra m t PrintWriter v i ch c n ng d n t m t i t ng OutputStrea.*. BufferWriter.PrintWriter(OutputStream out. int off.PrintWriter(OutputStream out) t o ra m t PrintWriter không có ch c n ng t d n t m t i t ng OutputStream.println(10). v i vùng m ta s gi m c s l n c ghi lu ng.PrintWriter(Writer out.close().print("xau ki tu"). out. int off.io. do v y chúng ta c n ph i có m t k thu t nào ó t ng t c c/ghi.2345). Lu ng m Vì các thao tác v i c ng. out. . BufferReader. out. thông th ng b n s i các lu ng c a b n vào lu ng m. } } 1.4. sau khi ch y ch ng trình b n có th s d ng l nh type c a DOS xem import java. m ng th ng lâu h n r t nhi u so các thao tác v i b nh trong. Trang 111 . trong java ta có th o ra vùng m v i các l p BufferInputStream. m t s th c và m t xâu kí t .println(1. public class DataIODemo1 { public static void main(String[] args) throws IOException { // write the data out PrintWriter out = new PrintWriter(new FileOutputStream("c:/a. int len) void write(int b) void write(int c) void write(String s) ghi m t s nguyên dài và xu ng dòng ghi m t it ng và xu ng dòng ghi m t xâu và xu ng dòng t tr ng thái l i c a lu ng là true ghi m ng byte t v trí off len kí byte ra lu ng ghi m t byte ra lu ng Ghi m t kí t Ghi m t xâu n void write(String s. int len) Ghi m t xâu len kí t tính t v trí off Các hàm t o c a l p PrintWriter . boolean autoFlush) t o ra m t PrintWriter v i ch c n ng t d n t t i t ng Writer Sau ây là m t ví d v lu ng in n. out.void println(long x) void println(Object x) void println(String x) protected void setError() void write(byte[] buf.PrintWriter(Writer out) t o ra m t PrintWriter không có ch c n ng t d n t m t i ng Writer . .

ch duy nh t có m t l p cho phép ta c ghi ng th i.System. m t double t i m t file có tên ‘abc.txt’. ngoài ra chúng còn có các ph ng th c sau: . k ta u t p . import java.out. int bufferSize) public BufferOutputStream ( OutputStream out) public BufferOutputStream ( OutputStream out. rf. n byte th hai Trang 112 .println(rf. Nó s d ng ph ng pháp seek( ) tìm v trí nh v bên trong t p tin (b t u t 1). hay ghi ‘w’ hay c ghi ng th i ‘rw’.public long getFilePointer() tr v v trí con tr t p tính b ng byte.io. import java. p này tri n khai giao di n InputData và OutputData. import java. Nó ghi m t giá tr boolean.txt . System. rf = new RandomAccessFile( abc. int bufferSize) public BufferWriter ( Writer out) public BufferWriter ( Writer out.txt”.writeInt(67868).IOException. //S d ng ph ng th c seek() di chuy n con tr rf. ký t và double t t p tin và hi n th chúng ra màn hình.io.readDouble()). public class rndexam{ public static void main (String args[ ]) throws IOException { RandomAccessFile rf.out.readChar()).seek(1).readInt()).public long length() tr v dài c a t p . rw ). nên chúng có t t c các ph ng th c a c 2 l p này. rf. m t int.public void seek(long pos) chuy n con tr n v trí pos tính t v trí u tiên.lang.public final void writeChars(String s) ghi m t xâu kí t ra t p ng t gi ng C/C++ khi b n m m t t p truy c p ng u nhiên b n ph i ch rõ ch làm vi c là c ‘r’. int bufferSize) public BufferReader ( Reader in) public BufferReader ( Reader in.out. “rw”) Ch ng trình d i ây minh ho cách dùng l p RandomAccessFile.68). chú ý v trí u tiên tính t 0 .txt theo ch c ghi ng th i thì b n dùng cú pháp RandomAccessFile =new RandomAccessFile(“C:/ a.println(rf.writeDouble(678. m t char.Các ph ng th c t o d ng lu ng m: public BufferInputStream( InputStream ) public BufferInputStream (InputStream in. chúng không th c ghi ng th i.println(rf. rf.writeBoolean(true). ó là l p RandomAccessFile. int bufferSize) p tin truy c p ng u nhiên t c các lu ng xét trên ch có th c. System. System. Sau ó nó c giá tr s nguyên.public void writeChar(int v) ghi kí t unicode ra t p v i byte cao c ghi tr c . ví d nh b n mu n m t p a. rf.RandomAccessFile. ho c ghi.writeChars( ).

p File nh ngh a các thu c tính ph thu c vào môi tr ng (platform) c s d ng x lý p và tên g i các ng d n trong các th m c m t cách c l p v i môi tr ng.close().’ c s d ng phân cách các ng d n trong Window. tên c a t t c các m c l n l t theo cây th c) ho c ng d n t ng i (b t u t th m c hi n th i). } } t qu xu t ra c a ch ng trình: II. Ví d : File ch1 = new File(File.rf. public static final char separatorChar public static final String separator nh ngh a các ký hi u ho c các xâu s d ng ng n cách các thành ph n trong tên a ng d n. rf.seek(0). Ký hi u ‘/’ ng n cách cho Unix. File(File direct.readBoolean)). pathName có th là ng d n tuy t i (có c tên a. Ví d : C:\book. Ví d : C:\book\Java là tên ng d n trong Window. File(String pathName) Gán ng d n có tên pathName cho i t ng c a l p File.separator + “book” + File. ‘.separator + “chuong1”). public static final char pathSeparatorChar public static final String pathSeparator nh ngh a các ký hi u ho c các xâu s d ng ng n cách các t p ho c tên th m c trong danh sách c a các ng d n. D:\Anh\ABC. ‘\’ c s d ng ng n cách các cc a ng d n trong Window.out. M t ng d ng có th s d ng các ch c n ng chính c a File x lý t p ho c các th m c (directory) trong h th ng t p.println(rf. Ký hi u ng n cách ‘:’ cho Unix. FileOutputStream và RandomAccessFile. L p File p File cung c p giao di n chung x lý h th ng t p c l p v i môi tr ng c a các máy tính. A:\Docs là danh sách các ng d n trong Window. System. x lý các n i dung c a các t p thì s d ng các l p FileInputStream. String filename) Trang 113 . C:\Java.

long length() Hàm này cho l i kích th c c a t p tính theo byte. String getName() Hàm getName() cho l i tên c a t p trong th m c ch nh. boolean exists() boolean isFile() Hai hàm này cho k t qu true n u t p ó t n t i trên ng d n hi n th i. N u direct là null thì filename c x lý th m c hi n th i. Ví d : File mucNhap = new File(“book” + File.length==0){ u Trang 114 . boolean equals(Object obj) Hàm này so sánh tên các ng d n c a các i t ng t p. String[] list() Hàm này hi n th danh sách các t p th m c hi n th i. boolean createNewFile() throws IOException M t t p m i là r ng c t o ra th m c hi n th i ch khi t p này ch a có. ng c l i tên ng d n s là i ng direct ghép v i separator và filename. String getAbsolutePath() Hàm getAbsolutePath() cho l i tên c a ng d n tuy t i ch a t p ch nh. import java. public class DirectoryLister{ public static void main(String args[]){ File entry.*. Ví d . tên c a “C:\java\bin\javac” là “javac”. boolean isDirectory() Hàm này cho k t qu true n u th m c ó t n t i trên a hi n th i.io. p File cung c p các hàm nh n c các bi u di n ph thu c vào môi tr ng c a ng d n và các thành ph n c a ng d n.Gán t p có tên filename th m c direct cho i t ng c a l p File. Ví d 8. “chuong1”). boolean mkdir() boolean mkdirs() T o ra các ng d n c xác nh trong i t ng c a File. p File có th s d ng truy v n vào các h th ng t p bi t c các thông tin v t p và các th m c.separator + “duThao”). cho k t qu true chúng ng nh t v i nhau.1 Vi t ch ng trình c và hi n th các t p trong m t th m c. boolean renameTo(File dest) Hàm này i tên t p hi n th i thành dest. boolean delete() Hàm này xoá t p hi n th i. long lastModified() Hàm này cho l i th i gian d ng s long c a l n s a i t p l n cu i cùng. String getPath() Hàm getPath() cho l i tên c a ng d n (tuy t i ho c t ng i) ch a t p ch nh. if (args. File ch2 = new File(mucNhap.

ten=kInput. Trang 115 .print("Nhap nam sinh:").*.isDirectory()){ // N u i s c a ch ng trình là m t danh m c thì c ra (list()) String[] fileName = entry.in))."). return. i<fileName.exists()) { System.println(entry. i++){ // T o ra i t ng c a File x lý t ng m c File item = new File(entry.getCanonicalPath()).readLine().*. } entry = new File(args[0]).isFile()){ // N u i s c a ch ng trình là m t t p thì hi n th t p ó System. } } }catch(IOException e){System.nam=kInput.length.err. import java. listDirectory(item).out. if (fileName ==null)return. listDirectory(entry).getPath(). public class InputOutput { public static void main(String srgs[]) throws IOException { BufferedReader kInput=new BufferedReader(new InputStreamReader(System. import java.getName() +"not found.*.print("Nhap ho va ten:"). fileName[i]).lang. return.util.nam. } else if(entry.out.System.println("Hay cho biet ten duong dan?"). String ten.println(entry.out. } if (entry.out.list().out. Ví d 1:Ví d minh h a vi c nh p d li u t bàn phím package app001. System.readLine().println("Error:" +e). // T o ra i t ng c a File l y tên t agrs[0] // Hi n th các m c trong danh m c ch nh } public static void listDirectory(File entry) { try { if(!entry. // G i qui hàm listDirectory() hi n th t ng t p. for (int i = 0.io. import java. } } } ch xong có th ch y trong môi tr ng DOS: java DirectoryLister c:\users\lan t c các t p trong danh m c c:\users\lan s t s ví d ng d ng c hi n lên. do { System.

} return i. public static int readInt(){ int i = 0.nextToken()). } public static String readString(){ String S=" ".println(ex).in)).out.}while ((ten==null)||(nam==null)). import java. try{ String str = br. int ns=Integer.intValue().readLine().out.out. try{ String str = br.} catch (IOException ex){ System. } catch (IOException ex){ System. } } Ví d 2 Xây d ng gói nh p d li u cho riêng mình package app002.println(ex).println(ex). kInput.println("Nam sinh ban vua nhap ="+ns).out. } public static double readDouble(){ double d = 0. stok = new StringTokenizer(str). static private BufferedReader br = new BufferedReader(new InputStreamReader(System. } return S. public class MyInput{ static private StringTokenizer stok. stok = new StringTokenizer(str).*. System.parseInt(nam).io.readLine().*. d = new Double(stok.nextToken()). } return d. } } Trang 116 .out.println("Ho ten ban vua nhap ="+ten).util.close().readLine(). try{ S = br.doubleValue(). System. i = new Integer(stok. import java. } catch (IOException ex){ System.

out. import app001. } } Ví d 4.readString(). public class IOFile { public static void main(String args[]) throws IOException { BufferedReader FileInput=new BufferedReader(new FileReader("C:\\filein.println("nam sinh=" + nam).out.close(). System.println(nam).*. int ns = Integer. String ten=" ".print("Enter a String: ").parseInt(nam). while (FileInput. int i = MyInput. System.util.txt"))). System. Man ng1=new Man(ten.println("Ho ten=" + ten).readInt().lang.out.*.close(). System. FileOut.io.out. import java. System. import java.*. ng1.println(ten). PrintWriter FileOut=new PrintWriter(new BufferedWriter(new FileWriter("C:\\fileout.MyInput. Minh h a vi c c.hienthi(). String SS=MyInput.println("\nYou entered i = " + i).println("\nYou entered d = " + d).out.out. ng1.print("Enter a double: "). System. FileOut.nam="345".txt")).ns). ghi file Text package app001.out. long n=0.Ví d 3 S d ng gói nh p d li u trong ch ng trình Java import app002.readLine(). double d = MyInput.*. } FileInput.out.readLine().println("\nYou entered S = " + SS). import java.ready()==true) //==While (not eof()) { ten = FileInput.print("Enter an integer: "). System. public class TestInput{ public static void main(String[] args){ System.readDouble(). FileOut.HienThiNgay(). } } Ví d 5: Minh h a s d ng lu ng Trang 117 . nam = FileInput.

// int a[10]={2.i++) os.i<10.out.seek(0). System.io.write(s.i++) rf.78).println("Input Stream has:" + ibyts+" available bytes"). import java.writeBoolean(true). import java.A[9]=21.A[1]=1. } } Ví d 6: S d ng file ng u nhiên package welcome. public class FileIOExam0 { public static void main(String args[]) throws IOException {String s="Welcome to File Input Output Stream.println(rf.out. //Xoa file abc. import java.out.i<s.println("They are:"+new String(ibuf)).0.io.writeInt(2345).readBoolean()). A[0]=2. rf. //Ghi tung byte os.io.A[8]=12.charAt(i)).txt // File f1=new File("c:\\abc.readInt()). System.IOException.//Du lieu trong file System.System. rf.out.println("Number of Bytes read are:"+byrd).ibyts).1.A[5]=3.close(). //Lay so byte cua file abc.0.12.".lang. import java.txt de doc FileOutputStream os=new FileOutputStream("C:\\abc. Trang 118 . // f1.90}. rf.A[3]=7. rf. is.txt //Mo file abc.available().length().io.txt").close().out. //Dong file abc.writeDouble(456.txt". int A[]=new int[10] . for(int i=0. //Mo file abc.A[6]=4.read(ibuf..txt").A[7]=5."rw").5. for(int i=0. int ibyts=is. public class RandomAaccessFile0 { public static void main(String args[]) throws IOException { RandomAccessFile rf=new RandomAccessFile("c:\\abcd.println(rf. //Doc ibyts du lieu ra luong System.A[2]=9.FileOutputStream.txt").delete().8.io.writeInt(A[i]).A[4]=8.txt de doc FileInputStream is=new FileInputStream("C:\\abc.IOException.File.4.RandomAccessFile..9.FileInputStream. System. import java. import java. import java. //Khai bao dung bo dem du lieu int byrd=is.6.writeChars("A").package app002. rf.txt byte ibuf[]=new byte[ibyts].io.

println(rf.i++) System.i<10. for(int i=0.out.System.out.readChar()).close().out.readDouble()).println(rf. rf. System. } } Trang 119 .println(rf.readInt()).

v n không thay i. M c dù các thành ph n awt n c h tr trong Java 2 nh ng. hình nh… Trang 120 . Jcomponient Là l p cha c a m i thành ph n Swing ligth weight. tuy nhiên Sun khuyên b n nên s d ng các thành ph n Swing thay cho các thành ph n awt. Chúng ch thay th m t ph n c a awt nh : Button. Khi Java c phát hành. b ng cách s ng tr c ti p mã native c a h n n. JPanel là m t v t ch a. Graphics là l p tr u t ng cung c p ng c nh ho v các i t ng ho nh : ng th ng. JDialog là m t c a s c hi n th d i d ng modal. Window c s d ng t o ra m t c a s .Panel v n ph i c v b ng GUI trên n n c th . Panel. Font. Còn các l p tr giúp khác trong awt nh : Graphics. Container Là m t v t ch a dùng ghép nhóm các thành ph n giao di n khác. JAplet là l p cha c a m i l p ng d ng aplet. các thành ph n ho c t p trung vào th vi n mang tên Abstract Window Toolkit (AWT). s th a và giao di n. ng tròn. thành ph n AWT s c ánh x sang m t thành ph n n n c th . I. TextFeild.nút n. M i quan h k th a gi a các thành ph n này c mô t trong hình sau: Componient ây là l p (tr u t ng) cha c a m i l p giao di n ng i dùng. Gi i thi u chung Thi t k API cho l p trình ho c a Java là m t ví d hoàn h o v cách dùng l p. ô v n b n. tuy nhiên các thành ph n trong th vi n Swing không th thay t t c các thành ph n trong th vi n awt. a n ng. L p này cung c p các thu c tính. c v tr c ti p lên canvas b ng mã l nh Java. v. ngo i tr các thành ph n là l p con c a l p java.awt.v. Gi i thi u v h th ng ho c a Java 1.Ch ng 6: L P TRÌNH HO AWT M t kh n ng c a Java là cho phép ta xây d ng các ng d ng có giao di n ho hay còn g i là GUI (Grapthical User Interface). v. l u gi các thành ph n giao di n ng i dùng. Hai v t ch a hay c s d ng nh t la JFrame và JPanel.awt. hành vi c b n nh t c a t t c các thành ph n giao di n. M i t ch a có m t l p qu n lý hi n th . Ph n l n các thành ph n trong th vi n Swing u c tô v tr c ti p trên canvas b ng mã l nh c a Java. FontMetrics.Window ho c Java. Bên c nh ó các thành ph n Swing còn d ng mô hình s lý s ki n c a awt. h p ki m. Thông th ng ta hay s d ng hai l p con c a nó là JFrame và JDialog. API cho l p trình ho bao g m m t t p r t nhi u l p nh m tr giúp xây d ng các thành ph n giao di n khác nhau nh : c a s . iv i i h n n. Color. c l p v i h n n thu c th vi n Swing. các thành ph n giao di n c thay b ng t p h p các thành ph n linh ho t.v. Thành ph n Swing ít ph thu c vào h n n h n do v y ít g p l i h n và c bi t nó s d ng ít tài nguyên c a h th ng h n các thành ph n trong th vi n awt. chính vì v y nó ph thu c r t nhi u vào h n n và nó còn gây l i trên m t s h n n. menu. l p qu n lý hi n th có trách nhi m b trí cách th c hi n th các thành ph n bên trong.v. V i b n phát hành Java 2. m nh m . JFrame là c a s không l ng bên trong c a s khác. v.

FontMetrics là m t l p tr u t ng dùng xác nh các thu c tính c a Font. Trang 121 ng nên t Button vào .swing. Vi c làm này có th gây l i. Componient Container Panel Applet JApplet Object AWTEvent Font Window Frame JFrame Dialog JDialog FontMetric Color JComponent Các thành ph n khác trong gói javax. a các thành ph n trong th vi n Swing u có ti p u ng là ‘J’. m t memu có tên là JMenu.swing ck th a t JComponent Grapthics BorderLayout LayoutManage r FlowLayout GridLayout CardLayout GridBagLayout Ch ng h n nh ng nên t m t JButton vào m t Panel và JPanel.Color l p này bi u di n m t m u s c. T t c nh ng l p khác c li t kê trong hình d i ây Chú ý: ng pha tr n các thành ph n giao di n swing và awt trong cùng m t ng d ng. Ví d m t nút l nh trong th vi n Swing có tên là JButton. t c các thành ph n ho trong th vi n Swing c nhóm trong gói javax. Font l p này bi u th cho m t font ho .

tl p c k th a t l p JComponent c th hi n trong hình sau: AbstracButton JComponent JMenuItem JButton JtoggleButton JCheckBoxMen JMenu JRadioMenu JCheckBox JRadioButto JTextComponent JEditorPane JTextField JTextArea JTextPane JPasswordField JLabel JList JTable JOptionPane JCompoBox JScrollBar JSlider JMenuBar JCcollPane JprogressBar JFileChooser JTabbedPane JSplitBar JRootPane JPopupMenu JPane JToolTip JTree JSeparator JToolBar JInternalFrame JColorChooser JtableHeader JLayeredPane 2. int height) và void setSize(Dimension d) t l i kích th c c a thành ph n.Dimension getSize(): cho l i i t ng thu c l p Dimension g m width (chi u r ng). . Sau ây là m t s ph ng th c c a l p Component : . (ki u Point) trên cùng bên trái (t a g c) c a thành Trang 122 . M t s ph ng th c c a l p Component p Component cung c p các thu c tính. ph ng th c chung cho các l p con c a nó. height (chi u cao) xác nh kích th c c a m t thành ph n tính theo pixel.void setSize(int width. .Point getLocation(): cho l i t a ph n ang xét.

. . 300). int y) và void setLocation(Point p): t l i các t a c ch nh cho m t thành ph n.Rectangle getBounds(): cho l i ng biên là hình ch nh t Rectangle bao g m t a c và chi u dài.void setVisible(boolean b): t thành ph n h a có th c hi n th lên màn hình (nhìn th y c) ho c b che gi u tùy thu c vào i s c a hàm setVisible() là true hay false.Cho hi n frame: myWindow. ch b n chung t o ra m t c a s là: o ra m t frame có tiêu gì ó.add() b sung thêm JPanel ho c nh ng thành ph n giao di n khác vào Frame: Ví d : myWindow.Font getFont(): c s d ng bi t c font c a các ch ang x lý trong thành ph n h a.pack().setSize(200. 3.add(new JButton(“OK”)). . Trang 123 . 4.void setLocation(int x. . int y) và void setBounds(Rectangle r): t l i ng biên cho m t thành ph n. . trong ó có ph ng th c add() c n p ch ng dùng b sung m t thành ph n vào v t ch a và ph ng th c remove() c ng c n p ch ng g b m t thành ph n ra kh i v t ch a. ngh a là không th tr l i c các yêu u c a ng i s d ng.void setFont(Font f): t l i font ch cho m t thành ph n.void setBounds(int x. Các tham s c a hai hàm này là i t ng c a l p Color s c gi i thi u ph n sau.L u ý: T t c các thành ph n giao di n khi kh i t o u c kích ho t .setVisible(true).Xây d ng m t c u trúc phân c p các thành ph n b ng cách s d ng hàm myWindow. n u là false thì thành ph n t ng ng s không kích ho t c. T o ra Frame p JFrame là l p con c a l p Frame (Frame là l p con c a l p Window) cs ng t o ra nh ng c a s cho các giao di n ng d ng GUI.// a vào m t nút (JButton) có tên “OK” vào frame t l i kích th c cho frame s d ng hàm setSize(): myWindow. L p Container p Container là l p con c a l p tr u t ng Component.getContentPane(). Các l p ch a (l p con c a Container) cung c p t t c các ch c n ng xây d ng các giao di n h a ng d ng.void setEnabled(boolean b): u i s b c a hàm getEnabled() là true thì thành ph n ang xét ho t ng bình th ng.getContentPane(). ví d “My Frame” : JFrame myWindow= new JFrame(“My Frame”).void setBackground(Color c): t màu n n cho thành ph n h a. chi u r ng c a hình ch nh t. . có th tr l i các yêu c u c a ng i s d ng và sinh ra các s ki n nh mong mu n. . ngh a là có kh n ng kích ho t (enable).void setForeground(Color c): c s d ng t màu v cho thành ph n h a .Gói khung frame ó l i b ng hàm pack(): myWindow.// t l i khung frame là 200 ( 300 .. . Ng c l i. .

east ( ông) và center (trung tâm)). Hàm add() c a l p Container c n p ch ng th c hi n nhi m v a các thành ph n vào ph n t ch a. sau ó theo c t t trên xu ng d i. Các thành ph n giao di n sau khi ã c t o ra thì ph i c a vào m t ph n t ch a nào ó. Object constraints.Applet và JApplet. M i thành ph n giao di n ch a trong t ô. v. Cách s p x p này là m c nh i v i Panel. JTextField. Các thành ph n giao di n c s p x p trong các ô l i hình ch nh t l n l t theo hàng t trái qua ph i và theo c t t trên xu ng i trong m t ph n t ch a. Ng c l i. Jframe. null Các thành ph n bên trong v t ch a không th c c a v t ch a thay i. Trình qu n lý hi n th trong Java Khi thi t k giao di n h a cho m t ng d ng. JPanel . south (nam).v. void setLayout(LayoutManager mgr). sao cho ti n l i nh t i v i ng i s d ng. int index) Cmponent add(Component comp. i s index c s d ng ch ra v trí c a ô c n t thành ph n giao di n comp vào. nh ng m t thành ph n có th chi m nhi u nhi u h n m t ô. JCheckbox. Dialog và JDialog. khi c n lo i ra kh i ph n t ch a m t thành ph n giao di n thì s d ng các hàm sau: void remove(int index) Trang 124 . c s p l i khi kích Các ph ng pháp thi t t layout l y v layout hay t l i layout cho v t ch a. Frame. Tên l p FlowLayout Mô t X p các thành ph n giao di n tr c tiên theo hàng t trái qua ph i. Component add(Component comp) Component add(Component comp. chúng ta có th s d ng hai ph ng th c c a l p Container: LayoutManager getLayout(). chúng ta ph i quan tâm n kích th c và cách b trí (layout) các thành ph n giao di n nh : JButton.II. GridLayout BorderLayout GridBagLayout Cho phép t các thành ph n giao di n vào l i hình ch nh t. int index) Trong ó. Các thành ph n giao di n (ít h n 5) c t vào các v trí theo các ng: north (b c). Cách s p x p này là m c nh i v i l p Window. Java có các l p m nhi m nh ng công vi c trên và qu n lý các thành ph n giao di n GUI bên trong các v t ch a. i s constraints xác nh các h ng a comp vào ph n t ch a. Object constraints) Cmponent add(Component comp. west (tây). ng sau cung c p b n l p qu n lý layout (cách b trí và s p x p) các thành ph n GUI.

nam (SOUTH). nh ng không th c hai. L p FlowLayout L p FlowLayout cung c p các hàm t o l p s p hàng các thành ph n giao di n: FlowLayout() FlowLayout(int aligment) FlowLayout(int aligment. BorderLayout() BorderLayout(int horizongap. int verticalgap) T o ra m t l i hình ch nh t có rows ( columns ô có kho ng cách gi a các hàng các c t là horizongap. 3. óng các Window hay gõ các ký t t bàn phím.void remove(Component comp) void removeAll() 1. Vi c nh t nút. tây (WEST) và gi a (CENTER). int columns. ông (EAST).EventObject. III. int verticalgap) T o ra m t layout m c nh ho c có kho ng cách gi a các thành ph n (tính b ng pixel) là horizongap theo hàng và verticalgap theo c t. Trong Java các s ki n c th hi ng các i t ng. verticalgap. u t o ra các s ki (event) và c g i t i cho ch ng trình ng d ng. l p cha c a t t c các l p con c a các s ki n là l java. v. có th ch nh h ng t các thành ph n comp vào ph n t ch a theo constraint là m t trong các h ng trên. ng c l i.0) là t o ra l i có m t hàng. L p c s nh t. m .L p BorderLayout p BorderLayout cho phép t m t thành ph n giao di n vào m t trong b n h ng: c (NORTH). L p GridLayout p GridLayout cung c p các hàm t o l p s p hàng các thành ph n giao di n: GridLayout() GridLayout(int rows. Tr ng h p m c nh thì kho ng cách gi a các hàng. int hoiongap. int columns) GridLayout(int rows. int verticalgap) public static final int LEFT public static final int CENTER public static final int RIGHT i s aligment xác nh cách s p theo hàng: t trái. 2. c t là 5 pixel. int horizongap.v. Component add(Component comp) void add(Component comp. M t trong hai i s rows ho c columns có th là 0. X lý s ki n trong Java Các ng d ng v i GUI th ng c h ng d n b i các s ki n (event). GridLayout(1. Trang 125 n n n p . ph i hay trung tâm. horizongap và verticalgap là kho ng cách tính theo pixel gi a các hàng các c t. Object constraint) public static final String NORTH public static final String SOUTH public static final String EAST public static final String WEST public static final String CENTER Tr ng h p m c nh là CENTER.util.

Các thành ph n gây ra các s ki n hành ng bao g m: .java.khi m t nút button c khích ho t. . ItemEvent Các thành ph n c a GUI gây ra các s ki n v các m c g m có: Trang 126 .awt. p này có ph ng th c int getValue(): cho l i giá tr hi n th i c xác nh b i l n c n ch nh sau cùng. .JmenuItem. 1. JcheckBoxMenu.util.khi m t m c trong th c n c ch n. Các l p s ki n m c th p.Object java. b.EventObject java. AdjustmentEvent ki n này x y ra khi ta u ch nh (adjustment) giá tr thanh cu n (JScollBar) Scrollbar .khi gõ phím ENTER trong tr ng v n b n (text).JList .JButton .khi th c hi n m t l n c n ch nh trong thanh tr t Scrollbar.event ActionEvent AdjustmentEvent ComponentEven t ItemEvent TextEvent ContainerEvent FocusEvent InputEvent PaintEvent WindowEvent KeyEvent MouseEven t Hình H7-20 Các l p x lý các s ki n Các l p con c a AWTEvent c chia thành hai nhóm: Các l p mô t v ng ngh a c a các s ki n. JradioMenu .JTextField . .lang. ActionEvent ki n này c phát sinh b i nh ng ho t th c hi n trên các thành ph n c a GUI. Ý ngh a c a các l p a.awt. c.khi m t m c trong danh sách c kích ho t úp.AWTEvent java.

int dy) Hàm translate() c s d ng chuy n t a c a s ki n do chu t gây ra n (dx. FocusEvent ki n lo i này xu t hi n khi m t thành ph n nh n ho c m t focus. ContainerEvent ki n này xu t hi n khi m t thành ph n c b sung hay b lo i b kh i v t ch a (Container). . p ItemEvent có ph ng th c Object getItem(): Cho l i i t ng c ch n hay v a b ch n.khi tr ng thái c a h p ch n (Option) thay i. p ComponentEvent có ph ng th c: Component getComponent() Cho l i i t ng tham chi u ki u Component. hàm này c s d ng nh n l i giá tr nguyên. hàm này c s d ng nh n l i giá tr nguyên t ng ng v i mã c a phím trên bàn phím. KeyEvent L p KeyEvent là l p con c a l p tr u t ng InputEvent c s d ng x lý các ki n liên quan n các phím c a bàn phím.khi m t m c trong danh sách c ch n ho c b lo i b ch n. char getKeyChar() i v i các s ki n KEY_PRESSED. CheckboxMenuItem . mã Unicode t ng ng v i ký t c a bàn phím.khi m t m c trong danh sách c ch n ho c b lo i b ch n. L p này có các ph ng th c: int getKeyCode() i v i các s ki n KEY_PRESSED ho c KEY_RELEASED.JCompoBox .khi tr ng thái c a h p ki m tra Checkbox ng v i m c c a th c n thay i. TextField . int getClickCount() Trang 127 - .JList . . void translatePoint(int dx. h. .khi tr ng thái c a h p ki m tra Checkbox thay i. i. MouseEvent p MouseEvent là l p con c a l p tr u t ng InputEvent c s d ng x lý các tín hi u c a chu t. g. f. d.khi k t thúc b ng nh n nút ENTER. y c a v trí liên quan n s ki n do chu t gây ra. e. ComponentEvent ki n này xu t hi n khi m t thành ph n b n i/hi n ra ho c thay thay i l i kích th c.JCheckbox .JRadioButton. dy). TextEvent Các thành ph n c a GUI gây ra các s ki n v text g m có: TextArea .khi k t thúc b ng nh n nút ENTER. L p này có các ph ng th c: int getX() int getY() Point getPoint() Các hàm này c s d ng nh n l i t a x.

m t c a s . PaintEvent S ki n này xu t hi n khi m t thành ph n c v l i. th c t s ki n này x y ra khi ph ng th c paint()/ update() c g i n. WindowEvent S ki n lo i này xu t hi n khi thao tác v i các Window. Ki u s ki n Ngu n gây ra s ki n Ph ng th c ang ký.Hàm getClickCount() m s l n kích chu t. gõ b i t ng l ng nghe addComponentlistener removeActiontListener addAdjustmentListener removeAdjustmentListener addItemListener removeItemListener AdjustmentListe ner ItemListener Giao di n Listener l ng nghe t ng ng AcitionListener AcitionEvent JButton JList TexField AdjustmentEvent JScrollbar ItemEvent JCheckbox JCheckboxMenuItem JRadioButton JList JCompoBox JTextArea JTexField JTextPane JEditorPane TextEvent addTexListener removeTextListener TextListener ComponentEvent Component ContainerEvent Container addComponentListener removeComponentListener addContainerListener removeContainerListener addFocusListener removeFocusListener addkeyListener removeKeyListener addMouseListener Trang 128 ComponentListe ner ContainerListen er FocusListener KeyListener MouseMotionLi FocusEvent KeyEvent MouseEvent Component Component Component . L p này có ph ng th c: Window getWindow() Hàm này cho l i i t ng c a l p Window ng v i s ki n liên quan n Window ã x y ra. phóng to. j.. k. ch ng h n nh : óng. thu nh .

//fr. private JTextField tYear = new JTextField(10).remoMouseListener addMouseMotionListener remoMouseMotionListener WindowEvent 3. import java.swing. fr. and the loan amount.TitledBorder.setTitle("Mortgage Application"). import javax.swing. import java.event.setSize(400. fr.the number of years. 200). public static void main(String[] args){ StudentApp fr = new StudentApp().awt.awt.border. private JTextField tLoan = new JTextField(10).setVisible(true). private JTextField tTotal = new JTextField(10).Applet. } Trang 129 .*. public class StudentApp extends JFrame implements ActionListener{ private JTextField tRate = new JTextField(10). M t s l p Window uh p p uh pt ng ng uh pt uh pt uh pt ng ng ng ng ng ng addWindowListener removeWindowListener stener WindowListener Giao di n Listener l ng nghe AcitionListener AdjustmentListener ItemListener TextListener ComponentListener ContainerListener FocusListener KeyListener MouseMotionListener WindowListener t s ví d minh h a Không có l p Không có l p Không có l p AdjustmentAdapter ComponentAdapter ContainerAdapter FocusAdapter KeyAdapter MouseMotionAdapter WindowAdapter /* The applet enables the user to enter the interest rate.center(). Clicking the compute button displays the monthly payment and the total payment. import javax. */ import java.*. private JButton compute = new JButton("Compute mortgage"). fr.applet.*.

// Compute the total and displays it double m = loan * interest * year. } // Handler for the compute button public void actionPerformed(ActionEvent e){ if(e.add(p2. p1.intValue().add(new Label("Interest Rate")). // Add the components to the applet getContentPane(). p1. p1.2)).doubleValue(). Trang 130 .public StudentApp(){ tTotal. JPanel p1 = new JPanel(). public ChoiceList(String title){ super(title).RIGHT)).getText())).SOUTH). class ChoiceList extends Frame implements ActionListener{ Label l1 = new Label("What is your favorite color"). p2.valueOf(tYear.valueOf(tRate.setText(String. add(bt). p1. p2.add(new Label("Years")). add(l1).add(tRate).add(tTotal). Button bt = new Button("Exit"). setLayout(new FlowLayout()).CENTER).add(compute).BorderLayout. year and loan amount")). p1.valueOf(m)). tTotal. getContentPane().add(p1. p1.awt.setLayout(new GridLayout(5.valueOf(tLoan.BorderLayout.setEditable(false). int year = (Integer. } } } S d ng ListBox và nút l nh import java.*. JPanel p2 = new JPanel().addActionListener(this).add(new Label("Total Payment")).add(new Label("Loan Amount")).doubleValue(). p1.add(tLoan). import java.*. Choice colors = new Choice().awt.getSource() == compute){ // Get values from text fields double interest = (Double. // Register listener compute. p1.add(tYear). double loan = (Double.getText())). p1.event.setLayout(new FlowLayout(FlowLayout.getText())).setBorder(new TitledBorder("Enter interest rate. p1.

setLayout(new GridLayout(1. add(colors). clockP1.add(app. import java. private JButton btResum. } } // public void mouseExited(MouseEvent m){} public static void main(String args[]){ ChoiceList t = new ChoiceList("Choice List"). // Create a clock for Berlin p1.addItem("Green"). colors. ClockGroup app = new ClockGroup(). Trang 131 . clockP2.CENTER). fr.setSize(300. colors.init().Timer. } public void actionPerformed(ActionEvent ev){ if(ev. public static void main(String[] arg){ JFrame fr = new JFrame("Clock Group Demo").addItem("Orange"). t.setTitle("Berlin").*.swing.awt.util. import javax.start().setVisible(true).event.colors. clockP3.addItem("White").swing.*. bt. } } /* ClockGroup.*. app. 200).getSource() == bt){ System.addItem("Red").getContentPane().java * display a group of international clocks */ import java.*.exit(0). btSus.addItem("Blue"). t.awt.addActionListener(this). import javax. import java.show(). colors.add(clockP1 = new ClockPanel()).setSize(600.text.*. app. fr. p1. public class ClockGroup extends JApplet implements ActionListener{ private ClockPanel clockP1. colors. 350). } public void init(){ // Panel p1 for holding 3 clocks JPanel p1 = new JPanel(). BorderLayout.addItem("Yellow"). import java.3)). fr. colors.

clock. btSus.setLocale(Locale.clock.setTimeZoneID("CTT"). } public void actionPerformed(ActionEvent e){ if(e.clock.addActionListener(this). // Set BorderLayout for the ClockPanel Trang 132 . clockP2. private JButton btResum.suspend(). bt. getContentPane(). // Create a clock for Taipei p1.add(btResum = new JButton("Resum")).SOUTH). p2.clock.setTimeZoneID("PST"). clockP1.add(btSus = new JButton("Suspend")). } else if (e.add(btSus = new JButton("Suspend All")). clockP2.add(clockP3 = new ClockPanel()).US). protected Clock clock = null.add(btResum = new JButton("Resume All")).setLocale(Locale. clockP3.addActionListener(this).add(p1.BorderLayout.GERMAN).suspend().add(p2.BorderLayout. clockP3. p2.setTimeZoneID("ECT"). bt. // Add p1. // Panel p2 for holding 2 group buttons JPanel p2 = new JPanel(). // Register listener btResum.clock. clockP2. clockP2. clockP2.add(clockP2 = new ClockPanel()).getSource() == btSus){ // Start all clock clockP1.resume(). clockP3.resume().setLayout(new BorderLayout()). } } } class ClockPanel extends JPanel implements ActionListener{ private JLabel labelT.clock.setLayout(new FlowLayout()).setLocale(Locale.CENTER). clockP3.resume(). p2 into the applet getContentPane(). btSus.setTitle("San Francisco"). p2. public ClockPanel(){ JPanel bt = new JPanel().getSource() == btResum){ // Start all clock clockP1.suspend(). clockP3.CHINESE). // Create a clock for SanFrancisco p1.setTitle("Taipei").clockP1. getContentPane().

btSus.NORTH).getDefault()).BorderLayout.CENTER). } public void resume(){ timer. public Clock(){ this(Locale. } else if (e.this). // Add the clock to the center of the panel add(clock = new Clock(). } public void actionPerformed(ActionEvent e){ repaint(). } } Trang 133 .setHorizontalAlignment(JLabel. } public void suspend(){ if(clock != null) clock. timer. t).resume(). labelT. } } class Clock extends StillClock implements ActionListener{ protected Timer timer.getDefault(). // Register btResum.getSource() == btSus){ clock.suspend(). timer = new Timer(1000. } public Clock(Locale l.CENTER). // Add title label to the north of the panel add(labelT = new JLabel().setText(title). } public void suspend(){ timer.addActionListener(this).resume(). } public void actionPerformed(ActionEvent e){ if(e.SOUTH).stop(). TimeZone t){ super(l. BorderLayout. add(bt. } } public void resume(){ if(clock != null) clock. } public void setTitle(String title){ labelT.BorderLayout.start().getSource() == btResum){ clock.suspend().addActionListener(this).start(). TimeZone.setLayout(new BorderLayout()).

drawString("6". // Draw circle g. this. int xS = (int)(xC+sLen*Math.5.drawLine(xC. xM.sin(second*(2*Math. yC .width)/2. protected int clockR. xC = (getSize(). yS). yC + clockR + 10).setColor(Color. yC.drawString("3". Trang 134 .blue). protected DateFormat form.75).getSize().sin((hour+minute/60. yM). } public StillClock(Locale l. yC.black).PI/60))). int xM = (int)(xC+mLen*Math. public StillClock(){ this(Locale. yC + 3). yC = (getSize(). } // Override the paintComponent to display a clock public void paintComponent(Graphics g){ super. int yS = (int)(yC-sLen*Math. protected int xC. int xH = (int)(xC+hLen*Math. // Draw second hand int second = (int) cal. clockR = (int)(Math. xC + 3.width.drawOval(xC-clockR. TimeZone t){ setLocale(l).7*0.timeZ = t. int yM = (int)(yC-mLen*Math.clockR). g.get(GregorianCalendar.SECOND).clockR-10. 2*clockR.2*clockR).getDefault().cos(minute*(2*Math.min(getSize().height)/2. int hLen = (int)(clockR *0.drawString("12".HOUR_OF_DAY). int sLen = (int)(clockR *0.PI/60))). } public void setTimeZoneID(String newT){ timeZ = TimeZone. g.5). g.PI/60))). xS.getTimeZone(newT).paintComponent(g). // Draw hour hand int hour = (int) cal. g.PI/12))).0)*(2*Math. g. int mLen = (int)(clockR *0.get(GregorianCalendar.// Display a clock in JPanel class StillClock extends JPanel{ protected TimeZone timeZ. TimeZone. xC + clockR. xC .clockR. xC .cos(second*(2*Math. g.get(GregorianCalendar.getDefault()).red).MINUTE).height)*0. yC.drawString("9".setColor(Color. g.setColor(Color. // Draw minut hand int minute = (int) cal.9). g. g. yC + 3).sin(minute*(2*Math. // Get current time using GregorianCalendar GregorianCalendar cal = new GregorianCalendar(timeZ). yC .PI/60))).drawLine(xC.6).

*. public class ComponentTest extends Frame implements ActionListener. Choice colors = new Choice(). g.MouseListener { TextField tf1=new TextField(30). cb.setTimeZone(timeZ). 25). xH. (getSize(). TextField tf2 = new TextField(40). add(ta). setLayout(new FlowLayout()).awt.getDateTimeInstance( DateFormat. add(b1). getLocale()).. import java. Label label1 = new Label("This is a way to use component. TextArea ta = new TextArea(3. cb. colors.0)*(2*Math. colors. Checkbox b1 = new Checkbox("Red".int yH = (int)(yC-hLen*Math. colors.setColor(Color.event. and timzone form = DateFormat.width-fm. true). g. yC+clockR+30)."). PopupMenu optionsMenu = new PopupMenu("Options").drawLine(xC. Trang 135 .*. Checkbox b2 = new Checkbox("Blue". add(bg1).getFontMetrics().stringWidth(today))/2. add(tf1).addItem("Oranges"). yC.. // Set display form in specified style. g. Button btnExt = new Button("Exit"). import java. add(bg2). FontMetrics fm = g.awt. true). form. Checkbox bg1 = new Checkbox("Small". add(b2). add(tf2). locale.DateFormat. true).LONG. // Display current date String today = form. Button btnResult = new Button("Double is"). } } d ng các u khi n package welcome. add(label1).MEDIUM. public ComponentTest(String title) { super(title).cos((hour+minute/60.format(cal.PI/12))).addItem("Red"). yH).addItem("While"). Checkbox bg2 = new Checkbox("Large". CheckboxGroup cb = new CheckboxGroup().green).drawString(today.getTime()). true).

Menu formatMenu = new Menu("Format text"). colors.addItem("Blue"). formatMenu. fileMenu. optionsMenu. mbar.addSeparator().addSeparator().addItem("Black"). mbar. MenuItem readItem = new MenuItem("Read Only").addActionListener(this).addSeparator().addActionListener(this). colors.add(cutItem).addActionListener(this). MenuItem exitItem = new MenuItem("Exit"). MenuItem openItem = new MenuItem("Open").add(optionsMenu). fileMenu. CheckboxMenuItem insertItem = new CheckboxMenuItem("Insert". setMenuBar(mbar). exitItem. btnExt. true). optionsMenu. btnResult. optionsMenu. fileMenu. MenuItem saveItem = new MenuItem("Save").addSeparator().add(formatMenu). false).colors.add(newItem). fileMenu. fileMenu.add(fileMenu). editMenu.addActionListener(this). colors. //PopupMenu optionsMenu=new PopupMenu("Options"). MenuItem cutItem = new MenuItem("Cut").add(paseItem). editMenu. add(btnExt).add(openItem).add(readItem).addActionListener(this). formatMenu. add(colors).add(saveItem). fileMenu. MenuBar mbar = new MenuBar().addActionListener(this). optionsMenu.addSeparator().addItem("Green"). MenuItem copyItem = new MenuItem("Copy").addSeparator(). add(btnResult).add(copyItem). Menu editMenu = new Menu("Edit").add(editMenu). optionsMenu. fileMenu. Trang 136 . CheckboxMenuItem overtypeItem = new CheckboxMenuItem("Over type". fileMenu.addItem("Yellow"). Menu fileMenu = new Menu("File"). MenuItem newItem = new MenuItem("New"). editMenu.add(exitItem). editMenu. MenuItem paseItem = new MenuItem("Pase"). editMenu.add(insertItem).

import java.setText(String. tf2.addSeparator().equals("Open")) { System.show(). Fig. } if (ae. public static void main(String[] arg){ MenuDemo1 fr = new MenuDemo1(). } } /* The program has 4 buttons labeled Add.. } } public void mouseEntered(MouseEvent m) { } public void mouseExited(MouseEvent m) { } public void mouseClicked(MouseEvent m) { optionsMenu.show(this. Div and also create a menu to perform the same operation.getActionCommand().getX().exit(0).getSource() == btnResult) { int num = Integer.btDiv. Sub. } if (ae.getSource() == btnExt) { System. mSub. c. formatMenu. num2. Mul. label1. mDiv. m.mMul.*. private JMenuItem mAdd. btSub.getY()). } public void actionPerformed(ActionEvent ae) { if (ae. The user can choose the operation either from buttons or from menu selections.event.awt.*.pack(). Trang 137 . c.exit(0).println("You pressed the menuItem Open. res. The user will also create to perform the same operation. The following contains a sample run of the program.out. m.*.").*"). */ import java.swing.formatMenu. import javax. btMul. } if (ae. private JButton btAdd.add(overtypeItem). fr.awt.getText()) * 2. 300). mClose. public class MenuDemo1 extends JFrame implements ActionListener{ private JTextField num1.parseInt(tf1.awt.equals("Exit")) { System.getActionCommand()..valueOf(num)).setText("Open").setSize(500. } public void mouseReleased(MouseEvent m) { } public void mousePressed(MouseEvent m) { } public static void main(String args[]) { ComponentTest c = new ComponentTest("Vi du dung thu vien java.

p2.CENTER). opMenu. 'D')).CTRL_MASK)).add(mMul = new JMenuItem("Mul". getContentPane(). ActionEvent.add(btMul = new JButton("Mul")). p2.VK_S. p1. p1. exitMenu. p1. opMenu. ActionEvent. p2.add(new JLabel("Number 2")). getContentPane(). p1.add(btDiv = new JButton("Div")).fr. p1.setAccelerator(KeyStroke. btSub. btAdd. JMenu exitMenu = new JMenu("Exit"). 'C')). JPanel p2 = new JPanel().setMnemonic('E').add(new JLabel("Number 1")).add(mSub = new JMenuItem("Sub". exitMenu. ActionEvent. p1.setAccelerator(KeyStroke. 'M')). opMenu. p2.addActionListener(this). BorderLayout.VK_A. 'S')).add(res = new JTextField(4)).add(p2. Trang 138 .add(btAdd = new JButton("Add")).SOUTH).setLayout(new FlowLayout()).setEditable(false).add(mAdd = new JMenuItem("Add".addActionListener(this). mAdd.add(p1. mDiv.getKeyStroke(KeyEvent.setAccelerator(KeyStroke.CTRL_MASK)). JMenu opMenu = new JMenu("Operation").add(new JLabel("Result")).VK_M.setLayout(new BorderLayout()). getContentPane(). 'A')).add(mClose = new JMenuItem("Close".add(num2 = new JTextField(4)). ActionEvent. mMul. opMenu. JMenuBar mb = new JMenuBar().CTRL_MASK)). setJMenuBar(mb). mb.add(num1 = new JTextField(4)).setMnemonic('O').setAccelerator(KeyStroke. p2. p1. opMenu. JPanel p1 = new JPanel(). BorderLayout.add(opMenu).setLayout(new FlowLayout()).VK_D.add(mDiv = new JMenuItem("Div".getKeyStroke(KeyEvent.CTRL_MASK)).add(exitMenu). res. } public MenuDemo1(){ setTitle("Menu Demo"). mb. mSub.setVisible(true).getKeyStroke(KeyEvent.add(btSub = new JButton("Sub")).getKeyStroke(KeyEvent.

equals(comm)) calculate('-').parseInt(num1. btDiv. else if ("Mul". int r = 0. break.exit(0). } } p trình menu Trang 139 . case '*': r = n1 * n2. } public void actionPerformed(ActionEvent e){ String comm = e. } res.getSource() instanceof JButton){ if("Add". } else if (e. mMul.getActionCommand(). switch( op){ case '+': r = n1 + n2.addActionListener(this).equals(comm)) calculate('/').addActionListener(this).setText(String. int n2 = (Integer.addActionListener(this). mSub. break.equals(comm)) calculate('+').equals(comm)) calculate('-').addActionListener(this).btMul.equals(comm)) calculate('/').equals(comm)) System. case '/': r = n1 / n2. else if ("Mul". break.addActionListener(this).equals(comm)) calculate('*').getText().trim())).addActionListener(this).parseInt(num2.n2. break. else if ("Sub". if(e. else if ("Sub".trim())). else if ("Close". mClose.addActionListener(this). case '-': r = n1 .getSource() instanceof JMenuItem){ if("Add".getText(). else if ("Div". } } private void calculate(char op){ int n1 = (Integer.equals(comm)) calculate('*').equals(comm)) calculate('+'). mAdd. else if ("Div". mDiv.valueOf(r)).

'A')). res.add(mClose = new JMenuItem("Close". import javax./* The program has 4 buttons labeled Add.getKeyStroke(KeyEvent.*. mSub.add(exitMenu).CTRL_MASK)). 'C')).setAccelerator(KeyStroke. mAdd.CTRL_MASK)).CTRL_MASK)). 'S')).add(mMul = new JMenuItem("Mul". JMenu opMenu = new JMenu("Operation"). mClose. opMenu. exitMenu.add(mDiv = new JMenuItem("Div". mMul.*. fr.pack(). setJMenuBar(mb).swing.setAccelerator(KeyStroke. Fig.*. */ import java. private JButton btAdd.VK_S. opMenu. 'D')). mDiv. mb. The user can choose the operation either from buttons or from menu selections. public class MenuDemo1 extends JFrame implements ActionListener{ private JTextField num1. ActionEvent. opMenu. mSub. import java. JMenuBar mb = new JMenuBar(). private JMenuItem mAdd.awt.setVisible(true). btSub.setMnemonic('E'). Sub. The following contains a sample run of the program. exitMenu.btDiv. ActionEvent. The user will also create to perform the same operation.event. JMenu exitMenu = new JMenu("Exit"). } public MenuDemo1(){ setTitle("Menu Demo").VK_M. Trang 140 .mMul. fr. Div and also create a menu to perform the same operation. btMul.add(opMenu). public static void main(String[] arg){ MenuDemo1 fr = new MenuDemo1(). num2.setMnemonic('O'). opMenu. ActionEvent. 'M')).VK_A.getKeyStroke(KeyEvent.awt.add(mSub = new JMenuItem("Sub". mb.getKeyStroke(KeyEvent. Mul. opMenu.add(mAdd = new JMenuItem("Add".setAccelerator(KeyStroke.

ActionEvent. p1.addActionListener(this). btSub.add(p1. else if ("Sub".add(new JLabel("Result")).add(btSub = new JButton("Sub")).addActionListener(this). p2.add(btAdd = new JButton("Add")). Trang 141 .equals(comm)) calculate('*'). mMul.VK_D.add(btMul = new JButton("Mul")). btMul. p1.getKeyStroke(KeyEvent.add(new JLabel("Number 2")).add(btDiv = new JButton("Div")).add(p2.addActionListener(this).getSource() instanceof JButton){ if("Add". JPanel p2 = new JPanel(). getContentPane().setLayout(new BorderLayout()).addActionListener(this).add(res = new JTextField(4)). p2. getContentPane(). BorderLayout.setEditable(false). mSub. JPanel p1 = new JPanel().add(new JLabel("Number 1")). p2.CTRL_MASK)). p1.setLayout(new FlowLayout()). btDiv. p2.setLayout(new FlowLayout()). mClose. p1. p2.addActionListener(this).equals(comm)) calculate('-'). mAdd.add(num2 = new JTextField(4)).add(num1 = new JTextField(4)). p1.addActionListener(this). btAdd. else if ("Mul". res. getContentPane().SOUTH).addActionListener(this). BorderLayout. p1.mDiv. mDiv.addActionListener(this).equals(comm)) calculate('+'). if(e. } public void actionPerformed(ActionEvent e){ String comm = e. p1.addActionListener(this).getActionCommand().CENTER).setAccelerator(KeyStroke.

else if ("Div".equals(comm)) calculate('-'). break. else if ("Mul". else if ("Close". int r = 0. case '*': r = n1 * n2.equals(comm)) System. break.n2. } } private void calculate(char op){ int n1 = (Integer. else if ("Sub".exit(0).getSource() instanceof JMenuItem){ if("Add". int n2 = (Integer.setText(String. switch( op){ case '+': r = n1 + n2. else if ("Div".trim())). case '/': r = n1 / n2. break. break. case '-': r = n1 .equals(comm)) calculate('/').getText().trim())).equals(comm)) calculate('+'). } res.equals(comm)) calculate('/').equals(comm)) calculate('*'). } else if (e.parseInt(num1.getText(). } } Trang 142 .valueOf(r)).parseInt(num2.

ây là trình u khi n c cung c p mi n phí b i hãng Sun và nó c cài t t ng khi b n cài t JDK. . Các k u trình u khi n JDBC Các trình u khi n JDBC có th phân thành 4 ki u sau ph thu c vào cách th c ho t ng.. JDBC c thi t k t ng i n gi n.) cc s li u c a chúng . ODBC API là m t t p các hàm API truy c p vào CSDL thông qua các trình u khi n. II. cách k t n i v i CSDL. B ng cách này b n có th k t n i c v i nhi u h qu n tr c s li u khác nhau. SQL Server. Trang 143 . Mô hình JDBC a ra m t t p các l p và các ph ng th c giao ti p v i ng n d li u. JDBC API c tích h p vào ngay n n java nên b n không c n ph i cài t gì thêm khi truy c p CSDL.C u n i JDBC-ODBC. có th k t n i vào m t h CSDL c th nào ó (ch ng h n nh : Access. ng i l p trình s s d ng các hàm API trong giao di n này truy c p vào CSDL. MySQL…) s d ng c u n i JDBC-ODBC b n c n ph i có: ..Trình u khi n (Driver) c a dùng truy c p vào h CSDL ó.Ch ng 7 L P TRÌNH C S D LI U I. Thông th ng trình u khi n này c cung c p b i chính các hãng s n xu t h CSDL và nó th ng c cài t vào trong máy khi b n cài t h qu n tr CSDL. M i h c s d li u cung p m t trình u khi n (Driver) có kh n ng làm vi c ( c. Trình u khi n này s c ng ký v i b qu n lý ODBC . u n i JDBC – ODBC là m t trình u khi n s d ng mã java g i l i các hàm trong JDBC API. c p nh t. Ki u 1 : JDBC s d ng c u n i ODBC (JDBC-ODBC Bridge ) ODBC là m t công ngh c a Microsoft dùng k t n i n các h c s d li u thông qua trình u khi n Driver c a h c s d li u ó. công ngh này c bi t n v i cái tên JDBC (Java Database Connectivity). T ng quan 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.

Ki u 2 : JDBC k t n i tr c ti p v i các trình u khi n c s d li u . Fat Client.Mã JAVA { { { Java Application . Ki u k t n i này s d ng mã java tr c ti p g i các hàm trong trình u khi n c thù c a m i h c s d li u mà không ph i qua trung gian ODBC . Applet . Do v y ki u k t i này nhanh và hi u qu h n c u n i JDBC – ODBC. Trang 144 . nh ng ph i có trình u khi n c s c thù do nhà phát tri n cung c p ho c c a m t hãng th ba nào ó. không thích h p cho các ng d ng ch y trên máy khách nh : Aplet. ho c c ch y trên máy ch trong mô hình nhi u t ng (Multi . Servlet JDBC Driver ODBC Mã Native Database driver Database Mô hình truy c p CSDL qua c u n i JDBC Vì r ng trình u khi n ODBC ph i c cài t vào trong máy tr c khi b n có th d ng nên nó ch thích h p cho các ng d ng máy n.tier).

Applet . Servlet JDBC Driver M¹ng Java Middle Ware Mã JAVA Java Native driver Database Ki u 4 : JDBC k t n i thông qua các trình u khi n hoàn toàn mã java Trang 145 .Mã JAVA { { Java Application . Servlet JDBC Driver Database driver Mã Native Database Mô hình k t n i tr c ti p Ki u 3 : JDBC k t n i thông qua các ng d ng m ng trung gian i ki u k t n i này. máy ch s ch u trách nhi m k t n i v i c s d li u . Applet . Máy khách ch s d ng nh ng trình u khi n g n nh (thin) có kh n ng giao ti p i ng d ng trung gian thông qua m ng truy v n d li u . Mã JAVA { { Java Application .

Servlet Internet JDBC Driver Mã JAVA Java Native driver CSDL III.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 p.sql a) M t s giao di n Tên giao di n CallableStatement DatabaseMetaData PreparedStatement ResultSetMetaData Connection Driver ResultSet Statement Mô t ý ngh a Giao di n ch a các ph ng th c cho phép ta làm vi c v i th c l u tr n i Cho phép ta xem các thông tin v CSDL Giao di n này cho phép ta th c thi các câu l nh SQL ch a tham s Th hi n m t k t n i n CSDL Giao di n mà m i trình u khi n ph i cài t Th hi n m t t p các b n ghi l y v t CSDL Giao di n cho phép ta th c hi n các phát bi u SQL Trang 146 .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. M t s giao di n và l p trong gói java. Applet .Ki u này cho phép máy khách s d ng trình u khi n c s d li u c thù trên máy ch u khi n g n nh n i k t tr c ti p vào trình xa thông qua m ng Internet . gói javax.sql. 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. Gói java. 1.sql và javax. Mã JAVA { { Java Application .

qu n tr ph n d li u c a ch ng trình. hay còn g i là ki u d li u JDBC 2. Thi t l p k t n i ây là b c quan tr ng nh t bao g m hai b Trang 147 c: . Th c hi n các l nh làm vi c v i CSDL nh : truy v n. Chu n b a) Cài t JDBC và trình 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 u khi n và các th vi n JDBC API. gi i phóng tài nguyên.b) Mét s l p Tên l p Date DriverPropertyInfo Timestamp DriverManager Time Types Ý ngh a p bi u di n ki u DATE Ch a các thu c tính c a trình u khi n ã n p L p bi u di n cho SQL TimeTemp L p qu n lý các trình u kh ên p bi u di n ki u DATE p nh ngh a các h ng t ng ng v i các ki u d li u SQL. M t s l p và giao di n trong gói javax. Tr c khi truy c p vào h CSDL nào b n ph i có trong tay trình u khi n t ng ng v i h CSDL ó.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. c p nh t… óng k t n i. 2. 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: o b ng.sun. m t ch ng trình java (hay b t c ch ng ngôn ng nào khác) ph i tuân theo các b c sau: k t n i n CSDL. view. 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 u kh ên t ng ng.. th t c l u tr . Các b c xây d ng m t ng d ng CSDL v i JDBC: ng trình vi t 1.sql Tham kh o tài li u v JDBC IV. â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 ng nh m c ti n b n có có th mua c h qu n tr ó. B n có th download các trình u khi n cho m t s h CSDL quen thu c t a ch java. K t n i CSDL v i JDBC có th làm vi c v i CSDL.

n mã dùng n CSDL thông qua trình u khi n mà b n t o m t k t n i thông th ng nh sau: Connection con = DriverManager. "myLogin". m t kh u truy c p là theht thì câu l nh k t n i n CSDL là Connection con = DriverManager. dùng n p trình u khi n JDBC-ODBC u khi n khác nhau thì URL c a ph ng th c Class.forName(URL) khác nhau. "myPassword"). b) T o m t k t n i c ti p theo b n t o m t k t n i a n p b c trên.jdbc. bi t c URL t ng ng.myLogin là tên truy c p. Nên có th n p úng trình u khi n b n nên thao kh o tài li u i kèm a các trình u khi n. n u b n s d ng c u n i JDBC-ODBC thì url là “jdbc:odbc:DataSourceName”. u khi n dùng k t u khi n b n s d ng l nh Class. getConnection(“jdbc:odbc:TestDB”. 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 n p và ng ký trình Trong ó URL là m t chu i mô t các thông tin v tên c a trình i v i c s d li u.odbc."theht".url là chu i ch a thông tin k t n i n CSDL.forName("sun.a) N p trình u khi n JDBC s d ng m t b trình qu n lý u ki n (DiverManager). ch ng h n tôi ã t o m t DNS tên là TestDB v i tên truy c p là theht. n u m t không có m t kh u b n có th truy n cho nó m t xâu ng .forName() Chú ý: V i m i trình u khi n khác nhau. n u m t không có m t kh u b n có th truy n cho nó 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) t vài ví du: Ví d 1: N p trình u kh ên và k t n i n CSDL c a MySQL Trang 148 .JdbcOdbcDriver"). m i trình u khi n (Driver) cho phép ta làm vi c v i m t CSDL c th . "theht"). . ch ng h n l nh Class.myPassword là m t kh u truy c p. Trong ó : .getConnection(url.

getConnection( "jdbc:mysql://ServrName/DBName?user=UserName&password=Pass"). b n có th download t i a ch t MySQL.N p tình n t p tin này u khi n c a MySQL c nén theo chu n jar.mysql.getConnection "jdbc:microsoft:sqlserver://ServerName:ServerPort.N p trình u khi n Class.forName("com.SQLServerDriver"). Trang 149 .Password=Pass word.Trình u kh ên tury c p vào CSDL c a MySQL.Pass: là m t kh u truy c p Ví d 2: N p trình u kh ên và k t n i n CSDL c a SQL Server 7.ServerName: là tên c a máy ch CSDL .Driver")."Password").DatabaseName=DBName".com. sau khi download b n có m t t p tin duy nh t ã classpath tr .com .DatabaseName=DBName"). -K tn i n CSDL Connection conn = DriverManager. có m t trình u khi n mà ta nên s d ng ó là trình u khi n do chính hãng Microsoft cung c p.jdbc.jar install_dir: là th m c cài t . trình u khi n này hoàn toàn Free và h tr y các tính n ng c a Sql Server. ho c Connection conn = DriverManager. Class.UserName: là tên truy c p CSDL .0.a ch download www.sqlserver. . a ph n các trình u khi n u là các n ph m th ng m i.DBName: là tên c a CSDL .jar install_dir/lib/msutil.getConnection( " jdbc:microsoft:sqlserver://ServerName:ServerPort.microsoft.jar install_dir/lib/mssqlserver.jdbc.forName("com.microsoft. -K tn i n CSDL Connection conn = DriverManager. . 2000 Có r t nhi u trình u khi n cho MS SQL Server.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. "UserName".User=UserName.t classpath tr n 3 t p tin trên .

mdb".M k t n i b ng cách s d ng File DataSource Connection conn = DriverManager.+ ServerName: Là tên c a máy ch SQL + ServerPort: hi u c ng c a SQL.next()) System.getConnection(“jdbc:odbc:Driver={Microsoft Access Driver (*.forName("com.getConnection( "jdbc:microsoft:sqlserver://theht:1433.*. + DBName: là tên CSDL Ví d hoàn ch nh import java.DatabaseName=AA. .mdb)}.SQLServerDriver").M k t n i b ng cách s d ng DataSource Name + 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 Connection conn = DriverManager. while(rs.Chuy n CSDL làm vi c conn.sqlserver.getConnection(" jdbc:odbc:MyDB"). } catch (SQLException ex) {} } catch (ClassNotFoundException ex) { } } Ví d 3: N p trình u kh ên và k t n i n CSDL c a Access v i c u n i JDBC-ODBC 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. class Test{ public static void main(String[] args) { try { Class.setCatalog("DBName").getString("a")+ rs.getString("b")).microsoft. trình u khi n này do sun cung c p nó có tên là c u i JDBC-ODBC u khi n Class.user=sa. Statement st=conn.executeQuery("Select * from t").sql.DBQ=C:/Path/DatabaseName. JdbcOdbcDriver ").println(rs.password="). n u trong quá trình cài ng nh p vào SQL ng ng v i tài kho n ng nh p t mà b n không t i thì giá tr này là 1433 + UserName: Tài kho n + Password: t kh u t . Connection conn = DriverManager.jdbc. ResultSet rs=st.createStatement().jdbc.”) MyDB: tên c a DataSource Name mà b n ã t o Path: ng d n n CSDL Trang 150 . .odbc.forName("sun.N p trình .out.

util. //Charset làm vi c v i Unicode props. if (rs.next()) { System.getConnection(url.abc là m t kh u truy c p Trang 151 . 9i Trình u kh ên tury c p vào CSDL c a Oracle. String url = "jdbc:odbc:Driver={Microsoft Access Driver (*. "theht".theht là tên truy c p CSDL . } } } Ví d 4: p trình u kh ên và k t n i n CSDL c a Oracle 8i.@theht là tên c a máy ch CSDL .createStatement(ResultSet.forName("sun.'Toi là Access')"). b n có th tìm th y nó trong th m c %ORACLE_HOME%/JDBC/lib Class. ResultSet rs = stmt. import java.DatabaseName: tên CSDL Ví d hoàn ch nh import java.jdbc.execute("Insert Into tbl values('Xin chào '.getString("a") + "\t" + rs. Connection con = DriverManager.DBQ=C:/MyDB. props. } } catch (Exception ex) { ex.getString("b")).out. props).sql.getConnection("jdbc:oracle:oci8:@theht".put("user".printStackTrace(). //Chèn 1 b n ghi vào CSDL stmt.jdbc.executeQuery("Select * from tbl"). b text(50))"). //T o b ng stmt.JdbcOdbcDriver").put("password".*.*.println(rs. // L y v k t n i n CSDL Connection conn = DriverManager. Properties props = new Properties().executeUpdate("Create Table tbl(a text(50). "UTF8")."abc"). "guest").TYPE_SCROLL_SENSITIVE. class Test { public static void main(String a[]) { try { Class. props.CONCUR_UPDATABLE).forName("oracle.put("charSet". "guest").mdb". Statement stmt = con.odbc. ResultSet.mdb)}. .OracleDriver ").

createStatement(). Th c ra vi c có c p nh t c hay không còn ph thu c vào trình u kh ên và h qu n tr có h tr c p nh t hay không. 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 d li u hay UPDATE c p nh t d li u. PRICE FLOAT. 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 n s d ng m u sau: Statement stmt = con. TOTAL INTEGER)"). ch ng h n nh n l nh sau s d ng ph ng th c executeUpdate th c thi t câu l nh truy v n c p nh t stmt. i th i m này b n ch a có phát bi u SQL nào truy n n CSDL. 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. ConcurencyType). 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.executeUpdate("CREATE TABLE COFFEES"+"(COF_NAME VARCHAR(32). Statement stmt = con. i t t o it ng Statements b n s ng ph ng th c createStatement c a trong b c II. T ng tác v i CSDL T t c các l nh mà ta dùng t trong ba i t ng sau: it ng Dùng Dùng Dùng tác ng lên CSDL Mô t u có th th c hi n thông qua Satement PreparedStatement CallableStatement th c thi các l nh SQL không có tham s th c thi các l nh SQL có ch a tham s làm vi c v i th t c l u tr n i 1. 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. 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. SUP_ID INTEGER.createStatement(ResultSetType. T o ra m t JDBC Statements t i t ng Statements s giúp b n g i m t l nh SQL n h qu n tr CSDL.V. " + "SALES INTEGER. Sau ây là b ng các giá tr mà tham s ResultSetType có th nh n ng connection mà b n v a t o ra Trang 152 .

executeUpdate(DML_SQL_STRING). hay ch c 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 Statement theo m u: stmt. Ví d 2: Xoá các b n ghi c a b ng sinhvien có masv=01 stmt. \”Nguy n n An”).Ki u ResultSet TYPE_FORWARD_ONLY Cho bi t ResultSet nh n chi u t BOF n EOF c s thay c ch có th duy t theo m t TYPE_SCROLL_INSENSITIVE Cho phép duy t theo c hai chi u nh ng không th y i d li u c a ng i dùng khác cs TYPE_SCROLL_SENSITIVE Cho phép duy t theo c hai chi u nh ng th y thay i d li u c a ng i dùng khác Sau ây là b ng các giá tr mà tham s ConcurencyType có th nh n Ki u ConcurencyType CONCUR_READ_ONLY CONCUR_UPDATEABLE Cho bi t ResultSet không th c p nh t Cho bi t ResultSet có th c p nh t c c. Ví d 1: Thêm m t b n ghi vào b ng sinhvien stmt.executeUpdate(DML_SQL_STRING). UPDATE.executeUpdate(“DELETE sinhvien WHERE masv=01”). Trang 153 . tensv) values (\“01\”.executeUpdate(“INSERT INTO sinhvien(masv. it ng Trong ó: 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 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. 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. DELETE 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 ó: 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 ng sau l nh này.

7. Thêm b n ghi vào b ng CSDL 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. p nh t l i d li u c p nh t l i d li u b n s d ng m nh qua ph n làm stmt.executeUpdate( "DELETE FROM COFFEES").createStatement(). stmt.executeUpdate(“UPDATE sinhvien SET tensv=\”Nguy n V n B\” WHERE masv=01”). 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 Statement theo m u sau: ng th c executeQuery() c a i ng th c executeUpdate i có trình i h c lên 10 ng UPDATE SQL. 101. 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 ng ResultSet.executeQuery(QUERY_SQL_STRING).executeQuery(QUERY_SQL_STRING). 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. stmt. 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 ng Statement. Trang 154 . th c thi chúng thông Ví d 4: b n mu n c ng thêm ph c p cho t t c các ng ResultSet rs=stmt.executeUpdate( "UPDATE COFFEES " + "SET CP=PC+10 WHERE td=’dh’”). 0.executeUpdate("INSERT INTO COFFEES VALUES ('Colombian'.99. 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().Ví d 3: a l i tên c a sinh viên có masv=01 thành Nguy n V n B stmt. 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.

// S d ng ph ng th c getFloat vì c t PRICE có ki u float Trang 155 .executeQuery(query). 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 Các ph ng th c sau dùng di chuy n con tr : Ph next previous last first afterLast beforeFirst absolute(int pos) ng th c Ý ngh a Di chuy n con tr sang b n ghi k trong t p b n ghi. While(rs..getString("COF_NAME"). float n = rs. 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 Di chuy n con tr v tr c b n ghi u tiên trong t p b¶n ghi Di chuy n con tr v sau b n ghi cu i cùng trong t p b n ghi 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. PRICE FROM COFFEES". 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 â 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 relative(int pos) 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. ph c l i cho false ng th c tr v true n u vi c di chuy n là thành công ng Di chuy n con tr v b n ghi cu i cùng trong t p b n ghi.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. while (rs.executeQuery(“SELECT * FROM SinhVien”). 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 Di chuy n con tr v b n ghi u tiên trong t p b n ghi. ResultSet rs = stmt. ph ng th c tr true n u vi c di chuy n là thành công ng c l i cho false Di chuy n con tr v b n ghi tr c b n ghi hi n t i.next()) { //. 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.next()) { // s d ng ph ng th c getString vì c t //COF_NAME có ki u VARCHAR String s = rs.getFloat("PRICE"). ví d n u 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.

System.getString(1).getFloat("PRICE"). Và float n = rs. b i String s = 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 MN I E L O E U I H A O I A O A I I N A T G A O U C MT A R N N R N T MM Y L E I L A B I E I L GN N I E T T N R T T L MR E A I L C R C GA B GE E E HV R I V A A Y N A R R C H A R A R R B Y I N A R Y getByte getShort getInt getLong getFloat getDouble getBigDecimal getBoolean getString getBytes getDate Trang 156 x x x X x x x x x x x x x x x x x X x x x x x x x x x x x x x X x x x x x x x x x x x x x X x x x x x x x x x x x x x X x x x x x x x x x x x x x X X x x x x x x x x x x x x x X X x x x x x x x x x x x x x X x x x x x x x x x x x x x X X x x x x x x x X X x X x S T A M P . b i float n = rs. } 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 Ch ng h n trong ví d trên b n có th thay String s = rs.getString("COF_NAME").out.println(s + " " + n).

“Nguy n Van t”). 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(). Ta có các ph ng th c updateXXX() khác nhau ng v i các ki u d li u mà JDBC tr . 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. // Xác nh n s thay i rs. c ch c p nh t này ch có tác d ng i v i n ghi hi n hành. Nh v y khác v i các l nh SQL-DML.getTime getTimestamp getAsciiStream getUnicodeStream getBinaryStream getObject th s d ng ph Trong b ng trên v trí trí ánh “X” thì ph x x x x x x x x X x x x x x X x x x x x X X x x x X x x x x x x x x x x x x x x x x x x x c ánh “x” trên hàng c a ph ng th c getXXX.first(). Trong ph n này ta s d ng các ph ng th c trong JDBC 2. “Nguy n Van H ng”). Ph ng th c này ho t ng ng t nh ph ng th c commit(). Nh updateFloat(). v ng th c này nh n v giá tr c a c t có ki u d li u t ng th c s d ng thích h p nh t ng th c ó là ph p nh t t p ResultSet Trong ph n tr c ta dùng các l nh SQL. thì ta có ng ng.updateString(“tensv”. // gán gía tr m i cho c t tensv rs.0 th c hi n c ng công vi c ó. Ví d : p nh t ResultSet rs. 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.DML c p nh t tr c ti p vào b ng c a CSDL. // Hu b vi c c p nh t trên Thêm b n ghi m i Trang 157 .last(). 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 n ghi c n s a b ng m t trong các ph ng th c ã li t trong ph n tr c. n xác nh n vi c c p nh t b ng ph ng th c updateRow().updateInt().updateString(“tensv”. 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á.cancelRowUpdate(). T ng t nh ph ng th c getXXX() khi ta nh n thông tin t b ng. // Nh y n b n ghi cu i cùng rs. // Nh y n b n ghi u tiên rs.updateRow(). th nên các ResultSet này c n ph i là các ResultSet c p nh t c.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. // gán gía tr m i cho c t tensv rs.

// c 3: Xác nh n s thêm m i Chú ý: + 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 t ó s nh n các giá tr NULL. // c 2: Gán gía tr cho các c t b ng ph ng //updateXXX() t ng ng rs.updateString("masv". // L y v k t n i Statement st=cn.TYPE_SCROLL_SENSITIVE.updateString("tensv". Ví d : Thêm b n ghi vào ResultSet Class. 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.Ngoài vi c s d ng các l nh SQL-DML th thêm chúng b ng cách thông qua các ph c. Th c hi n vi c n các giá tr vào các c t t ng ng b ng các ph ng th c updateXXX()."Nguy n T Hào").5.updateDate("namsinh".moveToCurrentRow(). 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 . + Không có ph ng th c ta hu b vi c thêm m i b n ghi. M t ResultSet c p nh t Th c ch t nó ch là m t vùng m thêm các b n ghi trong b ng. ta còn có ng th c c a it ng ResultSet c p nh t c luôn t n t i m t b n ghi 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 Di chuy n con tr n b n ghi t m insertrow b ng ph ng th c moveToInsertRow().odbc.new Date(2004. // N p trình ng th c insertRow() u kh ên Connection cn=DriverManager.insertRow().JdbcOdbcDriver"). ResultSet.getConnection("jdbc:odbc:t").executeQuery("SELECT * FROM sinhvien").30)). B n ghi này không là m t thành ph n c a ResultSet. Ta g i ph xác nh n vi c thêm m i b n ghi vào b ng và ResultSet.jdbc.createStatement(ResultSet. Sau khi ch c ch n r ng các giá tr thêm vào là úng. Các b c xoá m t b n ghi kh i ResultSet Trang 158 . Xoá b n ghi xoá m t b n ghi b n có th s d ng các l nh SQL-DML.forName("sun. rs. //L y v t p ResultSet rs. // c 1: Di chuy n con tr n b n ghi t m thêm m i rs.CONCUR_UPDATABLE)."005"). c bi t g i là insertrow dùng cho vi c thêm m t b n ghi m i. //T p ResultSet có th c p nh t c ResultSet rs=st. rs. 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.

length. "French_Roast_Decaf"}. coffees[i]). S d ng i t ng Prepared Statements Khi nào s d ng i t ng Prepared Statements?. th thì b n ph i s d ng 100 l nh executeUpdate chèn 100 dòng. rs.ô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.setString(2.deleteRow(). int len = coffees. // Xóa b n ghi u tiên // Xoá b n ghi th 3 // Xoá b n ghi cu i cùng 2.last(). . b n s t câu h i có các nào mà ch n phân tích l nh. 100 l n t i u hoá l nh. String updateString = "update COFFEES set SALES = ? where COF_NAME like ?".setInt(1. Trang 159 . do v y ph i t 100 l n phân tích l nh. n b n ghi c n xoá u kh ên mà vi c xoá c th c hi n ngay hay ch là ánh d u ng th c deleteRow(). updateSales = con. 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. "Espresso". 155.executeUpdate(). trong tr ng h p này b t bu c b n ph i s d ng truy v n tham s hoá. câu tr l i c phân tích sau: .deleteRow(). Chú ý: Tu vào trình Ví d : Xoá b n ghi rs. công vi c này m t r t nhi u th i gian. rs. i++) { updateSales. 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. for(int i = 0. rs.absolute(3). 150. 60. n u b n c n chèn 100 dòng vào CSDL.deleteRow(). updateSales. 90}. "Colombian_Decaf". updateSales. salesForWeek[i]). i < len.prepareStatement(updateString). vâng cách ó chính là i t ng Prepared Statements.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. rs.first(). sau ó i u l nh SQL. "French_Roast". rs. String [] coffees = {"Colombian". int [] salesForWeek = {175.Di chuy n con tr i ph xoá. t i u l nh ch m t l n mà thôi.

prepareStatement( "UPDATE COFFEES SET SALES = ? WHERE COF_NAME LIKE ?").setAutoCommit(false). t trong ng d ng vi t ng java. t c là nó t ng commit sau khi th c thi thành công m t l nh n. updateTotal.commit(). updateSales.setAutoCommit(false). 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 c l u tr n i Các b c: 1.setAutoCommit(true).} Nh b n th y qua ví d trên : + L yv i t ng PreparedStatement b n s d ng ph ng th c prepareStatement 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. G i th t c executeXXX() t ng ng th c thi th t c l u tr .executeUpdate(). 50). // tác ng lên CSDL PreparedStatement updateSales = con.commit b n có th quy t nh commit hay rollback l i m t nhóm nh. // Xác nh n commit con. updateSales.setInt(1.prepareStatement( "UPDATE COFFEES SET TOTAL = TOTAL + ? WHERE COF_NAME LIKE ?").executeUpdate().setString(2. updateTotal. CallableStatement cs = con. Ví d : // T t ch auto-commit con.setString(2. "Colombian"). 3. // t l i ch auto-commit con. updateSales. updateTotal.prepareCall("{call tên_th _t c_l u_tr }"). 2. tuy nhiên b n có th tl i ch auto. Qu n lý giao d ch Khi m t k t n i c t o. 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. nó c t trong tr ng thái auto. 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() a i t ng prepareStatement. "Colombian").setInt(1. 50). Nh n mã sau: con. it ng này có ph ng th c prepareCall giúp b n có th g i th VI.commit. Ví d : L p truy c p AccessDriver Trang 160 . PreparedStatement updateTotal = con.

//Updatable test ResultSetMetaData rd = rs. "Cap nhat du lieu bang 455454ResultSet"). import java. i++) //return feildName System. //System.*. pro.executeUpdate("Delete from test where a='12'").executeUpdate( "Insert Into Test(a. //Nap trinh dieu khien Access } catch (ClassNotFoundException ex) { System. else System.put("charSet". i <= cols. ResultSet rs = st.updateRow().createStatement(ResultSet. public class AccessDriver { public static void main(String[] args) throws SQLException.prepareStatement("Insert into test(a.println("Rs is ReadOnly").jdbc. } try { Properties pro = new Properties().JdbcOdbcDriver").IOException{ try { Class.deleteRow(). rs. st. Statement st = conn. "rs.CONCUR_UPDATABLE) System. //ma unicode String urldb ="jdbc:odbc:Driver={Microsoft Access Driver (*.insertRow().getConnection(urldb.*.odbc.setString(2.setString(1. PreparedStatement pst = conn. //PreparedStatement interface thuc thi sql co tham so dau vao System. rs.out.println(yes).execute(). Trang 161 . rs. System.println("Rs is Updatable"). //Xoa du lieu bang ResultSet rs. if (rs. "UTF8").moveToCurrentRow().out. import java. st.updateString("a".util.out. "Tran Thi Hong Ha"). Connection conn = DriverManager.CONCUR_UPDATABLE). pst.update"). //lay ve tap ban ghi //cap nhat du lieu bang ResultSet // rs.out.out. for (int i = 1.mdb)}.'Nguyen Xuan Truong')"). String sql = "Select * from test". //rs. // st. rs.moveToInsertRow().ResultSet.io.sql.print(rd. rs.mdb".forName("sun. pst.absolute(1) " + rs.*. "0021").println("Rs.absolute(3). pro).DBQ=c:/data. //st.import java.executeQuery(sql). int cols = rd.getString(1)).print("Error: " + ex.b) values (?.out.?)").getColumnLabel").getConcurrency() == ResultSet.executeUpdate("Create Table Test (a text(10).TYPE_SCROLL_SENSITIVE.updateString("b".getColumnLabel(i) + ( (i == cols) ? "\n" : "\t")).b text(255))").getMetaData().getMessage()).println("Start----->rd.executeUpdate("update test set b='dhrhrtr' where a='0021'").getColumnCount(). boolean yes = pst.b) values ('1234'.out.

getMessage()).jdbc.getString("a") + " " + rs.out. while (rs.user=test.SQLServerDriver").next()) { //hien thi thong tin.out. Statement st=conn.close().getMessage()). conn.out.getString("b")).user=sa. public class SQLDriver { public static void main(String []a){ try{ //Nap trinh dieu khien SQLServer Class.println("OK").println("End----->rd.exit(0). conn.next()){ System.println("--------------------------------"). } catch (SQLException ex) { System.password=secret String url="jdbc:microsoft:sqlserver://xuantruong:1433.println("Can not load driver " +ex.print("Error: maxlenght 10 " + ex.System. } } } Ví d : L p truy c p SQLDriver import java.previous()) { System.out. } catch(ClassNotFoundException ex){ System. } } Ví d :L p truy c p JdbcOdbcDriver Trang 162 .executeQuery("Select * from tblSach"). in xuoi System.createStatement().out. } //jdbc:microsoft:sqlserver://server1:1433.getString(2)). } catch(SQLException ex){ System.DatabaseName=BOOK. while(rs. } rs.println(rs. } rs.microsoft.forName("com. System.passwor d=". } System.getString("b")). //in nguoc lai while (rs.println("Can not connection to database " + ex.out.exit(0).println(rs. ResultSet rs=st.*.sql. try{ Connection conn=DriverManager.getString(1)+"\t\t"+rs.close().out.close().getMessage()).println(rs.sqlserver.out. rs.getConnection(url).last(). } System.close().out.getColumnLabel").getString("a") + " " + rs. System.

executeQuery(sql).out. } } catch(SQLException e) {System.forName("sun.sql.TenKH.welcome.sql.'Hoang Anh'.getInt("Id").package com.borland."login". import javax.out. double l=rs.'900')".DiaChi. int n=stmt.out. String url="jdbc:odbc:myDatabase".println("Co "+ n +" ban ghi nao duong cap nhat"). Statement stmt=conn.getDouble("Luong").TenKH. String d=rs. if (n < 1) System.1".getConnection(url.out.executeUpdate(sql0).Luong) VALUES('8'. while (rs. try{ Class.println("Khong co ban ghi nao duong cap nhat").println("ID=" +id +" " + s+ " " + d + " Luong=" + l) .DiaChi. public class Connect { public static void main(String args[]) throws ClassNotFoundException. String s=rs.out. Connection conn=DriverManager.executeUpdate(sql2).SQLException { System.println("Loi thao tac CSDL"). ResultSet rs=stmt.samples.getString("DiaChi").odbc."password"). stmt.jdbc.createStatement().getString("TenKH").'HP'.next()) { int id=rs. import java.*. //Doc Record ra mh String sql="SELECT Id. else System.JdbcOdbcDriver"). //Them record vao bang String sql0="INSERT INTO KhachHang(Id.println("Ket noi CSDL").*.Luong FROM KhachHang". System.} } } Trang 163 . //Cap nhat du lieu (Tang luong cho cac cong nhan) String sql2="UPDATE Khachhang SET Luong=Luong+luong*0.

có th t ng t ng. yêu c u t i thi u các b n ph i n m c 3 giao th c : IP. chúng ta g i/ nh n d li u gi a 2 máy.net 1. gi ng nhau gi a 2 giao th c TCP và UDP 1. nh danh này c th hi n b ng a ch IP ho c a ch d i d ng Trang 164 . Socket là m t s tr u t ng hoá m c cao. Kh o sát m t s l p trong gói java. có th s d ng Socket liên l c theo mô hình Client/Server. a ch broadcash. multicash… . nó nh là m t thi t b truy n thông 2 chi u t ng t nh t p tin.T o l p hay m m t Socket + G n m t Socket v i m t a ch . thông qua giao di n này ta có th l p trình u khi n vi c truy n thông gi a 2 máy d ng các giao th c m c th p nh TCP. và ng c l i -M ts a ch c bi t: a ch l p.Phân bi t c s khác nhau. TPC. 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 ch Socket. a ch d ng tên mi n. t t c các l p liên quan n vi c p trình Socket c java nhóm l i và trong gói java. 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.Ch ng 8: L P TRÌNH SOCKET I. t ng t nh vi c c/ ghi trên t p tin.Giao th c.C ng giao th c . 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: . nh danh này ph i là duy nh t. ta c n ti n hành các thao tác: .Cách ánh a ch IP.Application Program Interface) d ng ng. UDP . L p InetAddress i m t máy khi tham gia truy n thông c n ph i có m t nh danh. Gi i thi u Socket Socket là m t giao di n l p trình ng (API . liên l c thông qua Socket. c th l p Socket cung c p cho ta c ch liên l c trong ch k t n i (s 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).net II. 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 2. 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 i thông 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 m: ng i g i không ch c ch n thông p c a h có n tay ng i nh n không t thông p có th g i nhi u l n thông p g i sau có th n ích tr c thông 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. UDP…. giao th c chuy n i a ch IP thành a ch tên mi n. 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.

V y th thì làm th nào a ch máy ó d ng t xa ho c nhà cung c p d ch v Internet. Trang 165 . Có m t s ph ng th c sau mà b n c n i d ng m ng byte Tr v m ng i t ng InetAddress.net. 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. 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 p java. khi ta mu n a ch IP c a máy xa. ta ph i bi t c a ch c a m t máy nào ó.InetAddress tr c khi có th s d ng nó. ôi khi ta không th bi t chính xác vì nhi u nguyên nhân khác nhau nh : máy ó kh i ta l i có 1 a ch IP khác nhau. tuy nhiên a a ch IP c a máy ó. p InetAddress cung c p m t s ph ng th c t nh (static) dùng i d ng tên mi n thành quan tâm: Ph ng pháp So sánh 2 yv it ng a ch IP d Mô t Public void equals( Object obj) Public byte[] getAddress() public static InetAddress[] getAllByName(String host) throws UnknownHostException public static InetAddress getByName(String host) throws UnknownHostException public String getHostAddress() public String getHostName() public static InetAddress getLocalHost() throws UnknownHostException public boolean isMulticastAddress() a ch IP và ng c l i. tên này là m t xâu kí t d i d ng tên mi n ho c a ch IP Tr v a ch IP c a máy ch ng InetAddress k t h p v i chính Tr v tên c a máy ch Tr v it máy ó Ki m tra xem a ch này có ph i là Multicast không a ch Chú ý: Trong gói java. Tr l i i t ng InetAddress có tên c ch ra. vì m t máy có th có nhi u a ch IP (do có nhi u card ng). b i c n i vào ch IP thì r t khó nh .tên mi n. do v y m i l n k t n i vào nhà cung c p d ch v ISP ta có th liên l c v i máy a ch d ng tên mi n chuy n i d a ch xa khi ta ch bi t i d ng tên mi n?. L p InetAddress bi u th cho m t liên l c v i m t máy xa.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. l p này t ng chuy n thành a ch IP và ng c l i. câu tr l i là l p InetAddress ã làm u ó cho ta.

n u không tìm th y nó tìm ti p trong t p host.edu.theht.net. Ví d 2: T o ra m t InetAddress t import java.*.getByName("www.vn"). n u không th phân gi i c tên này thì nó s sinh ra m t t chúng vào m t kh i try . class InetAddress1 { public static void main(String[] args) { try { ng th c getByName InetAddress address = InetAddress. } catch (UnknownHostException ex) { System.1").vn/127.println("Could not find this computer's address. class MyAddress { public static void main(String[] args) { try { InetAddress address = InetAddress.edu.out.getLocalHost().. n máy ch DNS yêu c u phân gi i a ch IP.out.edu.vn"). th nên b n c n Ví d 1: Minh ho cách s d ng các ph import java. System.out. } } } ng ng v i máy c c b : t qu ch y ch ng trình nh sau: Trang 166 .println("Could not find www.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.168. System.").catch.getByName("192. } } } t qu ch y ch ng trình nh sau: www. } catch (UnknownHostException ex) { System.0. t o ra m t InetAddress u v n không tìm th y nó s c g ng k t n i tên này thành ngo i l UnknownHostException.0.theht.out.101.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.println(address).theht.*.println(address).net.

getAllByName("www.168.out.5").101.theht. } } } Trang 167 . } catch (Exception ex) { System.com c a Microsoft c cài bao nhiêu b giao ti p m ng b ng cách thayInetAddress.microsoft.theht. for (int i = 0.2www.println(ex).com").10.out.vn /10.90. 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. } } } ng ng v i a ch IP cho t ng card m ng ó: t qu ch y ch ng trình nh sau: www.0.edu. class AllAddressesOfTheht { public static void main(String[] args) { try { InetAddress[] addresses = InetAddress.getAllByName("www. } } catch (UnknownHostException ex) { System.10.println("Could not find www.*.println(ia.163.edu.theht.163.err.net. l y v tên c a máy ta s d ng ph ng th c getHostName nh sau: import java.out.theht.net.edu.theht.theht.edu.edu.edu.vn /162. Ví d 4: y v tên máy khi bi t a ch IP c a nó.168.length.*. b i InetAddress.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 ng các InetAddess t import java.vn /192. i++) { System.25s d cho k t qu nh trên là do máy c a tôi có cài 4 card m ng.getAllByName("www.theht1/192.vn /3.vn").getByName("162.0. t ng ng v i m i card m ng tôi t m t d a ch IP cho nó.theht.vn").getHostName()).println(addresses[i]).101.microsoft. class ReverseTest { public static void main(String[] args) { try { InetAddress ia = InetAddress. System.vn"). i < addresses.edu.152.5www.1www.

*. System.edu. String dottedQuad = me.getHostAddress().getByName("www. ch ng h n b n có th l y v ch IP c a máy www. class GetHostAddress1 { public static void main(String[] args) { try { InetAddress me = InetAddress.theht. String dottedQuad = me.168.println("Address is " + dottedQuad). } catch (UnknownHostException ex) { System.101. class GetHostAddress { public static void main(String[] args) { try { InetAddress me = InetAddress.").*.println("I'm sorry.out. } catch (UnknownHostException ex) { System.com nh sau: import java.168. System.out.out. } } } ch IP c a máy khi bi t tên c a máy.net.1 Trang 168 . l yv a ch IP c a máy ta s ng th c getHostAddress nh sau: t qu in ra nh sau: My address is 192.101.println("I'm sorry.").1Ta 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.out.vn").println("My address is " + dottedQuad).microsoft.edu.vn ho c www.getLocalHost().theht.t qu ra nh sau: theht Ví d 5: L y v ng ph import java.net. I don't know my own address. } } } t qu in ra nh sau: Address is 192. I don't know my own address.getHostAddress().

io. } } else { BufferedReader in = new BufferedReader(new InputStreamReader(System.*. InetAddress add2 = InetAddress.out. import java. } } catch (UnknownHostException ex) { System.Ví d 6: Ki m tra xem hai u này ta s d ng ph import java.length. ki m tra n th c equals nh sau: class Equal { public static void main(String args[]) { try { InetAddress add1 = InetAddress. if (add1.in)).vn"). Trang 169 .out.equals(add2)) { System. } else { System. public class HostLookup { public static void main(String[] args) { if (args.*. i++) { System.edu.theht.println("Hai dia chi nay co cung IP").").out. } } } t qu cho nh sau: Hai dia chi nay khac nhau Ví d 7: Xây d ng ch ng trìn HostLookup t ng t nh ch ng trình NSLookup c a Windows.vn").getByName("www.length > 0) { // Su dung tham so dong lenh for (int i = 0.println(lookup(args[i])).getByName("www.com.out. i < args.println("Hai dia chi nay khac IP"). a ch tên mi n có cùng m t a ch IP hay không.net.*.net. 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.theht.println("Khong the tim thay host.

println(lookup(host)). } } //Hàm ki m tra xem a ch host d i d ng tên mi n hay private static boolean isHostname(String host) { char[] ca = host.equalsIgnoreCase("exit") || host.getHostAddress().readLine().getByName(host). for (int i = 0. i++) { a ch IP Trang 170 . } } catch (IOException ex) { System. } System.equalsIgnoreCase("quit")) { break. } if (isHostname(host)) { //Dia chi nay duoi dang ten mien return node.length.Enter \"exit\" or \"quit\" to quit.System. i < ca.err. if (host. try { node = InetAddress. } else { // Dia chi nay duoi dang IP return node. } } } private static String lookup(String host) { InetAddress node.println( "Enter names and IP addresses. } catch (UnknownHostException ex) { return "Cannot find host " + host.getHostName().out.").out.toCharArray().println(ex). try { while (true) { String host = in.

edu. 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 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 a l p nó ném ra ngo i l MalformedURLException.anc. } } 2.isDigit(ca[i])) { if (ca[i] != '. testProtocol("mailto:elharo@metalab.poly. Có sáu 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.*.net.za/"). } catch (MalformedURLException ex) { System. } } return false. // hypertext transfer protocol testProtocol("https://www.unc. // secure http // file transfer protocol testProtocol("ftp://metalab.edu/").org").err.')return true.adc.amazon. 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 ng. // gopher testProtocol( // Lightweight Directory Access Protocol Trang 171 . } 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.if (!Character. 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 . // local file access testProtocol("gopher://gopher.org.com/exec/obidos/order2/"). class ProtocolTester { public static void main(String[] args) { testProtocol("http://www.println(ex).edu/pub/languages/java/javafaq/"). 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 t i t ng URL m i. 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.utehy. mà b n không c n ph i quan tâm n giao th c c s d ng. // Simple Mail Transfer Protocol testProtocol("telnet://dibner.vn/").edu").unc. // telnet testProtocol("file:///etc/passwd").

// custom protocols for HotJava testProtocol("netdoc:/UsersGuide/release. // NFS. testProtocol("nfs://utopia. } } } 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 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. System. // a custom protocol for JDBC // rmi.edu/usr/tmp/").adc.out.edu/o=University%20of%20Michigan.unc. p tin mà URL này s d ng. } catch (MalformedURLException ex) { // All VMs should recognize http } n ch ng trình trên t o ra m t URL ch n http://www.getProtocol() + " is supported").com/index.unc.html").html.edu/RenderEngine").out.c=US?postalAddress"). testProtocol("systemresource://www.adc. testProtocol("verbatim:http://www.itd. String hostname.println(u. public URL(String protocol. System.html"). a custom protocol for remote method invocation testProtocol("rmi://metalab."ldap://ldap.metalab. Ví d : try { URL u = new URL("http".poly.class"). url.org/"). ftp=23.substring(0.println(protocol + " is not supported"). String file) throws MalformedURLException Hàm t o này s t ng t port là giá tr m c nh. ng m c nh là 80 Trang 172 .. } private static void testProtocol(String url) { try { URL u = new URL(url). } catch (MalformedURLException ex) { String protocol = url. tên máy ch .jar!" + "/com/macfaq/io/StreamCopier. testProtocol( // JAR "jar:http://cafeaulait.org/books/javaio/ioexamples/javaio.umich.com"..microsoft.microsoft.org/+/index. 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. testProtocol("doc:/UsersGuide/release. "www. "/index.indexOf(':')).html"). Network File System testProtocol("jdbc:mysql://luna.html").edu:3306/NEWS"). chúng cho bi t: Giao th c.

println("The fragment ID of " + u + " is " + u. email=25.println(ex). trong ví d sau thì getRef s tr v xtocid1902914 URL u = new URL( "http://www.html.phtml?category=Piano").3 Trang 173 .public int getDefaultPort( ) tr v c ng m c nh c a giao th c c s d ng.3 tr v ng d n n file.public String getAuthority( ) // Java 1.ibiblio. .out..err.ibiblio. String relative) throws MalformedURLException Ví d : try { URL u1 = new URL("http://www. ng d n này th ng là t query string. } catch (MalformedURLException ex) { System.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.html").getRef( )).err.public String getHost( ) tr v tên c a máy ch . "mailinglists.ibiblio.ibiblio.org/javafaq/javafaq.ibiblio.html"). "localhost". String host.. . cú pháp nh sau: public URL(URL base.println(ex). ftp=23.html còn u2 thì ang tr n http://www.3 tr v user name . System.public String getFile( ) tr v tên t p tin .html").org/nywc/compositions.public String getUserInfo( ) // Java 1.org/javafaq/index.public String getPath( ) // Java 1.getQuery( )).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.org/javafaq/ mailinglists.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.org/javafaq/index. } Ví d này t o ra m t URL tr n http://localhost: 8080/index. "/index. Ví d nh : http=80. } Trong ví d này thì u1 ang tr n http://www.out. System.public int getPort( ) tr v c ng c s d ng . 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".html#xtocid1902914"). . 8080.println("The query string of " + u + " is " + u. int port. URL u2 = new URL (u1. t vài ph ng th c c a l p URL .public String getQuery( ) // Java 1. } catch (MalformedURLException ex) { System.public String getRef( ). .

class URLSplitter { public static void main(String args[]) { try { URL u = new URL("http://java. } else { System.").println("is not a URL I understand.getProtocol()).getHost().println("The path is " + u.out.println("The query string is " + u.getUserInfo()). System. } System.getRef()).comThe scheme is httpThe user info is nullThe host is java.5 public Object getContent( ) throws IOException public Object getContent(Class[] classes) throws IOException // 1.out.com").println("The user info is " + u.net.println(). System.println("The scheme is " + u. System. System.out. } // end main } // end URLSplitter t qu ch y ch ng trình nh sau: The URL is http://java. } System.println("The ref is " + u.getPort()).*.indexOf('@').substring(atSign + 1).println("The host is " + host).sun. if (atSign != -1) host = host.getQuery()).out. Trang 174 .out.err.println("The port is " + u. System. System.sun.getPath()).comThe port is -1The path is The ref is nullThe query string is nullc) Nh n v d li u t URL 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.out.println("The host is null.out.").Ví d sau minh ho các ph ng th c trên import java.out.println("The URL is " + u).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. String host = u.out.sun. if (host != null) { int atSign = host. System.out. } // end try catch (MalformedURLException ex) { System.

N u ph ng th c này th t b i nó ném ra ngo i l IOException.. InputStream in = u.openConnection( ). } Trang 175 .Ph .err. int c. // read from the connection.println(ex). // buffer the input to increase performance in = new BufferedInputStream(in). } } // end main } // end SourceViewer t qu ch y nh sau: <html><head><meta http-equiv="Content-Type"content="text/html.err. InputStream in = uc.err.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.jennicam. import java.net. try { URLConnection uc = u. while ( (c = r.*. class SourceViewer { public static void main(String[] args) { try { //Open the URL for reading URL u = new URL("http://localhost:80/index. Ví d : try { URL u = new URL("http://www. } // end try catch (IOException ex) { System.println( is not a parseable URL")..html").io. // chain the InputStream to a Reader Reader r = new InputStreamReader(in).println(ex).getInputStream( ). } } // end try catch (MalformedURLException ex) { System. } catch (IOException ex) { System.VnTime">Xin chào các b n</font></p></body></html> 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 .*. charset=iso-88591"><title> Web Posting Information </title></head><body><p><font face=".err. } } catch (MalformedURLException ex) { System.out.openStream().org/").read()) != -1) { System.print( (char) c).println(ex).

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.1 M t s hàm t o c a l p Socket a) public Socket(String host.image.getContent(). N u Socket không th m vì b t c lý do nào thì nó ném ra ngo i l IOException. 3. try { Object o = u. Trang 176 .www. Sau ây là t s hàm t o c a l p Socket. } // end try catch (IOException ex) { System.URLImageSource URL 3.HttpURLConnection$HttpInputStreamN u thay u = new URL("http://localhost:80/index.getName()).Trong java 1. 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.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 .*. N u nh không n t i máy này thì nó s ném ra m t ngo i l UnknownHostException. class ContentGetter { public static void main(String[] args) { //Open the URL for reading try { URL u = new URL("http://localhost:80/index.err.*. import java.Ph ng th c public final Object getContent( ) throws IOException Ví d : import java. IOException Ta th ng s d ng hàm t o này k t n i n máy ch .http.gif").println("is not a parseable URL").io.net.err.protocol.net. k t qu thu c nh sau: I got a sun. b i URL u = new URL("http://localhost:80/print. i v i máy khách nó th ng dùng t n i n máy ch .println(ex).getClass(). System. Trong hàm t o này tên c a máy là m t xâu ký t . } } // end try catch (MalformedURLException ex) { System. L p Socket L p này c dùng cho c máy ch và máy khách.html"). tên c a máy ch có th là tên mìên ho c a ch IP.println("I got a " + o. int port) throws UnknownHostException.out. } } // end main } // end ContentGetter t qu ch y nh sau: I got a sun.html").awt.

.public Socket(String host.err. Socket socket = new Socket("www.err.theht. 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.theht..edu.println(ex). 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 : K t n i n web server www.135.println(ex). // work with the sockets. 80. Ví d : try { InetAddress inward = InetAddress. int port. 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. } Trang 177 .public Socket(InetAddress host.5"). 80).vn". 0).vn trên c ng 80 try { InetAddress theht = InetAddress. Socket thehtSocket = new Socket(theht .edu. int localPort) throws IOException.println(ex).5".theht.err..theht.println(ex). } catch (UnknownHostException ex) { System. } catch (IOException ex) { System. } catch (UnknownHostException ex) { System. } catch (IOException ex) { System.10.err. InetAddress interface. 80).getByName("162.println(ex).edu....vn".edu. //~ Socket toTheht= new Socket("162.163. } . Ví d sau k t c ng k t n i n máy ch www.getByName("theht"). 80). //~ InetAddress theht = InetAddress. // send and receive data.10. inward.err.err. // send and receive data.vn try { Socket toTheht= new Socket("www.edu.println(ex).theht. } catch (IOException ex) { System. } .getByName("www. } catch (UnknownHostException ex) { System.vn").

} catch (UnknownHostException ex) { System.2. InetAddress interface..err.err. int localPort) throws IOException Hàm t o này c ng t ng t nh hàm t o trên.err. inward. System.sun.err. 80). 0). } catch (IOException ex) { System.println("Connected to remote host " + host).out.public Socket(InetAddress host.err. 80.sun. } 3. try { Socket theSocket = new Socket("java.getInetAddress( ). int port.com".println(ex).Ph ng th c public int getPort( ) dùng l y v c ng c a máy remote. 80).theht.err. InetAddress http= InetAddress.println("Connected on remote port " + port).println(ex).vn").Ph ng th c public InetAddress getInetAddress( ) dùng l y v i t ng InetAddress ng ng v i máy remote. } . Ví d : try { InetAddress inward = InetAddress. System.println(ex).getByName("theht").. Socket socket = new Socket(http..println(ex). } catch (IOException ex) { System. L y v thông tin g n v i Socket . InetAddress host = theSocket. } // end try catch (UnknownHostException ex) { System.println(ex). // work with the sockets. } catch (IOException ex) { System. Ví d : try { Socket theSocket = new Socket("java.getPort( ).com".edu. } Trang 178 . int port = theSocket.getByName("www. } // end try catch (UnknownHostException ex) { System.out.println(ex).

edu.err. 80). 80).println(ex).println(ex).err. Ví d : try { Socket theSocket = new Socket(hostname. } .out.getLocalAddress()). int localPort = theSocket.io.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 sau in ra màn hình m t s thông tin g n v i Socket import java.com".*.println("Connecting from local port " + localPort). 80). System. System.getLocalPort() + " of " + theSocket.getPort() + " from port " + theSocket. InetAddress localAddress = theSocket.theht. } // end try catch (UnknownHostException ex) { System.println(ex). Ví d : try { Socket theSocket = new Socket("java.println("Connected to " + theSocket.getLocalAddress( ). public class SocketInfo { public static void main(String[] args) { try { Socket theSocket = new Socket("www.*.Ph ng th c public InetAddress getLocalAddress( ) dùng l y v InetAddress gán v i card m ng dùng giao ti p.vn".getLocalPort( ).out. } it ng Trang 179 . } // end try catch (UnknownHostException ex) { System. } // end try catch (UnknownHostException ex) { System.net.out.sun.println("I can't find host").. } catch (IOException ex) { System.println(ex).getInetAddress() + " on port " + theSocket.println("Connecting from local address " + localAddress).err. import java. } catch (IOException ex) { System. System.err.err.

ó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 ng minh óng Socket l i. try { connection = new Socket("www.theht. 3..Ho c khi b thu rác c a java c ti n hành. } } // end main } // end SocketInfo .catch (SocketException ex) { System. 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: .Ph ng th c public InputStream getInputStream( ) throws IOException ph ng th c này dùng nh n v m t InputStream. } finally { // óng Socket l i if (connection != null) connection.err. } catch (IOException ex) { System. Vi c óng Socket l i s gi i phóng m t s tài nguyên c a h th ng.println("Could not connect to host").Ph ng th c public OutputStream getOutputStream( ) throws IOException dùng l y m t OutputStream.Khi ch ng trình k t thúc.println(ex). } // end try catch (UnknownHostException ex) { System.C hai lu ng nh p xu t g n v i Socket u c óng l i. Ví d sau th hi n u ó: ocket connection = null. Tuy các Socket c ng t ng óng l i khi c n thi t. m b o Socket luôn c óng l i cho dù có ngo i l x y ra hay không. thì ch p lý nh t óng Socket l i là trong kh i finally. Vi c g i d li u n máy remote c thông qua OutputStream này.println(ex).3.vn".err. ..close( ). } catch (IOException ex) { System. .err. } Trang 180 . 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ó.edu. Vi c nh n d li u t máy remote c th c hi n thông qua InputStream này.println(ex). nh ng m t thói quen th c hành t là nên g i n ph ng th c close() khi không còn dùng n nó n a. 80). . // interact with the socket.err.

out.isConnected( ) && ! socket.write("GET / HTTP 1. 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.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.4.getOutputStream( )).4 tr lên) ph ng th c này tr v tru n u nh Socket ã c óng l i..0\r\n\r\n")..isClosed( )) { // do something. Truy n trong ch haft duplex K t phiên b n java 1.shutdownOutput( ). } 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. try { connection = new Socket("www... // read the response. 80).4 tr lên) ph ng th c này tr v true n u b n ã t ng t n i n máy xa hay ch a và nh n v false trong tr ng h p ng c l i. Socket connection = null. . /* óng lu ng xu t l i. Writer out = new OutputStreamWriter(connection. } else { // do something else. 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.flush( ). Th nên ki m tra xem Socket có ang m hay không b n c n s d ng n ch ng trình sau: boolean connected = socket.isClosed( ).edu. 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.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 ó. 3.Ph ng th c public boolean isClosed( ) (ch có trong java 1. out. khi này b n ch có th truy n ho c nh n m t chi u (haft duplex)..vn".Ph ng th c public boolean isBound( ) (ch có trong java 1. do v y ta nên óng l i gi i phóng tài nguyên. nh n v false trong tr ng h p ng c l i..theht. } catch (IOException ex) { } finally { try { Trang 181 . ..

} catch (IOException ex) {} } 4. } catch (IOException ex) { System. int queueLength. Tuy nhiên trong m t s tr ng h p nó r t h u d ng. 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). 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. Ví d : T o m t ServerSocket l ng nghe trên c ng 80.*. class LocalPortScanner { public static void main(String[] args) { for (int port = 1.net. IOException public ServerSocket(int port.N u không th t o ra m t ServerSocket thì nó s ném ra ngo i l IOException .close( ). } Chú ý: . 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. 4. Bây gi ta xét c th t ng hàm t o: . int queueLength) throws BindException.io. import java.4 Các hàm t o này xác nh c ng. Tuy nhiên trong tr ng h p này máy khách khó có th k t n i n nó vì không bi t rõ c ng.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.if (connection != null) connection.*.println(ex).err. import java. Nó th ng c s d ng l ng nghe m t k t n i n. M t s hàm t o c a l p ServerSocket: public ServerSocket(int port) throws BindException. 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. IOException public ServerSocket(int port. Trang 182 .Hàm t o public ServerSocket(int port) throws BindException. port <= 65535. IOException Hàm t o này s t o ra m t ServerSocket l ng nghe trên c ng port. L p ServerSocket p này ch dùng cho phía máy ch .1. InetAddress bindAddress) throws IOException public ServerSocket( ) throws IOException // Java 1. try { ServerSocket httpd = new ServerSocket(80).

Tuy nhiên ServerSocket ch ng nghe trên b giao ti p m ng c ch ra trong tham s th 3. 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 . tuy nhiên nó ch a th c s l ng nghe trên c ng nào c . th s liên k t v i m t c ng nào ó b n c n g i ph ng th c bind().println(ex).10. try { ServerSocket httpd = new ServerSocket(3456. 100. int queueLength. 100). 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 : 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.163. IOException Hàm t o này có nhi m v t ng t hàm t o tr c ó. t o ra t ServerSocket l ng nghe trên c ng 3456.10.Hàm t o public ServerSocket(int port. 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. } catch (IOException ex) { System.4 Hàm t o này t o ra m t ServerSocket. Ví d : Gi s r ng máy c a b n có hai b giao ti p m ng.err.Hàm t o public ServerSocket(int port. } // end catch } // end for } } .4 throws IOException Trang 183 . b giao ti p m ng 162.101.println(ex).").1.} catch (IOException ex) { System.5 (ch không ph i là 192.101. InetAddress. public void bind(SocketAddress endpoint) throws IOException // Java 1. m t b giao ti p m ng có a ch 162.5")).println("There is a server on port " + port + ". } . } .4 public void bind(SocketAddress endpoint.5 và m t b giao ti p m ng khác có a ch 192. ây là ph ng th c ch có trong java 1. try { ServerSocket httpd = new ServerSocket(3456.163.168.1) và cho phép 100 yêu c u k t n i.Hàm t o public ServerSocket( ) throws IOException // Java 1. int queueLength) // Java 1.out.4 tr lên. } catch (IOException ex) { System.168.10. InetAddress bindAddress) throws BindException. int queueLength) throws IOException.err.163.getByName("162.

net. ServerSocket ss = new ServerSocket( ). OutputStreamWriter out = new OutputStreamWriter(connection. //T o ra m t i t ng SocketAddress liên k t SocketAddress http = new InetSocketAddress(80).*.write("You've connected to this server. } } } Ch ng trình trên máy khách //Client.java import java. 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 ó. //Liên k t ServerSocket v i c ng 80 ss.io.. Chú ý: Ph ng th c accept() ch ch p nh n m t k t n i n mà thôi. // Thi t t m t s thu c tính cho Socket. Bye-bye now. while (true) { Socket connection = server.java import java. out.2. 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.accept().*.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. class Server { public static void main(String[] args) throws IOException { ServerSocket server = new ServerSocket(3456). ch p nh n 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.getOutputStream()). connection. out. import java. 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.flush().close(). 4..net.\r\n"). Vi c giao ti p v i máy khách c ti n hành thông qua Socket này.*.io. 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. class Client { public static void main(String[] args) throws IOException { Socket sk = new Socket().bind(http). Trang 184 .*. import java.

. System.public boolean isClosed( ) //N u k t n i ang m thì tr v tru và ng c l i.isClosed( ).. 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 i n t Client Trang 185 .close( ). } } 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.out.read().SocketAddress sv = new InetSocketAddress("theht1". } while (true). Ví d : ServerSocket server = new ServerSocket(port).connect(sv). liên l c b ng giao th c UDP. L p DatagramSocket p này dùng t o ra m t Socket 6. TCP Socket . Tuy nhiên m t phong cách l p trình t t là luôn óng i m t cách t ng minh khi không còn s d ng n nó n a.print( (char) c).. if (c == -1)break. 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 t thúc. Nó c s d ng III. c g i i b ng giao th c UPD. int c. tuy nhiên n u k t n i ch a c m thì nó c ng tr v false . //Làm m t s vi c server. do { c = in. L p DatagramPacket p này th hi n cho m t gói d li u i l p DatagramSocket.getInputStream(). sk. 3456). b thu rác c ti n hành. Trong java 1. 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. 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. } 5.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.isBound( ) && ! ss.4 b sung thêm hai ph ng th c: . InputStream in = sk.public boolean isBound( ) // Tr v true n u nó ã t ng c liên k t v i t c ng nào ó. 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.

nh n c các i ng này ta g i ph ng th c getOutputStream() trên i t ng Socket. c 3) nh n v các i t ng outputStream và inputStream t i t ng Socket nh n v ph ng th c accept b c 2. i t ng outputStream cho phép ta g i d li u n client. g i và nh n d li u Vi t ch ng trình phía server thi t l p m t server ta theo các b c sau: c 1) o ra m t i t ng ServerSocket và liên k t nó v i m t c ng. port). 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. 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 c 2) Nh n v các i t ng inputStream và outputStream k t h p v i i t ng Socket connectToServer. 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. sequelLength]). Ho c ServerSocket s=new ServerSocket(). 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 [. 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. ta s s d ng i t ng này “giao ti p” v i máy khách Socket connectToClient=s. m t cho 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. 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 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 i d ng thô. thông th ng vi c óng k t n i c kh i ng t phía máy khách Trang 186 . c 4) X lý d li u g i n t client và g i g i tr d li u.Liên l c trong ch k t n i s s d ng giao th c TCP. tuy n này s b phong to cho n khi có m t k t i n.bind(InetAddress addr.accept(). các i t ng này s giúp ta g i/nh n d li u t máy client. còn ch ng trình phía client thì kh i x ng yêu c u k t n i . ch ng trình server có nhi m v l ng nghe và ph n h i k t n i m i. ph ng th c này tr v m t i t ng Socket. b c này t ng t nh b c 3 trong ph n vi t ch ng trình cho server c 3) lý d li u nh n v / g i i thông qua 2 i t ng outputStream và inputStream c 4) óng k t n i gi i phóng tài nguyên. s.port). thông th ng ta s d ng hàm t o 2 i nh sau: Socket connectToServer=new Socket(serverName. Vi t ch ng trình phía máy khách Vi c vi t ch ng trình cho client g m m t s b c c b n sau: c 1) o ra m t Socket k t n i n máy ch . nh n tham chi u n i t ng outputStream v n liên k t v i i t ng này. sau khi goi ph ng th c.

} catch (Exception ex) { ex.out. } catch (Exception ex) {} } } } Ví d 2: Xây d ng ch ng trình EchoClient và EchoServer.read(). public class EchoServer { public static void main(String args[]){ try{ ServerSocket server = new ServerSocket(3456). out. class SocketClient { public static void main(String[] args) { PrintWriter out = null.edu.html HTTP/1.getHostName(). Xây d ng ch ng trình phía máy ch import java.Ví d 1: Nh n v trang index.vn". String destName =client.theht. int localPort = server.html tr máy ch web www.io.getLocalPort(). out. import java.*.edu."). try { Socket http = new Socket("www.0\r\n\r\n"). System.net. } finally { try { out.out.*.flush().println("Accepted connection to "+destName Trang 187 .accept().getInetAddress(). do { c = in. Socket client = server. InputStream in = http.write("GET /index.io.out. } while (true). System. System.close(). OutputStream raw = http.*. OutputStream buffered = new BufferedOutputStream(raw).theht. int c.net.*.getPort(). import java.print( (char) c). int destPort = client.getOutputStream().getInputStream().println("Echo Server is listening on port"+localPort+". if (c == -1)break. out = new PrintWriter(buffered).vn và in ra màn hình import java. 80).printStackTrace().

} while(!finished). } catch (Exception e) { System.vn". public class EchoClient { public static void main(String args[]) { ClientConnect client = new ClientConnect("www.getOutputStream()). } } } Xây d ng ch ng trình phía máy khách import java. out = new DataOutputStream(connection. do { String inLine = inStream. outStream. client.io. int port) { try { connection = new Socket(destination.write(10). String outLine=new StringBuffer(inLine.close().edu. client.reverse().close(). }catch (IOException e){ System.println("Sent: "+outLine).theht. outStream.getInputStream())).close().getBytes()).println(e). System. outStream.out.*. System.println("Connected to server at port 3456. BufferedReader in.trim()).*.flush(). inStream. server.net. BufferedReader inStream = new BufferedReader( new InputStreamReader(client. DataOutputStream outStream = new DataOutputStream(client.toString().out. DataOutputStream out.readLine().println("Received: "+inLine).+" on port "+destPort+".requestServer().write(outLine.write(13).out. boolean finished = false.out."). outStream. public ClientConnect(String destination. } } class ClientConnect { Socket connection. outStream.getOutputStream()).equalsIgnoreCase("quit")) finished=true."). 3456).getInputStream())).close().println(e).shutdown(). if(inLine. System. import java. port). in = new BufferedReader(new InputStreamReader(connection.out. } Trang 188 . client.

} } } Ví d : ta vi t m t ví d n gi n nh sau: Trang 189 .writeBytes(sendLine). break.length() > 0) { line = line. System. String line = keyboardInput.write(10).out. switch (line.out. out. } } } catch (Exception e) { System.println().out.flush(). if (line.} public void requestServer() { BufferedReader keyboardInput = new BufferedReader( new InputStreamReader(System. receive.close().write(13). } catch (IOException ex) { System. System. do { try { System.println(e). boolean finished = false. } public void shutdown() { try { connection.out.out. out. System. case 'Q': finished = true. out.flush().charAt(0)) { case 'S': String sendLine = keyboardInput. break.read()) != '\n') System.write(inByte). while ( (inByte = in.println("IO error closing socket"). default: break. or quit (S/R/Q): ").readLine(). case 'R': int inByte.toUpperCase(). break. } } while (!finished).in)).out. out.print(">>>>").readLine().print("Send.out.

theht. 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.net.* 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.*. //Vòng l p vô t n ph c v yêu c u while (true) { a = in. DataOutputStream out = new DataOutputStream(connectToClient. 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 : package net. // nam Giap Than Socket connectToClient = s.// tr v k t qu cho máy khách out.getInputStream()).readDouble().readDouble(). getOutputStream()). kq = 0. chi u r ng và kích chu t vào nút tính.// l y chiêu r ng kq = a * b. import java.io. b = 0. try { ServerSocket s = new ServerSocket(2004).// dôn h t DL ra } } catch (IOException ex) { } } public static void main(String[] args) { Trang 190 .*. import java.flush().// l y chi u dài b = in.accept(). 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 . public class Server { public Server() { double a = 0. // ch p nh n k t n i // l y v i t ng nh p/xu t DataInputStream in = new DataInputStream(connectToClient. d li u g m có chi u dài và chi u r ng s c g i n máy 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.writeDouble(kq).// tính k t qu out.

net.awt. JLabel jLabel3 = new JLabel().setForeground(Color. 21)). import javax. } } Mã ngu n phía máy khách: package net. 0.setBounds(new Rectangle(101. 13)).Font(". jtfKetQua. //lu ng xu t boolean isConnect = false. 77. public class Frame1 extends JFrame{ JLabel jLabel1 = new JLabel(). Trang 191 .setFont(new java.*. JTextField jtfRong = new JTextField().*. 86.Font(".setLayout(null).setForeground(Color. 13)). 12. Socket connectToServer. jtfKetQua.setToolTipText("").*. 113. // lu ng nh p DataOutputStream out.getContentPane().event.printStackTrace(). } } void jbInit() throws Exception { jLabel1. 25)).*. 78.setFont(new java. jtfKetQua. jtfDai. 57. JButton jtfCompute = new JButton(). 21)).VnCourier New".setBounds(new Rectangle(16. jtfRong. JButton jtfConnect = new JButton().io. import java.swing.red). 46. jLabel2. jtfRong.*.theht.setText("K t qu "). 0. JButton jtfClose = new JButton(). import java. jLabel1. JTextField jtfKetQua = new JTextField().VnCourier New".VnCourier New". this. 0. jtfKetQua. jLabel2.white). jtfKetQua. jLabel2.setBounds(new Rectangle(102.Server server1 = new Server(). import java.awt.setBounds(new Rectangle(16.red). 13)).setText("Chi u dài").red).setText("Chi u r ng").setBounds(new Rectangle(14. DataInputStream in.Font(". jtfDai.awt. } catch (Exception ex) { ex.awt.setEditable(false). jLabel3. 25)). 44.setDisabledTextColor(Color.awt. jLabel1. 113. jLabel1. import java.setFont(new java.red).setText(""). //bi n ki m tra xem ã k t n i ch a public Frame1() { try { jbInit().setBackground(Color.setForeground(Color. 21)). jLabel3. jLabel3. JLabel jLabel2 = new JLabel(). 15. JTextField jtfDai = new JTextField().

CENTER). jtfCompute.Font(". this. out = new DataOutputStream(connectToServer.setBounds(new Rectangle(228. this. } 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".addActionListener(new Frame1_jtfConnect_actionAdapter(this)).addActionListener(new Frame1_jtfCompute_actionAdapter(this)).setBounds(new Rectangle(229.swing.SwingConstants. jtfClose. 85. jtfConnect. jtfClose.setFont(new java. 25)).CENTER).addActionListener(new Frame1_jtfClose_actionAdapter(this)).getContentPane(). 78.getOutputStream()).getContentPane(). this. "loi". this.add(jtfDai.VnCourier New".show(). null). 0.setTitle("Test Client/Server").setText("K t n i"). } public static void main(String[] args) { Frame1 frame1 = new Frame1(). isConnect = true.ERROR_MESSAGE). } catch (UnknownHostException ex) { JOptionPane.awt. 30)). this.setBounds(100. null).add(jtfKetQua. null).Font(". "khong tim thay may chu". 87. 130). jtfConnect.getContentPane(). this. 12)).add(jtfClose. jtfCompute. jtfCompute.VnCourier New".setFont(new java.add(jtfRong. null).showMessageDialog(this. 12)).Font(".CENTER).swing.add(jLabel3.setHorizontalAlignment(SwingConstants. 0. this. 10.setText(" óng"). 2004).getContentPane(). jtfConnect. jtfCompute. null). null). 44.SwingConstants.setBounds(new Rectangle(102. jtfConnect.add(jLabel2. JOptionPane. 30)).getContentPane(). this. 78. null).getInputStream()).add(jLabel1.awt.setVerticalAlignment(javax. 30)). frame1. 113. null). frame1. jtfConnect. in = new DataInputStream(connectToServer.getContentPane(). this. null). this. 86. jtfClose.setVerticalTextPosition(javax.getContentPane(). jtfClose.add(jtfCompute.setDefaultCloseOperation(EXIT_ON_CLOSE). 0.setText("Tính"). jtfConnect.awt.add(jtfConnect.VnCourier New".getContentPane().setBounds(new Rectangle(230.setFont(new java.getContentPane().setHorizontalTextPosition(SwingConstants. } Trang 192 . jtfConnect.jtfKetQua. 350. jtfConnect. 12)). 100. this.CENTER).

"loi". // 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. JOptionPane.ActionListener{ Frame1 adaptee.adaptee = adaptee.getText())). // g i chu u dài out. // thoát kh i ch ng trình } } // t o ra l p u h p. áp ng s ki n kích chu t vào nút tính class Frame1_jtfCompute_actionAdapter implements java.event.ActionListener { Frame1 adaptee.close(). } } } void jtfCompute_actionPerformed(ActionEvent e) { if ( (in == null) || (out == null)) // n u ch a k t n i thì báo l i JOptionPane. áp ng s ki n kích chu t vào nút k t n i class Frame1_jtfConnect_actionAdapter implements java.flush().awt. Trang 193 . } } // 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. "Ban nhap sai. } public void actionPerformed(ActionEvent e) { adaptee.ERROR_MESSAGE). // y h t d li u ra jtfKetQua. "loi".showMessageDialog(this. //g i chi u r ng out. JOptionPane.catch (IOException ex) { JOptionPane.parseDouble(jtfRong.awt.readDouble())).exit(0).ERROR_MESSAGE). // óng k t n i } catch (IOException ex) { } System. "Ban phai ket noi truoc khi tinh". } catch (IOException ex) { JOptionPane. "khong the guu/nhan du lieu\nCo the do ban chua ket noi". "co loi ve nhap xuat". Ban phai nhap so". Frame1_jtfConnect_actionAdapter(Frame1 adaptee) { this.parseDouble(jtfDai.getText())).ERROR_MESSAGE).jtfConnect_actionPerformed(e).setText(String.writeDouble(Double. JOptionPane. JOptionPane.showMessageDialog(this.event. "loi".ERROR_MESSAGE).writeDouble(Double.showMessageDialog(this. "loi". } } // t o ra l p u h p.showMessageDialog(this. try { out.valueOf(in.

ActionListener{ Frame1 adaptee. máy ch ch có th ph c v duy nh t m t khách.jtfClose_actionPerformed(e).io. Database server. ta ch thay i ch ng trình trên máy ch nh sau: package net. } public void actionPerformed(ActionEvent e) { adaptee. new HandleClient(connectToClient). } } // t o ra l p u h p.//ch y m t lu ng ph c v } } catch (IOException ex) { } } Trang 194 . Trong th c 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 m.net. b n ch c n t o ra m t lu ng ph c v cho m i khách. áp ng s ki n kích chu t vào nút óng class Frame1_jtfClose_actionAdapter implements java. ví d nh Web server.*. // ch p nh n k t n i new HandleClient(connectToClient).adaptee = adaptee. 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). Th t n gi n. while (true) { Socket connectToClient = s.event.Frame1_jtfCompute_actionAdapter(Frame1 adaptee) { this.jtfCompute_actionPerformed(e). ta có th làm c vi c này b ng k thu t a lu ng.adaptee = adaptee. và a thêm vào n mã t a nh sau: ServerSocket s = new ServerSocket(port). while (true) { Socket connectToClient = s.theht.accept(). Frame1_jtfClose_actionAdapter(Frame1 adaptee) { this. import java. } Ta s a l i ví d trên có th ph c v c nhi u máy khách.… 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.*. import java.awt. ch ng trình phía máy khách v n gi nguyên. } public void actionPerformed(ActionEvent e) { adaptee.accept(). } } n m t ngu n nhi u khách Trong ví d trên ta nh n th y.

start(). không th bi t c d li u g i i có n c ích không. khi liên l c trong ch không k t n i java s d ng giao th c UDP trong vi c u khi n truy n và nh n d li u.getInputStream()).readDouble().writeDouble(kq). // tr v k t qu cho máy khách out.s = s. DataOutputStream out = null. ch không ph i l p giao th c m ng hay java. } catch (IOException ex) { } //Vòng l p vô t n ph c v yêu c u while (true) { try { a = in. b = 0. 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. b i h không n ng l c Trang 195 . Trong th c t h m c k cho l i s y ra. sau ó cho ch y 2 ti n trình client. kq.getOutputStream()). Do v y không có xác nh n v d li u g i. b n ph i gi i quy t u ó. // l y chiêu r ng kq = a * b.} class HandleClient extends Thread{ private Socket s. out = new DataOutputStream(s. private double a = 0.flush(). } public void run() { DataInputStream in = null. không yêu c u ph i có 1 server luôn l ng nghe k t n i. public HandleClient(Socket s) { this. // l y chi u dài b = in.readDouble(). try { in = new DataInputStream(s. // tính k t qu out. this. // dôn h t DL ra } catch (IOException ex1) { } } } } sau khi s a l i b n cho kh i ng server. 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.

addActionListener(new Frame2_jbtExit_actionAdapter(this)). hai ch ng trình này là ngang hàng không có ch ng trình nào là ch c .VnCourier New".io. l p DatagramSocket cho phép ta g i/ nh n v các gói d li u t máy xa. import javax.setEditable(false). b i l Socket dòng s ng giao th c TCP. Ta gi i thích thông qua ch ng trình chat. 71. 0.*. private JButton jbtSend = new JButton().*. 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. 205. ch ng trình g m có 2 ch ng trình. jbtG id. 12)).*.addActionListener(new Frame2_jbtSend_actionAdapter(this)). jtaSend. import java.*. private JScrollPane jScrollPane2 = new JScrollPane(). private JScrollPane jScrollPane1 = new JScrollPane(). jbtSend. jbtSend.setText(""). 0. jbtExit.setText("").awt. nên nh ng u lo l ng ó không bao gi s y ra. } catch (Exception ex) { ex.awt. jtaRev.getContentPane(). import java. private DatagramPacket sen. // khai báo các bi n c n thi t private DatagramSocket s. public class Frame2 extends JFrame{ private JTextArea jtaSend = new JTextArea(). } } void jbInit() throws Exception { this.setDisabledTextColor(Color.setLayout(null).Font(". jbtExit. 12)). i t ng DatagramSocket g i i ho c nh n v .làm u ó.setFont(new java.rev. jbtExit. 174.setBounds(new Rectangle(315. liên l c trong ch không k t n i ta s d ng l p DatagramSocket và l p DatagramPacket. public Frame2() { try { jbInit(). import java. jbtSend.swing. import java.awt.setText("Thoat").awt.VnCourier New". private JTextArea jtaRev = new JTextArea(). 69.setFont(new java.event. private boolean isFirstLine=true.net.gray).setBounds(new Rectangle(314. 24)).seG ixt(G iu"). private JSplitPane jSplitPane1 = new JSplitPane(). jbtExit. jtaRev. Trang 196 . private JButton jbtExit = new JButton().*. jtaRev.theht.printStackTrace(). l p DatagramPacket cho cung c p cho ta công c óng gói d li u UDP.Font(". th nên gi i pháp an toàn cho b n là Socket dòng. 25)).

// nh n v d li u if (isFirstLine == true) { jtaRev. dat. 0.setOrientation(JSplitPane. jSplitPane1. } catch (SocketException ex) { } } private void nhan() { while (true) { // vùng m nh n d li u byte[] dat = new byte[100]. } catch (IOException ex) { } } } private void dong() { try { s. jSplitPane1.append("\n" + new String(rev. //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). isFirstLine = false.setDefaultCloseOperation(HIDE_ON_CLOSE). Trang 197 . 0.add(jtaSend. jSplitPane1.TOP).// óng k t n i } catch (Exception ex) { } System. } public static void main(String[] args) { Frame2 frame2 = new Frame2().getViewport().setDividerLocation(150).close().getLength())).BOTTOM).setTitle("Chuong trinh chat su dung giao thuc UDP").add(jSplitPane1.getContentPane(). this. 224)). 7.add(jScrollPane1. try { s.length).getViewport().add(jbtExit. null).VERTICAL_SPLIT). jScrollPane1. null). rev. 300.exit(0). this.setBounds(new Rectangle(6.getContentPane(). this.add(jbtSend.getData().addWindowListener(new Frame2_this_windowAdapter(this)). JSplitPane.getData().add(jScrollPane2.add(jtaRev.receive(rev). // t o ra i t ng DatagramPacket nh n gói d li u rev = new DatagramPacket(dat. null). null). null). this.append(new String(rev.getContentPane(). jScrollPane2.jSplitPane1. this. JSplitPane. this.getLength())). jSplitPane1. } else jtaRev. rev.

local. 100. } void jbtSend_actionPerformed(ActionEvent e) { byte dat[] = jtaSend.length. InetAddress local = null. } } class Frame2_jbtSend_actionAdapter implements java.awt.send(sen). } } class Frame2_jbtExit_actionAdapter implements java.nhan(). "khong the gui duoc"). } public void actionPerformed(ActionEvent e) { adaptee. frame2.jbtSend_actionPerformed(e).getLocalHost(). } Trang 198 .show().jbtExit_actionPerformed(e). Frame2_jbtSend_actionAdapter(Frame2 adaptee) { this. } catch (UnknownHostException ex) { } // T o ra i t ng DatagramPacket g i gói d li u sen = new DatagramPacket(dat. Frame2_jbtExit_actionAdapter(Frame2 adaptee) { this.ActionListener{ private Frame2 adaptee. frame2. } void this_windowClosing(WindowEvent e) { dong(). } } void jbtExit_actionPerformed(ActionEvent e) { dong().frame2.getBytes(). 4002).exit(0).adaptee = adaptee. System. try { s. try { local = InetAddress.event. } public void actionPerformed(ActionEvent e) { adaptee.setBounds(100. // G i d li u i } catch (IOException ex1) { JOptionPane. 280).adaptee = adaptee. dat.awt.ActionListener{ private Frame2 adaptee.showMessageDialog(this.event. 400.getText().

awt. jbtSend.getContentPane().addActionListener(new Frame3_jbtSend_actionAdapter(this)).io. import java. private JScrollPane jScrollPane1 = new JScrollPane().*.*. 69.awt. 183.swing. rev.setText("Thoat"). private DatagramSocket s.seG ixt(G iu").setFont(new java.WindowAdapter{ private Frame2 adaptee. public Frame3() { try { jbInit().this_windowClosing(e). private DatagramPacket sen. private JTextArea jtaSend = new JTextArea().adaptee = adaptee. private JSplitPane jSplitPane1 = new JSplitPane(). public class Frame3 extends JFrame{ private JTextArea jtaRev = new JTextArea().event.VnCourier New".printStackTrace(). private JScrollPane jScrollPane2 = new JScrollPane().*.awt. import java. private boolean isFirstLine = true. } public void windowClosing(WindowEvent e) { adaptee.event. this.setLayout(null).} class Frame2_this_windowAdapter extends java. jbtExit.addActionListener(new Frame3_jbtExit_actionAdapter(this)). } catch (Exception ex) { ex. jtaRev. private JButton jbtExit = new JButton(). Frame2_this_windowAdapter(Frame2 adaptee) { this. 24)). 0. jbtSend. jbtExit. jbtG id. Trang 199 .*. import java.setText("").*.setBounds(new Rectangle(315.net. import javax. import java.setEditable(false). jbtSend.theht.Font(".awt.addActionListener(new Frame3_jbtSend_actionAdapter(this)). } } void jbInit() throws Exception { jtaRev. private JButton jbtSend = new JButton(). } } Ch ng trình th hai: package net. jbtSend. 12)).

getContentPane().setOrientation(JSplitPane. this.getLength())).setTitle("Chuong trinh chat su dung giao thuc UDP").close().setBounds(new Rectangle(314.setFont(new java. 12)). dat. JSplitPane. isFirstLine = false.append("\n" + new String(rev. 296. 7.add(jtaRev. null). 219)).getContentPane(). rev. } catch (SocketException ex) { } jScrollPane2. } { } public static void main(String[] args) { Trang 200 . this. null). 0. jbtExit. } catch (IOException ex) { } } } private void dong() { try { s.add(jSplitPane1.BOTTOM).jbtExit.getLength())). jScrollPane1. null).getData(). JSplitPane. } private void nhan() { while (true) { byte[] dat = new byte[100]. 71. this. jSplitPane1. this. jSplitPane1.TOP). try { s. null).setDividerLocation(150).getData().setDefaultCloseOperation(HIDE_ON_CLOSE). null).exit(0).setBounds(new Rectangle(5.length). null).add(jtaSend. rev = new DatagramPacket(dat.add(jScrollPane2.getContentPane(). jSplitPane1.awt.VERTICAL_SPLIT).add(jtaRev. 0.Font(". 24)). if (isFirstLine == true) { jtaRev. this. //user code try { s = new DatagramSocket(4002).receive(rev).getViewport().getViewport(). } catch (Exception ex) System.add(jbtExit. 0.add(jScrollPane1.addWindowListener(new Frame3_this_windowAdapter(this)).getViewport().append(new String(rev. } else jtaRev. 156.VnCourier New". this. jSplitPane1. jScrollPane1. jSplitPane1.add(jbtSend. rev.

WindowAdapter{ private Frame3 adaptee.getText(). } public void actionPerformed(ActionEvent e) { adaptee.event.Frame3 frame3 = new Frame3().ActionListener{ private Frame3 adaptee.getBytes(). Frame3_jbtExit_actionAdapter(Frame3 adaptee) { this. } catch (UnknownHostException ex) { } sen = new DatagramPacket(dat. 2004).jbtExit_actionPerformed(e). try { local = InetAddress.setBounds(100. Frame3_this_windowAdapter(Frame3 adaptee) { Trang 201 . } void this_windowClosing(WindowEvent e) { dong(). } public void actionPerformed(ActionEvent e) { adaptee.adaptee = adaptee. "khong the guu duoc").show(). } void jbtSend_actionPerformed(ActionEvent e) { byte dat[] = jtaSend. } } class Frame3_jbtSend_actionAdapter implements java. 100. } } void jbtExit_actionPerformed(ActionEvent e) { dong(). 280).event.send(sen). local.getLocalHost(). frame3.nhan(). try { s. } } class Frame3_this_windowAdapter extends java.ActionListener{ private Frame3 adaptee. InetAddress local = null. Frame3_jbtSend_actionAdapter(Frame3 adaptee) { this.awt.event.adaptee = adaptee.awt.awt. } catch (IOException ex1) { JOptionPane. } } class Frame3_jbtExit_actionAdapter implements java.showMessageDialog(this.length.jbtSend_actionPerformed(e). frame3. frame3. dat. 400.

và c t vào trong vùng m buf -g i d li u b ng ph ng th c send.setBounds(new Rectangle(84.*. int offset. Trang 202 . 19)).event. this. 34. c ng c ch ra. Hàm t o này s t o ra i t ng DatagramSocket ho t ng trên c ng c ch ra. 274. import java.receive(datagramSocket) Ví d ChatApp.net. c a l p DatagramSocket datagramSocket. import java. 187. 93. int offset.awt.sen(datagramSocket) . } } 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: o ra i t ng DatagramSocket nh n và g i d li u. int length. 21)). addrText.*. int length) hàm t o này th ng dùng trong vi c nh n d li u có dài length .*. 183.*. public class ChatApp extends Frame { TextField msgText = new TextField().setBounds(new Rectangle(15. b ng hàm t o c a nó nh sau: s = new DatagramSocket(port). 277.DatagramPacket(byte[] buf. Label label1 = new Label(). 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. int port) nh n v li u trên máy. TextField addrText = new TextField(). TextArea replyText = new TextArea(). b t u t m offset + DatagramPacket(byte[] buf. int length. replyText.adaptee = adaptee. InetAddress address. import java.awt.this. label1. public ChatApp(){ this.java import java. 89)). c a l p DatagramSocket datagramSocket. 208. 55. InetAddress address.setSize(new Dimension(297.setBounds(new Rectangle(17.setTitle("Java Chat"). 214)).io. Sender sender=new Sender(). label1.Nh n d li u b ng ph ng th c receive. ng cách s d ng ham t o c a l p DatagramPacket + DatagramPacket(byte[] buf.setBounds(new Rectangle(16. msgText.setText("talking with").setLayout(null). this.this_windowClosing(e). } public void windowClosing(WindowEvent e) { adaptee. int port) 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 + DatagramPacket(byte[] buf. int length) th ng dùng hàm t o này khi nh n d li u +length. Button sendButt = new Button(). 23)).

InetAddress serverAddress. } public static void main(String args[]){ ChatApp app = new ChatApp(). null). byte inBuffer[] = new byte[bufferLength].add(sendButt. } } class Sender{ DatagramSocket listenerSocket.2345).add(msgText.add(replyText. null).sendData(addrText.setText("127. } catch (Exception e){ System. 28)). 94.addrText. int bufferLength = 256. listenerSocket. String localHost. this. } } Trang 203 .setLabel("Send"). null).event. outDatagram = new DatagramPacket(outBuffer.0. sendButt. String data){ try{ serverAddress = InetAddress.getByName(DestAddr). listener. outBuffer = data.getText()). byte outBuffer[].println(e).getBytes().1"). this. } }). null).add(addrText.ActionListener() { public void actionPerformed(ActionEvent e) { sendButt_actionPerformed(e).getText(). ListenerThread listener=new ListenerThread(app.add(label1. public void sendData(String DestAddr.addActionListener(new java.exit(0).length. null). this. app.awt. outBuffer = new byte[bufferLength]. this. } }).send(outDatagram).serverAddress.start().out.replyText).outBuffer.show().msgText.0. sendButt. DatagramPacket outDatagram.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent event){ System. DatagramPacket inDatagram. sendButt. } void sendButt_actionPerformed(ActionEvent e) { sender. 61.setBounds(new Rectangle(15. this. app.

String data = new String(inDatagram.println("IOException occurred.getAddress().getLocalPort(). byte inBuffer[] = new byte[bufferLength].").out.inBuffer. } } class ListenerThread extends Thread{ TextArea text. inDatagram = new DatagramPacket(inBuffer.trim(). InetAddress destAddress = inDatagram.inBuffer. DatagramSocket socket. } catch (Exception e){ System. } } public void run() { try{ DatagramSocket socket = new DatagramSocket(2345). public ListenerThread(TextArea text){ this.getHostName().out. String localHost. } } } Trang 204 .getData()).inBuffer. DatagramPacket outDatagram. text. int bufferLength = 256. DatagramPacket outDatagram.length). byte outBuffer[]. byte inBuffer[] = new byte[bufferLength]. } }catch (IOException ex){ System. inDatagram = new DatagramPacket(inBuffer.getHostName().println("connect error!"). int localPort = socket. DatagramPacket inDatagram = new DatagramPacket(inBuffer.out.println("connect error!").length). InetAddress serverAddress.getPort().append(destHost+" say: "+data+"\n").length). DatagramPacket inDatagram. int bufferLength = 256. int destPort = inDatagram.trim().public Sender(){ try{ listenerSocket = new DatagramSocket().receive(inDatagram). } String localAddress = InetAddress.trim(). byte outBuffer[]. } catch (Exception e){ System. try{ socket = new DatagramSocket().text=text. while (true) { socket. String destHost = destAddress.getLocalHost().

Sau ó. Còn m c ích c a chu n SMTP miêu t cách u khi n các thông p trên ng Internet. Trong ch ng này ta s s ng hai giao th c :POP3 và SMTP g i nh n mail. ngày nay POP c c i ti n thành POP3 (Post Officce Protocol vertion 3). c ích chính c a X. B n ghi a ch mail c a b n và c a ng i nh n.400 là cho phép các mail có th c truy n nh n thông qua các lo i ng khác nhau b t ch p c u hình ph n c ng. Mô hình g i nh n mail Mail Server ng i i Mail Server trung gian ng ng Mail Server ng nh n i Sende r Reveicer Tr c khi i vào ph n chính chúng ta cùng ôn l i m t s khái ni m c s sau: Trang 205 . SMTP th ng i kèm v i chu n POP3 và do h n ch c a SMTP mà ngày nay ng i ta dùng chu n m r ng c a nó là ESMTP (Extended SMTP). E-mail cho phép g i thông p t n i này n n i khác t ng t nh cách g i th truy n th ng thông qua b u n. Mail server s g i th c a b n n m t máy ch hay mail server c a a ch ng i nh n. th ng nh t gi a các máy ch mail trên toàn th gi i v cách th c g i nh n mail òi h i hình thành các chu n v mail. Mail server n i nh n s c t th vào m t n i thích h p (mail box hay còn g i là p th ) trên máy ch . u quan tr ng c a chu n SMTP là gi nh máy nh n ph i dùng giao th c SMTP g i Mail cho m t Server luôn luôn ho t ng. a ch ng i nh n (reciept) sau ó ng i g i mang th n u n nh b u n chuy n th i. sau ó nh p vào n i dung c n g i. Các máy ch (mail server) cung c p cho b n ch mail (còn g i là e-mail address). i v i th n t e-mail g i qua h th ng Internet hay m ng thì c ch g i/nh n ng hoàn toàn t ng t .400 và SMTP (Simple Mail Transfer Protocol). Có 2 chu n v Mail th ng c các máy ch mail h tr là X. Trong cách thông th ng b n ph i cung p a ch ng i g i (sender). u này giúp cho vi c g i nh n các thông p c m b o. SMTP (ESMTP). ng i nh n s n l y Mail a h t Server khi nào h mu n dùng giao th c POP (Post Office Protocol). POP3. Các khái ni m MAIL Ngày nay e-mail hay th n t ã tr nên ph bi n và h u nh không th thi u trong th gi i Internet. B u n s chuy n th n h p th c a ng i nh n.Ch ng 9: JAVA MAIL I. Ng i nh n s ti n hành ng nh p (hay còng g i là login) vào h p th c a máy ch c n i dung e-mail g i cho mình. giao th c truy n d n c dùng. h u hành m ng. làm cho nh ng ng i các n i khác nhau có th trao i thông tin v i nhau. chu n MAIP.400. Các giao th c Mail thông ng : chu n X.

N u mail client c vi t d i giao di n Web thì nó c g i là Web mail. phân ph i mail n máy ch khác. Giao th c l u tr và nh n mail (mail store protocol): Khi trình ch mail ti p nh n c mail. Trình ch ti p nh n yêu c u c a trình khách theo giao th c POP3 c g i là POP Server. cho phép máy khách truy c p vào l y mail. II. l u tr mail… Chính vì v y tr c khi b n g i nh n mail n ph i bi t a ch c a máy ch mail (máy ang ch y d ch v mail). Trong tr ng h p này mail server (n i chuy n ti p th i) óng vai trò nh m t trình khác (mail client) i v i máy ch n i nh n. Hi n nay POP3 (Post Office Protocol) và IMAP (Internal Message Access Protocol) là hai giao th c l u tr và l y mail t h p th (Inbox) c nhi u mail server s d ng. u quá trình ng nh p thành công. c ch g i mail b ng SMTP m i có th th c hi n c. G i mail v i th vi n có s n c a java Java cung c p cho b n m t th vi n nh g n giúp b n có th g u mail m t cách d dàng. Mail client. SMTP khá n i ti ng và c h u các máy ch mail trên th gi i h tr . khi ó nó có trách nhi m g i mail n máy ch khác v i cùng giao th c SMTP. a ch c a ng i nh n (to). d ch v này có nhi m v nh n mail t máy khách g i n.Mail server: là m t ch ng trình ch y d i d ng m t d ch v . Nó ti n hành l u tr mail theo m t cách th c nào ó trình khác có th d dàng truy c p vào và nh n mail v . Trình ch ti p nh n mail theo giao th c SMTP c g i là SMTP Server. a ch c a máy ch nh n mail g i i c g i là outgoing mail address. Trình khách s d ng giao th c SMTP g i th i c g i là SMTP Client. trình khách ph i s d ng m t giao th c trò chuy n v i mail server. g i mail b n cung c p a ch c a ng i g i (from). Internet mail là m t h th ng chuy n mail liên t c gi a các máy ch mail v i nhau cho n khi nào mail n c máy ch ích. T ng t nh trình duy t s ng giao th c HTTP trò chuy n v i Web server. C ch POP before SMTP yêu c u máy khách mu n s d ng d ch v mail c a máy ch ph i tr c h t ph i ng nh p (login) vào tài kho n (account) theo giao th c POP. s d ng các tính n ng cao c p b n x th vi n Mail API (gi i thi u trong ph n sau). D i ây là m t ch ng trình n gi n dùng g i mail n a Trang 206 . POP before SMTP (Ch ng th c quy n truy c p theo giao th c POP tr c khi s ng SMTP): tránh tình tr ng máy ch mail c l i d ng g i mail m t cách t. Th vi n này có l p SmtpClient dùng g i mail. C th . tuy nhiên v i th vi n này b n không có c các tính n ng cao c p nh g i file ính kèm…. Web mail: là ch ng trình dùng nh n mail v t trình ch và cho phép i mail lên trình ch . a ch c a mail server (máy ch ti p nh n mail do b n g i lên) cùng v i n i dung mà b n mu n g i. Giao th c g i mail (Mail transport protocol): g i mail n máy ch . Các máy khách mu n b t tay v i trình ch và g i mail lên máy ch s s d ng giao th c SMTP (Simple Mail Transport Protocol). SMTP Relay: Các mail server n u nh n c mail không thu c a ch do mình qu n lý. a ch này th ng c g i là mail host. Các ch ng trình mail Client th ng s d ng giao th c POP3 nh n mail t trình ch . Các mail server a ph n h tr tính n ng Relay. a ch c a máy ch l u tr mail cho phép máy khách truy c p vào nh n mail v c g i là incoming mail address.

sun.vn". d li u c nhúng c hình nh. String body = "Hello this is test message for mail".com nh vào máy ch mail utehy. c ph n n i dung //K t thúc quá trình g i mail mailer.startMessage().vn". 1. ps. // Thi t l p a ch c a ng i g i và ng i nh n mailer.*. ps. Nh ng th ng là a ch c a b n ng i nh n sau khi c th xong có th h i âm (Reply) l i cho n.println(body).from(from).com/javamail/index.to(to). String to = "thek44a2@yahoo. System.edu. String subject = "Test Message". Gi i thi u java mail API L p SmtpClient c a java mà chúng ta s d ng trên ây ch giúp b n g i mail m c n gi n nh t v i n i dung mail d ng thu n v n b n.com".// Thêm CRLF vào tr ps.net. ps.closeServer(). M t ng d ng mail phía máy khách th ng có các ch c n ng ph c t p h n nh : G i file ính kèm. String from = "theth@utehy. import java.out.*.ch thek44a2@yahoo. Cài t th vi n java mail M c nh các th vi n java mail API không c cài t khi b n cài JDK. //Di n các thông tin khác ps. n có th download t a ch http://java. /* T o i lên */ it ng g i mail theo giao th c SMTP. a ch ng i g i có th t tu ý. âm thanh… th c hi n nh ng ch c n ng này java a ra m t th vi n riêng chuyên lý các thao tác g i nh n mail. nó c óng gói trong t p mail.println().println("From:" + from). host là a ch c a máy ch nh n mail do ta SmtpClient mailer = new SmtpClient(host). public class SendMailApp { public static void main(String[] args) throws Exception { String host = "utehy.smtp. III. } } Chú ý: Hãy thay a ch From.java import sun.io.edu. //L y v lu ng xu t g n v i mail PrintStream ps = mailer.println("Subject:" + subject).html Trang 207 .vn (máy ch mail c a tr ng DHSP KT H ng Yên).jar.edu. To b ng a ch e-mail mà b n mu n g i. mailer. Th vi n này g m ba ph n: Ph n th nh t là h t nhân c a các tác v x lý mail.println("Mail has been sent").println("To:" + to). //SendMailApp.

mail.sun.interner. b n có th tìm th y nó trong th m c Jbuilder_Home/lib 2. Các b c g i nh n mail Các b c nh n mail: o i t ng mail Session. H u h t các ng d ng mail client c n import các th vi n javax.4 th vi n này có tên mail. Trong java 1. M i Folder s ch a m t lo i mà n mu n l y. n i dung mail… i ph ng th c Transport.jar.jar n t bi n môi tr ng classpath=%CLASSPATH%. Ho c b n có th g i ph ng th c getInstance() c a l p Session thay cho getDefaultInstance() t o ra th hi n c a i t ng Session nh sau: //T o i t ng Properties ch a thông tin kh i t o n u có Properties props=new Properties(). i t ng này s ch a các thông tin v mail c n g i i nh a ch ng i g i. o i t ng store chu n b l y mail v . /*gán giá tr cho các thu c tính b ng ph ng th c props.html Ph n th ba là các l p c hay nh n mail t trình ch . Các l p liên quan n vi c g i mail 3. a ch ng i nh n. tiêu mail. Các l p c b n x lý thao tác g i nh n mail Ta tìm hi u các gói trong th vi n java mail. d ng i t ng Store l yv i t ng Folder. javax. L p Session L p này th hi n m t phiên k t n i t i mail server.1. Các b c g i mail Yêu c u ng i g i ch n giao th c g i (SMTP) và nh n (POP3 hay IMAP…).activation. Folder sent ch a các th v a g i i… Duy t i t ng Folder l y v danh sách các th . 3.Ph n th hai là JavaBean Activation FrameWork c n cho m i phiên b n c a java mail. ví d : //T o i t ng Properties ch a thông tin kh i t o n u có Properties props=new Properties().jar.null).setProperty(PropertyName. C:\JBuilderX\lib\activation. o i t ng Message. C:\JBuilderX\lib\mail.com/products/javabean/glasgow/jar. 3.getDefaultInstance(props. Folder trash ch a các th a b xoá. javax.mail. Chú ý: Khi b n cài JBuilder hai th vi n này c ng ct ng cài t vào máy.1. v i th vi n này b n có th t i xu ng t http://java. Trang 208 . L u các thông tin này vào i t ng Session. t o i t ng Store b n yêu c u ng i dùng nh p vào tên và m t kh u ch ng th c quy n truy c p h p pháp. Th vi n này mang tên activation. PropertyValue) */ //T o i t ng Session Session session =Session. Tr c khi truy c p (g i/nh n) n c n ph i t o ra m t i t ng Session th hi n cho m t phiên làm vi c.jar.send() ho c ph ng th c sendMessage c a i t ng Transport g i th i.mail. Nh Folder Inbox ch a các th vi n g i n.1.

Thông tin di n gi i này s c hi n th thay khi ng i nh n c th thay cho a ch mail from. S khác nhau gi a hai ph ng th c này là getInstance() thì luôn t o ra m t Session i còn getDefaultInstance() thì không t o ra m t th hi n m i c a Session n u nh nó ã c t o ra trong cùng java virtual machine.from".1. Hoang Trong The ). ví d : props. u b n ch nh Mime cho n i dung c n g i n u nó không ph i là thu n v n b n nh sau: message. Tuy nhiên ít khi b n làm vi c tr c ti p v i i t ng này mà b n th ng làm vi c v i các p con c a nó."utehy. M t thói quen t t nên có là t cho mail m t tiêu (subject). b n có th thi t t n i dung th g i b ng nh: message. N u b n mu n a ch e-mail có thêm thông tin di n gi i b n thêm s d ng cú pháp nh sau: Address address =new InternetAddresss( theht@utehy.edu. props.edu. b n s ng l p con c a nó là InternetAddresss. b n t o thông p mail chu n b g i i nh sau: MimeMessage message =new MimeMessage(mailsession). 3.setProperty(PropertyName.setProperty("mail.edu.getInstance(props. 3. ti p n ta s d ng l p Address o ra ch c a ng i g u và ng i nh n. Ho c InternetAddresss address =new InternetAddresss( theht@utehy.null). PropertyValue)*/ //T o i t ng Session Session session =Session. g i mail b n b n c n t o ra i t ng Message.3.setText(content).edu./*gán giá tr cho các thu c tính b ng ph ng th c props. n i nh n mail s c n c vào Mime hi n th úng n i dung c a thông p nh n c.2."text/html"). L p Address là l p tr u t ng. L p Address Sau khi b n t o ra i t ng Session và Message. l p MimeMessage. Ph ng th c setSubject() s giúp ta làm vi c ó.setProperty("mail. L p Message Sau khi có i t ng Session b n. u n i dung c a thông p là thu n v n b n.host".vn ).edu.vn"). Trang 209 . các thu c tính c u hình c t trong i t n Properties nên tr c khi b n b n g i nh n mail b n c n thi t t các thu c tính này.vn .setSubject( Xin chao ). Trong c hai ph ng th c kh i t o i t ng Session nêu trên. u n i dung không ph i thu n v n b n thì b n ph i ch nh Mime cho nó. ví d . Ng i nh n c n c vào tiêu th bi t c n i dung v n t t mô t trong th .setContent(content.vn ).1. Ví d : Session.… ây th ng thì b n truy n null cho tham s th hai v i ý ngh a s d ng c ch ch ng th c (authentication) m c nh c a mail server.vn")."theht@utehy. Ví d b n t o a ch mail t l p này nh sau: Address address =new InternetAddresss( theht@utehy.

vn”).1. toAddress). Ho c b n có th ch n giao th c g i mail t i t ng Session.edu.RecipientType.getAllRecipients()). Ta có th t a ch c a ng i g i là m t danh sách (m ng) ng i nh n có th ph n h i l i cho nhi u ng i cùng m t lúc. b n có th t cho nó m t a ch e-mail không có th c. password).RecipientType.connnect().RecipientType. L p Transport L p Transport cung c p các ph ng th c g i mail n mail server. ccAddress). t a ch c a ng i g i b n g i ph ng th c setFrom().addRecipient(Message. message.RecipientType. n gi n b n g i ph ng th c t nh send() c a l p Transport g i i t ng thông p i. Java cung c p cho b n ba lo i a ch ph bi n: Ki u a ch Message. Address ccAddress=new InternetAddresss(“theht@walla. B n g i ph ng th c addFrom() nh sau: Address address[]=… Message. Chú ý: java mail không cung c p c ch ki m tra xem a ch c a ng i g i có h p l hay không.close().com”). transport. Ví d : Transport.TO.getStransport( smtp ).Sau khi t o xong a ch c a ng i g i. ng th c addRecipient() c a Ví d : //T o a ch Address toAddress=new InternetAddresss(“thek44a2@yahoo.RecipientType.CC Message.addRecipient(Message.sendMessage(message. // ho c b n có th g i ph ng th c transport.send(message).setFrom(myAddress).BCC B n g i ph ý ngh a a ch n i n a ch ng i g i c n l u ý a ch ng i g i c n tham kh o it ng Message gán a ch c n g i. a ch c a ng i g i không quan tr ng. t o k t n i n trình ch mail và g i ph ng th c sendMessage() g i mail i: Transport transport. transport. ki m tra m t a ch mail có h p l hay không không ph i là d . a ch c a ng i nh n b n c n g n nó vào thông p c n g i i. message. user. Ví d : Address myAddress=new InternetAddresss(“theht@utehy.com”).TO Message.addFrom(address).CC. message.4. n u b n t a ch c a ng i g i không có th c thì ng i nh n không th ph n h i (reply) l i cho b n.connnect(host. transport =mailSession. thông th ng n gi n nh t b n ki m tra xem trong a ch ó có kí t @ hay không? 3. transport. //Gán a ch cho ng i nh n message. Trang 210 .

user. Còn n u b n s d ng giao th c IMAP thì b n khai báo gói com.open(Folder.mail. folder. k t n i vào mail server b n g i ph ng th c connect() nh sau: store.READ_ONLY). store.send() ph i t n i.sun. Các l p liên quan n vi c nh n mail p Store và l p Folder: Là hai l p này ph c v ch y u cho vi c nh n và c mail ch a trong h p th c a mail server. Các thông p mail c l u tr trên mail theo m t c u trúc cây. g i ph ng th c getStore() l yv i t ng Store ph c v cho m c ích k t n i v i mail server nh n mail.getFolder(“INBOX”).sun. INBOX ám ch th m c ch a th g i n. SENT… Ph ng th c getMessages() tr v m t m ng các i t ng Message. t ng t nh c u trúc cây th m c c a h u hành.*.getConten()).imap nh sau: import com. s d ng hai l p này tr c tiên b n c n ch nh giao th c nh n mail.getStore( pop3 ).sun.mail. Có hai giao th c nh n mail chính là POP3 và IMAP.*. Trong khi ph ng th c transport. t ã c xong th b n óng h p th và ng t k t n i: folder.close().close(). 3. B n g i ng th c getConten() l y v n i dung c a mail nh sau: for(int i=0. Chú ý: V i giao th c POP3 b n ch có th l y mail t INBOX v i giao th c IMAP (m ng c a giao th c POP3) b n có th nh n mail trong các th m c TRASH.Cách th hai này nhanh h n cách th nh t trong tr ng h p b n mu n g i m t s ng l n các mail. k t n i v n c duy trì cho n khi b n g i ph ng th c transport.i<message.println(((MimeMessage)message[i]). b n dùng i t ng Session. trong khi k t n i v n còn m b n có th g i bao nhiêu th tu ý mà không ph i k t n i l i v i mail server. Folder folder = store.out. ph Trang 211 . i s true cho bi t có c p nh t các l nh xoá mail hay không (s c p trong ph n sau).close(true).mail.getMessages().2.lenth(). Trong ó: host là a ch c a mail server mà b n mu n l y th user/password là tài kho n ng nh p vào h p th c a b n.mail.i++) System. do v y m t th i gian. ng t nh l p Transport trong thao tác g i mail.imap. Message message[]=folder.sun.pop3 nh sau: import com. Ví d n u s d ng giao th c POP3 thì b n khai báo gói com.pop3. u k t n i thành công b n l y v i t ng Folder duy t mail. óng k t n i m i khi có m t thông p c g i i.connect(host. password). Store store =mailSession.

Trang 212 .edu.internet.setSubject(subject). props. msg.III. msg. msg. Nó t ng t ch ng trình SenMailApp chúng ta ã tìm hi u trong ph n tr c. smtpHost).activation.setFrom(new InternetAddress(from)).edu. import java. "" + smtpPort).setRecipient(Message.*. String content = "". M c dù v y thay vì s ng l p SmtpClien b n s d ng các l p Session.setText(content). // Construct the message Message msg = new MimeMessage(session). import javax. ng c a mail server.vn".*.RecipientType. //SendMailAPI.java import javax.put("mail. String to = "thek44a2@yahoo.host".put("mail.port". msg.put("mail. // Create a mail session Properties props = new Properties(). // Send the message Transport. smtpHost).put("mail.*. G i mail 1. props. G i mail n gi n Ch ng trình SendMailAPI d i ây s g i mail i theo giao th c SMTP. "" + smtpPort).port". new InternetAddress(to)). c nh c ng c a mail s là 25. null).getDefaultInstance(props. props. SendMailAPI là ch ng trình java thu n tuý s d ng th vi n java mail. "" + smtpPort).send(msg).*.. Session session = Session. Transport c a java mail API. } } Tr c tiên b n t o ra m t i t ng Properties ch a các thông tin: tên máy ch mail. int smtpPort = 25. b ng câu l nh Properties props = new Properties().smtp. null). String from = "theht@utehy.vn".smtp.host".mail. public class SendMailAPI { public static void main(String args[]) throws Exception { String smtpHost = "utehy.put("mail.smtp. n u mail ho t ng trên m t c ng không ph i là 25 thì b n ph i ch rõ c ng c a mail server b ng dòng l nh: props. String subject = "Xin chao".smtp.port".TO.util. import javax.mail. props.smtp.getDefaultInstance(props.com". Ti p theo b n l y v m t phiên k t n i b ng dòng l nh: Session session = Session.

user.smtp.activation. smtpHost).edu.””. new InternetAddress(to)). MimeType) v i MimeType là m t xâu cho bi t ki u n i dung c ch a trong mail. import java. props.setSubject(subject).*.com".port".VnArialH\" size=\"8\">Xin chào các n</font></b></p><p><font face=\". String to = "thek44a2@yahoo.getTransport("smtp"). u b n ch a gán a ch mail server và c ng c a nó thì b n ph i g i ph ng th c: tp.send(msg). 2. // Create a mail session Properties props = new Properties().put("mail. tp. import javax.vn".setText(content).connect(). String subject = "Xin chao". int smtpPort = 25.sendMessage(msg. props.vn".connect(host.mail.host".*.password). Ví d sau minh ho cách g i th v i n i dung có nh d ng HTML: // SendMailAPIFromat. tp. msg.Ti p theo b n t o ra i t ng thông p và n các thông tin c n thi t vào: Message msg = new MimeMessage(session). msg.setFrom(new InternetAddress(from)). msg.setText(StringMsg) gán n i dung cho i t ng thông p c n g i i. N u n i dung th không ph i là d ng thu n v n b n b n c n g i ph ng th c Message. // Construct the message Trang 213 .*.msg. n có th thay dòng l nh này b ng n l nh sau: Transport tp= session. Session session = Session. Cu i cùng g i th i b n g i ph ng th c: Transport.put("mail. import javax.smtp. //Gán n i dung là m t xâu có nh d ng HTML String content = "<p><b><font face=\".VnTimeH\">Chúc m t ngày vui v </font></p>".close().*. msg.password không c n thi t.edu. n có th cung c p cho nó m t xâu r ng nh sau: tp.TO. Do b n ang g i mail nên các thông tin ng nh p user.util.RecipientType.setConten(StringMsg.mail.getDefaultInstance(props.getAllRecipients()). null). "" + smtpPort). G i th v i n i dung có nh d ng HTML N u n i dung th là thu n v n b n b n g i ph ng th c Message. public class SendMailAPIFromat{ public static void main(String args[]) throws Exception { String smtpHost = "utehy.setRecipient(Message. tp. String from = "theht@utehy.internet.connect(host.java import javax.””).

close(). "" + smtpPort). String to = "thek44a2@yahoo. D a vào hai l p BodyPart và MultiPart ta có th t o ra m t mail ph c t p có th phân tích b i i nh n. báo cho ng i nh n bi t n i dung bên trong th có nh d ng HTML b n g i ph ng th c msg.setFrom(new InternetAddress(from)). M i phân n c g i là m t BodyPart.util.edu. new InternetAddress(to)). tp.sendMessage(msg.getTransport("smtp"). smtpHost).vn". //t o i t ng session Properties props = new Properties(). import java.mail. "".internet. Ch ng trình SendMailAttachAPI.smtp.java import javax.vn".mail. 3. import javax. //T o i t ng thông p Trang 214 . props.TO.put("mail.setContent(content. "text/html"). Session session = Session.txt". // Send the message Transport tp = session. props. "text/html").port".java d i ây s cho th y k thu t g i mail v i file ính kèm. //SendMailAttachAPI. msg.activation. null). T t c các BodyPart c g i là MultiPart.getAllRecipients()). int smtpPort = 25. import javax. msg.RecipientType. String from = "theht@utehy. Nh ng file này th ng c nhúng vào ph n n i dung mail g i i d ng mã hoá t ng phân n (Multi – part MIME).com". public class SendMailAttachAPI { public static void main(String args[]) throws Exception { String smtpHost = "utehy.*.smtp. tp. String subject = "Xin chao". ""). tp. msg.setSubject(subject). M t Message c xem là g m nhi u phân n.edu.vn".*. //Tên c a file ính kèm String fileName = "C:/test. String content = "Chuc mot buoi sang tot lanh".*. } } Trong ví d trên b n gán n i dung là m t xâu có nh d ng HTML.*.connect("utehy.setRecipient(Message.Message msg = new MimeMessage(session). //Gán ki u n i dung MimeType là text/html msg. G i th v i file ính kèm Th vi n java mail API cho phép b n g i mail v i các file ính kèm.host".edu. msg.setContent(content.put("mail.getDefaultInstance(props.

b ng cách t o ra nhi u BodyPart khác nhau. msgBodyPart.setFileName(fileName). } } Chú ý: B n có th dính kèm bao nhiêu file tu ý.sun. tp. //Thêm i t ng msgBodyPart vào multiPart multiPart. tp. msgBodyPart. //Gán tên t p tin cho BodyPart msgBodyPart.close().getTransport("smtp").vn".getAllRecipients()). Nh n mail 1. import javax.setDisposition("attachment"). public class GetMailAPI { public static void main(String[] args) throws Exception { String smtpHost = "utehy. DataSource source = new FileDataSource(fileName). //Thêm i t ng msgBodyPart vào multiPart multiPart.*.pop3.*.mail.Message msg = new MimeMessage(session).vn".java import java. //T o ra i t ng BodyPart ch a n i dung mail BodyPart msgBodyPart = new MimeBodyPart(). i t ng này dùng ch a các BodyPart */ Multipart multiPart = new MimeMultipart().setRecipient(Message.addBodyPart(msgBodyPart). Nh n mail n gi n nh n mail. import com. new InternetAddress(to)). Ví d GetMailAPI sau minh ho cách nh n mail t trình ch và hi n th ra màn hình.*. msg. tp. //Cho bi t ây là ph n ch a file ính kèm msgBodyPart. //T o i t ng Session Trang 215 . //Gán multiPart cho i t ng thông p msg.setText(content).edu.connect("utehy. i t ng này dùng ch a ph n file ính kèm */ msgBodyPart = new MimeBodyPart().addBodyPart(msgBodyPart).util. //GetMailAPI. IV.RecipientType.TO. msg.edu. //G i thông p i Transport tp = session.setContent(multiPart).mail. b n k t n i vào mail server l y v các Message trong th m c INBOX. int smtpPort = 25.sendMessage(msg.setDataHandler(new DataHandler(source)). /* T o i t ng Multipart. "". msg. /*T o i t ng BodyPart th hai.setSubject(subject).setFrom(new InternetAddress(from)). ""). msg.

//L y v th m c INBOX Folder folder = store.getSubject().smtp.length. i < from.println("From: " + from[i]). Session session = Session.getMessages(). } //M th m c INBOX v i ch ch c folder. "abc"). //L y v các i t ng Message và hi n th ra màn hình Message[] messages = folder. i < messages. } //L y v ngày th cg i Date d = m.open(Folder.port".smtp. store. props. store. Trang 216 . i++) { printMessage(messages[i]).getStore("pop3").getRecipients(Message. for (int i = 0. //T o i t ng Store Store store = session.READ_ONLY). "thek44a2".getSentDate().println("Subject: " + subject). if (to != null) { for (int i = 0.exit(1). } } //L y v các a ch nh n TO Address[] to = m.getFolder("INBOX").close(). */ } public static void printMessage(Message m) throws Exception { //In ph n tiêu th //L y v các a ch g i Address[] from = m. i < to.RecipientType. props.out.out.println("To: " + to[i]).put("mail.println("Date: " + d). "" + smtpPort). if (folder == null) { System. if (from != null) { for (int i = 0.host".TO).close(false). i++) { System.length.println("No folder"). null). System. if (d != null) { System.out.connect(smtpHost. if (subject != null) { System.Properties props = new Properties().getFrom().put("mail. } } //L y v tiêu th String subject = m. } /* óng k t n i nh ng không xoá các Message t mail server folder.getDefaultInstance(props.out. smtpHost).length.out. i++) { System.

if (from != null) System. int c. i++) { System.out. Folder folder = session.write(c). L y v các thông tin i kèm v i mail n có th l y v các thông tin i kèm v i th nh : ngày g i.110. "abc").} //Thêm m t hàng xu ng dòng phân cách ph n tiêu và ph n chính c a th System. } else { // nh d ng này s c gi i thi u trong ph n sau System.getFrom().println("From: " + from[i]). //In n i dung c a th Object content = m. i n ch ng trình URLName urlName=new URLName("pop3".getReplyTo()). b n có th thay n ch ng trình sau: Store store = session.out.println().println("Unrecognized Content Type")."thek44a2"."abc"). "thek44a2".vn". } else if (content instanceof InputStream) { InputStream in = (InputStream) content.toString(m.out.println("From: " + from).getFolder(urlName). tiêu … ph ng th c printInfo sau s in ra màn hình các thông tin i kèm v i th . //L y v th m c INBOX Folder folder = store. } } //L y v các a ch ã ph n h i String replyTo = InternetAddress.toString(m.read()) != -1) System.out.connect(smtpHost. public static void printInfo(Message m)throws Exception { //L y v a ch c a ng i g i String from = InternetAddress."utehy. i < from. while ( (c = in.getStore("pop3"). store. Trang 217 .getFrom()). ng cách này b n không c n ph i t o ra i t ng Store 2. } } } Chú ý: B n có th không c n dùng i t ng Store.out.length.getContent().getFolder("INBOX"). //Ho c Address[] from = m. if (content instanceof String) { System. if (from != null) { for (int i = 0.println(content).edu.out."INBOX".

int smtpPort = 25. if (received != null) System.*. n u có thì ghi n i dung c a file ính kèm xu ng th m c C:\data.length. if (sent != null) System. i++) { System.mail.net.println("Cc: " + cc).mail. import javax. import javax.java minh ho cách ki m tra mail có file ính kèm hay không?.host". if (to != null) System.*. import java. //Ho c Address[] reply = m.getRecipients(Message.println("Reply: " + reply[i]).*.println("Sent: " + sent). public class GetMailAttach { public static void main(String[] args) throws Exception { String smtpHost = "utehy.getReplyTo(). Ví d GetMailAttach. //L y v các a ch CC String cc = InternetAddress.CC)).println("Subject: " + subject).smtp. //L y v ngày th c nh n Date received = m.out. //L y v các a ch BCC String bcc = InternetAddress.out.sun. if (subject != null) System.out. props.RecipientType.smtp.TO)).toString(m.println("To: " + to). "" + smtpPort).put("mail.println("Reply-to: "+ replyTo).getRecipients(Message. i < reply. smtpHost).out. if (bcc != null) System.mail.RecipientType. if (cc != null) System.*.out.out.if (replyTo != null) System. } } //L y v các a ch TO String to = InternetAddress.*. //L y v tiêu c a th String subject = m.put("mail.edu.RecipientType.getSentDate(). import com.port". import java.pop3.getReceivedDate().getSubject(). Nh n mail v i các file ính kèm N u n i dung th có ch a file ính kèm b n có th tách ph n ính kèm.println("Bcc: " + to).println("Received: " + received).BCC)).toString(m.java import java.util. if (reply != null) { for (int i = 0.toString(m.io. //GetMailAttach. } 3.getRecipients(Message.out. Trang 218 .vn". props.out. ph n th ra.internet. //L y v ngày th cg i Date sent = m. //t o ra m t mail Session Properties props = new Properties().*.

} } // óng k t n i. } //M th m c l y th theo ch ch c folder.close(). /* y v d u hi u cho bi t Part có ph i là ph n file ính kèm không */ String disposition = p. //N u không có th m c này thì thoát if (folder == null) { System. null). //X lý t ng th m t for (int i = 0.equals(Part.Session session = Session.connect(smtpHost. store.open(Folder. //K t n i v i mail server store.ATTACHMENT). i < mp. } //Ph ng th c x lý th g m nhi u Part public static void processMultipart(Multipart mp) throws MessagingException { for (int i = 0.getDefaultInstance(props.READ_ONLY).length.println("No folder"). i < messages.getStore("pop3").exit(1). //L y v th m c INBOX Folder folder = store. System. "abc").getCount(). vì disposition có th nh n giá tr null khi ó ph ng th c equals s nh n m t ngo il */ Trang 219 . //L y v các th trong Mail Box Message[] messages = folder.getContent().getFolder("INBOX"). "thek44a2".getBodyPart(i)).out.getDisposition().getMessages().getFileName().close(false). //L y v Store Store store = session. nh ng không xoá các th folder. } } //Ph ng th c x lý m t Part public static void processPart(Part p) { try { //Th l y v tên file c a Part String fileName = p. i++) { processPart(mp. } else { //N i dung th ch có m t ph n processPart(messages[i]). i++) { //L y v n i dung c a th Object body = messages[i]. /* Ki m tra xem Part có ph i là file ính kèm không? Chú ý không nên s d ng disposition. //Ki m tra xem n i dung th có nhi u ph n hay không? if (body instanceof Multipart) { //N i dung th g m nhi u ph n processMultipart( (Multipart) body).

available()]. } //L y v lu ng xu t g n v i t p tin FileOutputStream out = new FileOutputStream(f). } } } Trang 220 .err. in.getContent()). //Ghi vùng nh m ra t p out. } } catch (Exception e) { System. for (int i = 0.println(e).flush().printStackTrace(). //L y v lu ng nh p g n v i Part InputStream in = new BufferedInputStream(p.exists(). File f = new File("C:/data/" + fileName).ATTACHMENT. //Khai báo vùng nh t m c n i dung t Part byte buffer[] = new byte[in. // c n i dung t part vào vùng nh m out. // óng lu ng g n v i t p in.txt".if (Part.read(buffer). i++) { f = new File("C:/data/" + fileName + " " + i).equals(disposition)) { //N u Part là ph n ch a file ính kèm if (fileName == null) fileName = "data. //Ghi d n h t vùng m ra t p out.println(p. f.getInputStream()).// óng lu ng g n v i Part } else { //Part không ph i là ph n ch a file ính kèm System. e.close().close().write(buffer).out.

getMessages().SEEN)) { System.Flag.//Chú ý b t bu c ph i là tham s true 2. j++) { System. Ti p n óng k t n i.println("Draft").close(true).Flag.setFlag(Flags. } } Trang 221 . Message[] messages = folder.println("Deleted").USER)) { // We don't know what the user flags might be in advance // so they're returned as an arrya of strings String[] userFlags = messages[i].out.Flag. for (int j = 0.Flag.DELETE. } // ã c if (messages[i].getFlags().println("Recent").isSet(Flags.isSet(Flags.DELETED)) { System. c/ghi nh sau: Ti p n t c xoá: Messages[i]. Ki m tra tr ng thái c c a mail // Ki m tra tr ng thái c a các c : // ã ánh d u xoá if (messages[i].length.out. j < userFlags.getUserFlags().out. Xoá mail 1.Flag.out.ANSWERED)) { System.FLAGGED)) { System. } if (messages[i].Flag.isSet(Flags.isSet(Flags. } // ã c gán c if (messages[i].println("Marked").println("Answered"). } // ã vào thùng rác if (messages[i].open(Folder.Flag. } // ã tr l i if (messages[i].true).println("User flag: " + userFlags[j]).out. Xoá mail xoá mail b n m h p th v i quy n Folder folder = store.println("Read").out.DRAFT)) { System.out. mail server s t ng xoá mail folder.READ_ONLY).Flag. } if (messages[i].isSet(Flags.isSet(Flags.RECENT)) { System.V.getFolder("INBOX").isSet(Flags. folder.

ã khi n các ch ng trình truy n th ng này không còn áp ng c yêu c u n a. giúp các b n có các ki n th c c b n v l p trình phân tán và công ngh l p trình phân tán RMI. Có r t nhi u công ngh l p trình phân tán nh : DCOM. CORBA. Trang 222 . Thông th ng n u các i t ng c t p trung trên cùng m t máy thì b n có th tri u g i các ph ng th c c a nó b ng cách g u cho nó m t thông báo. RMI và l p trình phân tán i t ng Thông th ng mã l nh c a m t ch ng trình khi th c thi c t p trung trên cùng t máy. ây là cách l p trình truy n th ng. B2. Sau khi h c xong ch ng này ng i h c có th : Hi u c khái ni m v l p trình phân tán và công ngh RMI ng d ng công ngh RMI xây d ng các ng d ng phân tán Chuy n tham s cho ph ng th c tri u g i t xa và nh n k t qu tr v t ph ng th c tri u g i t xa I. Tuy nhiên các i t ng Java có th tri u g i ph ng th c c a m t i t ng n m trên m t máy khác d a vào giao th c tri u g i t xa RMI. S phát tri n nh v bão c a m ng máy tính c bi t là m ng Internet toàn c u. RMI. RMI là cách th c giao ti p gi a các i t ng Java có mã l nh cài t (bao g m c ph ng th c và thu c tính) n m trên các máy khác nhau có th tri u g i l n nhau. B3 là các i t ng c c b .Ch ng 10: L P TRÌNH PHÂN TÁN V I JAVA RMI ( REMOTE METHOD INVOKE) L p trình phân tán v i RMI là m t trong nh ng v n nóng b ng c a n n công nghi p ph n m m ngày nay. Hình sau mô hình tri u g i i t ng phân tán. EJB. Trên máy A các i t ng A1. Trong mô hình d i ây thì l i tri u g i ph ng th c c a i t ng B2 ( n m trên máy B) t i t ng A1 ( n m trên máy A) là l i g i ph ng th c t xa.. ây chính là n i dung c a l p trình phân tán mã l nh RMI (Remote Method Invoke – t m ch là tri u g i ph ng th c t xa). trong ó RMI là công ngh thu n Java và d l p trình nh t. t ng t các i ng B1. Các ch ng trình bây gi yêu c u ph i có s h p tác x lý. câu h i t ra là làm th nào có th tri u g i các ph ng th c c a m t i t ng n m trên m t máy khác. Ch ng này ta th o lu n v các khía c nh ó. t c là mã l nh c a nó ã không t p trung trên m t máy mà c phân tán trên nhi u máy. Khi t ng d ng có mã l nh th c thi c phân tán trên nhi u máy thì ch ng trình ó c i là ch ng trình phân tán và vi c l p trình t o ra các ch ng trình này c g i là l p trình phân tán. A2 i các ph ng th c c a nhau c g i là tri u g i ph ng th c c c b (local method invoke) ây là cách l p trình h ng i t ng truy n th ng v n s d ng.

Trang 223 .Máy A A1 A2 Máy B B2 B1 B3 Máy C C Hình 1: Mô hình tri u g i các ph ng th c t xa II. Các i t ng trên hai máy khác nhau ho t ng trên hai ti n trình khác nhau (có hai không gian a ch khác nhau) nên vi c tham chi u bi n a ch i t ng là khác nhau. G i ph ng th c t xa và các v n phát sinh Vi c tri u g i m t ph ng th c t xa tho t nhìn có v n gi n nh ng th c t l i ph c t p h n tri u g i ph ng th c c c b . tuy nhiên vùng nh th c s c a i t ng l i n m trên m t máy khác. III. p trung gian t n t i c hai phía: phía máy khách (n i g i ph ng th c c a i t ng xa) và máy ch (n i i t ng th c s c cài t). các tham s truy n vào ph ng th c c ng nh t qu tr v t ph ng th c c th c hi n thông qua ng n x p (stack) trong khi l i g i ph ng th c t xa ph i c óng gói và chuy n qua m ng. phía máy ch l p trung gian c g i là skeletion (l p n i). nh v y vi c b t và ki m soát l i trong các ng d ng phân tán là r t t. L i g i ph ng th c c c b luôn tr v k t qu thông qua ng n x p trong khi l i g i ph ng th c xa k t qu tr v ph i thông qua k t n i m ng chính vì v y các s c v truy n thông luôn có th s y ra. Ta có th hình dung l p trung gian stub và skel là hai ng i trung gian giúp các i ng xa có th giao d ch c v i nhau. n gi n và trong su t i v i ng i l p trình i t ng Java trên hai máy khác nhau không tri u g i ph ng th c c a nhau m t cách tr c ti p mà thông qua l p trung gian. Ví d khi b n truy n m t i t ng cho m t ph ng th c tri u g i t xa thì th c s b n truy n m t tham chi u i t ng n ph ng th c t xa. Vai trò c a các l p trung gian i v i l i g i ph ng th c c c b . Phía máy khác l p trung gian này c g i là stub (l p móc).

Máy A A1

A1 C1_stub

Máy C C1_skel

C1

B1_stub

Máy B

B1_skel

B1 Hình 2: G i ph ng th c c a it ng thông qua l p trung gian

Trong hình trên b n có i t ng C1 c cài t trên máy C. trình biên d ch Java giúp ta t o ra hai l p trung gian C1_stub và C1_skel. L p C1_stub c mang v máy A. Khi A1 trên máy A tri u g i ph ng th c c a i t ng C1 nó s chuy n l i g i ph ng th c cho l p trung gian C1_stub. L p trung gian C1_stub có trách nhi m óng gói các tham chuy n tham s qua m ng n ph ng th c c tri u g i c a i t ng C1. Trên máy C l p trung gian C1_Skel có nhi m v nh n các tham s và chuy n vào vùng a ch thích p sau ó g i ph ng th c t ng ng. K t qu tr v (n u có) c a ph ng th c do C1 tr s c l p C1_Skel óng gói và chuy n ng c v cho trình khách. Trên máy khách l p trung gian C1_Stub chuy n giao k t qu cu i cùng l i cho A1. B ng c ch này A1 luôn ngh r ng i t ng C1 ang t n t i ngay trên cùng máy v i nó nh các i t ng c c b khác. H n n a nh có l p trung gian C1_Stub mà khi k t n i m ng g p s c thì l p trung gian stub s luôn bi t cách thông báo l i n i t ng A1. Th c t làm cách nào A1 tham chi u c n C1, m t khi không có i t ng C1 c cài t trên máy A? C1_Stub trên máy A ch th c hi n vi c chuy n tham s , nh n k t qu tr v n u có và th c hi n các giao th c m ng, nó không ph i là hình nh c a C1. làm c u này i t ng C1 c n cung c p m t giao di n t ng ng v i các ph ng th c mà các i t ng trên máy khác có th tri u g i. Chúng ta ti p t c làm sáng t ìêu này khi nói giao di n t xa. IV. Cài t i t ng phân tán 1. Giao di n t xa Khi b n mu n t o ra m t s v t t xa thì b n che m t n cài t n n b ng cách truy n qua m t giao di n. V y khi khách thu c m t tham chi u n i t ng t xa thì th c ch t ó là m t giao di n. Trang 224

Khi t o ra m t giao di n t xa, thì b n ph i tuân theo các h ng d n sau: Giao di n t xa ph i là m t giao di n public, t c là khi t o ra m t giao di n t xa ta ph i thêm t khoá public vào tr c nh ngh a giao di n. B ng không, khi b n tham chi u n i t ng t xa b n s thu c m t ngo i l Giao di n t xa ph i là giao di n c k th a t giao di n Remote i ph ng pháp trong giao di n t xa ph i khai báo RemoteException trong m nh throws bên b t c ngo i l nào khác, t c là t t c các ph ng th c trong giao di n t xa u ph i ném ra ngo i l RemoteException u tham s truy n cho ph ng th c ho c giá tr nh n v t th c tri u g i t xa là m t i t ng thì i t ng ó ph i tri n khai giao di n Remote ho c giao di n Serializable Thông th ng b n th ng th y m t giao di n t xa có c u trúc nh sau:
import java.rmi.*; public interface RemoteInterface extends Remote{ [public] ReturnDataType method1([DataType arg1,][ DataType arg2, RemoteException; [public] ReturnDataType method2() throws RemoteException; } ] ) throws

Ví d 1-1: Sau ây là m t giao di n t xa n gi n c a ng d ng HelloRMI HelloRMI.java import java.rmi.*; public interface HelloRMI extends Remote{ public String sayHello() throws RemoteException; } Nhìn vào giao di n này ta th y nó gi ng b t k giao di n nào khác ngo i tr nó c r ng t giao di n Remote và t t c các ph ng th c trong giao di n này u ph i nem ra ngo i l RemoteException, b n hãy nh r ng t t c các ph ng th c c khai báo trong giao di n s t ng là public, th nên trong giao di n trên b n có th b t khoá public khi khai báo ph ng th c sayHello. B n ti n hành biên d ch javac HelloRMI.java b n s thu c t p tin HelloRMI.class 2. Tri n khai giao di n t xa Sau khi b n t o ra giao di n t xa, công vi c ti p theo mà b n c n ph i làm là tri n khai t t c các ph ng th c trong giao di n t xa. Ví d 1-2: Sau ây là cài t c a giao di n t xa HelloRMI HelloRMIImpl.java
import java.rmi.*; public class HelloRMIImpl implements HelloRMI { public String sayHello() throws RemoteException { return "Hello RMI"; } }

V n t ra là làm th nào cài t i t ng HelloRMI lên m t máy (máy 2) và g i ph ng th c sayHello() c a HelloRMI t máy khác (máy 1)? Nh ã nêu trên ta không i c ph ng th c sayHello c a HelloRMI m t cách tr c ti p mà c n có thêm hai l p trung gian là HelloRMIImpl_Stub và HelloRMIImpl_Skel. D a vào l p Trang 225

HelloRMIImpl.class, trình biên d ch rmic.exe c a Java s giúp ta t o ra hai l p trung gian Stub và Skel. B n m c a s DOS – Prompt và gõ vào dòng l nh Rmic HelloRMIImpl.class t qu b n s thu c hai t p HelloRMIImpl_Stub.class và HelloRMIImpl_Skel.class 3. Cài t, ng kí i t ng t xa B c ti p theo sau khi b n cài t giao di n t xa là công vi c ng ký nó v i trình rmiregistry theo m u sau: Ví d 1-4: Ví d sau là ch ng trình ng ký và cài t i t ng HelloRMIImpl v i trình ch rmiregistry. Setup.java
import java.rmi.server.*; import java.rmi.*; import java.net.*; public class Setup { public static void main(String[] args) { // t o ra m t th hi n c a i t ng t xa HelloRMI h=new HelloRMIImpl(); try { // Khai báo i t ng có kh n ng tri u g i t xa UnicastRemoteObject.exportObject(h); // ng ký nó v i trình rmiregistry Naming.bind("//localhost/hello , h); // có th thay ph ng th c bind b i ph ng th c rebind nh sau: // Naming.rebind("//localhost/hello , h); } catch (MalformedURLException ex) { } catch (AlreadyBoundException ex) { } catch (RemoteException ex) { } } }

Công vi c u tiên b n ph i làm khi cài t i t ng t xa là t o ra m t th hi n a i t ng t xa. HelloRMI h=new HelloRMIImpl(); b n có th thay b ng dòng l nh HelloRMIImpl h=new HelloRMIImpl(); Ti p theo b n g i ph ng th c t nh exportObject c a l p UnicastRemoteObject java bi t i t ng h (HelloRMI) là i t ng có kh n ng truy xu t t xa. UnicastRemoteObject.exportObject(h); máy o

u ý s d ng c l p UnicastRemoteObject b n ph i khai báo import java.rmi.server.*; u ch ng trình

Trang 226

c cu i cùng là b n t cho i t ng h m t cái tên g i nh và ng ký tên này ib ng ký rmiregistry. Ph ng th c t nh c a l p Naming s th c hi n u này Naming.bind("[rmi:]//hostname[:port]/name , h); Ph ng th c bind có hai tham s : tham s th nh t là m t chu i nh v URL, i s th hai là b n thân i t ng c n ng ký Chu i nh v URL có nh d ng nh sau: [rmi:]//hostname[:port]/name Trong ó: mri là tên giao th c, ây là ph n tu ch n, m c nh giao th c là rmi nên b n có th b qua. Hostname là tên c a máy ch ho c a ch IP c a máy ch n i i t ng phân tán ang n t i. Port là s hi u c ng c a ch ng trình rmiregistry, ây là tham s tu ch n, n u b qua tham s này thì c ng m c nh là 1009 Name là tên g i nh c a i t ng phân tán Ph ng th c bind s i vào vòng l p vô h n ch k t n i t máy kách. Các ch ng trình phía máy khách s d a vào chu i nh v URL mà ta ng ký v i trình rmiregistry truy tìm tham chi u n i c n dùng. n có th kh i ng b ng ký rmiregistry này âu? B n m c a s DOS-Prompt và cho ch y ch ng trình rmiregistry này t dòng l nh nh sau: C:\JDK1.4\bin\rmiregistry.exe u trong WintNT thì b n có th ch y nó nh m t d ch v b ng dòng l nh start C:\JDK1.4\bin\rmiregistry.exe Sau khi kh i ng ch ng trình rmiregistry b ng m t trong hai cách b n không th y ph n h i gì c b i vì ây là ch ng trình ch y d i d ng d ch v (service). M c nh rmiregistry l ng nghe các k t n i trên c ng 1009. B n có th ch nh ng khác cho nó. Ví d l nh sau s kh i ng rmiregistry trên c ng 2004 C:\Jdk1.4\bin\rmiregistry.exe 2004 Chú ý: Trong java 1 hostname không th là localhost, ngh a là n u b n mu n th nghi m trên máy c c b thì b n ph i truy n cho nó m t a ch IP ch ng h n nh 127.0.0.1 ho c tên c a máy ( bi t tên c a máy c a mình b n vào Control Panel\Net Work ch n th Indentification và b n s th y tên máy c a mình trong ph n Computer Name) RMI s không làm vi c ch ng nào b n ch a cài h giao th c TCP/IP. u b n ang ki m th trên máy c c b thì b n có th ng ký v i trình rmiregistry d n gi n nh sau: Naming.bind(“hello”,h); u b n ng ký m t i t ng m i v i m t cái tên g i nh ã c s d ng cho m t i t ng khác b n s nh n c m t ngo i l AlreadyBoundException. ng n c n u này b n nên dùng ph ng th c Naming.rebind() thay cho ph ng th c Naming.bind() vì Naming.rebind() b sung m t cái tên m i n u nó ch a có và thay th m t cái tên ã t n t i i m t i t ng m i. Cho dù ph ng th c main() k t thúc thì i t ng t xa b n t o ra và ng ký cho nó t cái tên v n còn ó ch ng nào mà rmiregistry v n còn ang ch y và b n không g i Trang 227

ph ng th c Naming.unbind() thì s v t này v n còn ó. B i lý do này, khi b n phát tri n ng d ng c a mình thì b n c n ph i t t rmiregistry và cho ch y l i nó m i khi b n biên d ch i i t ng t xa. n không nh t thi t ph i kh i ng rmiregistry nh m t ti n trình ngoài. N u b n bi t ng ng d ng c a mình là ng d ng duy nh t s dùng s ng ký. Thì b n có th b t u nó bên trong ch ng trình c a mình b ng dòng l nh: LocateRegistry.createRegistry(Port); ây Port là s hi u c ng. u này là t ng ng v i vi c ch y rmiregistry Port t d u nh c c a DOS-Prompt 4. Vi t trình khách tri u g i ph ng th c c a i t ng cài t t xa Trình khách tri u g i i t ng phân tan RMI có th là m t trong các ki u ng d ng sau: ng d ng console ng d ng có giao di n ho ng d ng Servlet trang JSP … u duy nh t b n ph i làm trong ch ng trình khách là tra c u và l y v giao di n xa t trình ch . T ó tr i vi c tri u g i ph ng th c t xa gi ng nh là tri u i ph ng th c c a b t k i t ng c c b nào khác. Sau ây là m u ch ng trình phía trình khách tri u g i i t ng phân tán RMI import java.rmi.*; import java.rmi.registry*; public Client { public static void main(String args[]) throws RemoteException { // l y v tham chi u i t ng phân tán b ng ph ng th c Naming.lookup() RemoteInterface r=(RemoteInterface)Naming.lookup(“[rmi:]//hostname[:port]/name”); // tri u g i các ph ng th c c a i t ng t xa } } Ví d 1-5: Sau ây là trình khách tri u g i i t ng HelloRMI Client.java import java.rmi.*; import java.rmi.registry*; public Client { public static void main(String args[]) throws RemoteException {// l y v tham chi u i t ng phân tán b ng ph ng th c Naming.lookup() HelloRMI r=( HelloRMI)Naming.lookup(“//localhost/hello”); // tri u g i ph ng th c sayHello c a i t ng t xa System.out.println(HelloRMI.sayHello()); } } Trang 228

truy tìm i t ng xa, ch ng trình máy khách g i ph ng th c Naming.lookup(); Ph ng th c này ch yêu c u i s là chu i cho bi t a ch c a máy ch và tên ng ký c a i t ng. RemoteInterfacer=(RemoteInterface)Naming.lookup(“[rmi:]//hostname[:port]/name”); M c nh ph ng th c Naming.lookup() tr v m t tham chi u Object nên b n c n ph i ép ki u sang giao di n t xa. B n có th hình dung ph ng th c Naming.lookup() óng vai trò nh m t d ch v tìm ki m i t ng trên máy ch , nó liên l c v i trình rmiregistry trên máy ch và yêu c u tr tham chi u i t ng cho b n s d ng. Còn Naming.bind() óng vai trò nh d ch v ng ký. Biên d ch và ch y trình khách Javac Client.java tc s n sàng, b n hãy ch y ch ng trình khách nh sau: Java Client t qu thu c là l i chào “Hello RMI” Hình 3 di n t c ch g i ph ng th c t xa c a các i t ng RMI m t cách t ng quát: ng ký i t ng v i trình rmiregistry b ng cách g i ph ng th c Naming.bind() ho c Naming.rebind(). Máy khách mu n g i ph ng th c c a i t ng trên máy ch tr c h t c n ph i g i ph ng th c Naming.lookup() truy tìm tham chi u n i t ng xa theo tên. ng ký s tr v tham chi u c a i t ng xa thông qua giao di n t xa. a vào giao di n t xa mà trình khách có th g i các ph ng th c c a i t ng xa. Khi m t ph ng th c c g i, l i g i s c chuy n n l p trung gian _Stub. L p trung gian này có nhi m v óng gói các tham s và chuy n n l p trung gian _Skel trên trình ch . p trung gian trên máy ch s ti p nh n các tham s g i n t trình khách và tr c ti p yêu c u i t ng th c thi ph ng th c và chuy n k t qu (n u có) v cho trình khách. . M¸y kh¸ch
Client Naming.looku p2
3

M¸y chñ
rmiregistry Naming.bin d Naming.rebi HelloRMIIm nd pl
6 1

HelloRMI
4

HelloRMIImpl_Stub
5

HelloRMIImpl_Skel

Ví d 2: Vi t l p Calculator, l p này có các ph ng th c add, less, mul, div dùng hi n các phép toán t ng ng c ng, tr , nhân và chia c 1: t o ra giao di n t xa - M m t trình so n th o b t k gõ vào n i dung nh sau: Trang 229

th c

//Calculator.java import java.rmi.*; public interface Calculator extends Remote { float add(float a, float b) throws RemoteException; float less(float a, float b) throws RemoteException; float mul(float a, float b) throws RemoteException; float div(float a, float b) throws RemoteException; } - Ghi l i vào th m c C:\NetWork\Server - M c a s DOS-Prompt và gõ vào dòng l nh biên d ch nh sau:

c 2: Cài t giao di n t xa - M trình so n th o b t k gõ vào n i dung sau: // CalculatorImpl.java
import java.rmi.RemoteException; public class CalculatorImpl implements Calculator { public float add(float a, float b) throws RemoteException { return a+b; } public float less(float a, float b) throws RemoteException { return a-b; } public float mul(float a, float b) throws RemoteException { return a*b; } public float div(float a, float b) throws RemoteException { return a/b; } }

- Ghi l i v i cái tên CalculatorImpl.java - M c a s DOS_Prompt và gõ vào dòng l nh sau

biên d ch

Trang 230

sau khi biên d ch b n thu c t p tin CalcultatorImpl.class c 3 T o ra các l p trung gian _Stub và _Skel n m c a s DOS_Prompt và gõ vào dòng l nh

Sau khi th c hi n xong l nh này b n s thu c hai l p trung gian là CalcultatorImpl_Stub và CalcultatorImpl_Skel trong cùng th m c C:\network\server c 4: ng ký i t ng t xa v i trình rmiregistry - B n m trình so n th o b t k và gõ vào n i dung nh sau: // CalculatorSetup.java import java.rmi.server.*; import java.rmi.*; public class CalculatorSetup { public static void main(String[] args) throws Exception{ Calculator c=new CalculatorImpl(); UnicastRemoteObject.exportObject(c); Naming.rebind("rmi://localhost/Cal",c); } } - Ghi l i v i cái tên CalculatorSetup.java trong vào th m c c:\network\server - M c a s DOS_Prompt gõ vào dòng l nh sau:

Trang 231

c 5: Kh i ng d ch v ng ký tên rmiregistry n m c a s DOS-Prompt. chuy n vào th m c C:\NetWork\Server và gõ vào dòng l nh sau: ng trình ang ký ã c kh i ng c 6: Kh i ng trình setup n m c a s DOS-Prompt khác gõ vào dòng l nh Chú ý: N u b n không chuy n vào th m c C:\NetWork\Server tr ang ký thì b n s nh n cm tl i Ch c khi kh i ng d ch Trang 232 .

Ch ng 11: JAVA JSP (JAVA SERVLET) Trang 233 .

Các ph ng th c thông th ng c a Bean không tuân theo quy t c trên. b n có th dùng cách ti p c n “get” và “set” trên. II.Ch ng 12: EJB (ENTERPRISE JAVA BEANS) Ch ng này ta s nghiêm c u và xây d ng m t trong nh ng thành ph n thú v c a java ó là JavaBean m t mô hình quan tr ng trong ki n trúc c a Java. nh ng n c ng có th dung “is” thay cho “get”. nh ng chúng ph i là ph ng th c public. Các v n chính s c c p trong ch ng này JavaBean và công ngh ph n m m Tìm hi u các thành ph n c a JavaBean Tìm hi u b phân tích Introspector c a java Xây d ng và s d ng JavaBean Tích h p JavaBean v i các công ngh thành ph n khác I. bi t c các thu c tính và các ph ng th c c a m t Bean n ch c n tuân th theo quy t c t tên sau: i m t thu c tính có tên là xxx. u Bean cho phép ng ký thính gi thì v i m t thính gi (listener) XxxListener b n ph i có hai ph ng th c t ng ng i kèm là addXxxListener(XxxListener) và Trang 234 . u duy nh t b n ph i làm h i s a cách t tên cho các ph ng th c c a mình. Ki u tr v c a ph ng th c “get” c ng chính là ki u c a i ph ng th c “set” và th ng thì chúng c ng là ki u c a thu c tính xxx. Xây d ng thành ph n JavaBean Nh ã gi i thi u trên JavaBean th c ch t là m t l p java thông th ng. ki u c a chúng ra làm sao? u này ã c các nhà thi t k java gi i quy t m t cách r t n gi n. B n không c n ph i vi t thêm b t c mã ph nào hay s d ng nh ng m r ng ngôn ng c bi t nào t o ra m t Bean. nh ng nó c vi t theo m t quy t c quy nh tr c. u ý r ng ký t th nh t sau “get” hay “set” ph i vi t hoa. Nh v y t JavaBean c ng có các thu c tính và các ph ng th c. B n c ng chú ý cho là tên c a thu c tính và ki u cho “get” và “set” là không liên quan. liên k t v i thành ph n JavaBean khác hay c dùng k t n i v i các ng d ng. B ng cách s d ng JavaBean các nhà phát tri n ng d ng có th gi m kh i ng mã mà h ph i vi t. T ng quan v JavaBean JavaBean là m t công ngh l p trình h ng thành ph n c a Sun d a trên n n t ng a ngôn ng Java. JavaBean là m t giao di n l p trình dùng t o ra nh ng kh i mã xây ng s n và có th dùng l i c. H có th t vi t ra chúng ho c có th mua l i c a m t hãng phát tri n th ba khác (third party). JavaBean th c ch t là m t l p Java nh các l p Java thông th ng khác. ph ng th c nào. Chính tên ph ng th c m i báo cho công c xây d ng bi t ây có là m t thu c tính hay m t s ki n hay ch là m t ph ng th c thông th ng. M t câu h i b n t ra là làm th nào ng i dùng Bean c a b n có th bi t c trong Bean ó có nh ng thu c tính. Nh ng thành ph n JavaBean có th c “nhúng” vào t ng d ng. i m t thu c tính boolean. thì b n t o ra hai ph ng th c: getXxx() và setXxx().

DataInputStream is. thu c tính này là m t //m ng nên tham s là m t ng public void setArr(int[] arr) { this. } public void setI(int i) { //ph ng th c set cho thu c tính i this.arr = arr. // thu c tính ki u int private int[] arr. thông th ng các thu c tính th ng c t m c truy c p là private. Thu c tính c a Bean Thu c tính th c ch t là m t bi n n m bên trong m t l p. Ví d v i m t Bean n gi n có tên là xBean nh sau: public class xBean { private String myName.DataOutputStream os. Ví d : Trình bày cách t o ra các thu c tính và cách xây d ng các ph ng th c “get” và “set” public class Bean1 { private String str. public String getStr() { //Ph ng th c get cho thu c tính str return str. // thu c tính ki u String private int i. } Trang 235 . public String getName() { return myName. } public void setStr(String str) { //Ph ng th c set cho thu c tính str this. truy c p n các thu c tính private này ta th ng dùng hai ph ng th c: “get” mang ngh a là l y giá tr c a thu c tính và “set” hàm ngh a gán giá tr cho thu c tính. Ph n l n các bi n c và thính gi là có s n b n có th t t o ra các bi n c và thính gi riêng c a mình.io. // thu c tính ki u logic private float f. Khi B phân tích (Instrospector) c a java th y trong Bean có hai ph ng th c tên là getName và setName nó s hi u r ng bên trong Bean này có m t thu c tính tên là name (vì có hai ph ng th c tên là getName và setName).} } Thu c tính myName trong l p xBean c l y và gán gián tr thông qua ph ng th c getName và setName. } //Ph ng th c set cho thu c tính arr. // thu c tính ki u m ng int private boolean b. } //Ph ng th c get cho thu c tính arr thu c tính này là m t //m ng nên giá tr tr v là m t ng public int[] getArr() { return arr.removeXxxListener(XxxListener).} public void setName(String newName) { myName=newName.i = i.io. } public int getI() { //Ph ng th c get cho thu c tính i return i. // thu c tính ki u float private java. // thu c tính ki u i t ng private java. 1.str = str. Nh b n th y gi a tên thu c tính và tên ph ng th c “get” và “set” là không liên quan n nhau.

DataOutputStream getOs() { return os.DataInputStream getIs() { return is.DataOutputStream os) { this. ch cài t m t thu c tính có th thông báo cho các i t ng khác bi t khi nó thay i r t n gi n ch c n cài t hai ph ng th c dùng ng ký và lo i b m t i t ng listener nh sau: public void add<PropertyName>Listener(PropertyChangeListener lst) public void remove<PropertyName>Listener(PropertyChangeListener lst) Ví d : n có m t JavaBean A có m t thu c tính size cho bi t kích c gì ó. sau ó ng ký v i thành ph n BeanA nh các ph ng th c mà b n xây d ng b c trên. S thay i bao Trang 236 .os = os. các i t ng Listener này có th nh n bi t c s thay i c a thu c tính size ta ph i g i ph ng th c firePropertyChange c a i t ng PropertyChangeSupport t thành ph n BeanA nh sau: public void firePropertyChange (String propertyName. private PropertyChangeSupport changeSize=new PropertyChangeSupport(this). } public java. } public void setOs(java. Khi m t thu c tính c a m t Bean A thay i nó có th thông báo cho các i t ng khác bi t là thu c tính c a A ã thay i i t ng này th c hi n công vi c gì ó ch ng h n nh c p nh t l i giá tr c a nó theo thu c tính c a A. } public void setF(float f) { this.io. Ph ng th c duy nh t mà b n ph i ghi è khi cài t giao di n PropertyChangeListener là public void propertyChange(PropertyChangeEvent evt) {.} Các th t c trên ây ch th c hi n nhi m v ng ký và t o i t ng Listener mà thôi. } //n u thu c tính là m t i t ng thì ph ng th c get tr //v m t i t ng ki u i ng public java. Object oldValue. Object newValue) Ph ng th c này s thông báo n m i i t ng listener (b ng cách g i ph ng th c propertyChange c a listener) ã ng ký v i thành ph n JavaBean. } } a) Các thu c tính th hi n s thay i (Bound Property) JavaBean là các thành ph n riêng bi t nh ng nó v n có th t ng tác v i các i ng khác thông qua c ch truy n thông p (message)..io.is = is. do thu c tính này ki u //logic nên b n có th s d ng is thay cho get public boolean isB() { return b.io.io.//Ph ng th c get cho thu c tính b. } public void setIs(java. Khi thu c tính size thay i các i t ng khác u bi t s thay i này ta cài t nh sau: public class BeanA {float size. public void addSizeListener(PropertyChangeListener lst){ } public void removeSizeListener(PropertyChangeListener lst){ } } Các i t ng mu n nh n c thông báo t JavaBean này u ph i cài t giao di n PropertyChangeListener .f = f. } public void setB(boolean b) { this. } public float getF() { return f.b = b.DataInputStream is) { this.

getOldValue()).*. public float getSize() { return size. // changeSize có nhi m v qu n lý các i t ng listener ã ng //ký và g i thông báo n chúng m i khi thu c tính size thay i PropertyChangeSupport changeSize = new PropertyChangeSupport(this).setSize(333). float newdSise = ( (Float) evt.floatValue(). } } Ví d sau th nghi m BeanA v a cài // TestBeanA.*.beans.firePropertyChange("size". // ng ký i t ng l ng nghe v i i t ng ba ba. public class TestBeanA { public static void main(String[] args) { // t o ra m t i t ng BeanA BeanA ba = new BeanA().floatValue(). D i ây là cài t l p BeanA và m t l p th nghi m thu c tình nh n bi t s thay i size //BeanA.addPropertyChangeListener(lst). size = newSize.beans. Trang 237 . } //Ph ng th c gán giá tr cho cho thu c tính size public void setSize(float newSize) { float oldSize = size.java import java. new Float(oldSize). //N u có thay i v kích th c thì thông báo n t t c các i //t ng ã ng ký l ng nghe if(oldSize!=newSize) changeSize.m giá tr tr c khi thay i (oldValue) và giá tr sau khi thay i (newValue) và tên thu c tính c thay i. String propertyName = evt. ph ng th c này // c tri u g i m i khi thu c tính thay i public void propertyChange(PropertyChangeEvent evt) { float oldSise = ( (Float) evt. } public void addSizeListener(PropertyChangeListener lst) { changeSize.removePropertyChangeListener(lst).getNewValue()).java t trên import java. public class BeanA { //Khai báo thu c tính size private float size. new Float(newSize)). } } //T o ra i t ng có kh n ng l ng nghe s thay i c a thu c tính class MyListener implements PropertyChangeListener { //Ph ng th c duy nh t c n ph i cài t. } public void removeSizeListener(PropertyChangeListener lst) { changeSize.getPropertyName(). //thay i giá tr c a thu c tính size ba.addSizeListener(new MyListener()).

T ng t nh thu c tính bound m i khi thu c tính constrain nh thay i giá tr (ch d nh ch ch a thay i) nó s thông báo n t t các i t ng ang l ng nghe. sau ó ng ký. } i t ng l ng nghe không ng ý cho thay i thu c tính nó ch c n ném ra m t ngo i l PropertyVetoException. Object newValue) Trang 238 .System.0 new value 333. Các i t ng s không bi t n s thay i c a thu c tính size cho n khi b n g i ph ng th c firePropertyChange c a i t ng PropertyChangeSupport. lo i v i thành ph n BeanA nh các ph ng th c mà b n xây d ng b c trên.0 Chú ý: Trong ví d trên tên c a ph ng th c dùng ng ký là addSizeListener và tên c a ph ng th c dùng g b ng ký là removeSizeListener tuy nhiên b n có th t cho nó m t cái tên thu thích ch ng h n nh dangKyLangNghe ng ký i ng l ng nghe hay huyBoLangNghe hu b i t ng l ng nghe.. Ng c l i n u t t c các i t ng ng nghe u không ph n i s thay i thì lúc ó thu c tính này m i nh n c giá tr i. Object oldValue. } } t qu khi ch y ch ng trình nh sau: Change size old value 1. ng nh thu c tính bound. khi thu c tính constrain có d nh thay i giá tr trong ph ng th c “set” nó c n thông báo n các i t ng ã ng ký l ng nghe (listener) v i nó b ng ph ng th c fireVetoableChange c a i t ng VetoableChangeSupport t thành ph n JavaBean nh sau: public void fireVetoableChange (String propertyName. b) Các thu c tính ràng bu c (Constrain Property) H n ch c a các thu c tính bound trên là các i t ng ch ph n ng l i khi giá tr a thu c tính ã b thay i.println("Change " + propertyName + " old value " + oldSise + " new value " + newdSise). Java cung c p m t kh n ng khác m nh h n ó là t o ra các thu c tính b ràng bu c (constrain property).out. m t thu c tính có th thông báo cho các i t ng khác bi t khi nó s p thay i giá tr r t n gi n b n ch c n cài t hai ph ng th c dùng ng ký và lo i b t i t ng listener nh sau: public void add<PropertyName>Listener(VetoableChangeListener lst) public void remove<PropertyName>Listener(VetoableChangeListener lst) Các i t ng mu n nh n c thông báo t JavaBean này u ph i cài t giao di n VetoableChangeListener. Ph ng th c duy nh t mà b n ph i ghi è khi cài t giao di n VetoableChangeListener là public void vetoableChange(PropertyChangeEvent evt) throws PropertyVetoException {. thành ph n JavaBean có thu c tính constrain s b t y và hu b vi c thay i giá tr cho thu c tính. i t ng l ng nghe có th t ch i s thay i và nh v y giá tr c a thu c tính v n gi nguyên giá tr ban u.

//Ph ng th c l y v giá tr c a thu c tính size public int getSize() { return size. i ây là m t cài t cho m t JavaBean B có thu c tính size.fireVetoableChange("size". Nh n xét: i t ng VetoableChangeSupport c ng t ng t nh i t ng PropertyChangeSupport dùng qu n lý các i t ng listener. } //Ph ng th c dùng thay i giá tr c a thu c tính size public void setSize(int newSize) { int oldSize = size. M i khi size thay i nó s thông báo cho các thành ph n khác bi t thông qua i t ng listener. // BeanB.java import java. // vetoAgent vó nhi m v qu n lý t t c các i t ng listener // ã ng ký private VetoableChangeSupport vetoAgent = new VetoableChangeSupport(this). public class TestBeanB { public static void main(String[] args) { Trang 239 . } //N u t t c các listener u không ph n i s thay i thì // ti n hành gán giá tr m i cho thu c tính size size = newSize.*. try { // Thông báo n t t c các i t ng ã ng ký l ng nghe vetoAgent. i t ng listener này s t ch i không cho thay i n u size >100.removeVetoableChangeListener(lst). newSize). } catch (PropertyVetoException ex) { // N u có m t listener nào ó ph n i không cho phép thay i //giá tr c a thu c tính size thì k t thúc ph ng th c return. } } Ví d sau dùng test th BeanB v a t o // TestBeanB. } //Ph ng th c dùng g b i t ng l ng nghe public void removeSizeListener(VetoableChangeListener lst) { vetoAgent.addVetoableChangeListener(lst).*. } //Ph ng th c dùng ng ký i t ng l ng nghe public void addSizeListener(VetoableChangeListener lst) { vetoAgent. public class BeanB { //Khai báo thu c tính size private int size = 0.beans.Ph ng th c này s thông báo n m i i t ng listener (b ng cách g i ph ng th c vetoableChange c a listener) ã ng ký v i thành ph n JavaBean.java import java. oldSize.beans. PropertyChangeSupport c dùng v i các thu c tính bound còn VetoableChangeSupport dùng cho thu c tính constrain.

intValue().getSize()).out.addSizeListener(new MyListener()).println(">Sau khi gan thuoc tinh size= "+b.out.setSize(56).getOldValue()). System.getPropertyName().out. System. //Gán giá tr 234 (234>100) cho thu c tính size b.getSize()).println(">Sau khi gan thuoc tinh size= "+b. evt).getSize()).out.setSize(10).println(">Sau khi gan thuoc tinh size= "+b.out. //Gán giá tr 10 (10<100) cho thu c tính size b.setSize(123).getNewValue()).out. String propName = evt.getSize()).println("size=123").println("size=10").out. System.out. //Gán giá tr 56 (56>100) cho thu c tính size b.println("size=56"). System.intValue().println("size=234").println(">Sau khi gan thuoc tinh size= "+b. System. } } //Cài t l p l ng nghe bi n c VetoableChangeListener class MyListener implements VetoableChangeListener { //Ghi è ph ng th c vetoableChange public void vetoableChange(PropertyChangeEvent evt) throws PropertyVetoException { int oldSize = ( (Integer) evt. int newSize = ( (Integer) evt. //Gán giá tr 123 (123>100) cho thu c tính size b. //N u newSize>100 thì không cho thay i b ng cách ném ra m t //ngo i l PropertyVetoException if (newSize > 100) throw new PropertyVetoException( "Gia tri gan cho Size lon hon 100".setSize(234).//T o ra m t i t ng BeanB BeanB b = new BeanB(). // ng ký i t ng l ng nghe b. System. System. } } t qu khi ch y ch ng trình size=10 >Sau khi gan thuoc tinh size= 10 size=123 >Sau khi gan thuoc tinh size= 10 size=234 >Sau khi gan thuoc tinh size= 10 size=56 >Sau khi gan thuoc tinh size= 56 Trang 240 . System.

MouseListener. Lúc này JavaBean c a b n c coi là i t ng ngu n i t ng phát sinh bi n c . có th l ng nghe và x lý các bi n c do các i t ng khác g i n JavaBean c a b n ch c n tri n khai các giao di n t ng ng và cài t các ph ng th c n thi t trong các giao di n ó.Event Source). sau ó ng ký nó v i các i t ng ngu n. T o ra JavaBean có kh n ng l ng nghe bi n c M t JavaBean có th c thi t k l ng nghe m t s bi n c do các i t ng khác g i n. Ví d : JavaBean c a b n có th x lý các bi n c v chu t do các i t ng khác g i n.awt. 4.1. import java. Xây d ng các ph ng th c cho JavaBean Các ph ng th c c a JavaBean c xây d ng nh các ph ng th c thông th ng.event. ng ký i t ng listener v i thành ph n JavaBean các thành ph n khác có th ng ký c i t ng listener v i thành ph n JavaBean thì b n thân thành ph n JavaBean c a b n ph i cài t hai ph ng th c theo khuôn m u (pattern) sau: public synchronized void add<EventListener>(<EventListener> lst) public synchronized void remove<EventListener>(<EventListener> lst) Ví d : các i t ng khác có th ng ký i t ng listener cho tình hu ng nh n chu t thì JavaBean c a b n ph i cài t hai ph ng th c ng ký nh sau: Trang 241 .MouseEvent. 4.awt.event. public class Bean3 implements MouseListener { public void mouseClicked(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } } Nh n xét: Nh b n th y vi c t o ra m t JavaBean có th l ng nghe các bi n c hoàn toàn ng t nh vi c t o ra các i t ng l ng nghe bi n c khác.2. JavaBean c a b n ch c n cài t giao di n MouseListener nh sau: import java. 3. Các i t ng khác mu n l ng nghe và x lý bi n c do JavaBean c a b n g i n nó ph i cài t giao di n l ng nghe t ng ng và ph i ng ký nó v i JavaBean c a b n. T o ra JavaBean có th ng ký i t ng l ng nghe bi n c Ngoài vi c b n có th t o ra các JavaBean có th l ng nghe bi n c do các i t ng khác g i n b n còn có th t o ra các JavaBean có kh n ng ng ký và g i i các bi n c n các i t ng l ng nghe khác.

*.java import java. BorderLayout.*. } //Ph ng th c dùng lo i b i t ng l ng nghe bi n c Trang 242 . public class MouseBean extends JPanel { // M t Vecto l u tr các i t ng listener private transient Vector mouseListeners = new Vector().awt.removeElement(l).setText("Mouse JavaBean"). JavaBean s g i n t ng ph ng th c t ng ng c a các listener này.CENTER).contains(l)) { mouseListeners.contains(l)) { mouseListeners. import java. Khi mu n chuy n giao tình hu ng.event.swing. } } Hai ph ng th c trên ch là hình th c dùng ng ký và lo i b các i t ng l ng nghe mà thôi. import java.public synchronized void addMouseListener(MouseListener l) public synchronized void removeMouseListener(MouseListener l) Thành ph n JavaBean c n l u l i danh sách các listener ã ng ký.awt. Khi t JavaBean mu n thông báo n các i t ng l ng nghe nó ch c n duy t trong danh sách các i t ng ã ng ký l ng nghe bi n c và g i ph ng th c t ng ng mà i ng listener ã cài t.addElement(l).util. // Thêm vào danh sách } } //Ph ng th c dùng lo i b m t listener public synchronized void removeMouseListener(MouseListener l) { if (mouseListeners != null && mouseListeners. jButton1. public MouseBean() { jButton1.addMouseListener(new MyListener(this)). this.setLayout(new BorderLayout()).*.*. this.add(jButton1. // T o ra m t nút l nh JButton jButton1 = new JButton(). N u có nhi u listener cùng ng ký thì JavaBean c a b n th ng l u l i danh sách các i t ng listener ã ng ký b ng m t Vecto nh sau: //T o ra m t Vecto l u l i danh sách các listener ã ng ký private transient Vector mouseListeners=new Vector(). ta xây d ng thành ph n JavaBean có kh n ng ti p nh n các i t ng listener dùng x lý tình hu ng chu t. i ây là m t ví d minh ho . Th c ch t nó ch a g i i b t c thông báo nào n i t ng l ng nghe. import javax. //Ph ng th c ng ký i t ng listener public synchronized void addMouseListener(MouseListener l) { //N u listener ng ký ch a có trong danh sách thì thêm nó vào if (!mouseListeners. // MouseBean.

swing.mouseClicked(e).MouseAdapter { MouseBean adaptee. i < count. } } //Ph ng th c dùng ng ký i t ng l ng nghe bi n c public synchronized void addMouseListener(MouseListener l) { if (!mouseListeners.contains(l)) { mouseListeners. import java. } } Sau ây là ng d ng test th thành ph n MouseBean.*. // Frame1.public synchronized void removeMouseListener(MouseListener l) { if (mouseListeners != null && mouseListeners. i++) { ( (MouseListener) listeners. } public void mouseClicked(MouseEvent e) { adaptee. Khi b n kích chu t trên MouseBean thì thính gi này s xu t hi n t h p thông báo (message).jButton1_mouseClicked(e).*. } } } /*Khi chu t c kích trên nút l nh thì thông báo n t t c các i t ng ã ng ký ng nghe b ng cách g i ph ng th c fireMouseClicked */ void jButton1_mouseClicked(MouseEvent e) { fireMouseClicked(e). import java.size().event. for (int i = 0.contains(l)) { mouseListeners.addElement(l).awt.event. } } //T o ra l p l ng nghe s ki n chu t c a nút l nh class MyListener extends java. MyListener(MouseBean adaptee) { this. Có m t thính gi l ng nghe bi n click trên MouseBean.removeElement(l).elementAt(i)).adaptee = adaptee.*.java import javax. } } /*Ph ng th c này dùng thông báo n t t c các i t ng l ng nghe bi n c khi có ki n mouseClick s y ra trên i t ng jbutton1*/ protected void fireMouseClicked(MouseEvent e) { if (mouseListeners != null) { int count = mouseListeners.awt. public class Frame1 extends JFrame { //t o ra i t ng MouseBean Trang 243 .awt.

setLocale(java. 48)). this.MouseBean mouseBean1 = new MouseBean(). 270.setDefaultCloseOperation(EXIT_ON_CLOSE).mouseBean1_mouseClicked(e). } } //T o ra i t ng l ng nghe class MouseBeanListener extends java.getContentPane().getContentPane(). // ng ký i t ng l ng nghe v i i t ng MouseBean mouseBean1."Test MouseBean". 100. 150).INFORMATION_MESSAGE). null). 137.getDefault()). f. f. 34.awt.MouseAdapter { Frame1 adaptee.showMessageDialog(this. } //Khi kích chu t vào MouseBean thì hi n th h p thông báo void mouseBean1_mouseClicked(MouseEvent e) { JOptionPane. } public static void main(String[] args) { Frame1 f = new Frame1(). MouseBeanListener(Frame1 adaptee) { this.setLayout(null).Locale.adaptee = adaptee. mouseBean1.setBounds(new Rectangle(61.event. "Ban vua kich chuot vao MouseBean".JOptionPane. } } t qu ch y ch ng trình sau khi b n kích chu t vào MouseBean Trang 244 .setBounds(100.setVisible(true). this. } public void mouseClicked(MouseEvent e) { adaptee.addMouseListener(new MouseBeanListener(this)). this. public Frame1() { this.util.add(mouseBean1.

} //Ph ng th c này dùng lo i b i t ng listener public void removeMouseListener(MouseListener lst) { saveListener=null. import java.beans.beans. v i c ch này ôi lúc s d n n tr ng h p xâm ph m l n nhau. Kh n ng ng ký m t listener (unicast) và nhi u listener (milticast) c a thành ph n JavaBean Thông th ng m t JavaBean cho phép ng ký nhi u i t ng l ng nghe bi n c .2.PropertyVetoException.PropertyChangeEvent. /* Ph ng th c ng ký i t ng listener*/ public void addMouseListener(MouseListener lst) throws TooManyListenerException { if(saveListener==null){ saveListener=lst. //UseBean2. import java.VetoableChangeListener. } else{ /* u ã có m t listener nào ó c ng ký thì ném ra m t ngo i l */ throw new TooManyListenerException(). n u có nhi u h n m t listener c ng ký thì ph ng th c ng ký c a JavaBean c n c thi t k ném ra m t ngo i l là: TooManyListenerException nh sau: public void add<EventListenerType>(< EventListenerType> lst) throws TooManyListenerException n ch ng trình sau t o ra hai ph ng th c add và remove ch cho phép ng ký t listener mà thôi: MouseListener saveListener=null.4. d i ây ta s vi t m t ví d minh ho cho s tranh ch p khi có nhi u i t ng listener cùng ng ký x lý m t tình hu ng. tr c khi thay i giá tr c a thu c tính nó c n h i ý ki n c a t t c listener. Thu c tính size c a thành ph n BeanB là thu c tính ràng bu c. public class UseBean2 { public static void main(String[] args) { Trang 245 . Ch ng trình s d ng hai i t ng listener cùng x lý m t tình hu ng. ch ng h n listener này thì cho phép thay i giá tr c a thu c tính trong khi listener khác l i ng n c n.beans.java import java. } hi u rõ h n. Chính vì v y m t vài thành ph n JavaBean ch cho phép ng ký m t listener mà thôi (unicast). Ch ng trình này dùng l i thành ph n BeanB ã thi t k ph n u (xem ví d v thu c tính ràng bu c –contrain property). minh ho ta s t o ra hai i ng listener là MyListener21 ch cho phép thay i thu c tính size khi giá tr m i l n h n 50 còn MyListener22 ch cho phép thay i thu c tính size khi giá tr m i l n h n 100. Tuy nhiên. ch cho phép nhi u listener cùng c ng ký x lý cùng m t tình hu ng cg i là milticast.

if (newSize > 100) throw new PropertyVetoException("Gia tri lon hon 100 Listener 2 reject".getSize() + " set new size 30"). System.out. b.getNewValue()). evt). if (newSize > 50) throw new PropertyVetoException("Gia tri lon hon 50 Listener 1 reject". System. Chính vì v y java phân bi t hai cách ng ký listener là unicast và multicast.setSize(90). } } class myListener22 implements VetoableChangeListener { public void vetoableChange(PropertyChangeEvent evt) throws PropertyVetoException { int newSize = ( (Integer) evt.out. b. Trang 246 .getNewValue()).println("old size:" + b.getSize() + " set new size 90").intValue(). m c dù listener th hai là myListener22 cho phép gán giá tr >50 và <100 nh ng listener th nh t là myListener22 l i không cho phép. Tuy nhiên theo khuy n khích thì các thành ph n JavaBean nên c xây d ng h tr c ch ng ký nhi u i t ng listener (multicast). b.BeanB b = new BeanB().intValue(). b.out.getSize()).setSize(30).println("size after setting:" + b. } } t qu ch y ch ng trình: old size:0 set new size 30 size after setting:30 old size:30 set new size 90 size after setting:30 Quan sát k t qu ch y ch ng trình ta th y t t c giá tr l n h n 50 u không th gán c cho thu c tính size. System. nh y trong tr ng h p listener th hai myListener22 cài t mà không bi t r ng myListener21 ã c cài t tr c ó thì ng i dùng cu i s b nh m l n. evt).getSize()).out.addSizeListener(new myListener22()). System.println("size after setting:" + b.addSizeListener(new myListener21()). } } class myListener21 implements VetoableChangeListener { public void vetoableChange(PropertyChangeEvent evt) throws PropertyVetoException { int newSize = ( (Integer) evt.println("old size:" + b.

u này là hoàn h o gi i quy t v n Bean mà không yêu c u b n ph i làm thêm b t c th thu t ngôn ng nào nh v n b yêu c u trong các ngôn ng l p trình tr c quan khác. Công c này chính là l p Instrospector.III. Cách mà Instrospector làm vi c Ví d khi ra có hai ph ng th c nh sau: public int getSize() public void setSize(int newSize) Theo cách này java hi u r ng b n mu n t o ra m t thu c tính có tên là size có ki u int. s ki n c a JavaBean. không nh ng làm cho JavaBean n gi n h n trong s d ng mà còn cung c p t ngõ c a chu n t o ra các JavaBean ph c t p h n. Tìm hi u Instrospector 1. ph ng th c. làm th nào môi tr ng phát tri n tr c quan này có th bi t c trong JavaBean a ta có nh ng thu c tính. ph ng th c. n truy n tham chi u Class cho l p này và nó hoàn toàn i h i l p ó và cho l i t i t ng BeanInfo. s ki n nào.. d a vào BeanInfo này b n có th m x tìm ra các thu c tính. ph ng th c. ph ng pháp quan tr ng nh t c a l p này là static getBeanInsfo(). Th ng thì ta dùng các m u sau khi xây d ng các ph ng th c dành cho thu c tính và s ki n. m t trong nh ng lý do chính mà ph n x c thêm vào cho java là h tr JavaBean (m c dù nó còn c dùng trong tu n t hoá và g i các ph ng th c ng t xa). s ki n c a m t l p b t k (k c l p vô danh). Trong th c t . Instrospector là gì? M t câu h i b n t ra là khi b n kéo m t JavaBean t thanh công c và th vào Form (trong m t môi tr ng phát tri n tr c quan nào ó ch ng h n nh Jbuilder ch ng n). Hay khi t o ra các thu c tính ràng bu c (contrain property) ta vi t: public addSizeListener(VetoableChangeListener lst) public removeSizeListener(VetoableChangeListener lst) java s hi u là có m t thu c tính size c n g i n hai ph ng th c này m i khi mu n ng ký hay lo i b m t i t ng listener dùng quan sát s thay i c a thu c tính. c ch ph n x giúp ta có th phát hi n ra các thu c tính. 2. Thi t k các ph ng th c m u dùng cho thu c tính i v i m i thu c tính b n c n xây d ng hai ph ng th c “get” và “set” theo m u sau ây: public <propertyType> get<PropertyName>() public void set<PropertyName>(<propertyType> newValue) Trong ó: propertyType là b t c ki u d li u nào nguyên thu hay i t ng PropertyName là tên c a thu c tính Chú ý: u thu c tính có ki u boolean thì ph ng th c “get” có th thay b ng ph ng th c “is” Trang 247 . Tóm l i n u các ph ng th c c thi t k theo m t m u (pattern) nào ó thì nó s c em dùng vào m c ích riêng.. Nh ng nh ng ng i thi t k java l i mu n cung c p m t công c chu n.?. V n này ã c gi i quy t b ng tính ph n x (reflect).

return null. case BeanInfo.java l p này c d n xu t t l p SimpleBeanInfo có nhi m v cung c p các thông tin v thành ph n JavaBean mà ta xây ng: import java. beanClass.ICON_COLOR_32x32: return iconColor32x32Filename != null ? loadImage(iconColor32x32Filename) : null. } } Trang 248 . } } public java. case BeanInfo. } catch(IntrospectionException ex) { ex.Image getIcon(int iconKind) { switch (iconKind) { case BeanInfo. case BeanInfo. public class BeanBBeanInfo extends SimpleBeanInfo { Class beanClass = BeanB. public BeanBBeanInfo() { } public PropertyDescriptor[] getPropertyDescriptors() { try { PropertyDescriptor _size = new PropertyDescriptor("size". String iconColor32x32Filename. "getSize". } return null.*. Tìm hi u l p BeanInfo Khi b n t o ra BeanB (xem l i l p này trong ph n thu c tính ràng bu c) b n có th o ra m t l p ph khác là BeanBBeanInfo. return pds. "setSize").ICON_MONO_16x16: return iconMono16x16Filename != null ? loadImage(iconMono16x16Filename) : null. String iconMono32x32Filename.Java ch hi u là b n nh t o ra m t thu c tính n u nh có c hai ph ng th c “get” và “set” Ki u tr v c a ph ng th c “get” th ng là ki u c a i ph ng th c “set Thi t k các ph ng th c m u dùng cho s ki n xây d ng m t s ki n nào ó cho m t thành ph n JavaBean ta c n xây d ng hai ph ng th c “add” và “remove” theo m u sau ây: public void add<EventListenerType> (<EventListenerType> evt) public void remove<EventListenerType> (<EventListenerType> evt) Trong ó EventListenerType là i t ng tình hu ng mà JavaBean mu n các thành ph n khác t ng tác c v i mình.printStackTrace().class. String iconMono16x16Filename.beans. PropertyDescriptor[] pds = new PropertyDescriptor[] { _size}. Ví d thành ph n JavaBean có th ng ký c các tình hu ng Action ta vi t public void addActionListener (ActionListener lst) public void removeActionListener (ActionListener lst) 3. String iconColor16x16Filename.ICON_MONO_32x32: return iconMono32x32Filename != null ? loadImage(iconMono32x32Filename) : null.awt.ICON_COLOR_16x16: return iconColor16x16Filename != null ? loadImage(iconColor16x16Filename) : null.

s ki n. IV. óng gói JavaBean Tr c khi xu t b n JavaBean b n th ng óng gói nó vào trong m t t p .Các ph ng th c quan tr ng mà b n c n quan tâm là: Ph ng th c getIcon() ph ng th c này c g i khi các môi tr ng phát tri n tr c quan mu n l y v bi u t ng cho JavaBean.0 Name BeansDir/BeanB. Trình biên d ch d dàng tìm ra các thu c tính. ph ng th c. t dòng th hai tr i cho bi t trong tên c a các l p có trong t p óng gói.mf Dòng th nh t cho bi t phiên b n. Trang 249 . Ph ng th c getPropertyDescriptors() ph ng th c này giúp cho Instrospector d dàng y v các thu c tính c a JavaBean. Tr c khi mu n bi t JavaBean c a n có nh ng thành ph n nào trong Bean c a b n tr c tiên nó i tìm trong l p BeanInfo t ng ng. dòng cu i cùng cho bi t n v óng gói này là m t JavaBean. các công c xây d ng tr c quan bi t trong t p óng gói này là m t JavaBean b n c n o t p mô t óng gói b ng cách sau: d ng m t trình so n th o b t k t o ra t p tin BeanB.class Java-Bean: True Ghi l i v i cái tên gì ó ch ng h n BeanB. Ph ng th c getMethodDescriptors() ph ng th c này giúp cho Instrospector d dàng y v các ph ng th c c a JavaBean… ng cách xây d ng l p BeanInfo i kèm v i JavaBean c a b n.mf nh sau: Manifest-Version: 1. n u không tìm th y BeanInfo i kèm v i l p lúc ó nó m y s ng c ch ph n x hay i tìm các ph ng th c c thi t k theo m u. B n ti n hành óng gói b ng l nh jar hoàn toàn t ng t nh b n óng gói các l p khác.class Name BeansDir/BeanBInfo.jar chu n.

Sign up to vote on this title
UsefulNot useful