P. 1
All Java02

All Java02

|Views: 4|Likes:
Published by nguoicodon123

More info:

Published by: nguoicodon123 on Nov 02, 2010
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

11/05/2011

pdf

text

original

Sections

  • Ch ng 1: CÁC KHÁI NI M C B N
  • BÀI 1. LÀM QUEN V I JAVA
  • I. L ch s java
  • II. Java em là ai
  • II. M t s c tr ng c a java
  • III. Các ki u ng d ng Java
  • IV. Máy o Java (JVM-Java Virtual Machine)
  • BÀI 2 N N T NG C A JAVA
  • I. T p ký t dùng trong java
  • II. T khoá c a Java
  • III. nh danh (tên)
  • IV. C u trúc m t ch ng trình java
  • V. Ch ng trình JAVA u tiên
  • VI. Chú thích trongch ng trình
  • VII. Ki u d li u
  • VII. M t s phép toán trên ki u d li u nguyên thu
  • IX. Toán t chuy n ki u
  • X. Các hàm toán h c
  • XI. Các phép toán trên ki u kí t
  • BÀI 3. U KHI N LU NG CH NG TRÌNH
  • I.C u trúc r nhánh
  • II. C u trúc l p while và do-while
  • III. C u trúc for
  • IV. L nh break và continue
  • Ch ng 2: L P TRÌNH H NG I T NG
  • BÀI 1. NH NGH A L P
  • I. Khai báo l p
  • II. Chi ti t v khai báo m t ph ng th c
  • III. T khoá this
  • IV. T khoá super
  • V. S d ng l p
  • VI. i u khi n vi c truy c p n các thành viên c a m t l p
  • BÀI 2. KH I U VÀ D N D P
  • I. Ph ng th c t o d ng (constructor)
  • II. Kh i kh i u vô danh và kh i kh i u t nh
  • III. D n d p: k t thúc và thu rác
  • BÀI 3. CÁC THÀNH PH N T NH
  • I. Thu c tính t nh
  • BÀI 4. N P CH NG PH NG TH C
  • I. Khái ni m v ph ng th c b i t i
  • II. Yêu c u c a các ph ng th c b i t i
  • BÀI 5. K TH A (INHERITANCE)
  • I. L p c s và l p d n xu t
  • II. Cách xây d ng l p d n xu t
  • } III. Th a k các thu c tính
  • IV. Th a k ph ng th c
  • V. Kh i u l p c s
  • VI. Ghi è ph ngth c ( Override )
  • VI. Thành ph n protected
  • VII. T khoá final
  • BÀI 6. L P C S TR U T NG
  • BÀI 7. A HÌNH THÁI
  • BÀI 8. GIAO DI N, L P TRONG, GÓI
  • I. Giao di n
  • II. L p trong
  • Bài 9. M NG, XÂU KÝ T , T P H P
  • I. M ng
  • II. Xâu ký t
  • III.L p StringTokenizer
  • IV. M t s l p c b n c a Java
  • V. Các l p t p h p
  • Ch ng 3: X LÝ NGO I L
  • I. M c ích c a vi c x lý ngo i l
  • II. Mô hình s lý ngo i l c a java
  • III. c t ngo i l
  • III. Ném ra ngo i l
  • IV. B t ngo i l
  • Ch ng 4: L P TRÌNH A TUY N
  • I. Các ki n th c liên quan
  • II. L p trình a tuy n trong Java
  • Ch ng 5: NH P XU T (Input/Output)
  • I. L p lu ng
  • II. L p File
  • Ch ng 6: L P TRÌNH HO AWT
  • I. Gi i thi u v h th ng ho c a Java
  • II. Trình qu n lý hi n th trong Java
  • III. X lý s ki n trong Java
  • Ch ng 7 L P TRÌNH C S D LI U
  • II. Các k u trình u khi n JDBC
  • III. Các l p trong JDBC API dùng truy c p CSDL
  • IV. K t n i CSDL v i JDBC
  • V. T ng tác v i CSDL
  • VI. Qu n lý giao d ch
  • Ch ng 8: L P TRÌNH SOCKET
  • II. Kh o sát m t s l p trong gói java.net
  • 2. L p URL và URI
  • 3. L p Socket
  • 4. L p ServerSocket
  • 5. L p DatagramSocket
  • 6. L p DatagramPacket
  • III. TCP Socket
  • Ch ng 9: JAVA MAIL
  • I. Các khái ni m MAIL
  • II. G i mail v i th vi n có s n c a java
  • III. Gi i thi u java mail API
  • III. G i mail
  • IV. Nh n mail
  • V. Xoá mail
  • 1. Xoá mail
  • I. RMI và l p trình phân tán i t ng
  • II. G i ph ng th c t xa và các v n phát sinh
  • III. Vai trò c a các l p trung gian
  • IV. Cài t i t ng phân tán
  • Ch ng 11: JAVA JSP (JAVA SERVLET)
  • Ch ng 12: EJB (ENTERPRISE JAVA BEANS)
  • I. T ng quan v JavaBean
  • II. Xây d ng thành ph n JavaBean
  • III. Tìm hi u Instrospector
  • IV. óng gói JavaBean

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

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

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

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

M 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 .class Ø Qu n lý b nh Ø D n “rác” Vi c không nh t quán c a ph n c ng làm cho máy o ph i s d ng ng n x p l u tr các thông tin sau: Ø Các “Frame” ch a các tr ng thái c a các ph ng th c. Ø Các toán h ng c a mã bytecode.o). Trang 8 . Khi c n thi t. 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. 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ó th thay i n i dung thanh ghi i h ng th c thi c a ch ng trình. m t thanh ghi c c b có tên “Program Counter” c s d ng. Thanh ghi này tr t i l nh ang th c hi n. Ø Các bi n c c b . h u hành. 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. Trong tr ng h p thông th ng thì t ng l nh m t n i ti p nhau s c th c thi. M 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. Nó thi t l p các l p tr u t ng cho: Ph n c ng bên d i. Ø Các tham s truy n cho ph ng th c. Khi JVM th c thi mã. 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.

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). 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. 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 . do v y ta có th dùng các kí t unicode t tên cho các nh danh.. 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). T khoá c a Java M i ngôn ng l p trình có m t t p các t khoá. ph ng th c không th ghi è. hàm. 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.BÀI 2 N N T NG C A JAVA I. các kí t c nhóm l i theo m t cách nào ó t o thành các t . nh s d ng nó t tên bi n. II. T p ký t dùng trong java M i ngôn ng nói chung. 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 . ta không th nh ngh a l i ngh a c a các t khoá.

ví d l p WhileTest.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. Do java có phân bi t ch hoa.Không ch a d u cách._ . java có phân bi t ch hoa ch th ng . ghi t u tiên ch th ng. nh danh (tên) Tên dùng xác nh duy nh t m t i l ng trong ch ng trình. -. giao di n ta vi t hoa các kí t u tiên c a m i t trong tên. ví d PI. tên ph i b t u b ng kí t ho c b t u b ng kí $. Circle . 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.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 . ví d area. l p. readInteger… i v i tên l p./. radius.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.Tên h ng bao gi c ng vi t hoa. 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. Trong java tên c t theo quy t c sau: .Tên nên t sao cho có th mô t c i t ng trong th c t .Gi ng nh C/C++. ph ng th c sao cho ngh a c a chúng rõ ràng.Không trùng v i m t nh danh khác trong cùng m t ph m vi Chú ý: . khoa h c và mang tính c l qu c t . %.Trong java ta có th t tên v i dài tu ý . d hi u. MAX_VALUE IV.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) . vi t hoa kí t u tiên c a m i t theo sau trong tên. *. . ch th ng nên ta ph i c n th n và chú ý.Không trùng v i t khoá .Không b t u b ng m t s .. 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. các kí t toán h c nh +. h ng. C u trúc m t ch ng trình java . 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 ‘_’.

ph ng th c c a l p ó. Khi xây d ng m t 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 nh u c k t thúc b ng d u ch m ph y “.java //Nh p kh u các th vi n import th _vi n. 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”. 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 ó.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) . 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) .Khi ban khai báo m t l p.. th c ch t b n ang t o ra m t m t ki u d li u. trong khi ó m i i t ng là m t th hi n th c s .Bên trong thân c a m i l p ta khai báo các thu c tính. . i t ng là các th hi n (instance) c a l p. b n c n xác V c b nm tl p c khai báo nh sau: Trang 11 . M i l p xác nh m t th c th . t n v biên d ch là m t t p tin . Java là ngôn ng h ng i t ng.”. nh d li u và các ph ng th c c a l p ó. do v y mã l nh ph i n m trong l p nào ó. //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. 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.

. 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....... <met_datatype> methodname (parameter_list){..ki u d li u c a bi n variablename . . 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ó...4) ta s nh n c m t c u trúc th m c nh sau: V.T khoá xác nh l p classname ... 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 . . + 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 . song không th ng c l i. 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.Ki u d li u tr v c a ph ng th c methodname . ây là l p x p l ng nhau.. Nó chi ph i vi c truy nh p n các thành ph n c a l p bao ph chúng. Có hai lo i l p trong ó là l p trong t nh “static” và l p trong không t nh “non static” + L p trong t nh (static) L p trong t nh c nh ngh a v i t khoá “static”....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 ..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 ....4\BIN\javac TênT p.Tên c a bi n met_datatype . Ch - biên d ch m t ch ng trình java sang mã byte code ta dùng l nh C:\JDK1.....Cú pháp: class classname { var_datatype variablename.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 . trong h p tho i hi n ra gõ “classpath” vào ô Variable Name và “.i v i dòng Win9X: M t p C:\Autoexec..jar” trong ô variable value (chú ý không gõ d u “ vào. 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ó.4\lib\tools.4\jre\lib\rt.4\jre\lib\rt.C:\jdk1.C:\jdk1.4\bin” Công vi c t các bi n môi tr ng ã xong.C:\jdk1.jar.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: .jar.4\lib\dt.4\lib\tools. trong ô value ta thêm vào cu i “.C:\jdk1.jar.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.4\lib\dt..jar + path=….bat sau ó thêm vào hai dòng sau: +classpath=.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 .C:\jdk1.C:\jdk1.jar.c:\jdk1.C:\jdk1.

Chú ý: Trong java ta có th t chú thích âu?.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.M c a s DOS Prompt + Chuy n vào th m c C:\ + Gõ l nh javac HelloWorld.java biên d ch ch ng trình. 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. 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. 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.- 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. Ghi l i v i cái tên C:\HelloWorld. k c ch hoa ch th ng. nh notepad. Sau khi thông d ch và ch y ta nh n c - VI. v i cách chú thích hai ta ch có th chú thích trên m t dòng. wordpad. ph n m r ng là java) . C++ Cách 3: s d ng c p /** và */.class trong cùng th m c. ây là ki u chú thích tài li u (không có trong C/C++). C++ Cách 2: s d ng c p // ý ngh a c a c p chú thích này gi ng nh c a C.out. Trang 14 . 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. } } tr asciii.println("Hello World"). Chú thích trong ch ng trình Trong java ta có 3 cách ghi chú thích Cách 1: s d ng c p /* và */ ý ngh a c a c p chú thích này gi ng nh c a C. câu tr l i là: âu có th t cm t d u cách thì ó có th t chú thích.

Trang 15 Mô t T p h p các d li u cùng ki u. 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. 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. Ki u d li u 1. Là s cài t mô t v m t ng it ng trong bài toán. m c a các bi n ki u tham chi u là nó ch a ng mà nó tr .VII. Do v y vi c truy xu t vào m t bi n ki u nguyên th y r t nhanh. 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.

Khai báo bi n ng t ngôn ng C/C++. Ph m vi bi n M i bi n c khai báo ra có m t ph m vi ho t ng.type là ki u d li u cu bi n . ph m vi c a bi n là n i mà bi n có th c truy c p. VIII.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. trong ó: . u này xác nh c tính th y c và th i gian s ng c a bi n. các bi n này c phân cách nhau b i d u ph y . 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ú ý: .name là tên c a bi n.InitValue là giá tr kh i t o cho bi n. 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. tên bi n là m t xâu kí t c t theo quy t c t tên c a java . Khai báo bi n 1. 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. Trang 16 .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. ây là ph n tu ch 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. khai báo bi n trong java ta s d ng cú pháp sau: type name [=InitValue].

Ø 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. 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. 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. // c i và j u có giá tr 10 Trang 17 . Phép gán Cú pháp Bi n=Bi uTh c. Phép gán c th c hi n b ng toán t ‘=’. 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. 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. 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. 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 .// 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. // ch có i s n sàng s d ng { int j=10. VII. { int i=10. M t s phép toán trên ki u d li u nguyên thu 1. // 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.

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. t ng sau(gi m tr c. 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. 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 tr ). Phép toán quan h Phép toán quan h bao gi c ng cho k t qu boolean. 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). % ( 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 ./ ( phép chia ). 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. 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 . * ( phép nhân ). chúng ch khác nhau khi chúng n m trong bi u th c 4. ta có th mô t tóm t t qua các b ng sau: Mô t ng op lên 1 n v .2. Toán t t ng. nó xác nh m i quan h gi a chúng. phép toán quan h s so sánh 2 giá tr . 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 . gi m Gi ng nh ngôn ng C/C++. ví d ! = s tr v true n u 2 toán h ng là khác nhau. java c ng có phép toán t ng. gi m. 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 .

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

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.1. giá tr c a op2 ch c tính khi op1 là false op là false C op1 và op2 u là true. << 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. i <= j = true j <= i = false k <= j = true Equal to. op2 bit Sau ây là hình minh ho phép toán d ch bít Trang 20 . 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 c tính k c khi op1 là false 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 ch c tính khi op1 là true Ho c op1 ho c op2 là true. i! = j = true k! = j = false 5. phép toán thao tác trên bit 6... 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.. i == j = false k == j = true Not equal to... 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..

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

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

C u trúc l p while và do-while 1. 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. Toán t u ki n là m t lo i toán t bi u th c u ki n. String result=a%2==0 ? a là s ch II. 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. Trong ó bi u th c 1: Bi u th c 1 là m t bi u th c logic. n u giá tr c a bi u th c logic là úng thì câu l nh trong thân c a while s c th c hi n. 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. 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. sau khi th c hi n xong nó tính l i giá tr c a bi u th c logic. Ví d : Trang 30 . 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. 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. 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.1. } ta có th th y c lu ng th c hi n c a ch : a là s l .4. 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. 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 .

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

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

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

// Out of for loop if(i % 9! = 0) continue. } int i = 0.println(i). 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 . 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.out. 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.out. 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. ví d sau ch ra cách s d ng break và continue bên trong c u trúc l p for và while public class BreakAndContinue { public static void main(String[] args) { for(int i = 0. i < 100.// Next iteration System. } } } 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.i= 2 j= 4 i= 3 j= 6 i= 4 j= 8 IV. // An "infinite loop": while(true) { i++.println(i). th c hi n l n l p ti p theo.// Out of loop if(i % 10! = 0) continue. int j = i * 27.// Top of loop System. if(j == 1269) break. i++) { if(i == 74) break.

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

} static void prt(String s) { System.out. } } 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 .println(s).

hành vi ). vì v y ng i ta còn g i l p là ki u d li u i t ng. l p là s m r ng khái ni m RECORD trong pascal. m t ch ng trình java g m m t t p các i t ng.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. các i t ng này ph i h p v i nhau t o thành m t ng d ng hoàn ch nh. Các i t ng c mô t qua khái ni m l p. 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. hay struct c a C. ta có th xem l p là m t ki u d li u. l p còn có các hàm ( ph ng th c. ngoài các thành ph n d li u. Trang 37 . do v y có th quan ni m l p là t p h p các i t ng cùng ki u. java là ngôn ng l p trình h ng i t ng.

abstract là b t cho java bi t ây là m t l p tr u t ng. NH NGH A L P I. 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 ó. Khai báo l p 1. 2. final là b t cho java bi t ây là m t l p không th k th a Trang 38 . bao g m: thu c tính và ph ng th c> } Trong ó: 1.1. 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. do v y ta không th t o ra m t th hi n c a l p này 3. 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.BÀI 1.

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

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. Chi ti t v khai báo m t ph 1. nó là m t thu c tính s d ng chung cho c l p. khai báo nh ng ch khác s cho ta bi n. protected ho c có th b tr ng.3.Ø accessLevel có th là m t trong các t public. Ø .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ó 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.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. ý ngh a c a các b t này c mô t ph n trê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. II. 1. 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. private. 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.

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

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

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

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

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

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

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

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

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

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

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

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

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

out. 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. k th a không ch là sao chép giao di n c a l p c a l p c s . 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. 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. 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. 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. 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 .println ( "Ham tao c a lop co so" ). i u này d n ta n m t hình dung. 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. nó còn c k th a t t c các thành ph n c a l p cha II. thì nó ch a bên trong nó m t s v t con 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. 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 . cú pháp nh sau: class b extends a { // ph n thân c a l p b } III. 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 . 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.} } 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 thì l p c s ph i c b o m kh i u úng. l p h u du ).BÀI 5. } Trang 54 . nh ng th c t không ph i v y. 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 ó.out. Khi ta t o ra m t i t ng c a l p suy d n. 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ó. 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. 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.println ( "Ham tao c a lop dan xuat" ). package c al pc s IV. K TH A (INHERITANCE) I.

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

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

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

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

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

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

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. chúng ch g m có khai báo.BÀI 6. do v y các ph ng th c tr u t ng c ng không c cài t c th . 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. do l p tr u t ng ch làm l p c s cho các l p khác. 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. vi c cài t c th s dành cho l p con Chú ý: 1. 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. ta không th t o ra th hi n c a l p này. Không th t o ra i t ng c a l p tr u t ng Ph Trang 61 .

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

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

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

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

} public Object nextElement() { if (!hasMoreElements()) throw new NoSuchElementException().elementAt(currentItem--).return (currentItem >= 0). else return items. } } } 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 .

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

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

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

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

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

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

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

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

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

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

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

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 . Float floatObj = new Float(3. có th thao tác c trên các giá tr nguyên th y (giá tr s . Boolean boolObj = new Boolean(“true”). 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. Class getClass() Tr l i tên l p c a i t ng hi n th i. Trang 78 .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). 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). Boolean boolObj = new Boolean(true). 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().14F). 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”.C u trúc phân c p m t s l p trong gói java. hàm này có th s d ng xác nh duy nh t giá tr cho m i i t ng. 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. 2. 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 è. kí t và logic) thì gói java.lang 1. 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 ó. Double doubleObj = new Double(3. 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’). 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.14). ngh a là tr c khi i ng ó b hu b . 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. Integer intObj = new Integer(“2002”). ngh a là t o ra b n copy m i c a i t ng hi n th i. ây là l p c s nh t. 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(). Integer intObj = new Integer(2002). 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. 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. Các l p bao có nh ng c tính chung sau: Các toán t t o l p chung.

// “3. // “a” String boolStr = boolObj.14”).MAX_VALUE và các giá tr ki u ký t Unicode.floatValueOf(). toString(). 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.valueOf(“2002”). // “true” String intStr = intObj. Double doubleObj= new Double(“3. // false Integer intObj1 = Integer.valueOf(“3.valueOf(“3.valueOf(“2010”). 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 . Boolean. // ‘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. // true int i = intObj. 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 .toString(). // 3.equals(intObj1). Character charObj = new Character(‘a’).TRUE. // false L p Boolean L p này nh ngh a hai i t ng Boolean.FALSE bi u di n cho hai giá tr nguyên th y true và false t ng ng.14F”).charValue(). equals().valueOf(“true”).doubleValueOf(). L p Character L p Character nh ngh a hai giá tr c c ti u. Integer intObj = Integer.toString().14”). typeValue(). c c i Character.intValue(). Có các hàm ti n ích chung: valueOf(String s). // 2002 float f = floatObj.equals(‘b’). // 3. boolean charTest = charObj. Character. Double doubleObj= Double. boolean intTest = intObj.toString().14 char c = charObj.booleanValue().14F”).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. 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.MIN_VALUE. String charStr = charObj.Float floatObj = new Float(“3.14F double d = doubleObj. Float floatObj = Float. // “2002” String doubleStr = doubleObj. Boolean boolObj = Boolean.toString(). boolean b = boolObj.

MAX_VALUE.intValue().MAX_VALUE là các gi i h n c a các s trong ki u ó. double value3 = Double.out. static void nhap(){ String str.14”).parseDouble(“3. for (int k = 0. 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.out. k < n. day[k] = Integer. k < n.*. Các l p bao ki u s Các l p Byte.MIN_VALUE.parseInt(“2002”).err. Integer. byte minByte = Byte.in). // 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. for (int k = 0.println("I/O Error!"). k++){ try{ System.print(day[k] + " ").length. str = stream. int value2 = Integer. // -128 int maxInt = Integer. class SapXep{ static int[] day. } } } static void hienThi(){ int n = day.io. import java.println("Nhap vao " + n + " so nguyen"). Short. System.readLine(). }catch(IOException e){ System. Trang 80 .valueOf(str).print(k + ": ). Ví d .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 .parseByte(“16”). DataInputStream stream = new DataInputStream(System. Float. System.out. int n = day. Double là các l p con c a l p Number.println().length. Long. k++) System.out. Trong các l p này u xác nh hai giá tr : <L p bao>.MIN_VALUE <L p bao>.

hienThi(). } } 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. L p final class Math còn cung c p nh ng h ng s nh s e (c s c a logarithm). i--){ max = day[i]. } } public static void main(String[] args){ String str.err.println("Day so duoc sap xep: "). max. 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 . static double ceil(double d) Trang 81 . sapXep().k = i. SapXep. str = "0".println("I/O Error!"). 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 . for (int j = 0.print("\nCho biet bao nhieu so nhap vao: "). tìm s c c i. v.PI.valueOf(str). k. i > 0.day = new int[n]. nhap().in). System. }catch(IOException e){ System.length-1.E và Math. for(int i =day. } n = Integer.v. DataInputStream stream = new DataInputStream(System. int n. day[i] = max. 3. k = j.} static void sapXep(){ int x. System. } day[k] = day[i]. s pi thông qua Math.readLine().out. try{ str = stream.out. j++) if (max < day[j]){ max = day[j]. j < i.intValue(). c c ti u. sinh s ng u nhiên.

double b) c n p ch ng tr l i giá tr c c i c a hai is . long b) max(float a.14) cho giá tr 4.0 là s tr n trên c a i s .14) cho giá tr 3. static int min(int a. Ví d ceil(3. 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 . static double sqrt(double d) + Hàm sqrt() tr l i giá tr là c n b c hai c a d . float b) static double min(double a.0 là s sàn d i c a i s . max(int a.0 n 1.+ Hàm ceil() tr l i giá tr nh nh t ki u double mà không nh h n s nguyên. int b) static long min(long a. int b) max(long a. double d2) + Hàm pow() tr l i giá tr là l y th a c a d1 và d2 (d1d2). 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. i s âm. 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. long b) static float min(float a. float b) max(double a. i d ng radian. 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 random() + Hàm random() cho l i giá tr là s ng u nhiên trong kho ng t 0.0. is . Trang 82 . 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. 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). i d ng radian. Ví d floor(3.

V. SortedSet và Map và giao di n c s m r ng thành SortedMap.v. HashSet. <<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. v. Trang 83 . trong ó các ph n t c s p x p theo th t . Ph n giao di n Giao di n (interface) Collection là c s phát tri n. List.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. 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. LinkedList. TreeSet. 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. 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. HashTable. 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. tìm ki m và c thao tác nh là các ph n t c a t p h p. Các i t ng b t k có th c l u tr . 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. 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.

Các phép toán c s int size(). k c s p x p. boolean isEmpty(). ng c l i false. tìm ki m và d ch chuy n các ph n t . boolean contains(Object obj).<< 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. ng c l i false. 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.Tr l i true n u t p h p ch a obj.Xác nh kích th c c a t p h p. static void fill(List list. Object obj) Thay th t t c các ph n t trong danh sách list b ng obj. Ph n thu t toán L p java. boolean add(Object obj). 1.util. M t s hàm trong s ó là: static int binarySearch(List list. // Tùy ch n Trang 84 . 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. 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.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. 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.Tr l i true n u t p h p r ng.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. Gói java.

retainAll(b) a.clear() ng ng b ⊆ a ? (T p con) a = a ∪ b (H p t p h p) a = a . b là hai t ph pb tk . trong ó a. 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). b có th mô t nh trong b ng sau: Các hàm trong Các phép h p t Set a. K t qu th c hi n trên 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 Th c hi n phép h p hai t p h p boolean removeAll(Collection c). HashSet(Collection c) Trang 85 .boolean remove(Object obj). Gi s a.removeAll(b) a. Set (t p h p) T p h p Set là c u trúc d li u.addAll(b) 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 . a b a a a a a. // 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.removeAll(b) 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 tr hai t p h p boolean retainAll(Collection c).retainAll(b) Hình Các phép toán trên các t p h p 2. 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. ng c l i false. boolean cotainAll(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.addAll(b) a. trong ó các ph n t c a nó là không c s p.containsAll(b) a. 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. boolean addAll(Collection c). 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.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.

println(tap2 + " va " + tap1 + " co " + tapChung + " la phan chung").println(tap2+" la tap cha cua "+tap1).addAll(tap2). // tap1 có b ng tap2? if (isSuperset && isSubset) System.util.out.// 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. i < nArgs. tapChung. j++)// T p th 2 ch a các ký t c a arg tap2.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.containsAll(tap2). j < size. if (b) System.out. else if (isSuperset) System. else System. // L y t ng i s c a ch ng trình Set tap2 = new HashSet(). } tap1.*. i++){ String arg = args[i]. // T o ra t p th nh t là r ng for (int i = 0. // T o ra t p tapChung chính b ng tap1 Set tapChung = new HashSet(tap1). public class TapKT { public static void main(String args[]) { int nArgs = args.// tapChung = tap1 ∩ tap2 boolean b = tapChung.out.retainAll(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.println(tap2+" va "+tap1+" la roi nhau").containsAll(tap1).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. // S i s c a ch ng trình Set tap1 = new HashSet(). So sánh hai t p ó. thông báo k t qu ra màn hình. Ví d 6.charAt(j))). 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. HashSet(int initCapacity. import java.size() == 0.println(tap2+" la tap con cua "+tap1).// T o ra t p th 2 int size = arg.length(). // S ký t trong m i i s for (int j = 0.add(new Character(arg. 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 + " bang tap " + tap1). 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. else { // tap2 có ph i là t p con c a tap1? boolean isSubset = tap1.out. // tap1 có ph i là t p con c a tap2? boolean isSuperset = tap2. else if (isSubset) System.

i.err. e.*.length != N_DIGIT) { System. o] va [m. Các l p ArrayList. i. Object elem) // Tùy ch n Thay th ph n t c xác nh b i index b ng elem. int toIndex) L y ra m t danh sách con t v trí fromIndex n toIndex . ListIterator listIterator() Cho l i các ph n t liên ti p b t u t ph n t u tiên. 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.println("Hay doan " + N_DIGIT + " chu so!"). Ví d 6. o] [a. Trong ó ListIterator là giao di n m r ng giao di n Iterator ã có trong java. e.util. v. n] va [m. Object remove(int index) // Tùy ch n B i 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.lang. } List biMat = new ArrayList(). Hi u su t s d ng hai l p này là t ng ng nhau. h. Ngoài nh ng hàm mà nó c k th a t Collection. void add(int index. 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. public class NhapDoanSo { final static int N_DIGIT = 5. 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. return. Object elem) // Tùy ch n Chèn elem vào sau ph n t c xác nh b i index. e] la tap con cua [m.[v. 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. 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. i. List subList(int fromIndex. v. Vector và ArrayList là hai l p ki u m ng ng (kích th c thay i c). 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. 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). import java. boolean addAll(int index.5 H th ng có m t dãy N_DIGIT (5) ch s bí m t. public static void main(String args[]){ if(args. o] la roi nhau 3. Object set(int index. e] la roi nhau [m.// T o danh sách biMat là r ng Trang 87 .

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

put(nhomTL. Integer nhomTL=new Integer((int)Math. ListIterator keyIterator = keys. i++){ double trongL = Double. i < nArgs.get(nhomTL). // 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].round(trongL/5)*5). // Tùy ch n Xoá i t t c các ánh x . // T ng s l n tr ng lu ng trong cùng nhóm. int demInt = dem.parseDouble(args[i]).listIterator().next().int size(). 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 ý. void clear(). ng c l i là false. Cho s các c p ánh x <key.intValue(). Xác nh t p các ánh x <key. // Tùy ch n Sao l i các ánh x t t. demNhom. Collection values(). Cho giá tr true n u ánh x r ng. n u là l n âu (demCu = null) thì t là 1. Integer demMoi = (demCu == null)? new Integer(1): new Integer(demCu. } // L y ra t p các giá tr t ánh x demNhom List keys = new ArrayList(demNhom. Trang 89 .get(nhom). Xác nh t p h p các giá tr . 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().length. Integer demCu = (Integer)demNhom. value>.util. import java.sort(keys). Ví d 6. boolean isEmpty().*.hasNext()) { Integer nhom = (Integer) keyIterator. 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. Xác nh t p các khoá. // c các tr ng l ng c nh p vào t i s và chia nhóm cách nhau 5 nv. Set entrySet().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). Integer dem = (Integer) demNhom.keySet()). Set keySet(). // 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.lang. value>. // S p x p l i theo các nhóm tr ng l ng Collections. demMoi). M t s phép toán th ng dùng void putAll(Map t).intValue()+1). int nArgs = args. for(int i = 0.

Object first(). SortedMap headMap(Object toKey).fill(bar. 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. SortedMap tailMap(Object fromKey). 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.println(nhom+"\t" + new String(bar)). Object toElem). SortedMap subMap(Object fromKey.Cho l i ph n t cu i cùng (c c i) c a t p c s p. 35 kg có 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. 75 kg có 2 và 95 kg có 1. Cho l i t p c s p g m nh ng ph n t cu i ng sau fromElem. nhóm 10 kg có 1. 4. Cho l i t p c s p g m nh ng ph n t ng tr c toElem.Cho l i ph n t u tiên (c c ti u) c a t p c s p.Cho l i ánh x c s p g m nh ng ph n t ng tr c toKey. Object last().Cho l i ánh x c s p g m nh ng ph n t cu i ng sau fromKey. '*').Cho l i ph n t cu i cùng (c c i) c a ánh x c s p. System.Arrays. SortedSet tailSet(Object fromElem). Chúng có b n lo i .Cho l i ánh x c s p g m nh ng ph n t k t fromKey n toKey. SortedSet subSet(Object fromElem. Object firstKey(). SortedSet headSet(Object toElem). } } } 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.Cho l i ph n t u tiên (c c ti u) c a ánh x c s p. Object toKey).out. Object lastKey(). 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). Cho l i t p c s p g m nh ng ph n t k t fromElem n toElem. ** 95 * Nh v y. Comparator comparator() Cho l i th t so sánh c a c u trúc c s p.

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. Trang 91 .T o ra nh ng t p ho c ánh x m i và r ng. 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. c s p theo th t t ng d n c a các ph n t ho c c a khoá.

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

M t ph ng th c ch có th ném ra các ngo i l mà nó c khai báo IV. Thông tin này có th c nh n v và c x lý.. Chú ý: . 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 . 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. } Trang 93 . Khi m t ngo i l x y ra. 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ó kh n ng gây ra l i ó trong kh i try ( th làm).’ III. 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 ó.B n ph i chú ý gi a l nh khai báo bi t l và l nh ném ra ngo i l . có ki u mà ta ã khai báo trong danh sách throws. i t ng này sau ó c truy n cho ph ng th c là n i mà ngo i l x y ra. ví d : public void myMethod() throws IOException. 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 } . 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. Cú pháp c a l nh ném ra ngo i l : throw ExceptionObject. 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 ‘.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. Sau khi b n ã bi t cách khai báo và ném ra bi t l . Khi h ã khoanh vùng c n mã có th gây ra l i h s t n mã. 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 ). i t ng này ch a thông tin chi ti t v ngo i l . 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. và t n mã x lý l i trong kh i catch ( b t gi ). khai báo bi t l ta s d ng t khoá throws trong khai báo ph ng th c. III. i t ng t ng ng v i ngo i l ó c t o ra..

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 . n u ki u ngo i l so kh p v i ki u ngo i l trong m nh catch. 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 . 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 . 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.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. 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ì.

println( Loi chia cho 0 ). 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.println(1/n). 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).getMessage()).out. Kh i này c t sau kh i ‘catch’ cu i cùng. V. 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. try { System.out. óng t p tin. nh các l nh óng t p vi t cu i ph ng th c) s không bao gi c g i. Java cung c p kh i finally gi i quy t vi c này. 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.class TryClass{ public static void main(String args[]) { int n=0. ph ng th c ang c th c thi có th b d ng mà không c hoàn thành.println(a.…. 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’. Kh i ‘finally’ Khi m t ngo i l xu t hi n.out. không b t bu c ph i có. â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.} } } 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. N u u này x y ra. 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. Trang 95 . } catch(ArithmeticException ex) {System.

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. Không th n p l p yêu c u. i s không h p l . 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’. 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. ‘catch’ và ‘finally’.Kh i ‘finally’ b o không. ch b o m t không cho phép th c hi n. try block No Exception Exception occurs finally block catch block finally block VI.lang L i v s h c. L p không th truy c p. Khi m t lu ng b ng t. Khi truy c p i t ng null. L i truy c p ra ngoài m ng. Ph ng th c yêu c u không t n t i. RuntimeException ArthmeticException IllegalAccessException IllegalArgumentException ArrayIndexOutOfBoundsExeption NullPointerException SecurityException ClassNotFoundException NumberFormatException AWTException IOException FileNotFoundException EOFException NoSuchMethodException InterruptedException Trang 96 . m lúc nào c ng c th c thi. 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. ví d nh ‘chia cho 0’.

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

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. nh v y không có ti n trình nào có th ti p t c x lý. 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 . 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 . 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!. nó c p nh t l i trong tài kho n là 400$. M i lu ng c gán m t công vi c c th . II. do v y B c p nh t vào trong tài kho n c a A là 800$ ( =500$ +300$).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. nh ng A không nh n c. 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. 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. nh v y B ã tr A 300$. 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. c ng nh gi i phóng tài nguyên cho các ti n trình khác s d ng. M t ng d ng có th bao g m nhi u lu ng. 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. B tr A 300$.

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

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

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

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

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

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. l u tr âu thì java u tr u t ng hoá thành các lu ng. 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. nó ng nh t m i ngu n d li u v i nhau: nh n v các thông tin. d i d ng th c nh th nào. 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.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. b nh . ngu n thông tin ngoài không ch g m d li u c l u tr trên a t . hình nh ho c âm thanh. kí t . Socket) và c các thông tin tu n t . do v y b t k d li u ra âu. a CD mà nó có th là d li u c a m t ch ng trình khác. dù d li u c l u tr i hình th c nào. 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 . 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. 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.

m i l n c/ ghi ra lu ng là c 2 byte t ng ng v i m t kí t unicode.I. Sau ay là mô hình phân c p các l p c/ ghi ng kí t 1. L p nh p. java chia lu ng ra thanh 2 lo i: lu ng byte ( byte stream) và lu ng kí t (character stream). 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 . hai l p InputStream và OutputStream là hai l p c s tr u t ng cho các lu ng h ng byte. m i lân c/ ghi ra lu ng là c/ ghi 8 bit d li u ra lu ng. 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. Lu ng h ng byte có th c ghi 1 byte. x lý m i lo i d li u. 1. 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. ta ph i s d ng lu ng h ng byte. 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 .1. L p lu ng Java a ra nhi u l p lu ng. InputStream và OutputStream. 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 .2.

int length) lý t p tin x lý t p tin ngo i trú. int length) Thì l p OutputStream c ng có các ph ng th c t ng ng.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 offset. ví d l p Writer nh ngh a các ph ng th c ghi m t kí t . int offset. m t m ng các kí t ra lu ng int write(int c) int write(char cbuf[]) int write(char cbuf[]. 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[]. Trang 106 . 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 . 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. chúng ch khác nhau v ki u d li u c vào. 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[]. ghi m t byte. int offset. m t ng byte ra lu ng int write(int c) int write(byte cbuf[]) int write(byte cbuf[]. 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. FileReader và FileWriter cho vi c c ghi h ng kí t .

in. // 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. while ((c = in.*. FileReader in = new FileReader(inputFile).io.txt").close(). while ((c = in.close(). int off.txt"). int c.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. in.read())! = -1) out.close(). FileInputStream in = new FileInputStream(inputFile). ta s vi t ch d ng c 2 lu ng h ng byte và h ng kí t import java. 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. File outputFile = new File("C:/out.close(). out. l p DataInputStream tri n khai giao di n DataInput. File outputFile = new File("outagain. out.*.txt"). int c.io. 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.write(c).read())! = -1) out. th c hi n vi c copy m t t p. // 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.write(c). } } ng trình này Lu ng d li u c/ ghi các ki u d li u nguyên thu . Trang 107 . FileWriter out = new FileWriter(outputFile). } } import java. ta s d ng lu ng DataInputStream và DataOutputStream.txt"). FileOutputStream out = new FileOutputStream(outputFile).

public class DataIODemo { public static void main(String[] args) throws IOException { // write the data out DataOutputStream out = new DataOutputStream(new FileOutputStream( c:/TestIO. // ghi s nguyên out.. out.*. 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.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.writeInt(10)..txt")). ví d này ghi d li u ra t p r i l i lai: import java. int off.255 c m t s nguyên không d u trong n t 0.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. // ghi s long Trang 108 .

trong java có th s d ng lu ng in n xu t d li u ra d i d ng asciii.readDouble()).out.close(). try { System. // c l i s nguyên dài System. // c l i giá tr logic System.out.writeBoolean(true).out. // c l i m t xâu unicode } catch (EOFException e) { System. // c l i s th c chính xác n System. // read it in again DataInputStream in = new DataInputStream(new FileInputStream("c:/TestIO.println("Gia tri float " + in. L p PrintStream và PrintWriter s giúp ta làm vi c này. u xu t ra d li u d ng asciii.close().readFloat()).3.456789).} in. Hai l p này th c hi n ch c n ng nh nhau.out.out.println("Gia tri long " + in.println("Gia tri nguyen " + in.readLong()).// c l i s th c chính xác kép System. // ghi m t xâu out. } } 1.println("Gia tri xau " + in. // c l i s nguyên System.456789f).txt")).out.writeUTF("Day la mot xau ki tu").out. 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 .out.println("Gia tri boolean " + in.writeFloat(123.readBoolean()). // ghi giá tr logic out.readInt()).readUTF()). ho c các ch ng trình so n th o asciii xem c.println("loi"). // ghi s th c chính xác n out. 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.println("Gia tri double " + in.writeDouble(123. // ghi s th c chính xác kép 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 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. int off. 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 .

. out. out.2345). BufferWriter. int off. m t s th c và m t xâu kí t . int off. Trang 111 . m ng th ng lâu h n r t nhi u so các thao tác v i b nh trong. do v y chúng ta c n ph i có m t k thu t nào ó t ng t c c/ghi. k thu t ó chính là vùng m.*.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 .println(1. Lu ng m Vì các thao tác v i c ng.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.print("xau ki tu"). BufferOutputStream. thông th ng b n s i các lu ng c a b n vào lu ng m.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. trong java ta có th o ra vùng m v i các l p BufferInputStream.void println(long x) void println(Object x) void println(String x) protected void setError() void write(byte[] buf. out. ví d này in ra m t t p m t s nguyên. .PrintWriter(OutputStream out.close().io. out. 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.PrintWriter(Writer out. 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 .println(10). boolean autoFlush) t o ra m t PrintWriter v i ch c n ng d n t m t i t ng OutputStrea.txt")). BufferReader. v i vùng m ta s gi m c s l n c ghi lu ng. } } 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 bufferSize) p tin truy c p ng u nhiên t c các lu ng xét trên ch có th c.println(rf. import java. nên chúng có t t c các ph ng th c a c 2 l p này.public void writeChar(int v) ghi kí t unicode ra t p v i byte cao c ghi tr c . n byte th hai Trang 112 . rf.readChar()). rf. hay ghi ‘w’ hay c ghi ng th i ‘rw’.out. rw ).println(rf. int bufferSize) public BufferOutputStream ( OutputStream out) public BufferOutputStream ( OutputStream out.txt’.lang.public long length() tr v dài c a t p .System.public void seek(long pos) chuy n con tr n v trí pos tính t v trí u tiên.io. rf. rf = new RandomAccessFile( abc.readInt()).writeDouble(678. m t double t i m t file có tên ‘abc.writeInt(67868). ó là l p RandomAccessFile.writeBoolean(true). chúng không th c ghi ng th i.txt theo ch c ghi ng th i thì b n dùng cú pháp RandomAccessFile =new RandomAccessFile(“C:/ a. rf.txt”. import java. ký t và double t t p tin và hi n th chúng ra màn hình.RandomAccessFile. System.out.println(rf. System. public class rndexam{ public static void main (String args[ ]) throws IOException { RandomAccessFile rf.68). import java.seek(1). Nó ghi m t giá tr boolean. ch duy nh t có m t l p cho phép ta c ghi ng th i. System.txt . int bufferSize) public BufferWriter ( Writer out) public BufferWriter ( Writer out. p này tri n khai giao di n InputData và OutputData. “rw”) Ch ng trình d i ây minh ho cách dùng l p RandomAccessFile. ho c ghi.writeChars( ). m t char. int bufferSize) public BufferReader ( Reader in) public BufferReader ( Reader in. ví d nh b n mu n m t p a. Sau ó nó c giá tr s nguyên.public long getFilePointer() tr v v trí con tr t p tính b ng byte.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’. chú ý v trí u tiên tính t 0 .Các ph ng th c t o d ng lu ng m: public BufferInputStream( InputStream ) public BufferInputStream (InputStream in. m t int.io.out. 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). ngoài ra chúng còn có các ph ng th c sau: .IOException.readDouble()). //S d ng ph ng th c seek() di chuy n con tr rf. k ta u t p .

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. Ký hi u ng n cách ‘:’ cho Unix. Ví d : File ch1 = new File(File.close(). System. ‘\’ c s d ng ng n cách các cc a ng d n trong Window. rf. A:\Docs là danh sách các ng d n trong Window.rf. ‘. Ký hi u ‘/’ ng n cách cho Unix. pathName có th là ng d n tuy t i (có c tên a.separator + “book” + File. D:\Anh\ABC. File(String pathName) Gán ng d n có tên pathName cho i t ng c a l p File.seek(0). 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). 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. x lý các n i dung c a các t p thì s d ng các l p FileInputStream. FileOutputStream và RandomAccessFile. String filename) Trang 113 . } } t qu xu t ra c a ch ng trình: II.readBoolean)).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. Ví d : C:\book.out. C:\Java.println(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. Ví d : C:\book\Java là tên ng d n trong Window. File(File direct. 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.’ c s d ng phân cách các ng d n trong Window.

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.length==0){ u Trang 114 . N u direct là null thì filename c x lý 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ó.1 Vi t ch ng trình c và hi n th các t p trong m t th m c. 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. Ví d 8. ng c l i tên ng d n s là i ng direct ghép v i separator và filename. boolean delete() Hàm này xoá t p hi n th i. String getAbsolutePath() Hàm getAbsolutePath() cho l i tên c a ng d n tuy t i ch a t p ch nh.io.separator + “duThao”).*. 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. boolean mkdir() boolean mkdirs() T o ra các ng d n c xác nh trong i t ng c a File.Gán t p có tên filename th m c direct cho i t ng c a l p 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. long length() Hàm này cho l i kích th c c a t p tính theo byte. public class DirectoryLister{ public static void main(String args[]){ File entry. String getName() Hàm getName() cho l i tên c a t p trong th m c ch nh. Ví d . “chuong1”). 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. 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. tên c a “C:\java\bin\javac” là “javac”. import java. boolean renameTo(File dest) Hàm này i tên t p hi n th i thành dest. File ch2 = new File(mucNhap. if (args. 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. String[] list() Hàm này hi n th danh sách các t p th m c hi n th i. cho k t qu true chúng ng nh t v i nhau. Ví d : File mucNhap = new File(“book” + File.

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

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

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

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

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

JDialog là m t c a s c hi n th d i d ng modal. c l p v i h n n thu c th vi n Swing.v. TextFeild.v. các thành ph n ho c t p trung vào th vi n mang tên Abstract Window Toolkit (AWT). JFrame là c a s không l ng bên trong c a s khác. v. b ng cách s ng tr c ti p mã native c a h n n.awt. Panel.nút n. a n ng. v n không thay i. 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. ngo i tr các thành ph n là l p con c a l p java.v. thành ph n AWT s c ánh x sang m t thành ph n n n c th . l u gi các thành ph n giao di n ng i dùng. hành vi c b n nh t c a t t c các thành ph n giao di n. hình nh… Trang 120 . 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.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). 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. M c dù các thành ph n awt n c h tr trong Java 2 nh ng. menu. JAplet là l p cha c a m i l p ng d ng aplet. Gi i thi u v h th ng ho c a Java 1. V i b n phát hành Java 2. 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.awt. 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. 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. 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. Color. Window c s d ng t o ra m t c a s . s th a và giao di n. Hai v t ch a hay c s d ng nh t la JFrame và JPanel. 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. FontMetrics. M i t ch a có m t l p qu n lý hi n th . L p này cung c p các thu c tính. 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. Thông th ng ta hay s d ng hai l p con c a nó là JFrame và JDialog. Khi Java c phát hành.Window ho c Java. Chúng ch thay th m t ph n c a awt nh : Button. Còn các l p tr giúp khác trong awt nh : Graphics. m nh m . 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 . ng tròn. c v tr c ti p lên canvas b ng mã l nh Java. 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. iv i i h n n.Panel v n ph i c v b ng GUI trên n n c th . Jcomponient Là l p cha c a m i thành ph n Swing ligth weight. 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. 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. v. Font. JPanel là m t v t ch a. I.

FontMetrics là m t l p tr u t ng dùng xác nh các thu c tính c a Font. 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. m t memu có tên là JMenu. Font l p này bi u th cho m t font ho . Trang 121 ng nên t Button vào .swing.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. Ví d m t nút l nh trong th vi n Swing có tên là JButton. a các thành ph n trong th vi n Swing u có ti p u ng là ‘J’.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. Vi c làm này có th gây l i. t c các thành ph n ho trong th vi n Swing c nhóm trong gói javax.

void setSize(int width. (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. .Dimension getSize(): cho l i i t ng thu c l p Dimension g m width (chi u r ng).Point getLocation(): cho l i t a ph n ang xét.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. . height (chi u cao) xác nh kích th c c a m t thành ph n tính theo pixel. ph ng th c chung cho các l p con c a nó. int height) và void setSize(Dimension d) t l i kích th c c a thành ph n. Sau ây là m t s ph ng th c c a l p Component : .

. 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.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.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.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.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.void setBackground(Color c): t màu n n cho thành ph n h a.void setLocation(int x. . chi u r ng c a hình ch nh t.getContentPane(). ngh a là không th tr l i c các yêu u c a ng i s d ng. 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.void setFont(Font f): t l i font ch cho m t thành ph n. ví d “My Frame” : JFrame myWindow= new JFrame(“My Frame”).setSize(200. 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.getContentPane().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. n u là false thì thành ph n t ng ng s không kích ho t c. . 4.Gói khung frame ó l i b ng hàm pack(): myWindow. . 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.void setBounds(int x. .// t l i khung frame là 200 ( 300 .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(). ch b n chung t o ra m t c a s là: o ra m t frame có tiêu gì ó. int y) và void setLocation(Point p): t l i các t a c ch nh cho m t thành ph n.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 . .add(new JButton(“OK”)). Trang 123 . ngh a là có kh n ng kích ho t (enable).setVisible(true). L p Container p Container là l p con c a l p tr u t ng Component. 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. 3. int y) và void setBounds(Rectangle r): t l i ng biên cho m t thành ph n.// 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. Ng c l i. . 300).void setForeground(Color c): c s d ng t màu v cho thành ph n h a .

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. 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. sao cho ti n l i nh t i v i ng i s d ng. 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. Ng c l i. JPanel .v. i s constraints xác nh các h ng a comp vào ph n t ch a. 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. 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. Dialog và JDialog. int index) Trong ó. Cách s p x p này là m c nh i v i Panel. 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 ó. 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. M i thành ph n giao di n ch a trong t ô. Object constraints. v. Jframe. 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 . east ( ông) và center (trung tâm)). void setLayout(LayoutManager mgr). 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. 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. south (nam). 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. Frame. chúng ta có th s d ng hai ph ng th c c a l p Container: LayoutManager getLayout(). int index) Cmponent add(Component comp. JCheckbox. nh ng m t thành ph n có th chi m nhi u nhi u h n m t ô. 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.Applet và JApplet. 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). sau ó theo c t t trên xu ng d i. west (tây). Object constraints) Cmponent add(Component comp. Cách s p x p này là m c nh i v i l p Window. Component add(Component comp) Component add(Component comp. 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. JTextField.II.

m . 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). BorderLayout() BorderLayout(int horizongap. Trong Java các s ki n c th hi ng các i t ng. tây (WEST) và gi a (CENTER). int hoiongap. 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. Tr ng h p m c nh thì kho ng cách gi a các hàng. Trang 125 n n n p . int horizongap.EventObject. nam (SOUTH).void remove(Component comp) void removeAll() 1.v. Component add(Component comp) void add(Component comp.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). 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. Vi c nh t nút. c t là 5 pixel. M t trong hai i s rows ho c columns có th là 0. l p cha c a t t c các l p con c a các s ki n là l java. 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.0) là t o ra l i có m t hàng. int columns) GridLayout(int rows. 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 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. ông (EAST). int columns.util. 3. v. verticalgap. horizongap và verticalgap là kho ng cách tính theo pixel gi a các hàng các c t. III. 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. GridLayout(1. 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. 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. ng c l i. 2. ph i hay trung tâm. L p c s nh t. nh ng không th c hai. óng các Window hay gõ các ký t t bàn phím.

AdjustmentEvent ki n này x y ra khi ta u ch nh (adjustment) giá tr thanh cu n (JScollBar) Scrollbar .awt. 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.JList .khi th c hi n m t l n c n ch nh trong thanh tr t Scrollbar.EventObject java. .lang.khi m t m c trong danh sách c kích ho t úp. JradioMenu .util.khi m t m c trong th c n c ch n.khi gõ phím ENTER trong tr ng v n b n (text).Object java.java. Các thành ph n gây ra các s ki n hành ng bao g m: . 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.awt. JcheckBoxMenu. .AWTEvent java. 1. b.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. c. 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 .JButton .khi m t nút button c khích ho t. Ý ngh a c a các l p a. .JmenuItem.JTextField . Các l p s ki n m c th p.

.JCheckbox .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. 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. h.khi m t m c trong danh sách c ch n ho c b lo i b ch n.khi k t thúc b ng nh n nút ENTER.khi tr ng thái c a h p ki m tra Checkbox thay i. g. f. e. 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.JCompoBox . mã Unicode t ng ng v i ký t c a bàn phím. int getClickCount() Trang 127 - .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 . p ComponentEvent có ph ng th c: Component getComponent() Cho l i i t ng tham chi u ki u Component. p ItemEvent có ph ng th c Object getItem(): Cho l i i t ng c ch n hay v a b ch 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. hàm này c s d ng nh n l i giá tr nguyên. 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. d.JRadioButton. 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. TextEvent Các thành ph n c a GUI gây ra các s ki n v text g m có: TextArea . CheckboxMenuItem . dy). 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). i. y c a v trí liên quan n s ki n do chu t gây ra. 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. 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. .khi tr ng thái c a h p ch n (Option) thay i.khi k t thúc b ng nh n nút ENTER. 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.JList . void translatePoint(int dx.

th c t s ki n này x y ra khi ph ng th c paint()/ update() c g i n..Hàm getClickCount() m s l n kích chu t. phóng to. Ki u s ki n Ngu n gây ra s ki n Ph ng th c ang ký. 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. j. 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 . PaintEvent S ki n này xu t hi n khi m t thành ph n c v l i. thu nh . k. WindowEvent S ki n lo i này xu t hi n khi thao tác v i các Window. m t c a s . ch ng h n nh : óng.

fr. 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. private JTextField tYear = new JTextField(10). } Trang 129 . import java.*.center(). private JButton compute = new JButton("Compute mortgage").swing.applet.the number of years. 200).border.remoMouseListener addMouseMotionListener remoMouseMotionListener WindowEvent 3. Clicking the compute button displays the monthly payment and the total payment. fr. fr. public static void main(String[] args){ StudentApp fr = new StudentApp().*.awt. private JTextField tLoan = new JTextField(10). import javax. private JTextField tTotal = new JTextField(10).Applet. public class StudentApp extends JFrame implements ActionListener{ private JTextField tRate = new JTextField(10). //fr.awt. import javax. */ import java.event.*.setSize(400.TitledBorder. import java.setVisible(true). and the loan amount.setTitle("Mortgage Application").swing.

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

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

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

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

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

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

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

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

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

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

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

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

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

II. 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.Ch ng 7 L P TRÌNH C S D LI U I. 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 ó. 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. 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.Trình u khi n (Driver) c a dùng truy c p vào h CSDL ó.C u n i JDBC-ODBC. JDBC c thi t k t ng i n gi n. 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. . MySQL…) s d ng c u n i JDBC-ODBC b n c n ph i có: . 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. 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. công ngh này c bi t n v i cái tên JDBC (Java Database Connectivity). 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. Trình u khi n này s c ng ký v i b qu n lý ODBC . 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ó th k t n i vào m t h CSDL c th nào ó (ch ng h n nh : Access.) cc s li u c a chúng .. cách k t n i v i CSDL. 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. Trang 143 .. SQL Server. â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. 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.

ho c c ch y trên máy ch trong mô hình nhi u t ng (Multi .Mã JAVA { { { Java Application . Do v y ki u k t i này nhanh và hi u qu h n c u n i JDBC – ODBC. 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 ó. 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 . Trang 144 . 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. Fat Client. 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 . Applet . không thích h p cho các ng d ng ch y trên máy khách nh : Aplet.tier).

Applet . 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áy ch s ch u trách nhi m k t n i v i c s d li u .Mã JAVA { { Java Application . 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. 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 .

Applet .sql.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 l p và giao di n giúp ta th c hi n các tính n ng cao p. 1.sql và javax. M t s giao di n và l p trong gói java.sql ch a các giao di n và gói cho phép ta th c hi n các thao tác c b n i v i CSDL. Gói java. 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. Mã JAVA { { Java Application . Servlet Internet JDBC Driver Mã JAVA Java Native driver CSDL III.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.

hay còn g i là ki u d li u JDBC 2. 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 ó. 2. view. K t n i CSDL v i JDBC có th làm vi c v i CSDL. qu n tr ph n d li u c a ch ng trình. ây là l a ch n c a b n tu theo tính ch t c a d li u trong ch ng trình ng nh m c ti n b n có có th mua c h qu n tr ó. c p nh t… óng k t n i. 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. Th c hi n các l nh làm vi c v i CSDL nh : truy v 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. 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. 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. 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: .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.sql Tham kh o tài li u v JDBC IV. 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. 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. Các b c xây d ng m t ng d ng CSDL v i JDBC: ng trình vi t 1..sun. M t s l p và giao di n trong gói javax. gi i phóng tài nguyên. th t c l u tr .

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

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

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

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

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. 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. ConcurencyType).createStatement().V. 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. 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. 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. 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 . 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.createStatement(ResultSetType. Statement stmt = con. TOTAL INTEGER)"). 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. 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. 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. i th i m này b n ch a có phát bi u SQL nào truy n n CSDL. " + "SALES 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.executeUpdate("CREATE TABLE COFFEES"+"(COF_NAME VARCHAR(32). SUP_ID INTEGER. i t t o it ng Statements b n s ng ph ng th c createStatement c a trong b c II.

tensv) values (\“01\”.executeUpdate(DML_SQL_STRING).executeUpdate(DML_SQL_STRING).executeUpdate(“INSERT INTO sinhvien(masv. \”Nguy n n An”). UPDATE. 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.executeUpdate(DDL_SQL_STRING).executeUpdate(“DELETE sinhvien WHERE masv=01”). DELETE b n s d ng ph ng th c executeUpdate() c a i t ng Statement theo m u: stmt. 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. Trang 153 . 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.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. Ví d 2: Xoá các b n ghi c a b ng sinhvien có masv=01 stmt. 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.

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.executeQuery(QUERY_SQL_STRING).createStatement().99. Trang 154 .executeUpdate( "UPDATE COFFEES " + "SET CP=PC+10 WHERE td=’dh’”).executeUpdate( "DELETE FROM COFFEES").Ví d 3: a l i tên c a sinh viên có masv=01 thành Nguy n V n B stmt. 101.executeUpdate("INSERT INTO COFFEES VALUES ('Colombian'. 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. 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. 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.executeQuery(QUERY_SQL_STRING). stmt. 0. 7. 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.executeUpdate(“UPDATE sinhvien SET tensv=\”Nguy n V n B\” WHERE masv=01”). 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. 0)").createStatement(). stmt. 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. 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.

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. 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.executeQuery(query).executeQuery(“SELECT * FROM SinhVien”).. float n = rs. 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.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. // S d ng ph ng th c getFloat vì c t PRICE có ki u float Trang 155 . 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.getString("COF_NAME"). PRICE FROM COFFEES". 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 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. 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.next()) { // s d ng ph ng th c getString vì c t //COF_NAME có ki u VARCHAR String s = rs.next()) { //.getFloat("PRICE"). 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. While(rs. while (rs. ResultSet rs = stmt. 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.

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.println(s + " " + n).getString(1).getString("COF_NAME").getFloat("PRICE").out. } 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. b i String s = rs.System. Và float n = rs.

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

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

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

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

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

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

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

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

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. ô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. 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. L p InetAddress bi u th cho m t liên l c v i m t máy xa. tuy nhiên a a ch IP c a máy ó. Trang 165 . khi ta mu n a ch IP c a máy xa. 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?.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. 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 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. 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. l p này t ng chuy n thành a ch IP và ng c l i.tên mi n. Tr l i i t ng InetAddress có tên c ch ra.InetAddress tr c khi có th s d ng nó. vì m t máy có th có nhi u a ch IP (do có nhi u card ng). 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. b i c n i vào ch IP thì r t khó nh . ta ph i bi t c a ch c a m t máy nào ó. câu tr l i là l p InetAddress ã làm u ó cho ta.

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

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

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

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

println( "Enter names and IP addresses. } catch (UnknownHostException ex) { return "Cannot find host " + host.err. i < ca. if (host. } } } private static String lookup(String host) { InetAddress node. } else { // Dia chi nay duoi dang IP return node.equalsIgnoreCase("quit")) { break.System.out.equalsIgnoreCase("exit") || host. for (int i = 0.").println(lookup(host)).Enter \"exit\" or \"quit\" to quit.out.length. } System. } if (isHostname(host)) { //Dia chi nay duoi dang ten mien return node.getHostName(). i++) { a ch IP Trang 170 .readLine().getHostAddress(). try { while (true) { String host = in.toCharArray().getByName(host).println(ex). } } //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. } } catch (IOException ex) { System. try { node = InetAddress.

testProtocol("mailto:elharo@metalab. // telnet testProtocol("file:///etc/passwd").poly.')return true.org"). class ProtocolTester { public static void main(String[] args) { testProtocol("http://www. // secure http // file transfer protocol testProtocol("ftp://metalab. 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.com/exec/obidos/order2/"). } catch (MalformedURLException ex) { System.err.edu/").println(ex).adc. 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.edu"). 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.anc. // gopher testProtocol( // Lightweight Directory Access Protocol Trang 171 .vn/"). // local file access testProtocol("gopher://gopher. } } 2.unc.unc. 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.edu/pub/languages/java/javafaq/").*.za/").edu.org. } 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. 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. } } return false.isDigit(ca[i])) { if (ca[i] != '. 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 .net. 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.if (!Character.utehy.amazon. // hypertext transfer protocol testProtocol("https://www.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

h u hành m ng.400. 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. 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. u này giúp cho vi c g i nh n các thông p c m b o. B n ghi a ch mail c a b n và c a ng i nh n. Các giao th c Mail thông ng : chu n X. 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.400 và SMTP (Simple Mail Transfer Protocol). 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. 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). Trong cách thông th ng b n ph i cung p a ch ng i g i (sender). 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. 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.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. Sau ó.Ch ng 9: JAVA MAIL I. ngày nay POP c c i ti n thành POP3 (Post Officce Protocol vertion 3). c ích chính c a X. Trong ch ng này ta s s ng hai giao th c :POP3 và SMTP g i nh n mail. chu n MAIP. Có 2 chu n v Mail th ng c các máy ch mail h tr là X. 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 . SMTP (ESMTP). B u n s chuy n th n h p th c a ng i nh n. 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 . 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. Các máy ch (mail server) cung c p cho b n ch mail (còn g i là e-mail address). 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 . 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. giao th c truy n d n c dùng. 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. làm cho nh ng ng i các n i khác nhau có th trao i thông tin v i nhau. sau ó nh p vào n i dung c n g i.

a ch c a ng i nh n (to). 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…. phân ph i mail n máy ch khác. Mail client. II. 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. khi ó nó có trách nhi m g i mail n máy ch khác v i cùng giao th c SMTP. 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. g i mail b n cung c p a ch c a ng i g i (from). cho phép máy khách truy c p vào l y mail. u quá trình ng nh p thành công. 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). 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. Giao th c g i mail (Mail transport protocol): g i mail n máy ch . SMTP khá n i ti ng và c h u các máy ch mail trên th gi i h tr . 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 . 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). N u mail client c vi t d i giao di n Web thì nó c g i là Web mail. C th . D i ây là m t ch ng trình n gi n dùng g i mail n a Trang 206 . 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 . 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. 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. a ch này th ng c g i là mail host. a ch c a máy ch nh n mail g i i c g i là outgoing mail address. 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. 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 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. Các ch ng trình mail Client th ng s d ng giao th c POP3 nh n mail t trình ch .Mail server: là m t ch ng trình ch y d i d ng m t d ch v . trình khách ph i s d ng m t giao th c trò chuy n v i mail server. 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. c ch g i mail b ng SMTP m i có th th c hi n c. Trình khách s d ng giao th c SMTP g i th i c g i là SMTP Client. Trình ch ti p nh n mail theo giao th c SMTP c g i là SMTP Server. Các mail server a ph n h tr tính n ng Relay. d ch v này có nhi m v nh n mail t máy khách g i n. 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). 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. Th vi n này có l p SmtpClient dùng g i mail.

com". import java. String subject = "Test Message". nó c óng gói trong t p mail. // Thi t l p a ch c a ng i g i và ng i nh n mailer.vn".println("Mail has been sent").smtp.println("To:" + to).to(to). To b ng a ch e-mail mà b n mu n g i.sun.// Thêm CRLF vào tr ps. 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. â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.*.vn". System. ps.io.net.com nh vào máy ch mail utehy.jar.println("Subject:" + subject). //SendMailApp.println(body). public class SendMailApp { public static void main(String[] args) throws Exception { String host = "utehy.closeServer().ch thek44a2@yahoo. String from = "theth@utehy. a ch ng i g i có th t tu ý. c ph n n i dung //K t thúc quá trình g i mail mailer.println("From:" + from).html Trang 207 . III.edu. //Di n các thông tin khác ps.println(). mailer. ps.startMessage(). 1. //L y v lu ng xu t g n v i mail PrintStream ps = mailer.edu. /* T o i lên */ it ng g i mail theo giao th c SMTP.from(from). String body = "Hello this is test message for mail".out. n có th download t a ch http://java. 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. host là a ch c a máy ch nh n mail do ta SmtpClient mailer = new SmtpClient(host).vn (máy ch mail c a tr ng DHSP KT H ng Yên). 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.java import sun.edu. 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. 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.com/javamail/index. ps. d li u c nhúng c hình nh. String to = "thek44a2@yahoo. } } Chú ý: Hãy thay a ch From.*.

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. n i dung mail… i ph ng th c Transport. PropertyValue) */ //T o i t ng Session Session session =Session. 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().jar. C:\JBuilderX\lib\mail. 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 . a ch ng i nh n.null). 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.html Ph n th ba là các l p c hay nh n mail t trình ch .jar. 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. L u các thông tin này vào i t ng Session.4 th vi n này có tên mail. b n có th tìm th y nó trong th m c Jbuilder_Home/lib 2.1. H u h t các ng d ng mail client c n import các th vi n javax.mail. Th vi n này mang tên activation. /*gán giá tr cho các thu c tính b ng ph ng th c props. javax.interner.mail.mail.setProperty(PropertyName. tiêu mail. Folder trash ch a các th a b xoá.activation. Trang 208 . Nh Folder Inbox ch a các th vi n g i n.getDefaultInstance(props. javax. 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…). 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. 3. C:\JBuilderX\lib\activation. Trong java 1. d ng i t ng Store l yv i t ng Folder.Ph n th hai là JavaBean Activation FrameWork c n cho m i phiên b n c a java mail. o i t ng store chu n b l y mail v . Các l p liên quan n vi c g i mail 3.jar n t bi n môi tr ng classpath=%CLASSPATH%. 3.send() ho c ph ng th c sendMessage c a i t ng Transport g i th i.1. M i Folder s ch a m t lo i mà n mu n l y. ví d : //T o i t ng Properties ch a thông tin kh i t o n u có Properties props=new Properties(). L p Session L p này th hi n m t phiên k t n i t i mail server. 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.sun. o i t ng Message. Các b c g i nh n mail Các b c nh n mail: o i t ng mail Session.jar.com/products/javabean/glasgow/jar. v i th vi n này b n có th t i xu ng t http://java.

vn ). ví d . 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.vn").getInstance(props. L p Address Sau khi b n t o ra i t ng Session và Message. 3. u n i dung không ph i thu n v n b n thì b n ph i ch nh Mime cho nó.edu. u n i dung c a thông p là thu n v n b n. Ho c InternetAddresss address =new InternetAddresss( theht@utehy.vn ).host".null).setProperty("mail. 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. g i mail b n b n c n t o ra i t ng Message.vn . M t thói quen t t nên có là t cho mail m t tiêu (subject).1. PropertyValue)*/ //T o i t ng Session Session session =Session. 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.setContent(content.setProperty(PropertyName. b n s ng l p con c a nó là InternetAddresss. 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ó.edu.setProperty("mail."text/html"). L p Address là l p tr u t ng. 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. L p Message Sau khi có i t ng Session b n.setSubject( Xin chao ). ví d : props.setText(content)."theht@utehy.2. Trong c hai ph ng th c kh i t o i t ng Session nêu trên.edu. Ví d b n t o a ch mail t l p này nh sau: Address address =new InternetAddresss( theht@utehy.edu. l p MimeMessage.3. b n có th thi t t n i dung th g i b ng nh: message. 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 .from". 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.edu. Ph ng th c setSubject() s giúp ta làm vi c ó. props. 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. Hoang Trong The ).vn").1. b n t o thông p mail chu n b g i i nh sau: MimeMessage message =new MimeMessage(mailsession). Ví d : Session."utehy.… â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. ti p n ta s d ng l p Address o ra ch c a ng i g u và ng i nh n. Trang 209 . 3./*gán giá tr cho các thu c tính b ng ph ng th c props.

ng th c addRecipient() c a Ví d : //T o a ch Address toAddress=new InternetAddresss(“thek44a2@yahoo.Sau khi t o xong a ch c a ng i g i.RecipientType.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. //Gán a ch cho ng i nh n message.RecipientType.send(message). transport. L p Transport L p Transport cung c p các ph ng th c g i mail n mail server. B n g i ph ng th c addFrom() nh sau: Address address[]=… Message.close().com”).sendMessage(message. ki m tra m t a ch mail có h p l hay không không ph i là d .edu. 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.getAllRecipients()). message. // ho c b n có th g i ph ng th c transport. ccAddress). transport. user.TO. t a ch c a ng i g i b n g i ph ng th c setFrom().getStransport( smtp ).TO Message.addRecipient(Message. password).connnect(). Ví d : Transport. a ch c a ng i g i không quan tr ng.1. 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. 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. b n có th t cho nó m t a ch e-mail không có th c.CC. 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.setFrom(myAddress). transport =mailSession.RecipientType. transport.connnect(host.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. Java cung c p cho b n ba lo i a ch ph bi n: Ki u a ch Message.CC Message. Trang 210 . Ho c b n có th ch n giao th c g i mail t i t ng Session. Address ccAddress=new InternetAddresss(“theht@walla.RecipientType. 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. message.addRecipient(Message.com”).vn”). 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. toAddress).addFrom(address). Ví d : Address myAddress=new InternetAddresss(“theht@utehy.RecipientType. message.

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

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

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

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

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

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

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

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

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

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

} // ã c if (messages[i].out.Flag.getMessages().isSet(Flags.println("Answered").isSet(Flags.out.out. } if (messages[i].isSet(Flags. Xoá mail xoá mail b n m h p th v i quy n Folder folder = store.out.out.println("Read").isSet(Flags. } if (messages[i].Flag.isSet(Flags. for (int j = 0.open(Folder. Message[] messages = folder.//Chú ý b t bu c ph i là tham s true 2.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].Flag.DELETE. } } Trang 221 .FLAGGED)) { System. Xoá mail 1.getUserFlags().READ_ONLY). mail server s t ng xoá mail folder. } // ã tr l i if (messages[i].getFolder("INBOX").V.isSet(Flags.println("Marked").println("Deleted"). c/ghi nh sau: Ti p n t c xoá: Messages[i].SEEN)) { System. } // ã vào thùng rác if (messages[i].out.ANSWERED)) { System. Ti p n óng k t n 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]. j < userFlags.Flag. j++) { System. folder.Flag.getFlags().setFlag(Flags.Flag.Flag. } // ã c gán c if (messages[i].DELETED)) { System.println("Recent").DRAFT)) { System.close(true).out.println("User flag: " + userFlags[j]).length.true).isSet(Flags.println("Draft").RECENT)) { System.Flag.

Các ch ng trình bây gi yêu c u ph i có s h p tác x lý.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. 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. 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. t ng t các i ng B1. 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. 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. B3 là các i t ng c c b . 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. â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). Có r t nhi u công ngh l p trình phân tán nh : DCOM. 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. Hình sau mô hình tri u g i i t ng phân tán. Trang 222 . Ch ng này ta th o lu n v các khía c nh ó. Trên máy A các i t ng A1. ây là cách l p trình truy n th ng. trong ó RMI là công ngh thu n Java và d l p trình nh t. 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. ã 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.. 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. 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. 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. EJB. 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. CORBA. RMI. 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. B2.

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 . Phía máy khác l p trung gian này c g i là stub (l p móc). 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. III. 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. 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. 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. Trang 223 . Vai trò c a các l p trung gian i v i l i g i ph ng th c c c b .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. phía máy ch l p trung gian c g i là skeletion (l p n i). 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). 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. 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. 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. 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.

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

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 .c 5: Kh i ng d ch v ng ký tên rmiregistry n m c a s DOS-Prompt.

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

i m t thu c tính boolean. 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 nó c vi t theo m t quy t c quy nh tr c. ph ng th c nào. 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. u ý r ng ký t th nh t sau “get” hay “set” ph i vi t hoa. 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. 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). b n có th dùng cách ti p c n “get” và “set” trên. 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 . 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. II. 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. 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. 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. JavaBean th c ch t là m t l p Java nh các l p Java thông th ng khác. 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. nh ng n c ng có th dung “is” thay cho “get”. 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. Nh v y t JavaBean c ng có các thu c tính và các ph ng th c. Nh ng thành ph n JavaBean có th c “nhúng” vào t ng d ng. thì b n t o ra hai ph ng th c: getXxx() và setXxx(). 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.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. 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. nh ng chúng ph i là ph ng th c public. 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. 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. Các ph ng th c thông th ng c a Bean không tuân theo quy t c trên.

public String getName() { return myName.arr = arr. 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.removeXxxListener(XxxListener). public String getStr() { //Ph ng th c get cho thu c tính str return str. // thu c tính ki u i t ng private java. 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.i = i.} } 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. } Trang 235 .io. } public void setI(int i) { //ph ng th c set cho thu c tính i this. // thu c tính ki u String private int i. 1. // thu c tính ki u m ng int private boolean b.} public void setName(String newName) { myName=newName. thông th ng các thu c tính th ng c t m c truy c p là private. } public void setStr(String str) { //Ph ng th c set cho thu c tính str this. // thu c tính ki u float private java. } //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. // thu c tính ki u int private int[] arr. 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. 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.DataInputStream is.DataOutputStream os. // thu c tính ki u logic private float f. 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 int getI() { //Ph ng th c get cho thu c tính i return i.io. 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. 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). Ví d v i m t Bean n gi n có tên là xBean nh sau: public class xBean { private String myName.str = str. } //Ph ng th c set cho thu c tính arr.

DataInputStream getIs() { return is.is = is.io. S thay i bao Trang 236 . } public void setB(boolean b) { this. 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. 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. 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.DataOutputStream os) { this.//Ph ng th c get cho thu c tính b. } //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. } public void setIs(java.io. 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. } } 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). } public float getF() { return f. } public java.DataOutputStream getOs() { return os. 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) {.os = os. } public void setF(float f) { this.} 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.b = b. 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.io.io.DataInputStream is) { this. } public void setOs(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. Object oldValue.. 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. 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ì ó. private PropertyChangeSupport changeSize=new PropertyChangeSupport(this).

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.getOldValue()).beans. } public void addSizeListener(PropertyChangeListener lst) { changeSize.getNewValue()).java t trên import java.floatValue(). new Float(newSize)). //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.setSize(333). } //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.*. } } Ví d sau th nghi m BeanA v a cài // TestBeanA.*.getPropertyName().beans.floatValue(). } } //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. 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. } public void removeSizeListener(PropertyChangeListener lst) { changeSize. String propertyName = evt. public class TestBeanA { public static void main(String[] args) { // t o ra m t i t ng BeanA BeanA ba = new BeanA().addPropertyChangeListener(lst).removePropertyChangeListener(lst).firePropertyChange("size". 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). public class BeanA { //Khai báo thu c tính size private float size.addSizeListener(new MyListener()). // ng ký i t ng l ng nghe v i i t ng ba ba. float newdSise = ( (Float) 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. size = newSize. //thay i giá tr c a thu c tính size ba. Trang 237 . new Float(oldSize).

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). } } t qu khi ch y ch ng trình nh sau: Change size old value 1.System. 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.. 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.out. sau ó ng ký. 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. 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. ng nh thu c tính bound. Object newValue) Trang 238 . 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.0 new value 333.println("Change " + propertyName + " old value " + oldSise + " new value " + newdSise). } 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. 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. 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.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. 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. 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 {. 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. Object oldValue.

//Ph ng th c l y v giá tr c a thu c tính size public int getSize() { return size. PropertyChangeSupport c dùng v i các thu c tính bound còn VetoableChangeSupport dùng cho thu c tính constrain.java import java. } 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.java import java.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.*. 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. } //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. } //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. newSize). public class TestBeanB { public static void main(String[] args) { Trang 239 . } } Ví d sau dùng test th BeanB v a t o // TestBeanB. 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.beans. i t ng listener này s t ch i không cho thay i n u size >100. } //Ph ng th c dùng g b i t ng l ng nghe public void removeSizeListener(VetoableChangeListener lst) { vetoAgent.removeVetoableChangeListener(lst). } //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.*.addVetoableChangeListener(lst). // 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). try { // Thông báo n t t c các i t ng ã ng ký l ng nghe vetoAgent.beans. // BeanB.fireVetoableChange("size". i ây là m t cài t cho m t JavaBean B có thu c tính size. oldSize.

println(">Sau khi gan thuoc tinh size= "+b. } } 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 .println("size=10").setSize(10).out. System.println("size=234").out.println("size=123").out.getSize()).getSize()).println(">Sau khi gan thuoc tinh size= "+b.getSize()).setSize(123).out. evt). System. int newSize = ( (Integer) evt. // ng ký i t ng l ng nghe b.setSize(234). //Gán giá tr 123 (123>100) cho thu c tính size b.println(">Sau khi gan thuoc tinh size= "+b.out. System. System.out. System. //Gán giá tr 234 (234>100) cho thu c tính size b. System.getOldValue()). //Gán giá tr 10 (10<100) cho thu c tính size b.out.//T o ra m t i t ng BeanB BeanB b = new BeanB().println("size=56"). //Gán giá tr 56 (56>100) cho thu c tính size b. } } //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.getSize()).intValue().setSize(56). String propName = evt.getPropertyName().out. //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".getNewValue()). System. System.intValue().println(">Sau khi gan thuoc tinh size= "+b.addSizeListener(new MyListener()).

import java.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. 4.event. 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. 4. sau ó ng ký nó v i các i t ng ngu n. 3. 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.Event Source). 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. 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 ó.MouseEvent. 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 . 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 .awt.1. 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.2. JavaBean c a b n ch c n cài t giao di n MouseListener nh sau: 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.MouseListener.awt.

*.contains(l)) { mouseListeners. } //Ph ng th c dùng lo i b i t ng l ng nghe bi n c Trang 242 .addElement(l). // 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. 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().awt.setLayout(new BorderLayout()). jButton1.*. this.awt.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ý. BorderLayout. // MouseBean.*.contains(l)) { mouseListeners. 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. Khi mu n chuy n giao tình hu ng.util.swing.event. i ây là m t ví d minh ho . JavaBean s g i n t ng ph ng th c t ng ng c a các listener này. import java. // T o ra m t nút l nh JButton jButton1 = new JButton(). } } 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. this. 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.java import java.*. public class MouseBean extends JPanel { // M t Vecto l u tr các i t ng listener private transient Vector mouseListeners = new Vector(). public MouseBean() { jButton1.add(jButton1. 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 java.setText("Mouse JavaBean"). //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.addMouseListener(new MyListener(this)).removeElement(l).CENTER). import javax.

removeElement(l). } } Sau ây là ng d ng test th thành ph n MouseBean. } } /*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. i < count.event. MyListener(MouseBean adaptee) { this.*. import java. } } } /*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). } public void mouseClicked(MouseEvent e) { adaptee.addElement(l).swing.public synchronized void removeMouseListener(MouseListener l) { if (mouseListeners != null && mouseListeners.mouseClicked(e). } } //T o ra l p l ng nghe s ki n chu t c a nút l nh class MyListener extends java. // Frame1. for (int i = 0.java import javax.MouseAdapter { MouseBean adaptee. i++) { ( (MouseListener) listeners.awt. Có m t thính gi l ng nghe bi n click trên MouseBean. public class Frame1 extends JFrame { //t o ra i t ng MouseBean Trang 243 .size().*.elementAt(i)).adaptee = adaptee. import java.*.awt.contains(l)) { mouseListeners.event. 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). } } //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.awt.jButton1_mouseClicked(e).contains(l)) { mouseListeners.

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

Thu c tính size c a thành ph n BeanB là thu c tính ràng bu c. 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. 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. 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.VetoableChangeListener. } hi u rõ h n. 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.2.PropertyChangeEvent. v i c ch này ôi lúc s d n n tr ng h p xâm ph m l n nhau. 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. } else{ /* u ã có m t listener nào ó c ng ký thì ném ra m t ngo i l */ throw new TooManyListenerException().beans. } //Ph ng th c này dùng lo i b i t ng listener public void removeMouseListener(MouseListener lst) { saveListener=null. public class UseBean2 { public static void main(String[] args) { Trang 245 . 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. import java.beans.PropertyVetoException. /* Ph ng th c ng ký i t ng listener*/ public void addMouseListener(MouseListener lst) throws TooManyListenerException { if(saveListener==null){ saveListener=lst.4.java import java.beans. 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). import java. Ch ng trình s d ng hai i t ng listener cùng x lý m t tình hu ng. 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 . 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). //UseBean2. Tuy nhiên.

evt).getSize()).getSize() + " set new size 30"). System.intValue(). } } class myListener21 implements VetoableChangeListener { public void vetoableChange(PropertyChangeEvent evt) throws PropertyVetoException { int newSize = ( (Integer) evt.BeanB b = new BeanB(). } } 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. if (newSize > 50) throw new PropertyVetoException("Gia tri lon hon 50 Listener 1 reject". b. 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.println("size after setting:" + b.setSize(90). b.getSize()). System. b.out. System. Chính vì v y java phân bi t hai cách ng ký listener là unicast và multicast.println("size after setting:" + b.out.intValue().addSizeListener(new myListener21()).out. 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).addSizeListener(new myListener22()).setSize(30). 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. } } class myListener22 implements VetoableChangeListener { public void vetoableChange(PropertyChangeEvent evt) throws PropertyVetoException { int newSize = ( (Integer) evt. evt).getNewValue()).println("old size:" + b.getSize() + " set new size 90").println("old size:" + b. Trang 246 .getNewValue()). b. if (newSize > 100) throw new PropertyVetoException("Gia tri lon hon 100 Listener 2 reject".out.

s ki n c a JavaBean. 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 . Trong th c t . s ki n nào. 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 pháp quan tr ng nh t c a l p này là static getBeanInsfo(). ph ng th c.?. ph ng th c. 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. 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. V n này ã c gi i quy t b ng tính ph n x (reflect).. d a vào BeanInfo này b n có th m x tìm ra các thu c tính.III. 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). 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. 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. Công c này chính là l p Instrospector. Nh ng nh ng ng i thi t k java l i mu n cung c p m t công c chu n. 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. 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. c ch ph n x giúp ta có th phát hi n ra các thu c tính. 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). s ki n c a m t l p b t k (k c l p vô danh). 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.

String iconColor16x16Filename. } catch(IntrospectionException ex) { ex. case BeanInfo.awt. "getSize". PropertyDescriptor[] pds = new PropertyDescriptor[] { _size}.beans.printStackTrace(). public BeanBBeanInfo() { } public PropertyDescriptor[] getPropertyDescriptors() { try { PropertyDescriptor _size = new PropertyDescriptor("size". public class BeanBBeanInfo extends SimpleBeanInfo { Class beanClass = BeanB. String iconMono16x16Filename.ICON_MONO_16x16: return iconMono16x16Filename != null ? loadImage(iconMono16x16Filename) : null. return null. case BeanInfo.ICON_MONO_32x32: return iconMono32x32Filename != null ? loadImage(iconMono32x32Filename) : null. "setSize").ICON_COLOR_32x32: return iconColor32x32Filename != null ? loadImage(iconColor32x32Filename) : null. 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. 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.Image getIcon(int iconKind) { switch (iconKind) { case BeanInfo.*. String iconColor32x32Filename.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. beanClass.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.class. String iconMono32x32Filename. } } public java. return pds. } } Trang 248 .ICON_COLOR_16x16: return iconColor16x16Filename != null ? loadImage(iconColor16x16Filename) : null. case BeanInfo. } return null.

class Java-Bean: True Ghi l i v i cái tên gì ó ch ng h n BeanB. 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. Trình biên d ch d dàng tìm ra các thu c tính.jar chu n. Trang 249 . 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.0 Name BeansDir/BeanB. ph ng th c.class Name BeansDir/BeanBInfo. 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. 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. IV. 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. 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.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.mf nh sau: Manifest-Version: 1. s ki n. dòng cu i cùng cho bi t n v óng gói này là m t JavaBean. 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.mf Dòng th nh t cho bi t phiên b n. ó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 .

You're Reading a Free Preview

Download