You are on page 1of 249

Trang 1

Tr - ng i hc s- ph m k t hut h- ng yn
khoa cng ngh t hng t in
---------------ooo------------------
c - n g b i g i n g J a va
Nhm bin soan: 1. Hong Trong Th
2. Nguyn Duy Tn
Trang 2
MJC LJC
Chuong 1: CC KHI NIEM CO BAN.................................................................. 5
BI 1. LM QUEN VI JAVA................................................................................... 5
I. Lich su java ........................................................................................................... 5
II. Java em l ai ......................................................................................................... 5
II. Mt s dc trung cua java ..................................................................................... 5
III. Cc kiu ung dung Java........................................................................................ 7
IV. My ao Java (JVM-Java Virtual Machine) .......................................................... 7
BI 2 NEN TANG CUA JAVA ................................................................................ 9
I. Tp k tu dng trong java ...................................................................................... 9
II. Tu kho cua Java .................................................................................................. 9
III. Dinh danh (tn) ................................................................................................. 10
IV. Cu trc mt chuong trnh java ......................................................................... 10
V. Chuong trnh JAVA du tin .............................................................................. 12
VI. Ch thch trong chuong trnh ............................................................................ 14
VII. Kiu du liu ..................................................................................................... 15
VII. Mt s php ton trn kiu du liu nguyn thuy ............................................... 17
IX. Ton tu chuyn kiu .......................................................................................... 23
X. Cc hm ton hoc ............................................................................................... 24
XI. Cc php ton trn kiu k tu ............................................................................. 26
BI 3. DIEU KHIEN LUONG CHUONG TRNH .................................................... 27
I. Cu trc r nhnh ................................................................................................. 27
II. Cu trc lp while v do-while ........................................................................... 30
III. Cu trc for ....................................................................................................... 32
IV. Lnh break v continue ..................................................................................... 34
Chuong 2: LAP TRNH HUNG DOI TUONG ......................................................... 37
BI 1. DINH NGHA LP ....................................................................................... 38
I. Khai bo lop ........................................................................................................ 38
II. Chi tit v khai bo mt phuong thuc ................................................................. 40
III. Tu kho this ...................................................................................................... 43
IV. Tu kho super ................................................................................................... 43
V. Su dung lop ........................................................................................................ 44
VI. Diu khin vic truy cp dn cc thnh vin cua mt lop .................................. 44
BI 2. KHOI DAU V DON DEP ............................................................................ 47
I. Phuong thuc tao dung (constructor) ..................................................................... 47
II. Khi khoi du v danh v khi khoi du tinh ...................................................... 49
III. Don dep: kt thc v thu rc .............................................................................. 51
BI 3. CC THNH PHAN TNH ........................................................................... 52
I. Thuc tnh tinh .................................................................................................... 52
II. Phuong thuc tinh ................................................................................................ 52
BI 4. NAP CHONG PHUONG THUC .................................................................. 53
I. Khi nim v phuong thuc bi tai ........................................................................ 53
Trang 3
II. Yu cu cua cc phuong thuc bi tai ................................................................... 53
BI 5. KE THUA (INHERITANCE) ........................................................................ 54
I. Lop co so v lop dn xut .................................................................................... 54
II. Cch xy dung lop dn xut ................................................................................ 54
III. Thua k cc thuc tnh ...................................................................................... 54
IV. Thua k phuong thuc ........................................................................................ 54
V. Khoi du lop co so ............................................................................................. 54
VI. Ghi d phuong thuc ( Override ) ....................................................................... 56
VI. Thnh phn protected ........................................................................................ 56
VII. Tu kho final ................................................................................................... 56
BI 6. LP CO SO TRUU TUONG ......................................................................... 61
BI 7. DA HNH THI ............................................................................................ 62
BI 8. GIAO DIEN, LP TRONG, GI ................................................................... 63
I. Giao din ............................................................................................................. 63
II. Lop trong ............................................................................................................ 65
Bi 9. MANG, XU K TU, TAP HOP ................................................................... 67
I. Mang ................................................................................................................... 67
II. Xu k tu ............................................................................................................ 70
III. Lop StringTokenizer ......................................................................................... 75
IV. Mt s lop co ban cua Java ............................................................................... 77
V. Cc lop tp hop .................................................................................................. 83
Chuong 3: XU L NGOAI LE ............................................................................ 92
I. Muc dch cua vic xu l ngoai l .......................................................................... 92
II. M hnh su l ngoai l cua java .......................................................................... 92
III. Dc ta ngoai l ................................................................................................... 93
III. Nm ra ngoai l ................................................................................................. 93
IV. Bt ngoai l ....................................................................................................... 93
V. Khi finally ...................................................................................................... 95
VI. Mt s lop ngoai l chun cua Java ................................................................... 96
Chuong 4: LAP TRNH DA TUYEN ........................................................................ 97
I. Cc kin thuc lin quan ........................................................................................ 97
II. Lp trnh da tuyn trong Java .............................................................................. 98
Chuong 5: NHAP XUAT (Input/Output) ............................................................... 104
I. Lop lung .......................................................................................................... 105
II. Lop File ............................................................................................................ 113
Chuong 6: LAP TRNH DO HOA AWT ................................................................ 120
I. Gioi thiu v h thng d hoa cua Java .............................................................. 120
II. Trnh quan l hin thi trong Java ...................................................................... 124
III. Xu l su kin trong Java .................................................................................. 125
Chuong 7 LAP TRNH CO SO D LIEU .............................................................. 143
I. Tng quan 143
II. Cc ku trnh diu khin JDBC......................................................................... 143
Trang 4
III. Cc lop trong JDBC API dng d truy cp CSDL ........................................... 146
IV. Kt ni CSDL voi JDBC ................................................................................. 147
V. Tuong tc voi CSDL ........................................................................................ 152
VI. Quan l giao dich ............................................................................................ 160
Chuong 8: LAP TRNH SOCKET .............................................................................. 164
I. Cc kin thuc lin quan ...................................................................................... 164
II. Khao st mt s lop trong gi 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. Cc khi nim MAIL ......................................................................................... 205
II. Gui mail voi thu vin c sn cua java ............................................................... 206
III. Gioi thiu java mail API .................................................................................. 207
III. Gui mail .......................................................................................................... 212
IV. Nhn mail ....................................................................................................... 215
V. Xo mail ........................................................................................................... 221
Chuong 10: LAP TRNH PHN TN VI ................................................................. 222
JAVA RMI ( REMOTE METHOD INVOKE)............................................................. 222
I. RMI v lp trnh phn tn di tuong .................................................................. 222
II. Goi phuong thuc tu xa v cc vn d pht sinh ................................................. 223
III. Vai tr cua cc lop trung gian .......................................................................... 223
IV. Ci dt di tuong phn tn .............................................................................. 224
Chuong 11: JAVA JSP (JAVA SERVLET) ................................................................. 233
Chuong 12: EJB (ENTERPRISE JAVA BEANS) ........................................................ 234
I. Tng quan v JavaBean ..................................................................................... 234
II. Xy dung thnh phn JavaBean ........................................................................ 234
III. Tm hiu Instrospector ..................................................................................... 247
IV. Dng gi JavaBean ......................................................................................... 249
Trang 5
Chuong 1: CC KHI NIJM CO BAN
BI 1. LM QUEN VI JAVA
I. L|ch su java
Java l mt ngn ngu lp trnh duoc Sun Microsystems gioi thiu vo thng 6 nm
1995. Tu d, n d tro thnh mt cng cu lp trnh cua cc lp trnh vin chuyn nghip.
Java duoc xy dung trn nn tang cua C v C++. Do vy n su dung cc c php cua C v
cc dc trung huong di tuong cua C++.
Ban du Java duoc thit k d lm ngn ngu vit chuong trnh cho cc san phm
din tu dn dung nhu du video, tivi, din thoai, my nhn tin.. . Tuy nhin voi su mnh
m cua Java d khin n ni ting dn muc vuot ra ngoi su tuong tuong cua cc nh thit
k ra n.
Java khoi thuy tn l Oak- l cy si moc o pha sau vn phng cua nh thit k
chnh ng Jame Gosling, sau ny ng thy rng d c ngn ngu lp trnh tn Oak ri, do
vy nhm thit k quyt dinh di tn, Java l ci tn duoc chon, Java l tn cua mt
qun cafe m nhm thit k java hay dn d ung.
II. Java em l ai
Java l ngn ngu lp trnh huong di tuong, do vy khng th dng Java d vit
mt chuong trnh huong chuc nng. Java c th giai quyt hu ht cc cng vic m cc
ngn ngu khc c th lm duoc.
Java l ngn ngu vua bin dich vua thng dich. Du tin m ngun duoc bin dich
bng cng cu JAVAC d chuyn thnh dang ByteCode. Sau d duoc thuc thi trn tung
loai my cu th nho chuong trnh thng dich JAVA. Muc tiu cua cc nh thit k Java l
cho php nguoi lp trnh vit chuong trnh mt ln nhung c th chay trn bt cu phn
cung cu th, th nn khu hiu cua cc nh thit k Java l Write One, Run Any Where.
Ngy nay, Java duoc su dung rng ri d vit chuong trnh chay trn Internet. N l
ngn ngu lp trnh huong di tuong dc lp thit bi, khng phu thuc vo h diu hnh.
Java khng chi dng d vit cc ung dung chay don le hay trong mang m cn d xy
dung cc trnh diu khin thit bi cho din thoai di dng, PDA,
II. Mt s d}c trung cua java
1.Don gian
Nhung nguoi thit k mong mun pht trin mt ngn ngu d hoc v quen thuc
voi da s nguoi lp trnh. Java tua nhu C++, nhung d luoc bo di cc dc trung phuc tap,
khng cn thit cua C v C++ nhu: thao tc con tro, thao tc dinh nghia chng ton tu
(operator overloading), Java khng su dung lnh goto cung nhu file header (.h). Cu
trc struct v union cung duoc loai bo khoi Java. Nn c nguoi bao Java l C++--,
ngu bao java l C++ nhung d bo di nhung thu phuc tap, khng cn thit.
2. Hung di tung
C th ni java l ngn ngu lp trnh hon ton huong di tuong, tt cac trong java
du l su vt, du du cung l su vt.
3. Dc lp vi h nn
Muc tiu chnh cua cc nh thit k java l dc lp voi h nn hay cn goi l dc
lp phn cung v h diu hnh. Dy l kha nng mt chuong trnh duoc vit tai mt my
nhung c th chay duoc bt ky du
Trang 6
Tnh dc lp voi phn cung duoc hiu theo nghia mt chuong trnh Java nu chay
dng trn phn cung cua mt ho my no d th n cung chay dng trn tt ca cc ho my
khc. Mt chuong trnh chi chay dng trn mt s ho my cu th duoc goi l phu thuc
vo phn cung.
Tnh dc lp voi h diu hnh duoc hiu theo nghia mt chuong trnh Java c th
chay duoc trn tt ca cc h diu hnh. Mt chuong trnh chi chay duoc trn mt s h
diu hnh duoc goi l phu thuc vo h diu hnh.
Cc chuong trnh vit bng java c th chay trn hu ht cc h nn m khng cn
phai thay di g, diu ny d duoc nhung nguoi lp trnh dt cho n mt khu hiu :vit
mt ln, chy mi noi', diu ny l khng th c voi cc ngn ngu lp trnh khc.
Di voi cc chuong trnh vit bng C, C++ hoc mt ngn ngu no khc, trnh bin
dich s chuyn tp lnh thnh m my (machine code), hay lnh cua b vi xu l. Nhung
lnh ny phu thuc vo CPU hin tai trn my ban. Nn khi mun chay trn loai CPU
khc, chng ta phai bin dich lai chuong trnh.
4. Mnh m
Java l ngn ngu yu cu cht ch v kiu du liu, vic p kiu tu dng bua bi cua
C, C++ nay duoc han ch trong Java, diu ny lm chuong trnh r rng, sng sua, t li
hon.Java kim tra lc bin dich v ca trong thoi gian thng dich v vy Java loai bo mt
mt s loai li lp trnh nht dinh.Java khng su dung con tro v cc php ton con tro.
Java kim tra tt ca cc truy nhp dn mang, chui khi thuc thi d dam bao rng cc truy
nhp d khng ra ngoi gioi han kch thuoc.
Trong cc mi truong lp trnh truyn thng, lp trnh vin phai tu mnh cp pht
b nho. Truoc khi chuong trnh kt thc th phai tu giai phng b nho d cp. Vn d nay
sinh khi lp trnh vin qun giai phng b nho d xin cp truoc d. Trong chuong trnh
Java, lp trnh vin khng phai bn tm dn vic cp pht b nho. Qa trnh cp pht, giai
phng duoc thuc hin tu dng, nho dich vu thu nht nhung di tuong khng cn su dung
nua (garbage collection).
Co ch by li cua Java gip don gian ha qa trnh xu l li v hi phuc sau li.
5. H tr lp trnhda tuyn
Dy l tnh nng cho php vit mt chuong trnh c nhiu doan m lnh duoc chay
song song voi nhau. Voi java ta c th vit cc chuong trnh c kha nng chay song song
mt cch d dng, hon th nua vic dng b ti nguyn dng chung trong Java cung rt
dong gian. Diu ny l khng th c di voi mt s ngn ngu lp trnh khc nhu C/C++,
pascal
6. Phn tn
Java h tro dy du cc m hnh tnh ton phn tn: m hnh client/server, goi thu
tuc tu xa
7. H tr internet
Muc tiu quan trong cua cc nh thit k java l tao diu kin cho cc nh pht trin
ung dung c th vit cc chuong trnh ung dung internet v web mt cch d dng, voi
java ta c th vit cc chuong trnh su dung cc giao thuc TCP, UDP mt cch d dng, v
lp trnh web pha my khch java c cng ngh java applet, v lp trnh web pha my
khch java c cng ngh servlet/JSP, v lp trnh phn tn java c cng ngh RMI,
CORBA, EJB, Web Service.
Trang 7
8. Thng djch
Cc chuong trnh java cn duoc thng dich truoc khi chay, mt chuong trnh java
duoc bin dich thnh m byte code m dc lp voi h nn, chuong trnh thng dich java s
nh xa m byte code ny ln mi nn cu th, diu ny khin java chm chap di phn no.
III. Cc kiu ng dng Java
Voi Java ta c th xy dung cc kiu ung dung sau:
1. ng dng Applets
Applet l chuong trnh Java duoc tao ra d su dung trn Internet thng qua cc trnh
duyt h tro Java nhu IE hay Netscape. Applet duoc nhng bn trong trang Web. Khi
trang Web hin thi trong trnh duyt, Applet s duoc tai v v thuc thi tai trnh duyt.
2. ng dng dng lnh (console)
Cc chuong trnh ny chay tu du nhc lnh v khng su dung giao din d hoa.
Cc thng tin nhp xut duoc th hin tai du nhc lnh.
3. ng dng d ha
Dy l cc chuong trnh Java chay dc lp cho php nguoi dng tuong tc qua giao
din d hoa.
4. J SP/Servlet
Java thch hop d pht trin ung dung nhiu lop. Applet l chuong trnh d hoa
chay trn trnh duyt tai my tram. O cc ung dung Web, my tram gui yu cu toi my
chu. My chu xu l v gui kt qua tro lai my tram. Cc Java API chay trn my chu chiu
trch nhim xu l tai my chu v tra loi cc yu cu cua my tram. Cc Java API chay trn
my chu ny mo rng kha nng cua cc ung dung Java API chun. Cc ung dung trn my
chu ny duoc goi l cc JSP/Servlet. hoc Applet tai my chu. Xu l Form cua HTML l
cch su dung don gian nht cua JSP/Servlet. Chng cn c th duoc dng d xu l du liu,
thuc thi cc giao dich v thuong duoc thuc thi thng qua my chu Web.
5. ng dng co so d liu
Cc ung dung ny su dung JDBC API d kt ni toi co so du liu. Chng c th l
Applet hay ung dung, nhung Applet bi gioi han boi tnh bao mt.
6. ng dng mng
Java l mt ngn ngu rt thch hop cho vic xy dung cc ung dung mang. Voi thu
vin Socket ban c th lp trnh voi hai giao thuc: UDP v TCP.
7. ng dng nhiu tng
Voi Java ban c th xy dung phn tn nhiu tng voi nhiu h tro khc nhau nhu:
RMI, CORBA, EJB, Web Service
8. ng dng cho cc thit bj di dng
Hin nay phn lon cc thit bi di dng nhu: Din thoai di dng, my tro gip c
nhn du h tro Java. Th nn ban c th xy dung cc ung dung chay trn cc thit bi
di dng ny. Dy l mt kiu ung dung kh hp dn, boi v cc thit bi di dng ny ngy
cng ph bin v nhu cu c cc ung dung chay trn d, dc bit l cc ung dung mang
tnh cht giai tr nhu game
IV. My ao Java (JVM-Java Virtual Machine)
My ao l mt phn mm m phong mt my tnh tht (my tnh ao). N c tp
hop cc lnh logic d xc dinh cc hoat dng cua my tnh v c mt h diu hnh ao.
Nguoi ta c th xem n nhu mt my tnh tht (my tnh c phn cung ao, h diu hnh
Trang 8
ao). N thit lp cc lop truu tuong cho: Phn cung bn duoi, h diu hnh, m d bin
dich.
Trnh bin dich chuyn m ngun thnh tp cc lnh cua my ao m khng phu thuc
vo phn cung v h diu hnh cu th. Trnh thng dich trn mi my s chuyn tp lnh
ny thnh chuong trnh thuc thi. My ao tao ra mt mi truong bn trong d thuc thi cc
lnh bng cch:
Nap cc file .class
Quan l b nho
Don rc
Vic khng nht qun cua phn cung lm cho my ao phai su dung ngn xp d luu tru
cc thng tin sau:
Cc Frame chua cc trang thi cua cc phuong thuc.
Cc ton hang cua m bytecode.
Cc tham s truyn cho phuong thuc.
Cc bin cuc b.
Khi JVM thuc thi m, mt thanh ghi cuc b c tn Program Counter duoc su dung.
Thanh ghi ny tro toi lnh dang thuc hin. Khi cn thit, c th thay di ni dung thanh
ghi d di huong thuc thi cua chuong trnh. Trong truong hop thng thuong th tung lnh
mt ni tip nhau s duoc thuc thi.
Mt khi nim thng dung khc trong Java l trnh bin dich Just In Time-JIT. Cc
trnh duyt thng dung nhu Netscape hay IE du c JIT bn trong d tng tc d thuc thi
chuong trnh Java. Muc dch chnh cua JIT l chuyn tp lnh bytecode thnh m my cu
th cho tung loai CPU. Cc lnh ny s duoc luu tru v su dung mi khi goi dn.
Trang 9
BI 2 NN TNG CA JAVA
I. Tp k t dng trong java
Moi ngn ngu ni chung, ngn ngu lp trnh ni ring du phai xy dung trn mt
tp hop chu ci (hay cn goi l bang chu ci), cc k tu duoc nhm lai theo mt cch no
d d tao thnh cc tu, cc tu lai duoc nhm lai thnh cc cu (trong ngn ngu lp trnh
goi l cu lnh), mt chuong trnh my tnh tnh l mt tp cc cu lnh duoc b tr theo
mt trt tu m nguoi vit ra chng sp dt
Ngn ngu java duoc duoc xy dung trn bang chu ci unicode, do vy ta c th
dng cc k tu unicode d dt tn cho cc dinh danh.
II. T kho cua Java
Mi ngn ngu lp trnh c mt tp cc tu kho, nguoi lp trnh phai su dung tu
kho theo dng nghia m nguoi thit k ngn ngu d d ra, ta khng th dinh nghia lai
nghia cua cc tu kho, nhu su dung n d dt tn bin, hm..
Sau dy l mt s t kho thung gp:
T kha M ta
abstract Su dung d khai bo lop, phuong thuc truu tuong
boolean Kiu du liu logic
break Duoc su dung d kt thc vng lp hoc cu trc switch
byte kiu du liu s nguyn
case duoc su dung trong ln switch
cast Chua duoc su dung (d dnh cho tuong lai)
catch duoc su dung trong xu l ngoai l
char kiu du liu k tu
class Dng d khai bo lop
const Chua duoc dng
continue duoc dng trong vng lp d bt du mt vng lp moi
default duoc su dung trong lnh switch
do duoc dng trong vng lp diu kin sau
double kiu du liu s thuc
else kha nng lua chon thu hai trong cu lnh if
extends chi rng mt lop duoc k thua tu mt lop khc
false Ga tri logic
final Dng d khai bo hng s, phuong thuc khng th ghi d, hoc lop khng
th k thua
finally phn cui cua khi xu l ngoai l
float kiu s thuc
for Cu lnh lp
goto Chua duoc dng
if Cu lnh lua chon
implements chi rng mt lop trin khai tu mt giao din
import Khai bo su dung thu vin
instanceof kim tra mt di tuong c phai l mt th hin cua lop hay khng
interface su dung d khai bo giao din
long kiu s nguyn
native Khai bo phuong thuc duoc vit bng ngng ngu bin dich C++
new tao mt di tuong moi
Trang 10
null mt di tuong khng tn tai
package Dng d khai bo mt gi
private dc ta truy xut
protected dc ta truy xut
public dc ta truy xut
return Quay tu phuong thuc v ch goi n
short kiu s nguyn
static Dng d khai bo bin, thuc tnh tinh
super Truy xut dn lop cha
switch lnh lua chon
synchronized mt phuong thuc dc quyn truy xut trn mt di tuong
this m chi chnh lop d
throw Nm ra ngoai l
throws Khai bo phuong thuc nm ra ngoai l
true Gi tri logic
try su dung d bt ngoai l
void Dng d khai bo mt phuong thuc khng tra v gi tri
while Dng trong cu trc lp
III. D|nh danh (tn)
Tn dng d xc dinh duy nht mt dai luong trong chuong trnh. Trong java tn duoc
dt theo quy tc sau:
- Khng trng voi tu kho
- Khng bt du bng mt s, tn phai bt du bng k tu hoc bt du bng k $,_
- Khng chua du cch, cc k tu ton hoc nhu +, -, *,/, %..
- Khng trng voi mt dinh danh khc trong cng mt pham vi
Ch :
- Tn nn dt sao cho c th m ta duoc di tuong trong thuc t
- Ging nhu C/C++, java c phn bit chu hoa chu thuong
- Trong java ta c th dt tn voi d di tuy
- Ta c th su dung cc k tu ting vit d dt tn
Quy uc v dt tn trong java
Ta nn dt tn bin, hng, lop, phuong thuc sao cho nghia cua chng r rng, d hiu,
khoa hoc v mang tnh uoc l quc t. Do java c phn bit chu hoa, chu thuong nn ta
phai cn thn v ch .
Sau dy l quy uoc dt tn trong java (ch dy chi l quy uoc do vy khng bt buc
phai tun theo quy uoc ny):
- Di voi bin v phuong thuc th tn bao gio cung bt du bng k tu thuong, nu tn
c nhiu tu th ghp lai th: ghp tt ca cc tu thnh mt, ghi tu du tin chu thuong,
vit hoa k tu du tin cua mi tu theo sau trong tn, v du area, radius, readInteger
- Di voi tn lop, giao din ta vit hoa cc k tu du tin cua mi tu trong tn, v du lop
WhileTest, Circle
- Tn hng bao gio cung vit hoa, nu tn gm nhiu tu th chng duoc ni voi hau boi
k tu ghach duoi _, v du PI, MAX_VALUE
IV. Cu trc mt chuong trnh java
- Mi ung dung Java bao gm mt hoc nhiu don vi bin dich (mi don vi bin dich
l mt tp tin c phn mo rng Java)
- Mi don vi bin dich bao gm mt hoc nhiu lop
Trang 11
- Mi ung dung dc lp phai c duy nht mt phuong thuc main (dim bt du cua ung
dung)
- Mi don vi bin dich c nhiu nht mt lop duoc khai bo l public, nu nhu trong
don vi bin dich c lop public th tn cua don vi bin dich phai trng voi tn cua lop
public (ging ht nhau ca k tu hoa ln k tu thuong)
- Bn trong thn cua mi lop ta khai bo cc thuc tnh, phuong thuc cua lop d, Java
l ngn ngu huong di tuong, do vy m lnh phai nm trong lop no d. Mi lnh du
duoc kt thc bng du chm phay ;.
- Trong ngn ngu Java, lop l mt don vi mu c chua du liu v m lnh lin quan dn
- mt thuc th no d. Khi xy dung mt lop, thuc cht ban dang tao ra mt mt kiu du
liu. Kiu du liu moi ny duoc su dung d xc dinh cc bin m ta thuong goi l di
tuong. Di tuong l cc th hin (instance) cua lop. Tt ca cc di tuong du thuc v
mt lop c chung dc tnh v hnh vi. Mi lop xc dinh mt thuc th, trong khi d mi
di tuong l mt th hin thuc su.
- Khi ban khai bo mt lop, ban cn xc dinh du liu v cc phuong thuc cua lop d.
V co ban mt lop duoc khai bo nhu sau:
//Nhp khu cc thu vin
import thu_vin;
//Xy dung cc lp
public class clsMain{
.
public static void main(String args[])
{
//dim bt du ca chuong trnh
}
.
}
class lp1
{
.
}
class lp2
{
.
}
Mt don vi bin dich l mt tp
tin .java
Trang 12
C php:
class classname
{ var_datatype variablename;
...........
<met_datatype> methodname (parameter_list){...........}
............
}
Trong d:
class - Tu kho xc dinh lop
classname - Tn cua lop
var_datatype - kiu du liu cua bin
variablename - Tn cua bin
met_datatype - Kiu du liu tra v cua phuong thuc
methodname - Tn cua phuong thuc
parameter_list Cc tham s duoc cua phuong thuc
- Ban cn c th dinh nghia mt lop bn trong mt lop khc. Dy l lop xp lng nhau,
cc th hin (instance) cua lop ny tn tai bn trong th hin cua mt lop che phu chng.
N chi phi vic truy nhp dn cc thnh phn cua lop bao phu chng. C hai loai lop
trong d l lop trong tinh static v lop trong khng tinh non static
+ Lop trong tinh (static)
Lop trong tinh duoc dinh nghia voi tu kho static. Lop trong tinh c th truy nhp
vo cc thnh phn tinh cua lop phu n.
+ Lop trong khng tinh (non static)
Lop bn trong (khng phai l lop trong tinh) c th truy nhp tt ca cc thnh phn cua
lop bao n, song khng th nguoc lai.
V. Chuong trnh JAVA du tin
D c th bin dich v chay cc chuong trnh java ta phai ci
- JRE (Java Runtime Enviroment) mi truong thuc thi cua java, n bao gm: JVM (Java
Virtual Machine) my ao java v cc chuong trnh java duoc thng dich v chay trn
my ao java v tp cc thu vin cn thit d chay cc ung dung java.
- B cng cu bin dich v thng dich JDK cua Sun Microsystem
Sau khi ci dt JDK (gia su thu muc ci dt l C:\JDK1.4) ta s nhn duoc mt cu trc
thu muc nhu sau:
- D bin dich mt chuong trnh java sang m byte code ta dng lnh
C:\JDK1.4\BIN\javac TnTp.java
- D thng dich v chay chuong trnh ta su dung lnh
Trang 13
C:\JDK1.4\BIN\java TnTp
D bin dich v chay chuong trnh Java don gian ta nn thit dt hai bin mi truong
paht v classpath nhu sau:
- Di voi dng WinNT:
+ R-Click vo My Computer chon Properties chon Advanced Enviroment
Variables
+ Trong phn System variables chon new d thm bin mi truong moi, trong hp
thoai hin ra g classpath vo 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 khng g du vo, muc dch d cho d nhn m thi)
+ Cung trong phn System variables tm dn phn path trong danh sch chon edit
d sua lai gi tri hin c, trong value ta thm vo cui ;C:\jdk1.4\bin
Cng vic dt cc bin mi truong d xong, d thy duoc tc dung cua cc bin mi
truong ta cn phai khoi dng lai my
- Di voi dng Win9X:
Mo tp C:\Autoexec.bat sau d thm vo hai dng 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 dng lai my d thy duoc tc dung cua cc bin mi truong ny
V d du tin: chuong trnh Hello World (chuong trnh khi chay s in ra mn hnh loi
cho Hello World)
Cc buoc:
Trang 14
- Mo mt chuong trnh soan thao vn ban h tro asciii, nhu notepad, wordpad,
EditPlus v g vo cc dng sau:
public class HelloWorld {
public static void main(String[] args){
System.out.println("Hello World");
}
}
- Ghi lai voi ci tn C:\HelloWorld.java (ch tn tp phai trng voi tn lop, k ca chu
hoa chu thuong, phn mo rng l java)
- Mo cua s DOS Prompt
+ Chuyn vo thu muc C:\
+ G lnh javac HelloWorld.java d bin dich chuong trnh, nu vic bin dich
thnh cng (chuong trnh khng c li c php) th ta s thu duoc tp
HelloWorld.class trong cng thu muc, nu trong chuong trnh cn li c php
th trong buoc ny ta s nhn duoc mt thng bo li v lc ny tp
HelloWorld.class cung khng duoc tao ra
+ G lnh java HelloWorld (ch khng g phn mo rng) d chay chuong trnh
HelloWorld.
Sau khi thng dich v chay ta nhn duoc
VI. Ch thch trong chuong trnh
Trong java ta c 3 cch d ghi ch thch
Cch 1: su dung cp /* v */ nghia cua cp ch thch ny ging nhu cua C, C++
Cch 2: su dung cp // nghia cua cp ch thch ny ging nhu cua C, C++
Cch 3: su dung cp /** v */, dy l kiu ch thch ti liu (khng c trong C/C++), n
dng d tao ra ti liu ch thch cho chuong trnh.
Voi cch thu nht v cch ba ta c th vit ch thch trn nhiu dng, voi cch ch thch
hai ta chi c th ch thch trn mt dng.
Ch : Trong java ta c th dt ch thch o du?, cu tra loi l: o du c th dt duoc mt
du cch th o d c th dt ch thch.
Trang 15
VII. Kiu d liu
1. Cc kiu d liu nguyn thuy
T kho M ta Kch c Ti thiu Ti da Lp bao
(kiu s nguyn)
byte s nguyn mt byte 8 bit -128 127 Byte
short s nguyn ngn 16 bit -2
15
2
15
-1 Short
int s nguyn 32 bit -2
31
2
31
-1 Integer
long s nguyn di 64 bit -2
63
-2
63
-1 Long
(kiu s thc)
float kiu thuc voi d chnh
xc don
32 bit IEEE754 IEEE75
4
Float
double Double-precision
floating point
64 bit IEEE754 IEEE75
4
Double
(kiu khc)
char kiu k tu 16 bit Unicode 0 Unicode
2
16
-1
Character
boolean kiu logic true hoc false - - Boolean
void - - - - Void
Dc dim cua cc bin c kiu nguyn thuy l vng nho cua chng duoc cp pht o phn
stack. Do vy vic truy xut vo mt bin kiu nguyn thuy rt nhanh.
2. Kiu tham chiu
Trong Java c 3 kiu du liu tham chiu
Kiu d liu M ta
Mang (Array) Tp hop cc du liu cng kiu.
Lop (Class) L su ci dt m ta v mt di tuong trong bi ton.
Giao din
(Interface)
L mt lop thun truu tuong duoc tao ra cho php ci dt
da thua k trong Java.
Dc dim cua cc bin kiu tham chiu l n chua dia chi cua di tuong m n tro
dn.
Ku nguyn thu
kiu logic boolean Kiu s
Kiu s thuc
Kiu k tu
Kiu s
boolean
char byte short int long
float
doubl
e
Trang 16
Vng nho cua bin tham chiu duoc cp pht o vng nho stack cn vng nho cua
di tuong duoc cp pht o vng nho heap. Vic truy xt vo vng nho heap chm hon truy
xt vo vng nho stack tuy nhin java c co ch cho php truy cp vo vng nho heap voi
tc d xp xi bng tc d truy cp vo vng nho stack.
VI I I . Khai bo bin
1. Khai bo bin
Tuong tu ngn ngu C/C++, d khai bo bin trong java ta su dung c php sau:
type name [=InitValue];
trong d:
- type l kiu du liu cua bin
- name l tn cua bin, tn bin l mt xu k tu duoc dt theo quy tc dt tn cua java
- InitValue l gi tri khoi tao cho bin, dy l phn tuy chon, nu bo qua phn ny th gi
tri ban du cua bin duoc khoi tao gi tri mc dinh
Ch :
- Nu cn khai bo nhiu bin c cng mt kiu du liu ta c th dt cc khai bo cc bin
trn mt dng, cc bin ny duoc phn cch nhau boi du phay
- Java s xu l cc bin khng duoc khoi du gi tri nhu sau:
+ Di voi thuc tnh (bin duoc khai bo trong pham vi cua lop) th Java s tu dng
khoi gn gi tri cho cc bin theo quy tc sau:
+ gi tri 0 cho kiu du liu s
+ false cho kiu logic
+ k tu null (m 0) cho k tu
+ gi tri null cho kiu di tuong
+ Di voi cc bin cuc b th bin khng duoc khoi gn gi tri mc dinh, tuy nhin
Java s bo li nu ta su dung mt bin chua duoc nhn gi tri
2. Phm vi bin
Mi bin duoc khai bo ra c mt pham vi hoat dng, pham vi cua bin l noi m
bin c th duoc truy cp, diu ny xc dinh ca tnh thy duoc v thoi gian sng cua bin.
Bin tham chiu i tuong
Trang 17
Bin pham vi lop l bin duoc khai bo bn trong lop nhung bn ngoi cc phuong
thuc v hm tao, tuy nhin vic khai bo phai xut hin truoc khi bin duoc su dung
Bin pham vi cuc b l bin duoc khai bo bn trong mt khi, pham vi cua bin tnh
tu dim bin duoc khai bo cho dn cui khi m bin duoc khai bo
V d:
{
int i=1; // chi c i sn sng su dung
{
int j=10; // ca i v j du sn sng
}
// chi c i sn sng
// j khng sn sng v nm ngoi pham vi
}
Ch : Ta khng th lm diu sau cho d n c th trong C/C++
{
int i=1;
{ int i=10;// khng duoc php v d c mt bin cng tn voi n }
}
Nhung nguoi thit k java cho rng diu d c th gy ln ln, do vy ho d quyt
dinh khng cho php che giu mt bin o pham vi lon hon.
Ch : thoi gian sng cua cc di tuong khng tun theo quy lut thoi gian sng cua cc
bin kiu nguyn thuy.
VII. Mt s php ton trn kiu d liu nguyn thuy
1. Php gn
C php Bin=BiuThc;
Php gn duoc thuc hin bng ton tu =, n c nghia l hy tnh ton gi tri biu
thuc bn phai du gn, sau d dua gi tri d vo nho c tn nm o bn tri du gn
Ch :
+ Cu lnh gn gm mt du =
+ Kiu cua biu thuc bn phai du gn phai tuong thch voi kiu du liu cua bin
+ Trong java ta c th thuc hin mt dy gn nhu sau:
i = j = 10; // ca i v j du c gi tri 10
Trang 18
2. Ton tu ton hc
Ngn ngu java cung c cc php ton s hoc nhu cc ngn ngu khc: + ( php cng), - (
php tru ), * ( php nhn ),/ ( php chia ), % ( php ton chia ly phn nguyn)
Ta m ta tm tt cc php ton s hoc qua bang tng kt sau:
Php ton Su dng M ta
+ op1 + op2 Cng op1 voiop2
- op1 - op2 Tru op1 cho op2
* op1 * op2 Nhn op1 voi op2
/ op1/ op2 chia op1 cho op2
% op1 % op2 Tnh phn du cua php chia op1 cho op2
3. Ton tu tng, giam
Ging nhu ngn ngu C/C++, java cung c php ton tng, giam, ta c th m ta
tm tt qua cc bng sau:
Php ton Su dng M ta
++ op++
Tng op ln 1 don vi, gi tri cua op duoc tng ln truoc khi biu
thuc chua n duoc tnh
++ ++op
Tng op ln 1 don vi, gi tri cua op duoc tng ln sau khi biu thuc
chua n duoc tnh
-- op--
Giam op xung1 don vi, gi tri cua op duoc giam xung truoc khi
biu thuc chua n duoc tnh
-- --op
Giam op xung1 don vi, gi tri cua op duoc giam xung sau khi
biu thuc chua n duoc tnh
Ch : nu ton tu tng truc, tng sau(giam truc, giam sau) dng mt mnh(khng
nm trong biu thuc ) th chng hoat dng nhu nhau, chng chi khc nhau khi chng nm
trong biu thuc
4. Php ton quan h
Php ton quan h bao gio cung cho kt qua boolean, php ton quan h s so snh
2 gi tri, n xc dinh mi quan h giua chng, v du! = s tra v true nu 2 ton hang l
khc nhau.
Ta tm tt cc php ton qua bang sau:
Php ton Su dng Nhn v gi tr| true khi
> op1 > op2 op1 lon hon op2
>= op1 >= op2 op1 lon hon hoc bng op2
< op1 < op2 op1 nho hon op2
<= op1 <= op2 op1 nho hon hoc bng op2
== op1 == op2 op1 bng op2
!= op1! = op2 op1 khc op2
V du: Su dung cc php ton 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
}
}
Dy l du ra cua chuong trnh
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. Php ton logic
Java h tro 6 php ton logic duoc chi ra trong bang sau:
Php ton Su dng Nhn v gi tr| true khi
&& op1 && op2
Ca op1 v op2 du l true, gi tri cua op2 chi duoc tnh
khi op1 l true
|| op1 || op2
Hoc op1 hoc op2 l true, gi tri cua op2 chi duoc tnh
khi op1 l false
! ! op op l false
& op1 & op2
Ca op1 v op2 du l true, gi tri cua op2 lun duoc tnh
k ca khi op1 l false
| op1 | op2
Hoc op1 hoc op2 l true, gi tri cua op2 lun lun duoc
tnh k ca khi op1 l true
^ op1 ^ op2 Nu op1 khc op2
Nhn xt:
+ Php ton && ( & ) chi nhn gi tri true khi v chi khi ca hai ton hang du l true
+ Php ton || ( | ) chi nhn gi tri false khi v chi khi ca hai ton hang l false
+ Php ton ^ chi nhn gi tri true khi v chi khi hai ton hang khc nhau
6. php ton thao tc trn bit
6.1. Php ton djch bit
Ta s m ta php ton dich chuyn qua bang sau:
Php ton Su dng Kt qua
>> op1 >> op2
Dich chuyn op1 sang phai op2 bit, op2 bit pha bn phai s
duoc din bng cc bt 0
<< op1 << op2
Dich chuyn op1 sang tri op2 bit(giu nguyn du cua op1),
op2 bit nm bn tri s duoc din bng cc bt 0
>>> op1>>> op2 Dich chuyn op1 sang phai op2 bit, op2 bit
Sau dy l hnh minh hoa php ton dich bt
Trang 21
V du:
13>>1=6 v 13=11012 do vy khi dich phai mt bit ta s duoc 1102=6
5<<1=10 v 5=1012 do vy khi dich tri 1 bit ta s duoc 10102=10
5<<2=100 v 5=1012 do vy khi dich tri 2 bit ta s duoc 101002=100
Nhn xt: php ton djch tri mt bit chnh l php nhn vi 2, cn djch phai chnh l
php chia cho 2
6.2. Php ton logic trn bit
Cc php ton thao tc bit cho php ta thao tc trn tung bit ring le trong mt kiu du liu
thch hop, cc php ton thao tc bit thuc hin dai s boolean trn cc bit tuong ung cua 2
ton hang d tao ra kt qua
Ta tm tt cc php ton trong bang sau:
Php ton Su dng Thc hin
& op1 & op2 Thuc hin php and cc bit tuong ung cua op1 voi op2
| op1 | op2 Thuc hin php or cc bit tuong ung cua op1 voi op2
^ op1 ^ op2 Thuc hin php xor cc bit tuong ung cua op1 voi op2
~ ~op2 Thuc hin php lt not cc bit cua op2
Bang gi tri chn l cua cc php ton di s boolean:
Trang 22
Php AND
op1 op2 Result
0 0 0
0 1 0
1 0 0
1 1 1
Php 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. Ton tu gn tt
Ging nhu C/C++ java cung c ton tu gn, ta tm tt cc ton tu gn qua bang
sau:
Php gn Su dng 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
Php 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 t uu tin cua cc php ton
Thu tu uu tin cua cc php ton xc dinh trnh tu tnh ton gi tri cua mt biu thuc, java
c nhung quy tc ring d xc dinh trnh tu tnh ton cua biu thuc, ta phai nho quy tc
sau:
Cc php ton mt ngi bao gio cung duoc thuc hin truoc tin
Trong mt biu thuc c nhiu php ton th php ton no c d uu tin cao hon s
duoc thuc hin truoc php ton c d uu tin thp
Trong mt biu thuc c nhiu php ton c d uu tin ngang nhau th chng s duoc
tnh theo trnh tu tu tri qua phai
Ta c bang tm tt thu tu uu tin cua cc php ton 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 trn thu tu uu tin cua cc php ton duoc giam tu trn xung duoi,
trn cng mt hng th chng c d uu tin ngang nhau.
Ton tu dy
Khng ging nhu C/C++, trong java ch duy nht m ta c th dt ton tu dy l bn trong
cp ngoc trn cua cu trc for( s duoc m ta chi tit trong chuong sau )
IX. Ton tu chuyn kiu
9.1 Chuyn di kiu khng tung minh
Vic chuyn di kiu thuong duoc din ra mt cch tu dng trong truong hop biu
thuc gm nhiu ton hang c kiu du liu khc nhau. Diu ny di khi lm cho ban kh
ngac nhin v nhn duoc mt kt qua khng theo mun. V du ta xt doan trnh sau:
int two=2, three=3;
Trang 24
float result=1.5 +three/two;
kt qua nhn duoc cua result l 2.5. Diu m ban mong mun l 3.0 chu khng phai l 2.5.
Kt qua 2.5 nhn duoc l do three v two l hai gi tri nguyn nn kt qua cua php chia
three/two cho ta mt gi tri nguyn bng 1 chu khng phai l 1.5. D ni rng kt qua cua
php chia three/two l mt gi tri thuc chu khng phai l mt gi tri nguyn th mt trong
hai ton hang cua php chia ny phai l mt s thuc. Do vy ta cn phai chuyn kiu cua
mt trong hai ton hang ny hoc ca hai thnh s thuc. D nhn duoc kt qua dng trong
truong hop ny ban cn vit nhu sau:
float result=1.5 + (float) three/two; hoc
float result=1.5 + three/ (float)two; hoc
float result=1.5 +(float)three/(float)two;
L do m ta vit nhu trn l nu trong mt php ton c su tham gia cua nhiu ton hang
c kiu khc nhau th java s chuyn kiu tu dng cho cc ton hang mt cch tu dng
theo quy tc sau:
byte -> short -> int -> long -> float -> double
9.2. Chuyn di kiu tung minh
D chuyn di kiu mt cch tuong minh ta su dung c php sau:
(type) biu_thc;
khi gp cu lnh ny java s tnh ton gi tri cua biu thuc sau d chuyn di kiu gi tri
cua biu thuc thnh kiu 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 :
- Php ton chuyn kiu l php ton c d uu tin cao, nn (int)3.5*2(int)(3.4*2)
- Cn ch khi chuyn mt biu thuc kiu du liu c min gi tri lon sang mt kiu
c min gi tri nho hon. Trong truong hop ny c th ban s bi mt thng tin.
X. Cc hm ton hc
Cc hm ton hoc nhu sin, cos, sqrt duoc java vit sn trong lop Math. Lop ny nm trong
gi java.lang (gi mc dinh) do vy ban khng cn phai thm cu lnh import o du
chuong trnh d c th su dung lop ny. Cc hm ny duoc vit l cc phuong thuc tinh do
vy ta khng cn phai tao ra th hin cua lop Math.
Bang sau lit k mt s phuong thuc tinh trong lop Math:
Tn phuong thc M ta nghia Kiu tham s Kiu tra v
sin(arg) tnh sin cua arg arg l mt biu thuc kiu
double th hin mt cung
theo radians
double
cos(arg) tnh cos cua arg arg l mt biu thuc kiu
double th hin mt cung
theo radians
double
tan(arg) tnh tang cua arg arg l mt biu thuc kiu
double th hin mt cung
theo radians
double
asin(arg) tnh sin-1 (arcsin) arg l mt biu thuc kiu double trong h
Trang 25
arg double th hin mt cung
theo radians
radians
acos(arg) tnh cos-1
(arccosin) cua arg
arg l mt biu thuc kiu
double th hin mt cung
theo radians
double trong h
radians
atan(arg) tnh tan-1
(arctang) cua arg
arg l mt biu thuc kiu
double th hin mt cung
theo radians
double trong h
radians
atan2 (arg1,arg2) tnh tan-1
(arctang) cua
arg1/arg2
arg1,arg2 l cc biu thuc
kiu double th hin mt
cung theo radians
double trong h
radians
abs(arg) tnh tri tuyt di
cua arg
arg l mt biu thuc kiu
int, long, float, hoc double
The same type as
the argument
max (arg1,arg2) Nhn v gi tri lon
trong hai tham s
arg1, arg2 l mt biu thuc
kiu int, long, float, hoc
double
Nhn v kiu
cng kiu voi
tham s
min (arg1,arg2) Nhn v gi tri
nho trong hai tham
s
arg1, arg2 l mt biu thc
kiu int, long, float, hoc
double
Nhn v kiu
cng kiu voi
tham s
ceil(arg) Nhn v gi tri
nguyn nho hon
hoc bng arg
arg l biu thuc kiu float
hoc double
double
floor(arg) Nhn v gi tri
nguyn lon hon
hoc bng arg
arg l biu thuc kiu float
hoc double
double
round(arg) Tra v gi tri
nguyn gn arg
nht, gi tri ny
chnh l gi tri cua
arg sau khi d lm
trn
arg l biu thuc kiu float
hoc double
Nhn v kiu int
nu arg kiu float,
nhn v kiu long
nu arg kiu
double
rint(arg) Ging nhu
round(arg)
arg l biu thuc kiu double double
sqrt(arg) tnh cn bc hai
cua arg
arg l biu thuc kiu double double
pow (arg1,arg2) tnh arg1arg2 Ca arg1 v arg2 l cc biu
thuc kiu double
double
exp(arg) tnh earg arg l biu thuc kiu double double
log(arg) tnh logarithmo s
e cua arg
arg l biu thuc kiu double double
random() Nhn v mt s
gia ngu nhin
nm trong khoan
[0, 1)
Khng c tham s double
V du v cc hm ton hoc trong lop Math, ban hy g doan chuong trnh sau v cho chay
thu d thy duoc kt qua tnh ton cua cc hm ton hoc.
Trang 26
XI. Cc php ton trn kiu k t
Di voi kiu k tu ta c th thuc hin cc php ton s hoc (nhu: +, -, *,/ ) v cc php
ton quan h.
V d:
char kt1=A;
char kt2=tk1+a;// kt2 nhn k tu B
char kt3=(char)33*2;// kt3 nhn k tu B
(kt1>kt2)= false;
(kt2=kt3)= false;
Trang 27
BI 3. IU KHIEN LUNG CHUONG TRNH
Chuong trnh l mt dy cc lnh duoc b tr thuc hin theo mt trnh tu no d,
nhung di khi ta mun diu khin lung thuc hin cua chuong trnh tuy thuc vo diu
kin g d. Ngn ngu lp trnh java cung cp mt s pht biu cho php ta diu khin
lung thuc hin cua chuong trnh, chng duoc lit k trong bang sau:
Kiu lnh T kho
Lp while, do-while, for
Quyt dinh if-else, switch-case
Xu l li try-catch-finally, throw
R nhnh break, continue, label:, return
I. Cu trc r nhnh
1.1. Pht biu if
a) Dng khuyt
C php
if (Boolean-expression)
statement;
su hoat dng cua cu trc if thiu duoc m ta qua so d sau:
b) Dng du
C php
if (Boolean-expression)
statement1;
else
statement2;
su hoat dng cua cu trc if thiu duoc m ta qua so d sau:
diu kin
statement
T
F
diu kin
Statement 1
dng
sai
Statement2
Trang 28
1.2. Biu thc diu kin
C php:
Variable=booleanExpression? true-result-expression:
false-result-expression;
1.3. cu trc switch
a) Dng khuyt
C php
switch (biu_thc) {
case gt_1:
lnh 1; [ break;]
case gt_2:
lnh 2; [ break;]

case gt_n:
lnh n; [ break;]
}
Sau dy l so d khi m ta su hoat dng cua cu trc r nhnh switch dang thiu
biu_thuc
bng gt_1 lnh 1
biu_thuc
bng gt_2
.....................................................................
biu_thuc
bng gt_n
No
Yes
Yes
No
Yes
No
break;
lnh 2 break;
lnh n break;
Trang 29
b) Dng du
C php
switch(biu_thc) {
case gt_1:
lnh 1; [ break;]
case gt_2:
lnh 2; [ break;]

case gt_n:
lnh n; [ break;]
default:
lnh n+1;
}
Sau dy l so d khi m ta su hoat dng cua cu trc switch dang du
Ch :
- Biu_thuc phai l mt biu thuc c kiu char, byte, short, int nhung khng th l kiu
long, nu biu_thuc c kiu khc voi cc kiu lit k o trn th java s dua ra mt thng
bo li.
- Nu biu_thuc bng gi tri cua gt_i th cc lnh tu lnh i cho dn lnh n nu khng c
default (lnh n+1 nu c default) s duoc thuc hin.
- Cu lnh break thot ra khoi cu trc switch.
So d khi m ta su hoat dng cua cu trc switch trong truong hop c lnh break
biu_thc
bng gt_1
Lnh 1
biu_thc
bng gt_2 Lnh 2
...............................................
......................
biu_thc
bng gt_n
Lnh n
No
Yes
Yes
No
Yes
No
lnh n+1
Trang 30
1.4. Ton tu diu kin
Ton tu diu kin l mt loai ton tu dc bit v n gm ba thnh phn cu thnh
biu thuc diu kin. hay ni cch khc ton tu diu kin l ton tu 3 ngi.
C php :
Biu thc 1? biu thc 2 : biu thc 3;
Trong d
biu thc 1: Biu thuc 1 l mt biu thuc logic. Tuc l n tra tra v gi tri True hoc False
biu thc 2: Gi tri tra v nu biu thuc 1 nhn gi True.
biu thc 3: Gi tri tra v nu biu thuc 1 nhn gi tri False
Ch : Kiu gi tri cua biu thuc 2 v biu thuc 3 phai tuong thch voi nhau.
V du: Doan biu thuc diu kin sau tra v gi tri a l s chn nu nhu gi tri cua bin a
l s chn, nguoc lai tra v gi tri a l s le nu nhu gi tri cua bin a l s le.
String result=a%2==0 ? "a l s chn" : "a l s le";
II. Cu trc l}p while v do-while
1. Lp kim tra diu kin truc
Ta c th su dung cu trc while d thuc thi lp di lp lai mt lnh hoc mt khi
lnh trong khi diu kin dng
C php:
while (BooleanExpression) {
statement;
}
ta c th thy duoc lung thuc hin cua chuong trnh thng qua so d khi sau:
truoc tin pht biu while s tnh gi tri cua biu thuc logic, nu gi tri cua biu thuc logic
l dng th cu lnh trong thn cua while s duoc thuc hin, sau khi thuc hin xong n tnh
lai gi tri cua biu thuc logic, nu gi tri dng n lai tip tuc thuc hin lnh trong thn
while cho dn khi gi tri cua biu thuc sai.
V d:
Diu kin lp
dng
Lnh
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 :
+ Biu thuc bn trong cp ngoc trn phai l mt biu thuc logic ( biu thuc tra v
gi tri true hoc false )
+ Biu thuc diu kin phai nm trong cp ngoc trn
+ Sau tu kho while ta chi c th dt duoc duy nht mt lnh, do vy d c th thuc
hin nhiu tc vu sau while ta phai bao chng trong mt khi lnh
+ Bn trong thn cua vng lp while ta nn c lnh lm thay di gi tri cua biu thuc
logic, nu khng chng ta s roi vo vng lp v han.
+ Cu lnh trong thn cu trc while c th khng duoc thuc hin ln no (do biu
thuc lgic ban du c gi tri false )
2. Lp kim tra diu kin sau
C php:
do {
statement(s);
}while (expression);
su hoat dng cua cu trc ny duoc th hin qua so d sau:
Nhn vo so d ny ta thy su hoat dng cua n nhu sau:
b1. Thuc hin lnh
b2. Sau khi thuc hin lnh xong n tnh gi tri cua biu thuc logic
iu kin lp
dng
Lnh
sai
Trang 32
b3. Nu biu thuc logic dng n quay tro lai b1, nu sai th b4
b4. Kt thc vng lp v thuc hin lnh 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 :
+ Biu thuc bn trong cp ngoc trn phai l mt biu thuc logic ( biu thuc tra v
gi tri true hoc false )
+ Biu thuc diu kin phai nm trong cp ngoc trn
+ Sau tu kho do ta c th dt duoc nhiu lnh
+ Bn trong thn cua vng lp do-while ta nn c lnh lm thay di gi tri cua biu
thuc logic, nu khng chng ta s roi vo vng lp v han.
+ Cu lnh trong thn cu trc do-while duoc thuc hin t nht mt ln
III. Cu trc for
Dy la cu trc lp ph bin nht trong cc ngn ngu lp trnh, m ni dung cua
vng lp cn phai lp di lp lai mt s ln bit truoc, c php cua n nhu sau:
for (initialization; termination; increment)
{
statement
}
Trong d:
- initialization l gi tri khoi tao truoc khi vng lp bt dau, n chi duoc thuc hin duy
nht mt ln truoc khi vng lp bt du
- termination l diu kin dng d kt thc qu trnh lp
- increment l cu lnh dng d diu khin qu trnh lp
- statement l cu lnh m ta can phai thuc hin lp di lp lai.
So d khi din giai su hoat dng cua cu trc for sau:
Trang 33
Nhn xt:
+ Thn cua cu trc lp for ta chi c th dt duoc duy nht mt lnh, do vy d c
th thuc hin nhiu tc vu trong thn for ta phai bao chng trong khi lnh
+ Thn vng lp for c th khng duoc thuc hin ln no
+ Cc phn initialization, termination, increment c th khuyt tuy nhin dy phy
dnh cho n vn phai c
+ S ln thuc hin initialization=1
+ S ln thuc hin termination = s ln lp +1
+ S ln thuc hin increment = s ln lp
+ Ta c th dt mt vi khai bo bin trong phn initialization, nhu v du sau
+ Ta c th m ta cu trc while thng qua cu trc for nhu sau
for (; Boolean_Expression;) statement;
V du: kit k ra 128 cc k tu asciii du tin
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);
}
}// /:~
Ton tu dy v vng lp for
Trong bi truoc ta d nhc dn ton tu dy (ton tu dy l mt dy cc lnh don
duoc cch nhau boi du phy), trong java ch duy nht m ta c th dt ton tu dy d l
bn trong cu trc lp for, ta c th dt ton tu dy ca trong phn initialization ln phn
increment
V du v ton tu dy
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);
}
}
}
Kt qua chay chuong trnh sau:
i= 1 j= 11
increment
initialization
termination
statement
dng
Trang 34
i= 2 j= 4
i= 3 j= 6
i= 4 j= 8
IV. Lnh break v continue
Bn trong thn cua cc cu trc lp ta c th diu khin lung thuc hin bng cch
su dung lnh break v continue, lnh break s chm dut qu trnh lp m khng thuc hin
nt phn cn lai cua cu trc lp, continue s ngung thuc thi phn cn lai cua thn vng
lp v chuyn diu khin v dim bt du cua vng lp, d thuc hin ln lp tip theo, v
du sau chi ra cch su dung break v continue bn trong cu trc lp 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);
}
}
}
kt qua chay chuong trnh sau:
0
9
18
27
36
45
54
63
72
10
20
30
40
Bn trong cu trc lp for gi tri cua i khng th dat duoc gi tri 100 v pht biu break s
kt thc vng lp khi i=74
Ch : J ava khng c lnh nhy goto, tuy nhin trong java vn c mt vi vt tch cua
lnh nhy goto ( kht ting v duoc coi l ngun sinh cc li ) d l lnh break v continue
Trang 35
Nhn cua vng lp
Trong thuc t cc vng lp c th lng vo nhau, muc d lng nhau khng han ch,
th th cu hoi dt ra l lnh break s thot ra khoi vng lp no, cu tra loi l n thot ra
khoi vng lp m lnh break duoc dt, th th lm cch no ta c th cho n thot ra khoi
mt vng lp tuy no d, cu tra loi l java d h tro cho ta mt cng cu d l nhn cua
vng lp.
Nhn l mt ci tn sau d c 2 du chm
V d LabelName:
Ch duy nht m nhn c nghia d l ngay truoc lnh lp, ta khng th c bt cu
mt lnh no nm giua nhn v lnh lp, ta m ta su hoat dng, cch su dung nhn cua
vng lp thng 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);
}
}
kt qua chay chuong trnh 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 TRNH HUNG DI TUNG
Lop l khi nim trong tm cua lp trnh huong di tuong, java l ngn ngu lp
trnh huong di tuong, mt chuong trnh java gm mt tp cc di tuong, cc di tuong
ny phi hop voi nhau d tao thnh mt ung dung hon chinh. Cc di tuong duoc m ta
qua khi nim lop, lop l su mo rng khi nim RECORD trong pascal, hay struct cua C,
ngoi cc thnh phn du liu, lop cn c cc hm ( phuong thuc, hnh vi ), ta c th xem
lop l mt kiu du liu, v vy nguoi ta cn goi lop l kiu du liu di tuong. Sau khi dinh
nghia lop ta c th tao ra cc di tuong ( bng cch khai bo bin ) cua lop vua tao, do vy
c th quan nim lop l tp hop cc di tuong cng kiu.
Trang 38
BI 1. [NH NGHA LP
I. Khai bo lp
1.1. Mt lp duc djnh ngha theo mu sau:
[pbulic][final][abstract] class <tn_lp>{
// khai bo cc thuc tnh
// khai bo cc phuong thc
}
sau du l v du don gian dinh nghia lop ngn xp:
Tng qut: mt lp duc khai bo dng sau:
[public][<abstract><final>][ class<Tn lop>
[extends <Tn lop cha>] [implements<Tn giao din>] {
<Cc thnh phn cua lop, bao gm: thuc tnh v phuong thuc>
}
Trong d:
1. Boi mc dinh mt lop chi c th su dung boi mt lop khc trong cng mt gi voi
lop d, nu mun gi khc c th su dung lop ny th lop ny phai duoc khai bo l lop
public.
2. abstract l b tu cho java bit dy l mt lop truu tuong, do vy ta khng th tao ra
mt th hin cua lop ny
3. final l b tu cho java bit dy l mt lop khng th k thua
Trang 39
4. class l tu kho cho chuong trnh bit ta dang khai bo mt lop, lop ny c tn l
NameOfClass
5. extends l tu kho cho java bit lop ny ny duoc k thua tu lop super
6. implements l tu kho cho java bit lop ny s trin khai giao din Interfaces, dy
l mt dang tuong tu nhu k thua bi cua java.
Ch :
a) Thuc tnh cua lop l mt bin c kiu du liu bt ky, n c th lai l mt bin c
kiu l chnh lop d
b) Khi khai bo cc thnh phn cua lop (thuc tnh v phuong thuc) c th dng mt
trong cc tu kho private, public, protected d giuo han su truy cp dn thnh phn d.
Ccc thnh phn private chi c th su dung duoc o bn trong lop, ta khng th truy
cp vo cc thnh phn privatetu bn ngoi lop
Cc thnh phn publicc th truy cp duoc ca bn trong lop ln bn ngoi lop.
Cc thnh phn protectedtuong tu nhu cc thnh phn private, nhung c th truy cp
duoc tu bt cu lop con no k thua tu n.
Nu mt thnh phn cua lop khi khai bo m khng su dung mt trong 3 b tu
protected, private, publicth su truy cp l ban b, tuc l thnh phn ny c th truy
cp duoc tu bt cu lop no trong cng gi voi lop d.
c) Cc thuc tnh nn d muc truy cp private d dam bao tnh du kn v lc d d
bn ngoi pham vi cua lop c th truy cp duoc dn thnh phn privateny ta phai tao
ra cc phuong thuc phuong thuc get v set.
d) Cc phuong thuc thuong khai bo l public, d chng c th truy cp tu bt cu du.
e) Trong mt tp chuong trnh (hay cn goi l mt don vi bin dich) chi c mt lop
duoc khai bo l public, v tn lop public ny phai trng voi tn cua tp k ca chu
hoa, chu thuong
1.2. Khai bo thuc tnh
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 trn ta c mt thuc tnh duoc dinh nghia nhu sau:
private Vector items;
Vic khai bo nhu trn duoc goi l khai bo thuc tnh hay cn goi l bin thnh vin lop
Tng qut vic khai bo mt thuc tnh duoc vit theo mu sau:
Trong d:
Trang 40
accessLevel c th l mot trong cc tu public, private, protected hoc c th bo trng,
nghia cua cc b tu ny duoc m ta o phn trn
- static l tu kho bo rng dy l mot thuoc tnh lop, n l mot thuoc tnh su dung
chung cho ca lop, n khng l cua ring mt di tuong no.
- transient v volatile chua duoc dng
- type l mot kiu d liu no d
name l tn cua thuoc tnh
Ch : Ta phai phn bit duoc vic khai bo nhu th no l khai bo thuc tnh, khai bo
th no l khai bo bin thng thuong? Cu tra loi l tt ca cc khai bo bn trong thn cua
mt lop v bn ngoi tt ca cc phuong thuc v hm tao th d l khai bo thuc tnh, khai
bo o nhung ch khc s cho ta bin.
1.3. Khai bo phuong thc
Trong lop Stack trn ta c phuong thuc push dng d dy mt di tuong vo dinh ngn
xp, n duoc dinh nghia nhu sau:
Cung ging nhu mt lop, mt phuong thuc cung gm c 2 phn: phn khai bo v phan
thn
- Phn khai bo gm c nhung phn sau( chi tit cua khai bo duoc m ta sau):
- Phn thn cua phuong thuc gm cc lnh d m ta hnh vi cua phuong thuc, cc hnh vi
ny duoc vit bng cc lnh cua java.
II. Chi tit v khai bo mt phuong thc
1. Tng qut mt phuong thc duc khai bo nhu sau:
accessLevel //m ta muc d truy cp dn phuong thuc
static //dy l phuong thuc lop
abstract //dy l phuong thuc khng c ci dt
final //phuong thuc ny khng th ghi d
native //phuong thuc ny duoc vit trong mt ngn ngu khc
synchronized //dy l phuong thuc dng b
returnType //gi tri tra v cua phuong thuc
MethodName //tn cua phuong thuc
throws
exception
//khai bo cc ngoai l c th duoc nem ra tu phuong
thuc
Trong d:
Trang 41
- accessLevel c th l mt trong cc tu kho public, private, protected hoc bo trng,
nghia cua cc b tu ny duoc m ta trong phn khai bo lop
- static l tu kho bo cho java bit dy l mt phuong thuc lop
- abstract tu kho cho bit dy l mt lop truu tuong, n khng c ci dt.
- final dy l tu kho bo cho java bit dy l phuong thuc khng th ghi d tu lop con
- native dy l tu kho bo cho java bit phuong thuc ny duoc vit bng mt ngn ngu
lp trnh no d khng phai l java ( thuong duoc vit bng C/C++)
- synchronized dy l mt phuong thuc dng b, n rt huu ch khi nhiu phuong thuc
cng truy cp dng thoi vo ti nguyn min gng
- returnType l mt kiu du liu, dy l kiu tra v cua phuong thuc, khi phuong thuc
khng tra v du liu th phai dng tu kho void
- MethodName l tn cua phuong thuc, tn cua phuong thuc duoc dt theo quy tc dt tn
cua java
- throws l tu kho dng d khai bo cc ngoai l c th duoc nm ra tu phuong thuc,
theo sau tu kho ny l danh sch cc ngoai l c th duoc phuong thuc ny nm ra
Ch :
1) Nu trong lop c t nht mt phuong thuc truu tuong th lop d phai l lop truu
tuong
2) khng c thuc tnh truu tuong
3) ta khng th tao di tuong cua lop truu tuong
4) khc voi ngn ngu C/C++, java bt buc ban phai khai bo gi tri tra v cho phuong
thuc, nu phuong thuc khng tra v du liu thi dng tu kho void (trong C/C++ khi ta
khng khai bo gi tri tra v th mc dinh gi tri tra v l int)
2. Nhn gi trj tra v t phuong thc
Ta khai bo kiu gi tri tra v tu lc ta khai bo phuong thuc, bn trong thn cua
phuong thuc ta phai su dung pht biu return value; d nhn v kt qua, nu hm duoc
khai bo kiu void th ta chi su dung pht biu return; mnh d return di khi cn duoc
dng d kt thc mt phuong thuc.
3. Truyn tham s cho phuong thc
Khi ta vit cc phuong thuc, mt s phuong thuc yu cu phai c mt s tham s,
cc tham s cua mt phuong thuc duoc khai bo trong loi khai bo phuong thuc, chng
phai duoc khai bo chi tit c bao nhiu tham s, mi tham s cn phai cung cp cho
chng mt ci tn v kiu du liu cua chng.
V du: ta c mt phuong thuc dng d tnh tng cua hai s, phuong thuc ny duoc khai
bo nhu sau:
public double tongHaiSo(double a, double b){
return (a + b);
}
1. Kiu tham s
Trong java ta c th truyn vo phuong thuc mt tham s c kiu bt ky, tu kiu du
liu nguyn thuy cho dn tham chiu di tuong.
2. Tn tham s
Khi ban khai bo mt tham s d truyn vo phuong thuc th ban phai cung cp cho
n mt ci tn, tn nay duoc su dung bn trong thn cua phuong thuc d tham chiu dn
tham s duoc truyn vo.
Trang 42
Ch : Tn cua tham s c th trng voi tn cua thuc tnh, khi d tn cua tham s s
che di tn cua phuong thuc, boi vy bn trong thn cua phuong thuc m c tham s c
tn trng voi tn cua thuc tnh, th khi nhc dn ci tn d c nghia l nhc dn tham s.
3. Truyn tham s theo trj
Khi goi mt phuong thuc m tham s cua phuong thuc c kiu nguyn thuy, th ban
sao gi tri cua tham s thuc su s duoc chuyn dn phuong thuc, dy l dc tnh truyn
theo tri ( pass- by value ), nghia l phuong thuc khng th thay di gi tri cua cc tham
s truyn vo.
Ta kim tra diu ny qua v du sau:
public class TestPassByValue {
public static void test(int t) {
t++;
System.out.println("Gia tri ca 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 ca t tru?c khi goi ham = " + t);
test(t);
System.out.println("Gia tri ca t truoc khi goi ham = " + t);
}
}
Ta s nhn duoc kt qua ra nhu sau:
Gia tri cua t truoc khi goi ham = 10
Gia tri cua t bn trong ham sau khi tang len 1 la 11
Gia tri cua t truoc khi goi ham = 10
4. Thn cua phuong thc
Trong v du sau thn cua phuong thuc isEmpty v phuong thuc pop duoc in dm v
c mu 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: Xy 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
Thng thuong bn trong thn cua mt phuong thuc ta c th tham chiu dn cc
thuc tnh cua di tuong d, tuy nhin trong mt s tnh hung dc bit nhu tn cua tham
s trng voi tn cua thuc tnh, lc d d chi cc thnh vin cua di tuong d ta dng tu
kho this, tu kho this dng d chi di tuong ny.
V du sau chi ra cho ta thy trong tnh hung ny bt buc phai dng tu kho this v tn
tham s cua phuong thuc tao dung lai trng voi tn cua thuc tnh
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 mt lop duoc k thua tu lop cha trong ca lop cha v lop con du c mt
phuong thuc trng tn nhau, th th lm th no c th goi phuong thuc trng tn d cua
lop cha, java cung cp cho ta tu kho super dng d chi doi tuong cua lop cha
Ta xt 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 trn ta thy trong lop cha c phuong thuc tn l aMethod trong lop con cung
c mt phuong thuc cng tn, ta cn thy ca hai lop ny cng c mt thuc tnh tn
aVariable d c th truy cp vo cc thnh vin cua lop cha ta phai dng tu kho super.
Ch : Ta khng th dng nhiu tu kho ny d chi lop ng, lop cu chng han vit nhu
sau l sai: super.super.add(1,4);
V. Su dng lp
Sau khi khao mt mt lop ta c th xem lop nhu l mt kiu du liu, nn ta c th
tao ra cc bin, mang cc di tuong, vic khai bo mt bin, mang cc di tuong cung
tuong tu nhu khai bo mt bin, mang cua kiu du liu nguyn thuy
Vic khai bo mt bin, mang duoc khai bo theo mu sau:
<Tn_Lp> < tn_bin>;
<Tn_Lp> <tn_mang>[kch thuc mang];
<Tn_Lp>[kch thuc mang] <tn_mang>;
V ban cht mi di tuong trong java l mt con tro toi mt vng nho, vng nho
ny chnh l vng nho dng d luu tru cc thuc tnh, vng nho dnh cho con tro ny th
duoc cp pht trn stack, cn vng nho dnh cho cc thuc tnh cua di tuong ny th
duoc cp pht trn heap.
VI. Diu khin vic truy cp dn cc thnh vin cua mt lp
Khi xy dung mt lop ta c th han ch su truy cp dn cc thnh vin cua lop, tu
mt di tuong khc.
Ta tm tt qua bang sau:
Tu kho Truy cp
trong
chnh lop
d
Truy cp
trong lop
con cng
gi
Truy cp
trong lop
con khc
gi
Truy cp trong
lop khc cng gi
Truy cp trong
lop khc khc gi
private X - - - -
protected X X X X -
public X X X X X
default X X - X -
Trong bang trn th X th hin cho su truy cp hop l cn th hin khng th truy cp
vo thnh phn ny.
1. Cc thnh phn private
Cc thnh vin private chi c th su dung bn trong lop, ta khng th truy cp cc
thnh vin private tu bn ngoi lop ny.
V d:
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;// khng hop l
a.privateMethod();// khng hop l
}
}
2. Cc thnh phn protected
Cc thnh vin protected s duoc thao lun trong chuong sau
3. Cc thnh phn public
Cc thnh vin public c th truy cp tu bt cu du, 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. Cc thnh phn c mc truy xut gi
Khi ta khai bo cc thnh vin m khng su dung mt trong cc tu public, private,
protected th java mc dinh thnh vin d c muc truy cp gi.
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
BI 2. KHI U V DQN DEP
I. Phuong thc to dng (constructor)
1. Cng dng
Phuong thuc tao dung l mt phuong thuc cua lop ( nhung kh dc bit ) thuong dng
d khoi tao mt di tuong moi. Thng thuong nguoi ta thuong su dung hm tao d khoi
gn gi tri cho cc thuc tnh cua di tuong v c th thuc hin mt s cng vic cn thit
khc nhm chun bi cho di tuong moi.
2. Cch vit hm to
a) dc dim cua phuong thc to dng
hm tao c tn trng voi tn cua lop
hm tao khng bao gio tra v kt qua
n duoc java goi tu dng khi mt di tuong cua lop duoc tao ra
hm tao c th c di s nhu cc phuong thuc thng thuong khc
trong mt lop c th c nhiu hm tao
b) V d
V d 1: su dung hm tao d in ra mn hnh xu 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 d 2: su dung hm tao c di
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 hm tao c di
}
}// /:~
3. Hm to mc djnh
Khi xy dung mt lop m khng xy dung hm tao th th java s cung cp cho ta
mt hm tao khng di mc dinh, hm tao ny thuc cht khng lm g ca, nu trong lop d
c t nht mt hm tao th hm tao mc dinh s khng duoc tao ra, khi ta tao ra mt di
tuong th s c mt hm tao no d duoc goi, nu trnh bin dich khng tm thy hm tao
tuong ung n s thng bo li, diu ny thuong xy ra khi chng ta khng xy dung hm
Trang 48
tao khng di nhung khi tao dung di tuong ta lai khng truyn vo 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();
// li v lp ny khng c hm tao khng di
TestPassByValue thu1 = new TestPassByValue("Hello World");
// khng vn d g
}
}
4. Gi hm to t hm to
Khi ban vit nhiu hm tao cho lop, c di lc ban mun goi mt hm tao ny tu
bn trong mt hm tao khc d trnh phai vit lp m. D c th goi dn hm tao ta su
dung tu kho this.
C php this(danh sch di s);
V du:
public class Test {
public Test ()
{
System.out.println("hm tao khng di");
}
public Test ( int i)
{
this();// goi dn hm tao khng di ca chnh lp ny
}
public static void main(String[] args) {
TestPassByValue thu=new TestPassByValue(10);
}
}
Ch :
a) bn trong cu tu ta chi c th goi duoc ti da mt cu tu, diu ny c nghia l ta khng
th goi duoc tu 2 cu tu tro ln bn trong mt cu tu khc 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();// khng th goi hai hm tao tr ln bn trong mt hm 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 mt hm tao bn trong mt hm tao khc th loi goi hm tao phai l lnh du
tin trong thn phuong thuc, nn v du sau s bi bo li
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 dn cu t phi l lnh du tin
}
public static void main(String[] args) {
Test thu = new Test ("Hello World);
}
}
nu cho dich v du trn trnh bin dich s phn nn
"Test.java": call to this must be first statement in constructor at line 7, column 9
II. Khi khoi du v danh v khi khoi du tinh
1. Khi v danh
Trong java ta c th dt mt khi lnh khng thuc mt phuong thuc no, nghia l
khi ny khng thuc bt cu phuong thuc no k ca hm tao. khi d khi lnh ny duoc
goi l khi v danh, khi v danh ny duoc java goi thuc thi khi mt di tuong duoc tao
ra, cc khi v danh duoc goi truoc ca hm tao, thng thuong ta hay su dung khi v danh
d khoi du cc thuc tnh cua lop hoc duoc su dung d khoi tao cho cc thc tnh cua
mt lop v danh(v lop v danh khng c tn do vy ta khng th vit hm tao cho lop
ny, trong truong hop ny khi v danh l giai php duy nht )
V d: o v du ny ta c 3 khi v danh, khi chay java cho thuc thi cc khi v danh ny
theo thu tu tu trn xung duoi
public class Untitled1{
// hm tao
public Untitled1 (){
System.out.println ( "Day la ham tao" );
}
// bt du khi v danh
{
System.out.println ( "khoi khoi dau thu 3 ");
}// kt thc khi v danh
//bt du khi v danh
{
System.out.println ( "khoi khoi dau thu 1 ");
}//kt thc khi v danh
// bt du khi v danh
{
Trang 50
System.out.println ( "khoi khoi dau thu 2 ");
}//kt thc khi v danh
public static void main ( String[] args )
{
Untitled1 dt1 = new Untitled1 ();
Untitled1 dt2 = new Untitled1 ();
}
}
khi chay chuong trnh s cho kt 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. Khi khoi du tnh
Khi khoi du tinh l mt khi lnh bn ngoi tt ca cc phuong thuc, k ca hm
tao, truoc khi lnh ny ta dt tu kho static, tu kho ny bo cho java bit dy l khi
khoi du tinh, khi ny chi duoc goi 1 ln khi di tuong du tin cua lop ny duoc tao ra,
khi khoi du tinh ny cung duoc java goi tu dng truoc bt cu hm tao no, thng thuong
ta su dung khi khoi du tinh d khoi du cc thuc tnh tinh ( static ), sau dy l mt v
du c 1 khi khoi du tinh v mt khi v danh, d ban thy duoc su khc nhau giua khi
khoi du tinh v khi v danh
public class Untitled1
{
public Untitled1 ()
{
System.out.println ( "y l hm tao" );
}
static {// dy l khi khi du tnh
System.out.println ( "y l khi khi du tnh");
System.out.println("Khi ny chi duoc goi 1 ln khi th hin du tin ca lp duoc
tao ra");
}
{//dy l khi v danh
System.out.println ( "y l khi v danh ");
}
public static void main ( String[] args )
{
Untitled1 dt1 = new Untitled1 ();/ / tao ra th hin th nht ca lp
Untitled1 dt2 = new Untitled1 ();/ / tao tip th hin thu 2 ca lp
}
}
khi cho chay chuong trnh ta s duoc kt qua ra nhu sau:
Dy l khi khoi du tinh
Khi ny chi duoc goi 1 ln khi th hin du tin cua lop duoc tao ra
Trang 51
Dy l khi v danh
Dy l hm tao
Dy l khi v danh
Dy l hm tao
Nhn vo kt qua ra ta thy khi khoi du tinh chi duoc java goi thuc hin 1 ln khi di
tuong du tin cua lop ny duoc tao, cn khi v danh duoc goi mi khi mt di tuong
moi duoc tao ra
III. Dn dp: kt thc v thu rc
1. Phuong thc finalize
Java khng c phuong thuc huy bo. Phuong thuc finalize tuong tu nhu phuong
thuc huy bo cua C++, tuy nhin n khng phai l phuong thuc huy bo. So di n khng
phai l phuong thuc huy bo v khi di tuong duoc huy bo th phuong thuc ny chua chc
d duoc goi dn. Phuong thuc ny duoc goi dn chi khi b thu rc cua Java duoc khoi
dng v lc d di tuong khng cn duoc su dung nua. Do vy phuong thuc finalize c
th khng duoc goi dn.
2. Co ch gom rc cua java
Nguoi lp trnh C++ thuong su dung ton tu new d cp pht dng mt di tuong,
nhung lai thuong qun goi ton tu delete d giai phng vng nho ny khi khng cn dng
dn nua, diu ny lm r ri b nho di khi dn dn chuong trnh phai kt thc mt cch
bt thuong, qua tht du l mt diu ti t. Trong java ta khng cn quan tm dn diu d,
java c mt co ch thu rc tu dng, n du thng minh d bit di tuong tuong no khng
dng nua, ri n tu dng thu hi vng nho dnh cho di tuong d.
Trong ngn ngu C++ khi mt di tuong bi ph huy, s c mt hm duoc goi tu
dng, hm ny duoc goi l huy tu hay cn goi l hm huy, thng thuong hm hm huy
mc dinh l du l du d don dep, tuy nhin trong mt s truong hop th hm huy mc dinh
lai khng th dp ung duoc, do vy nguoi lp trnh C++, phai vit ra hm huy ring d lm
vic d, tuy nhin java lai khng c khi nim hm huy hay mt ci g d tuong tu.
Trang 52
BI 3. CC THNH PHN TNH
I. Thuc tnh tinh
Thuc tnh duoc khai bo voi tu kho static goi l thuc tnh tinh
V du:
class Static{
static int i = 10;// Dy l thuc tnh tinh
int j = 10;// Dy l thuc tnh thuong

}
+ Cc thuc tnh tinh duoc cp pht mt vng b nho c dinh, trong java b nho dnh cho
cc thuc tnh tinh chi duoc cp pht khi ln du tin ta truy cp dn n.
+ Thnh phn tinh l chung cua ca lop, n khng l cua ring mt di tuong no ca.
+ D truy xut dn thuc tnh tinh ta c th dng mt trong 2 cch sau:
tn_lop.tn_thuc_tnh_tinh;
tn_di_tuong.tn_thuc_tnh_tinh;
ca 2 cch truy xut trn du c tc dung nhu nhau
+ khoi gn gi tri cho thuc tnh tinh
thnh phn tinh duoc khoi gn bng mt trong 2 cch sau:
Su dung khi khoi du tinh (xem lai bi truoc )
Su dung khoi du truc tip khi khai bo nhu v du trn
Ch : Ta khng th su dung hm tao d khoi dau cc thuoc tnh tinh, boi v hm tao
khng phai l phuong thuc tinh.
II. Phuong thc tinh
Mt phuong thuc duoc khai bo l static duoc goi l phuong thuc tinh
V du:
class Static{
static int i;// Dy l thuc tnh tinh
// phuong thuc tinh
static void println (){
System.out.println ( i );
}
}
+ Phuong thuc tinh l chung cho ca lop, n khng l thuc vo mt di tuong cu th no
+ Loi goi phuong thuc tinh xut pht tu:
tn cua lop: tn_lop.tn_phuong_thuc_tinh(tham s);
tn cua di tuong: tn_di_tuong. tn_phuong_thuc_tinh(tham s);
+ V phuong thuc tinh l dc lp voi di tuong do vy o bn trong phuong thuc tinh ta
khng th truy cp cc thnh vin khng tinh cua lop d, tuc l bn trong phuong thuc
tinh ta chi c th truy cp dn cc thnh vin tinh m thi.
+ Ta khng th su dung tu kho this bn trong phuong thuc tinh
Trang 53
BI 4. NAP CHNG PHUONG THC
I. Khi nim v phuong thc bi tai
Java cho php ta xy dung nhiu phuong thuc trng tn nhau, trong cng mt lop, hin
tuong cc phuong thuc trong mt lop c tn ging nhau duoc goi l bi tai phuong thuc.
II. Yu cu cua cc phuong thc bi tai
Do su dung chung mt ci tn cho nhiu phuong thuc, nn ta phai cho java bit cn
phai goi phuong thuc no d thuc hin, java dua vo su khc nhau v s luong di cung
nhu kiu du liu cua cc di ny d phn bit cc phuong thuc trng tn 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) Nu nu java khng tm thy mt hm bi tai thch hop th n s dua ra mt thng
bo li
2) Ta khng th su dung gi tri tra v cua hm d phn bit su khc nhau giua 2
phuong thuc bi tai
3) Khng nn qu lam dung cc phuong thuc bi tai v trnh bin dich phai mt thoi
gian phn don d tm ra hm thch hop, diu ny di khi cn dn dn sai st
4) Khi goi cc hm nap chng ta nn c lnh chuyn kiu tuong minh d trnh bin
dich tm ra hm ph hop mt cch nhanh nht
5) Trong java khng th dinh nghia chng ton tu nhu trong ngn ngu C++, c th
dy l mt khuyt dim, nhung nhung nguoi thit k java cho rng diu ny l
khng cn thit, v n qu phuc tap.
Trang 54
BI 5. K THA (INHERITANCE)
I. Lp co so v lp dn xut
- Mt lop duoc xy dung thng qua k thua tu mt lop khc goi l lop dn xut (hay cn
goi l lop con, lop hu du ), lop dng d xy dung lop dn xut duoc goi l lop co so (
hay cn goi l lop cha, hoc lop t tin )
Mt lop dn xut ngoi cc thnh phn cua ring n, n cn duoc k thua tt ca cc
thnh phn cua lop cha
II. Cch xy dng lp dn xut
D ni lop b l dn xut cua lop a ta dng tu kho extends, c php nhu sau:
class b extends a
{
// phn thn cua lop b
}
III. Tha k cc thuc tnh
Thc tnh cua lop co so duoc thua k trong lop dn xut, nhu vy tp thuc tnh cua lop
dn xut s gm: cc thuc tnh khai bo trong lop dn xut v cc thuc tnh cua lop co
so, tuy nhin trong lop dn xut ta khng th truy cp vo cc thnh phn private, package
cua lop co so
IV. Tha k phuong thc
Lop dn xut k thua tt ca cc phuong thuc cua lop co so tru:
Phuong thuc tao dung
Phuong thuc finalize
V. Khoi du lp co so
Lop dn xut k thua moi thnh phn cua lop co, diu ny dn ta dn mt hnh
dung, l lop dn xut c cng giao din voi lop co so v c th c cc thnh phn moi b
sung thm. nhung thuc t khng phai vy, k thua khng chi l sao chp giao din cua lop
cua lop co so. Khi ta tao ra mt di tuong cua lop suy dn, th n chua bn trong n mt
su vt con cua lop co so, su vt con ny nhu th ta d tao ra mt su vt tuong minh cua
lop co so, th th lop co so phai duoc bao dam khoi du dng, d thuc hin diu d trong
java ta lm nhu sau:
Thuc hin khoi dau cho lop co so bng cch goi cau tu cua lop co so bn trong cau tu cua
lop dan xuat, nu ban khng lm diu ny th java se lm gip ban, nghia l java lun tu
dong thm loi goi cau tu cua lop co so vo cau tu cua lop dan xuat nu nhu ta qun lm
diu d, d c th goi cau tu cua lop co so ta su dung tu kho super
V du 1: v du ny khng goi cu tu cua lop co so mt cch tuong minh
class B
{
public B ()
{ System.out.println ( "Ham tao ca lop co so" );}
}
public class A extends B
{ public A () {// khng goi hm tao ca lp co s tung minh
System.out.println ( "Ham tao ca lop dan xuat" );
}
Trang 55
public static void main ( String arg[] )
{
A thu = new A ();
}
}
Kt qua chay chuong trnh nhu sau:
Ham tao cua lop co so
Ham tao cua lop dan xuat
V d 2: v du ny su dung tu kho super d goi cu tu cua lop co so mt cch tuong minh
class B
{ public B ()
{ System.out.println ( "Ham tao ca lop co so" ); }
}
public class A extends B
{ public A ()
{ super();// goi tao ca lp co s mt cch tung minh
System.out.println ( "Ham tao ca lop dan xuat" );
}
public static void main ( String arg[] )
{
A thu = new A ();
}
}
khi chay chung trnh ta thy kt qua ging ht nhu v du trn
Ch 1: Nu goi tuong minh cu tu cua lop co so, th loi goi ny phai l lnh du tin,
nu v du trn di thnh
class B
{ public B ()
{System.out.println ( "Ham tao ca lop co so" );}
}
public class A extends B
{public A () {// Li goi cu t ca lp co s khng phi l lnh du tin
System.out.println ("Ham tao ca lop dan xuat");
super ();
}
public static void main ( String arg[] )
{
A thu = new A ();
}
}
Nu bin dich doan m ny ta s nhn duoc mt thng bo li 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 dn mt hm tao cua lop co so bn trong hm tao cua lop dn
xut, v du chi ra sau d bi bo li
class B
{ public B (){System.out.println ( "Ham tao ca lop co so" );}
public B ( int i )
{System.out.println ( "Ham tao ca lop co so" );}
Trang 56
}
public class A extends B
{ public A ()
{super ();
super ( 10 );/ / khng th goi nhiu hon 1 hm tao ca lp co s
System.out.println ( "Ham tao ca lop dan xuat" );
}
public static void main ( String arg[] )
{
A thu = new A ();
}
}
1. Trt t khoi du
Trt tu khoi du trong java duoc thuc hin theo nguyn tc sau: java s goi cu tu
cua lop co so truoc sau d moi dn cu tu cua lop suy dn, diu ny c nghia l trong cy
pha h th cc cu tu s duoc goi theo trt tu tu gc xung dn dn l
2. Trt t dn dp
Mc d java khng c khi nim huy tu nhu cua C++, tuy nhin b thu rc cua java
vn hoat dng theo nguyn tc lm vic cua cu tu C++, tuc l trt tu thu rc th nguoc lai
so voi trt tu khoi du.
VI. Ghi d phuong thc ( Override )
Hin tuong trong lop co so v lop dn xut c hai phuong thuc ging ht nhau ( ca
tn ln b tham s) goi l ghi d phuong thuc ( Override ), ch Override khc Overload.
Gi phuong thc bj ghi d cua lp co so
Bn trong lop dn xut, nu c hin 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 dng tu kho super d truy
cp dn lop cha, c php sau:
super.overriddenMethodName();
Ch : Nu mt phuong thuc cua lop co so bi bi tai ( Overload ), th n khng th bi ghi
d ( Override ) o lop dn xut.
VI. Thnh phn protected
Trong mt vi bi truoc ta d lm quen voi cc thnh phn private, public, sau khi
d hoc v k thua th tu kho protected cui cng d c nghia.
Tu kho protected bo cho java bit dy l thnh phn ring tu di voi bn ngoi nhung lai
sn sng voi cc con chu
VII. T kho final
Tu kho final trong java c nhiu nghia khc nhau, nghia cua n tuy thuc vo ngu
canh cu th, nhung ni chung n mun ni ci ny khng th thay di duoc.
1. Thuc tnh final
Trong java cch duy nht d tao ra mt hng l khai bo thuc tnh l final
V du:
public class A
{ // djnh ngha hng tn MAX_VALUE gi trj 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 bo mt thuc tnh l final th thuc tnh ny la hng, do vy ta khng th
thay di gi tri cua n
2) Khi khai bo mt thuc tnh l final th ta phai cung cp gi tri ban du cho n
3) Nu mt thuc tnh vua l final vua l static th n chi c mt vng nho chung duy
nht cho ca lop
2. Di s final
Java cho php ta tao ra cc di final bng vic khai bo chng nhu vy bn trong
danh sch di, nghia l bn trong thn cua phuong php ny, bt cu c gng no d thay
di gi tri cua di du gy ra li lc dich
V du sau bi bo li lc dich v n c gng thay di gi tri cua di final
public class A
{ static public void thu ( final int i )
{ i=i+1;//khng cho php thay di gi trj ca tham s final
System.out.println ( i );;
}
public static void main ( String arg[] )
{ int i = 100;
thu ( i );
}
}
chuong trnh ny s bi bo li:
"A.java": variable i might already have been assigned to at line 5, column 9
3. Phuong thc final
Mt phuong thuc bnh thuong c th bi ghi d o lop dn xut, di khi ta khng
mun phuong thuc cua ta bi ghi d o lop dn xut v l do g d, muc dch chu yu cua
cc phuong thuc final l trnh ghi d, tuy nhin ta thy rng cc phuong thuc private
s tu dng l final v chng khng th thy duoc trong lop dn xut ln chng khng
th bi ghi d, nn cho d ban c cho mt phuong thuc private l final th ban cung cha
thy mt hiu ung no
4. Lp final
Nu ban khng mun nguoi khc k thua tu lop cua ban, th ban hy dng tu kho
final d ngn can bt cu ai mun k thua tu lop ny.
Ch : Do mt lop l final (tuc khng th k thua )do vy ta khng th no ghi d cc
phuong thuc cua lop ny, do vy dung c gng cho mt phuong thuc cua lop final l
final
V d v tnh k tha
1. Xy dng lp 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. Xy dng lpdn xut
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
BI 6. LP CO S TRU TUQNG
Mt lop co so truu tuong l mt lop chi duoc dng lm co so cho cc lop khc, ta
khng th tao ra th hin cua lop ny, boi v n duoc dng d dinh nghia mt giao din
chung cho cc lop khc.
Phuong thc tru tung
Mt lop truu tuong c th chua mt vi phuong thuc truu tuong, do lop truu tuong
chi lm lop co so cho cc lop khc, do vy cc phuong thuc truu tuong cung khng duoc
ci dt cu th, chng chi gm c khai bo, vic ci dt cu th s dnh cho lop con
Ch :
1. Nu trong lop c phuong thuc truu tuong th lop d phai duoc khai bo l truu tuong
2. Nu mt lop k thua tu lop truu tuong th: hoc chng phai ghi d tt ca cc phuong
thuc ao cua lop cha, hoc lop d phai l lop truu tuong
3. Khng th tao ra di tuong cua lop truu tuong
Trang 62
BI 7. A HNH THI
Da hnh thi trong lp trnh huong di tuong d cp dn kha nng quyt dinh trong
lc thi hnh (runtime) m no s duoc chay, khi c nhiu phuong thuc trng tn nhau
nhung o cc lop c cp bc khc nhau.
Ch : Kha nng da hnh thi trong lp trnh huong di tuong cn duoc goi voi nhiu ci
tn khc nhau nhu: tuong ung bi, kt ghp dng,..
Da hnh thi cho php cc vn d khc nhau, cc di tuong khc nhau, cc phuong thuc
khc nhau, cc cch giai quyt khc nhau theo cng mt luoc d chung.
Cc buoc d tao da hnh thi:
1) Xy dung lop co so (thuong l lop co so truu tuong, hoc l mt giao din), lop
ny s duoc cc lop con mo rng( di voi lop thuong, hoc lop truu tuong), hoc trin
khai chi tit ( di voi giao din ).
2) Xy dung cc lop dn xut tu lop co so vua tao. trong lop dn xut ny ta s ghi d
cc phuong thuc cua lop co so( di voi lop co so thuong), hoc trin khai chi tit n (
di voi lop co so truu tuong hoc giao din).
3) Thuc hin vic tao khun xung, thng qua lop co so, d thuc hin hnh vi da hnh
thi
Khi nim v tao khun ln, tao khun xung
Hin tuong mt di tuong cua lop cha tham tro dn mt di tuong cua lop con th duoc
goi l tao khun xung, vic tao khun xung lun duoc java chp thun, do vy khi
tao khun xung ta khng cn phai p kiu tuong minh.
Hin tuong mt di tuong cua lop con tham tro toi mt di tuong cua lop cha th duoc
goi l tao khun ln, vic tao khun ln l an ton, v mt di tuong cua lop con cung
c dy du cc thnh phn cua lop cha, tuy nhin vic tao khun ln s bi bo li nu
nhu ta khng p kiu mt cch tuong minh.
Trang 63
BI 8. GIAO DIEN, LP TRONG, GI
Giao din l mt khi nim duoc java dua ra voi 2 muc dch chnh:
D tao ra mt lop co so thun ao, mt lop khng c bt cu hm no duoc ci dt
Thuc hin hnh vi tuong tu nhu k thua bi, boi trong java khng c khi nim k thua
bi, nhu cua C++
Lop trong cho ta mt cch thuc tinh vi d che giu m mt cch ti da, trong java ta c th
dinh nghia mt lop bn trong mt lop khc, thm ch ta cn c th tao lop trong, bn trong
thn cua mt phuong thuc, diu ny cho php ta c th tao ra cc lop cuc b, chi duoc su
dung ni b bn trong mt don vi d. Ta khng th tao ra mt lop trong, trong ngn ngu
C++
I. Giao din
Tu kho interface d dua khi nim abstract di xa thm mt buoc nua. Ta c th
nghi n nhu l mt lop abstract thun tu, n cho php ta tao ra mt lop thun ao, lop
ny chi gm tp cc giao din cho cc lop mun dn xut tu n, mt interface cung c th
c cc truong, tuy nhin java tu dng lm cc truong ny thnh static v final
D tao ra mt interface, ta dng tu kho interface thay v tu kho class. Mt
interface gm c 2 phn: phn khai bo v phn thn, phn khai bo cho bit mt s thng
tin nhu: tn cua interface, n c k thua tu mt giao din khc hay khng. Phn thn chua
cc khai bo hng, khai bo phuong thuc ( nhung khng c ci dt). Ging nhu mt lop ta
cung c th thm b tu public vo truoc dinh nghia cua interface. Sau dy l hnh anh cua
mt interface.
Nhung do java tu dng lm cc truong thnh final nn ta khng cn thm b tu
ny, do vy ta c th dinh nghia lai giao din nhu sau:
Nhung do java tu dng lm cc truong thnh final nn ta khng cn thm b tu ny
public interface StockWatcher
{
final String
sunTicker = "SUNW";
final String oracleTicker = "ORCL";
final String ciscoTicker = "CSCO";
void valueChanged(String tickerSymbol, double newValue);
}
Trang 64
1. Phn khai bo cua giao din
Tng qut phn khai bo cua mt giao din c cu trc tng qut nhu sau:
Public //giao din ny l cng cng
interface InterfaceName //tn cua giao din
Extends SuperInterface //giao din ny l mo rng cua 1 giao din
khc
{
InterfaceBody
}
//thn cua giao din
Trong cu trc trn c 2 phn bt buc phai c d l phn interface v InterfaceName, cc
phan khc l tuv chon.
2. Phn thn
Phn thn khai bo cc cc hng, cc phuong thuc rng ( khng c ci dt ), cc phuong
thuc ny phai kt thc voi du chm phy ;, boi v chng khng c phn ci dt
Ch :
1. Tt ca cc thnh phn cua mt giao din tu dng l public do vy ta khng cn phai
cho b tu ny vo.
2. Java yu cu tt ca cc thnh phn cua giao din phai l public, nu ta thm cc b tu
khc nhu private, protected truoc cc khai bo th ta s nhn duoc mt li lc dich
3. Tt ca cc truong tu dng l final v static, nn ta khng cn phai cho b tu ny vo.
3. Trin khai giao din
Boi mt giao din chi gm cc m ta chng khng c phn ci dt, cc giao din duoc
dinh nghia d cho cc lop dn xut trin khai, do vy cc lop dn xut tu lop ny phai trin
khai dy du tt ca cc khai bo bn trong giao din, d trin khai mt giao din ban bao
gm tu kho implements vo phn khai bo lop, lop cua ban c th trin khai mt hoc
nhiu giao din ( hnh thuc ny tuong tu nhu k thua bi cua C++)
V d 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 d 2
public interface MyInterface{
public void add(int x, int y);
public void volume(int x, int y, int z);
Trang 65
} //Hoc
interface Interface_Const{
public static final double price = 100.0;
public static final int counter = 5;
}
+ Su dung Interface trn
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 :
+ Nu mt lop trin khai nhiu giao din th cc giao din ny duoc lit k cch nhau boi
du phy ,
+ Lop trin khai giao din phai thuc thi tt ca cc phuong thuc duoc khai bo trong giao
din, nu nhu lop d khng trin khai, hoc trin khai khng ht th n phai duoc khai bo
l abstract
+ Do giao din cung l mt lop truu tuong do vy ta khng th tao th hin cua giao din
+ Mt lop c th trin khai nhiu giao din, do vy ta c loi dung diu ny d thuc hin
hnh vi k thua bi, vn khng duoc java h tro
+ Mt giao din c th mo rng mt giao din khc, bng hnh thuc k thua
II. Lp trong
C th dt mt dinh nghia lop ny vo bn trong mt lop khc. diu ny duoc goi l
lop trong. Lop trong l mt tnh nng c gi tri v n cho php ban gp nhm cc lop v
mt logic thuc v nhau v d kim sot tnh thy duoc cua cc lop ny bn trong lop
khc. Tuy nhin ban phai hiu rng lop trong khng phai l l hop thnh
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 rt huu hiu khi ban ban mun tao ra cc lop diu hop ( duoc bn k khi ni v
thit k giao din nguoi dng )
Trang 67
Bi 9. MNG, XU K TU, TAP HQP
I. Mang
1. Mang 1 chiu
a) Khai bo
C php khai bo:
- KDL tn_mang[];//Khai bo mt con tro mang
- KDL []tn_mang;//nhu trn
- KDL tn_mang[] =new KDL[spt];//Tao ra mt mang c spt phn tu
Trong c php trn th:
KDL l mt kiu du liu bt ky nhu: kiu nguyn thuy, kiu di tuong n xc dinh
kiu du liu cua tung phn tu cua mang.
Spt l s phn tu cua mang.
Ch :
Mang trong Java l mt di tuong
Cung nhu cc di tuong khc, mang phai duoc tao ra bng ton tu new nhu sau:
Tn_mang=new KDL[spt];
Khi mang duoc tao ra th mi phn tu cua mang s nhn mt gi tri mc dinh, quy tc
khoi tao gi tri cho cc phn tu cua mang cung chnh l quy tc khoi du gi tri cho cc
thuc tnh cua di tuong, tuc l mi phn tu cua mang s nhn gi tri:
+ 0 nu KDL l kiu s
+ \0 nu KDL l k tu
+ false nu KDL l boolean
+ null nu KDL l mt lop no d.
V d 1: Khai bo mt mang s nguyn gm 100 phn tu
Cch 1:
int mangInt[]; //Khai bo mt con tro dn mang cc s nguyn
mangInt=new int[100]; //Tao ra mang
Cch 2:
int mangInt[]=new int[100];
V d 2: Gia su ta c lop SinhVien d duoc dinh nghia, hy khai bo mt mang gm 100
di tuong cua lop SinhVien
SinhVien arraySinhVien[]=new SinhVien[100];
Ch : Lc ny mi phn tu cua mang arraySinhVien l mt con tro cua lop SinhVien v
hin gio mi phn tu cua mang dang tro dn gi tri null. D khoi tao tung phn tu cua
mang ta phai lm nhu sau:
arraySinhVien[0]=new SinhVien(sv01, Nguyn Vn An, Hung Yn);
arraySinhVien[1]=new SinhVien(sv02, Nguyn Thi Bnh, Bc Giang);
.
arraySinhVien[99]=new SinhVien(sv100, Do Thi Mn, H Nam);
Ngoi cch khai bo trn Java cn cho php ta kt hop ca khai bo v khoi gn cc
phn tu cua mang theo cch sau:
int[] mangInt = {1, 3, 5, 7, 9};
Tao ra mt mang gm 5 phn tu, cc phn tu cua mang ln luot duoc gn cc gi tri l: 1,
3, 5, 7, 9
Trang 68
SinhVien[] mangSinhVien = {
new SinhVien(sv01, Nguyn Vn A, HY),
new SinhVien(sv02, Nguyn Thi B, HN),
new SinhVien(sv03, D Thi Q, BG),
null
};
Khai bo mt mang gm 4 phn tu, gi tri cua cc phn tu ln luot duoc khoi gn nhu sau:
mangSinhVien [0]=new SinhVien(sv01, Nguyn Vn A, HY)
mangSinhVien [1]=new SinhVien(sv02, Nguyn Thi B, HN)
mangSinhVien [2]=new SinhVien(sv03, D Thi Q, BG)
mangSinhVien [3]=null
b) Truy xt dn cc phn tu cua mang mt chiu
D truy xut dn phn tu thu ind cua mang ta su dung c php nhu sau:
Tn_mang[ind-1]
Ch : Phn tu du tin cua mang c chi s l 0.
V du:
int a[]=new int [3]; //Khai bo v tao ra mang gm 3 phn tu
Lc ny cc phn tu cua mang ln luot duoc truy xut nhu sau:
- Phn tu du tin cua mang l a[0]
- Phn tu thu 2 cua mang l a[1]
- Phn tu thu 3 dng thoi l phn tu cui cng cua mang l a[2]
c) Ly v s phn tu hin ti cua mang
Mang trong Java l mt di tuong, do vy n cung c cc thuc tnh v cc phuong
thuc nhu cc di tuong khc. D ly v s phn tu cua mang ta su dung thuc tnh length
nhu sau:
Tn_mang.length
V d 1: Nhp vo mt mang v in ra mn hnh
import com.theht.Keyboard;
class ArrayDemo{
public static void main(String[] args) {
//Nhp s phn t ca mng
System.out.print("Nhp s phn t ca mng:");
int n=Keyboard.readInt();
//Khai bo mng vi s phn t bng n
int a[]=new int[n];
//Nhp d liu cho mng
for(int i=0;i<a.length;i++){
System.out.print("a[" + i + "]=");
a[i]=Keyboard.readInt();
}
//In mng ra mn hnh
System.out.println("Mng va nhp l");
for (int i = 0; i < a.length; i++)
System.out.print(a[i] + " ");
}
}
Trang 69
V d 2: Nhp vo mt mang s thuc sau d kim tra xem mang c phai l mt dy tng
hay khng?
import com.theht.Keyboard;
class ArrayDemo2{
public static void main(String[] args) {
//Nhp s phn t ca mng
System.out.print("Nhp s phn t ca mng:");
int n=Keyboard.readInt();
//Khai bo mng vi s phn t bng n
int a[]=new int[n];
//Nhp d liu cho mng
for(int i=0;i<a.length;i++){
System.out.print("a[" + i + "]=");
a[i]=Keyboard.readInt();
}
//Kim tra dy tng
boolean kt=true;
for (int i = 0; i < a.length-1; i++)
if(a[i+1]-a[i]<0){
kt=false;//thay di trang thi c
break;//Thot khi vng lp
}
if(kt)
System.out.println("Dy tng dn");
else
System.out.println("Dy khng phi tng dn");
}
}
2. Mang nhiu chiu
a) Khai bo
Khai bo mang N chiu trong Java duoc tin hnh nhu sau:
hoc
Trong d:
KDL l mt kiu du liu bt ky: nguyn thuy hoc lop
sp1, sp2, , sptN ln luot l s phn tu trn chiu thu 1, 2, .., N
V du:
- Khai bo mt con tro cua mang 2 chiu
int[][] a ; hoc int a[][];
Khai bo v tao ra mang 2 chiu:
int[][] a = new int[2][3]; // Ma trn gm 2 hng, 3 ct
KDL [][][] tn_mang;
N ln
KDL tn_ mng [ ] [ ] [ ] ;
N ln
KDL tn_mang [][][] =new KDL[spt1][spt2][sptN];
N ln
Trang 70
- Khai bo v khoi gn gi tri cho cc phn tu cua mang 2 chiu:
int a[][]={
{1, 2, 5}. //Cc phn tu trn hng thu nht
{2, 4, 7, 9}. //Cc phn tu trn hng thu hai
{1, 7}. //Cc phn tu trn hng thu ba
}
Khai bo trn s tao ra mt mang hai chiu gm: 3 hng, nhung trn mi hng lai
c s phn tu khc nhau, cu th l: trn hng thu nht c 3 phn tu, hang 2 gm 4 phn tu
v hng thu 3 gm 2 phn tu.
Ch : Voi khai bo trn nu ta lit k cc phn tu cua mang theo trnh tu tu tri qua phai
v tu trn xung duoi th cc phn tu ln 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 xut dn phn tu mang nhiu chiu
tn_mang[ind1][ind2]
V du 1: Nhp vo mt ma trn v in ra mn hnh
import com.theht.Keyboard;
class MaTram {
public static void main(String[] args) {
//Nhp s hng v s ct
System.out.print("Nhp s hng:");
int sh = Keyboard.readInt();
System.out.print("Nhp s ct:");
int sc = Keyboard.readInt();
//Khai bo mng hai chiu gm sh hng v sc ct
float a[][] = new float[sh][sc];
//Nhp d liu cho mng hai chiu
for (int i = 0; i < a.length; i++)
for (int j = 0; j < a[i].length; j++) {
System.out.print("a[" + i + "," + j + "]=");
//Nhp liu cho phn t hng i, ct j
a[i][j] = Keyboard.readFloat();
}
//In mng hai chiu ra mn hnh
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: Nhp vo ma trn vung sau d tnh tng cc phn tu trn duong cho chnh.
II. Xu k t
Vic xu l cc xu k tu trong Java duoc h tro boi hai lop String v StringBuffer.
Lop String dng cho nhng xu k tu bat bin, nghia l nhung xu chi doc v sau khi
duoc khoi tao gi tri th ni dung bn trong xu khng th thay di duoc. Lop
StringBuffer duoc su dung di voi nhung xu k tu dng, tuc l c th thay di duoc ni
dung bn trong cua xu.
Trang 71
1. Lp String
Chui l mt dy cc k tu. Lop String cung cp cc phuong thuc d thao tc voi
cc chui. N cung cp cc phuong thuc khoi tao (constructor) khc nhau:
String str1 = new String( );
//str1 chua mt chui rng.
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- tnh tu k tu bt du, 2- l s luong k tu k tu k tu bt du.
Ton tu + duoc su dung d cng chui khc vo chui dang tn tai. Ton tu +
ny duoc goi nhu l ni chui. O dy, ni chui duoc thuc hin thng qua lop
StringBuffer. Chng ta s thao lun v lop ny trong phn sau. Phuong thuc concat( )
cua lop String cung c th thuc hin vic ni chui. Khng ging nhu ton tu +, phuong
thuc ny khng thuong xuyn ni hai chui tai vi tr cui cng cua chui du tin. Thay
vo d, phuong thuc ny tra v mt chui moi, chui moi d s chua gi tri cua ca hai.
Diu ny c th duoc gn cho chui dang tn tai. V du:
String strFirst, strSecond, strFinal;
StrFirst = Charlie;
StrSecond = Chaplin;
//.bng cch su dung phuong thuc concat( ) d gn voi mt chui dang tn tai.
StrFinal = strFirst.concat(strSecond);
Phuong thuc concat( ) chi lm vic voi hai chui tai mt thoi dim.
Cc phuong thc cua lp String
Trong phn ny, chng ta s xem xt cc phuong thuc cua lop String.
- char charAt(int index ) Phuong thuc ny tra v mot k tu tai vi tr index trong chuoi.
V du:
String name = newString(Java Language);
char ch = name.charAt(5);
Bin ch chua gi tri L, tu d vi tr cc s bt du tu 0.
- boolean startsWith(String s ) Phuong thuc ny tra v gi tri kiu logic (Boolean), phu
thuoc vo chuoi c bt dau voi mot chuoi con cu th no d khng.
V du:
String strname = Java Language;
boolean flag = strname.startsWith(Java);
Trang 72
Bin flag chua gi tri true.
- boolean endsWith(String s ) Phuong thuc ny tra v mot gi tri kiu logic (boolean),
phu thuoc vo chuoi kt thc bng mot chuoi con no d khng.
V du:
String strname = Java Language;
boolean flag = strname.endsWith(Java);
Bin flag chua gi tri false.
- String copyValueOf( )
Phuong thuc ny tra v mt chui duoc rt ra tu mt mang k tu duoc truyn nhu mt di
s. Phuong thuc ny cung ly hai tham s nguyn. Tham s du tin chi dinh vi tr tu noi
cc k tu phai duoc rt ra, v tham s thu hai chi dinh s k tu duoc rt ra tu mang. V du:
char name[] = {L,a,n,g,u,a,g,e};
String subname = String .copyValueOf(name,5,2);
By gio bin subname chua chui ag.
- char [] toCharArray( )
Phuong thuc ny chuyn chui thnh mt mang k tu. V du:
String text = newString(Hello World);
char textArray[] = text.toCharArray( );
- int indexOf(String sunString )
Phuong thuc ny tra v thu tu cua mt k tu no d, hoc mt chui trong pham vi mt
chui. Cc cu lnh sau biu din cc cch khc nhau cua vic su dung hm.
String day = new String(Sunday);
int index1 = day.indexOf(n);
//chua 2
int index2 = day.indexOf(z,2);
//chua 1 nu z khng tm thy tai vi tr 2.
int index3 = day.indexOf(Sun);
//chua muc 0
- String toUpperCase( )
Phuong thuc ny tra v chu hoa cua chui.
String lower = new String(good morning);
System.out.println(Uppercase: +lower.toUpperCase( ));
- String toLowerCase( )
Phuong thuc ny tra v chu thuong cua chui.
String upper = new String(JAVA);
System.out.println(Lowercase: +upper.toLowerCase( ));
- String trim()
Phuong thuc ny ct bo khoang trng hai du chui. Hy thu doan m sau d thy
su khc nhau truoc v sau khi ct bo khoang trng.
Ten lop
Edited by Foxit Reader
Copyright(C) by Foxit Software Company,2005-2008
For Evaluation Only.
Trang 73
String space = new String( Spaces );
System.out.println(space);
System.out.println(space.trim()); //Sau khi ct bo khoang trng
- boolean equals(String s)
Phuong thuc ny so snh ni dung cua hai di tuong chui.
String name1 = Java, name2 = JAVA;
boolean flag = name1.equals(name2);
Bin flag chua gi tri false.
- Cc phuong thc valueOf duoc nap chng d cho php chuyn mt gi tri thnh xu
static String valueOf(Object obj)//Chuyn mt di tuong thnh xu, bng cch goi dn
phuong thuc toString cua di tuong obj
static String valueOf(char[] characters)//Chuyn mang cc k tu thnh xu.
static String valueOf(boolean b)//Chuyn mt gi tri logic thnh xu, xu nhn duoc l
true hoc false tuong ung voi gi tri true hoc false cua b
static String valueOf(char c)//Chuyn k tu thnh xu
static String valueOf(int i)//chuyn mt s nguyn thnh xu
static String valueOf(long l)//Chuyn mt gi tri long thnh xu
static String valueOf(float f)//chuyn mt gi tri float thnh xu
static String valueOf(double d)//chuyn mt gi tri double thnh xu
2. Lp StringBuffer
Lop StringBuffer cung cp cc phuong thuc khc nhau d thao tc mt di tuong
dang chui. Cc di tuong cua lop ny rt mm deo, d l cc k tu v cc chui c th
duoc chn vo giua di tuong StringBuffer, hoc ni thm du liu vo tai vi tr cui. Lop
ny cung cp nhiu phuong thuc khoi tao. Chuong trnh sau minh hoa cch su dung cc
phuong thuc khoi tao khc nhau d tao ra cc di tuong cua lop ny.
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()); //cha 0
System.out.println(s3.length()); //cha 12
System.out.println(s1.capacity()); //cha 16
System.out.println(s2.capacity()); //cha 20
System.out.println(s3.capacity()); //cha 28
}
}
length() v capacity() cua StringBuffer l hai phuong thuc hon ton khc nhau.
Phuong thuc length() d cp dn s cc k tu m di tuong thuc chua, trong khi
capacity() tra v tng dung luong cua mt di tuong (mc dinh l 16) v s k tu
trong di tuong StringBuffer.
Dung luong cua StringBuffer c th thay di voi phuong thuc ensureCapacity(). Di
s int d duoc truyn dn phuong thuc ny, v dung luong moi duoc tnh ton nhu sau:
NewCapacity =OldCapacity * 2 +2
Edited by Foxit Reader
Copyright(C) by Foxit Software Company,2005-2008
For Evaluation Only.
Trang 74
Truoc khi dung luong cua StringBuffer duoc dt lai, diu kin sau s duoc kim tra:
- Nu dung luong(NewCapacity) moi lon hon di s duoc truyn cho phuong thuc
ensureCapacity(), th dung luong moi (NewCapacity) duoc dt.
- Nu dung luong moi nho hon di s duoc truyn cho phuong thuc
ensureCapacity(), th dung luong duoc dt bng gi tri tham s truyn vo.
Chuong trnh sau minh hoa dung luong duoc tnh ton v duoc dt nhu th no.
class test{
public static void main(String args[]){
StringBuffer s1 = new StringBuffer(5);
System.out.println("Dung luong ca b nh dm = "+s1.capacity()); //cha 5
s1.ensureCapacity(8);
System.out.println("Dung luong ca b nh dm = "+s1.capacity()); //cha 12
s1.ensureCapacity(30);
System.out.println("Dung luong ca b nh dm = "+s1.capacity()); //cha 30
}
}
Trong doan m trn, dung luong ban du cua s1 l 5. Cu lnh
s1.ensureCapacity(8);
Thit lp dung luong cua s1 dn 12 =(5*2+2) boi v dung luong truyn vo l 8 nho hon
dung luong duoc tnh ton l 12 .
s1.ensureCapacity(30);
Thit lp dung luong cua s1 dn 30 boi v dung luong truyn vo l 30 th lon hon dung
luong duoc tnh ton (12*2+2).
Cc phuong thc lp StringBuffer
Trong phn ny, chng ta s xem xt cc phuong thuc cua lop StringBuffer voi mt
chuong trnh.
- voidappend()
Phuong thuc ny ni thm mt chui hoc mt mang k tu vo cui cng cua di
tuong StringBuffer. V du:
StringBuffer s1 = newStringBuffer(Good);
s1.append(evening);
Gi tri trong s1 by gio l goodevening.
- voidinsert()
Phuong thuc ny c hai tham s. Tham s du tin l vi tr chn. Tham s thu hai
c th l mt chui, mt k tu (char), mt gi tri nguyn (int), hay mt gi tri s thuc
(float) duoc chn vo. Vi tr chn s lon hon hay bng 0, v nho hon hay bng chiu di
cua di tuong StringBuffer. Bt ky di s no, tru k tu hoc chui, duoc chuyn sang
chui v sau d moi duoc chn vo. V du:
StringBuffer str = new StringBuffer(Java sion);
str.insert(1,b);
Bin str chua chui Jbava sion.
- char charAt()
Phuong thuc ny tra v mt gi tri k tu trong di tuong StringBuffer tai vi tr duoc chi
dinh.V du:
StringBuffer str = new StringBuffer(James Gosling);
char letter = str.charAt(6); //cha G
Trang 75
- voidsetCharAt(int index, char value)
Phuong thuc ny duoc su dung d thay th k tu trong mt StringBuffer bng mt k tu
khc tai mt vi tr duoc chi dinh.
StringBuffer name = new StringBuffer(Jawa);
name.setCharAt(2,v);
Bin name chua Java.
- voidsetLength()
Phuong thuc ny thit lp chiu di cua di tuong StringBuffer. Nu chiu di duoc chi
dinh nho hon chiu di du liu hin tai cua n, th cc k tu thua s bi ct bot. Nu chiu
di chi dinh nhiu hon chiu di du liu th cc k tu null duoc thm vo phn cui cua
StringBuffer
StringBuffer str = new StringBuffer(10);
str.setLength(str.length() +10);
- char [] getChars()
Phuong thuc ny duoc su dung d trch ra cc k tu tu di tuong StringBuffer, v sao chp
chng vo mt mang. Phuong thuc getChars() c bn tham s sau:
Chi s du: vi tr bt du, tu noi m k tu duoc ly ra.
Chi s kt thc: vi tr kt thc
Mang: Mang dch, noi m cc k tu duoc sao chp.
Vi tr bt du trong mang dch: Cc k tu duoc sao chp vo mang dch tu vi tr ny.
V du:
StringBuffer str = new StringBuffer(Leopard);
char ch[] = new char[10];
str.getChars(3,6,ch,0);
By gio bin ch chua par
- voidreverse()
Phuong thuc ny dao nguoc ni dung cua mt di tuong StringBuffer, v tra v mt di
tuong StringBuffer khc. V du:
StringBuffer str = new StringBuffer(devil);
StringBuffer strrev = str.reverse();
Bin strrev chua lived.
III. Lp StringTokenizer
Mt lop StringTokenizer c th su dung d tch mt chui thnh cc phn tu
(token) nho hon. V du, mi tu trong mt cu c th coi nhu l mt token. Tuy nhin, lop
StringTokenizer d di xa hon vic phn tch cc tu trong cu. D tch ra cc thnh token
ta c th tuy bin chi ra mt tp du phn cch cc token khi khoi tao di tuong
StringTokenizer. Nu ta khng chi ra tp du phn cch th mc dinh l du trng (space,
tab, ...). Ta cung c th su dung tp cc ton tu ton hoc (+, *, /, v -) trong khi phn tch
mt biu thuc.
Bang sau tm tt 3 phuong thuc tao dung cua lop StringTokenizer:
Phuong thuc xy dung nghia
StringTokenizer(String) Tao ra mt di tuong StringTokenizer moi
Trang 76
dua trn chui duoc chi dinh.
StringTokenizer(String, Strng) Tao ra mt di tuong StringTokenizer moi
dua trn (String, String) chui duoc chi dinh
v mt tp cc du phn cch.
StringTokenizer(String, String,
boolean)
Tao ra mt di tuong StringTokenizer dua
trn chui duoc chi dinh, mt tp cc du
phn cch, v mt co hiu cho bit nu cc
du phn cch s duoc tra v nhu cc token
hay khng.
Cc phuong thuc tao dung o trn duoc minh hoa trong cc 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 cu lnh du tin, StringTokenizer cua st1 s duoc xy dung bng cch su
dung cc chui duoc cung cp v du phn cch mc dinh. Du phn cch mc dinh l
khoang trng, tab, cc k tu xung dng. Cc du phn cch ny th chi su dung khi phn
tch vn ban, nhu voi st1.
Cu lnh thu hai trong v du trn xy dung mt di tuong StringTokenizer cho cc
biu thuc ton hoc bng cch su dung cc k hiu *, +, /, v -.
Cu lnh thu 3, StringTokenizer cua st3 su dung du phy nhu mt du phn cch.
Lop StringTokenizer ci dt giao din Enumeration. V th, n bao gm cc
phuong thuc hasMoreElements() v nextElement(). Cc phuong thuc c th su dung cua
lop StringTokenizer duoc tm tt trong bang sau:
Phuong thc Mc dch
countTokens() Tra v s cc token cn lai.
hasMoreElements() Tra v True nu cn c token dang duoc dnh du
trong chui. N th ging ht nhu hasMoreTokens.
hasMoreTokens() Tra v True nu cn c token dang duoc dnh du
trong chui. N ging ht nhu hasMoreElements.
nextElement() Tra v token k tip trong chui. N th ging nhu
nextToken.
nextToken() Tra v Token k tip trong chui. N th ging nhu
nextElement.
nextToken(String) Thay di b du phn cch bng chui duoc chi
dinh, v sau d tra v token k tip trong chui.
Hy xem xt chuong trnh d cho o bn duoi. Trong v du ny, hai di tuong
StringTokenizer d duoc tao ra. Du tin, st1 duoc su dung d phn tch mt biu thuc
ton hoc. Thu hai, st2 phn tch mt dng cua cc truong duoc phn cch boi du phy.
Ca hai tokenizer, phuong thuc hasMoreTokens() v nextToken() duoc su dung d duyt
qua tp cc token, v hin thi cc token.
import java.util.*;
public class StringTokenizerImplementer{
public static void main(String args[]){
// dt mt biu thc ton hoc v tao mt tokenizer cho chui d.
Trang 77
String mathExpr = "4*3+2/4;
StringTokenizer st1 = new StringTokenizer(mathExpr,*+/-", true);
//trong khi vn cn cc token, hin thj
System.out.println("Tokens of mathExpr: ");
while(st1.hasMoreTokens())
System.out.println(st1.nextToken());
//tao mt chui ca cc trung duoc phn cch bi du phy v tao //mt
tokenizer cho chui.
String commas = "field1,field2,field3,and field4;
StringTokenizer st2 = new StringTokenizer(commas,,,false);
//trong khi vn cn token, hin thj.
System.out.println("Comma-delimited tokens : ");
while (st2.hasMoreTokens())
System.out.println(st2.nextToken());
}
}
Kt qua chay chuong trnh duoc m ta nhu hnh duoi.
IV. Mt s lp co ban cua Java
Cc lop co ban, hay su dung cua Java nhu: Object, cc lop Wrapper (lop bao cua
cc kiu du liu nguyn thuy), Math, String v lop StringBuffer. Nhung lop ny duoc xy
dung trong gi java.lang (gi mc dinh cua Java, khi cn su dung cc lop trong gi ny ta
khng cn phai import n). Moi lop trong Java du l lop con cua lop Object .
Object
Boolea Characte Voi Numbe Math Strin StringBuff
Integer Short Byte Long Float Double
...
Trang 78
Cu trc phn cp mt s lop trong gi java.lang
1. Lp Object
Tt ca cc lop duoc xy dung trong cc chuong trnh Java du hoc l truc tip
hoc gin tip duoc mo rng tu lop Object. Dy l lop co so nht, dinh nghia hu nhu tt
ca nhung phuong thuc phn co ban d cc lop con chu cua n su dung truc tip hoc vit
d.
Object cung cap cc phuong thuc sau:
int hashCode()
Khi cc di tuong duoc luu vo cc bang bm (hash table), hm ny c th su dung d xc
dinh duy nht gi tri cho mi di tuong. Diu ny dam bao tnh nht qun cua h
thng khi thuc hin chuong trnh.
Class getClass()
Tra lai tn lop cua di tuong hin thoi.
boolean equals(Object obj)
Cho lai kt qua true khi di tuong hin thoi v obj l cng mt di tuong. Hm ny
thuong duoc vit d o cc lop con cho ph hop voi ngu canh so snh bng nhau trong
cc lop mo rng d.
protectedObject clone() throwsCloneNotSupportedException
Di tuong moi duoc tao ra c cng cc trang thi nhu di tuong hin thoi khi su dung
clone(), nghia l tao ra ban copy moi cua di tuong hin thoi.
String toString()
Nu cc lop con khng vit d hm ny th n s tra lai dang biu din vn ban (textual)
cua di tuong. Hm println() o lop PrintStream s chuyn cc di s cua n sang dang vn
ban khi su dung hm toString().
protected voidfinalize() throwsThrowable
Hm ny duoc goi ngay truoc khi di tuong bi don vo thng rc, nghia l truoc khi di
tuong d bi huy bo.
2. Cc lp bao kiu nguyn thuy (Wrapper class)
Cc gi tri nguyn thuy khng phai l di tuong trong Java. D c th thao tc duoc
trn cc gi tri nguyn thuy (gi tri s, k tu v logic) th gi java.lang cung cap cc lop
bao gi (Wrapper) cho tung kiu d liu nguyn thuy (goi tt l lop bao). Cc lop bao c
nhung dc tnh chung sau:
Cc ton tu tao lp chung. Cc lop bao (tru lop Character chi c mt ton tu tao lp)
du c hai ton tu tao lp:
Ton tu tao lp su dung gi tri nguyn thuy d tao ra di 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);
Ton tu thu hai: chuyn cc di tuong lop String biu din cho cc gi tri nguyn
thuy v cc lop tuong ung. Cc ton tu ny s nm ra ngoai l
NumberFormatException khi gi tri String truyn vo hm tao khng 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 cc hm tin ch chung: valueOf(String s), toString(), typeValue(), equals().
Mi lop (tru lop Character) du dinh nghia hm static valueOf(String s) tra lai di
tuong tuong ung. Cc hm ny nm ra ngoai l NumberFormatException khi gi
tri String truyn vo phuong thuc khng hop l.
Boolean boolObj = Boolean.valueOf(true);
Integer intObj = Integer.valueOf(2002);
Float floatObj = Float.valueOf(3.14F);
Double doubleObj= Double.valueOf(3.14);
Cc lop vit d hm toString() tra lai l cc di tuong String biu din cho cc gi
tri nguyn thuy o dang xu.
String charStr = charObj.toString(); // a
String boolStr = boolObj.toString(); // true
String intStr = intObj.toString(); // 2002
String doubleStr = doubleObj.toString(); // 3.14
Cc lop dinh nghia hm typeValue() tra lai cc gi tri nguyn thuy tuong ung voi
cc di tuong nguyn 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
Cc lop vit d hm equals() d thuc hin so snh bng nhau cua cc di tuong
nguyn 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 ny dinh nghia hai di tuong Boolean.TRUE, Boolean.FALSE biu din cho hai gi
tri nguyn thuy true v false tuong ung.
Lop Character
Lop Character dinh nghia hai gi tri cuc tiu, cuc dai Character.MIN_VALUE,
Character.MAX_VALUE v cc gi tri kiu k tu Unicode. Ngoi ra lop ny cn dinh
nghia mt s hm static d xu l trn cc k tu:
static boolean isLowerCase(char ch)// true nu ch l k tu thuong
static boolean isUpperCase(char ch)// true nu ch l k tu vit hoa
static boolean isDigit(char ch) // true nuch l chu s
static boolean isLetter(char ch)// true nu ch l chu ci
static boolean isLetterOrDigit(char ch) // true nu ch l chu hoc l s
static char toUpperCase(char ch)// Chuyn ch v chu vit hoa
Trang 80
static char toLowerCase(char ch)// Chuyn ch v chu vit thuong
static char toTitleCase(char ch) // Chuyn ch v dang tiu d.
Cc lop bao kiu so
Cc lop Byte, Short, Integer, Long, Float, Double l cc lop con cua lop Number. Trong
cc lop ny du xc dinh hai gi tri:
<Lop bao>.MIN_VALUE
<Lop bao>.MAX_VALUE
l cc gioi han cua cc s trong kiu d. V du,
byte minByte = Byte.MIN_VALUE; // -128
int maxInt = Integer.MAX_VALUE; // 2147483647
Trong mi lop bao c hm typeValue() d chuyn cc gi tri cua cc di tuong nguyn
thuy v gi tri s:
byte byteValue()
short shortValue()
int intValue()
long longValue()
float floatValue()
double doubleValue()
Trong mi lop bao cn c hm static parseType(String s) d chuyn cc gi tri duoc biu
din duoi dang xu v cc gi tri s:
byte value1 = Byte.parseByte(16);
int value2 = Integer.parseInt(2002);
double value3 = Double.parseDouble(3.14);
V du: Vit chuong trnh d nhp vo mt dy s ty v sp xp theo thu tu tng dn.
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 ny k hiu cho di tuong cua lop Class biu din cho gi tri void.
3. Lp Math
Lop final class Math dinh nghia mt tp cc hm tinh d thuc hin cc chuc nng
chung cua ton hoc nhu cc php lm trn s, sinh s ngu nhin, tm s cuc dai, cuc tiu,
v.v.
Lop final class Math cn cung cp nhung hng s nhu s e (co s cua logarithm), s pi
thng qua Math.E v Math.PI.
Cc hm lm trn v xu l cc gi tri gioi han
static int abs(int i)
static long abs(long l)
static float abs(float f)
static double abs(double d)
+ Hm abs() duoc nap chng d tra lai gi tri tuyt di cua di s.
static double ceil(double d)
Trang 82
+ Hm ceil() tra lai gi tri nho nht kiu double m khng nho hon di s v lai bng
s nguyn. V du ceil(3.14) cho gi tri 4.0 l s trn trn cua di s.
static double floor(double d)
+ Hm floor() tra lai gi tri lon nht kiu double m khng lon hon di s v lai bng
s nguyn. V du floor(3.14) cho gi tri 3.0 l s sn duoi cua di s.
static int round(float f d)
static long round(double d)
+ Hm round() duoc nap chng d tra lai s nguyn gn nht cua di 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)
+ Hm max() duoc nap chng d tra lai gi tri cuc dai cua hai di 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)
+ Hm min() duoc nap chng d tra lai gi tri cuc tiu cua hai di s.
Cc hm luy thua
static double pow(double d1, double d2)
+ Hm pow() tra lai gi tri l luy thua cua d1 v d2 (d1d2).
static double exp(double d)
+ Hm exp() tra lai gi tri l lu thua co s e v s mu d (ed).
static double log(double d)
+ Hm log() tra lai gi tri l l-ga-rit tu nhin (co s e) cua d.
static double sqrt(double d)
+ Hm sqrt() tra lai gi tri l cn bc hai cua d , hoc gi tri NaN nu di s m.
Cc hm luong gic
static double sin(double d)
+ Hm sin() tra lai gi tri l sine cua gc d duoc cho duoi dang radian.
static double cos(double d)
+ Hm cos() tra lai gi tri l cose cua gc d duoc cho duoi dang radian.
static double tan(double d)
+ Hm tan() tra lai gi tri l tangent cua gc d duoc cho duoi dang radian.
Hm sinh s ngu nhin
static double random()
+ Hm random() cho lai gi tri l s ngu nhin trong khoang tu 0.0 dn 1.0.
Trang 83
V. Cc lp tp hp
Tp hop (Collection) trong Java cho php luu lai tham chiu dn cc di tuong. Cc
di tuong bt ky c th duoc luu tru, tm kim v duoc thao tc nhu l cc phn tu cua tp
hop.
Phn giao din
Giao din (interface) Collection l co so d pht trin, mo rng thnh cc giao din
khc nhu Set, List, SortedSet v Map v giao din co so d mo rng thnh SortedMap.
Hnh sau m ta cu trc phn cp theo quan h k thua cua cc giao din li.
Cc giao din li cua cu trc Collection duoc m ta trong bang sau:
interface M ta
Collection interface co so dinh nghia tat ca cc php ton co ban cho cc lop
cn duy tr thuc hin v ci dt chng
Set Mo rng Collection d ci dt cu trc tp hop, trong d khng c
phn tu duoc lp v chng khng duoc sp xp
SortedSet Mo rng Set d ci dt cu trc tp hop duoc sp, trong d khng c
phn tu duoc lp v chng duoc sp xp theo thu tu
List Mo rng Collection d ci dt cu trc danh sch, trong d cc phn tu
duoc sp xp theo thu tu, v c lp
Map interface co so dinh nghia cc php ton d cc lop su dung v ci dt
cc nh xa tu kho sang cc gi tri
SortedMap Mo rng cua Map d ci dt cc nh xa kho theo thu tu
Phn ci dt
Gi java.util cung cp tp cc lop ci dt cc giao din li d tao ra nhung cu trc du
liu thuong su dung nhu: Vector, HashTable, HashSet, LinkedList, TreeSet, v.v. Nhng
lop ny v giao din li duoc xy dung theo cu trc phn cp nhu trong hnh H6-3.
<<interface
>>
<<interface
>>
<<interface
>>
<<interface
>>
<<interface
>>
<<interface
>>
Trang 84
Cc giao din li v cc lop ci dt chng
Trong hnh trn k hiu biu din cho quan h k thua giua cc giao din v -->
biu din cho su ci dt cc giao din.
Phn thut ton
Lop java.util.Collection (cn phn bit voi giao din Collection) cung cp mt s
hm static thuc hin nhng thuat ton da xa cho nhng php ton khc nhau trn tp hop,
k ca sp xp, tm kim v dich chuyn cc phn tu.
Mt s hm trong s d l:
static int binarySearch(List list, Object key)
Su dung thut ton tm kim nhi phn d xc dinh chi s cua phn tu key trong
danh sch list.
static voidfill(List list, Object obj)
Thay th tt ca cc phn tu trong danh sch list bng obj.
static voidshuffle(List list)
Hon vi cc phn tu cua danh sch list mt cch ngu nhin.
static voidsort(List list)
Sp xp cc phn tu trong danh sch list theo thu tu tng dn.
1. Collection
Giao din Collection duoc xy dung nhu l mu hop dng cho tt ca cc cu trc
tp hop c th dua vo d m thuc thi v ci dt. Gi java.util cung cp cc lop tp hop v
ci dt hu ht cc hm cua Collection.
Cc php ton co so
int size();Xc dinh kch thuoc cua tap hop.
boolean isEmpty();Tra lai true nu tap hop rong, nguoc lai false.
boolean contains(Object obj);Tra lai true nu tap hop chua obj, nguoc lai false.
boolean add(Object obj); // Ty chon
Tree Map
Hash Set
<<
interface>>
Sorted Set
Array List Vector LinkedList
<<
interface>>
Map
<<
interface>>
Sorted Map
<<
interface>>
List
HashMap
HasTable
<<
interface>>
Set
Tree Set
<<
interface>>
Collection
Trang 85
boolean remove(Object obj); // Ty chon
Tra lai true nu tp hop thuc hin thnh cng vic b sung (loai bo) obj, nguoc lai false.
Mt s php ton khc
Nhung php ton sau thuc hin trn tp hop nhu mt don vi cu trc du liu.
boolean cotainAll(Collection c); // Ty chon
Kim tra xem tap hop hin thoi c chua ca tap hop c hay khng.
boolean addAll(Collection c);// Ty chon
Thuc hin php hop hai tap hop
boolean removeAll(Collection c); // Ty chon
Thuc hin php tru hai tp hop
boolean retainAll(Collection c); // Ty chon
Thuc hin php giao hai tp hop
void clear() // Ty chon
Huy bo di tuong trong tp hop cc php trn tra lai true nu thuc hin thnh cng
v cho kt qua thuc hin duoc minh hoa nhu trong hnh H6-4, trong d a, b l hai
tp hop bt ky.
a.addAll(b) a.removeAll(b) a.retainAll(b)
Hnh Cc php ton trn cc tp hop
2. Set (tp hp)
Tp hop Set l cu trc du liu, trong d khng c su lp lai v khng c su sp
xp cua cc phn tu. Giao din Set khng dinh nghia thm cc hm moi m chi gioi han
lai cc hm cua Collection d khng cho php cc phn tu cua n duoc lp lai.
Gia su a, b l hai tp hop (hai di tuong cua cc lop ci dt Set). Kt qua thuc hin trn a,
b c th m ta nhu trong bang sau:
Cc hm trong
Set
Cc php hop tuong ung
a.containsAll(b) b a ? (Tp con)
a.addAll(b) a = a b (Hop tp hop)
a.removeAll(b) a = a - b (Hiu tp hop)
a.retainAll(b) a = a b (Giao tp hop)
a.clear() a = (Tp rng)
Sau dy chng ta xt mt s lop thuc thi ci dt giao din Set.
HashSet
Mt dang ci dt nguyn thuy cua Set l lop HashSet, trong d cc phn tu cua n l
khng duoc sp. Lop ny c cc ton tu tao lp:
HashSet():Tao ra mt tp moi khng c phn tu no ca (tp rng).
HashSet(Collection c)
a
b
a
a a a
Trang 86
Tao ra mt tp moi chua cc phn tu cua tp hop c nhung khng cho php lp.
HashSet(int initCapacity)
Tao ra mt tp moi rng c kch thuoc (kha nng chua) l initCapacity.
HashSet(int initCapacity, float loadFactor)
Tao ra mt tp moi rng c kch thuoc (kha nng chua) l initCapacity v yu t
duoc nap vo l loadFactor.
V d 6.4 Khi thuc hin cc di s duoc dua vo sau tn chuong trnh theo dng lnh.
Chuong trnh bt du voi tap1 l rng v ly cc k tu cua di s du tin d tao ra tap2.
So snh hai tp d, thng bo kt qua ra mn hnh, sau d cng dn tap2 vo tap1 v lai
tip tuc nhu th di voi di s tip theo cho dn ht.
import java.util.*;
public class TapKT {
public static void main(String args[]) {
int nArgs = args.length; // S di s ca chuong trnh
Set tap1 = new HashSet(); // Tao ra tp th nht l rng
for (int i = 0; i < nArgs; i++){
String arg = args[i]; // Ly tng di s ca chuong trnh
Set tap2 = new HashSet();// Tao ra tp th 2
int size = arg.length(); // S k tu trong mi di s
for (int j = 0; j < size; j++)// Tp th 2 cha cc k tu ca arg
tap2.add(new Character(arg.charAt(j)));
// Tao ra tp tapChung chnh bng 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 phi l tp con ca tap1?
boolean isSubset = tap1.containsAll(tap2);
// tap1 c phi l tp con ca tap2?
boolean isSuperset = tap2.containsAll(tap1);
// tap1 c bng 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 vo tap1
}
}
}
Dich v thuc hin chuong trnh voi cc di s nhu sau:
java TapKT em voi em anh
s cho kt 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 sch)
Cu trc List l dang tp hop cc phn tu duoc sp theo thu tu (cn duoc goi l dy
tun tu) v trong d cho php lp (hai phn tu ging nhau). Ngoi nhung hm m n duoc
k thua tu Collection, List cn b sung thm nhung hm nhu:
Object get(int index)
Cho lai phn tu duoc xc dinh boi index.
Object set(int index, Object elem) // Ty chon
Thay th phn tu duoc xc dinh boi index bng elem.
void add(int index, Object elem) // Ty chon
Chn elem vo sau phn tu duoc xc dinh boi index.
Object remove(int index) // Ty chon
Bo di phn tu duoc xc dinh boi index.
boolean addAll(int index, Collection c) // Ty chon
Chn cc phn tu cua tp hop c vo vi tr duoc xc dinh boi index.
int indexOf(Object elem)
Cho bit vi tr ln xut hin du tin cua elem trong danh sch.
int lastI ndexOf(Object elem)
Cho bit vi tr ln xut hin cui cng cua elem trong danh sch.
List subList(int fromI ndex, int toI ndex)
Ly ra mt danh sch con tu vi tr fromIndex dn toIndex .
ListI terator listI terator()
Cho lai cc phn tu lin tip bt du tu phn tu du tin.
ListI terator listI terator(int index)
Cho lai cc phn tu lin tip bt du tu phn tu duoc xc dinh boi index.
Trong d ListIterator l giao din mo rng giao din Iterator d c trong java.lang.
Cc lp ArrayList, Vector v LinkedList
Ba lop ny c nhung ton tu tao lp d tao ra nhung danh sch moi rng hoc c
cc phn tu ly theo cc tp hop khc.
Vector v ArrayList l hai lop kiu mang dng (kch thuoc thay di duoc). Hiu sut su
dung hai lop ny l tuong duong nhau, tuy nhin nu xt theo nhiu kha canh khc th
ArrayList l cu trc hiu qua nht d ci dt cu trc danh sch List.
V du 6.5 H thng c mt dy N_DIGIT (5) chu s b mt. Hy vit chuong trnh nhp
vo N_DIGIT chu s d don xem c bao nhiu chu s trng v c bao nhiu vi tr cc
chu s trng voi dy 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 sch biMat l rng
Trang 88
biMat.add("5"); // B sung cc s vo dy biMat
biMat.add("3");
biMat.add("2");
biMat.add("7");
biMat.add("2");
List doan = new ArrayList();// Tao danh sch doan l rng
for(int i = 0; i < N_DIGIT; i++)
doan.add(args[i]); // ua cc s t di s chuong trnh vo doan
List lap = new ArrayList(biMat);// Luu luu biMat sang lap
int nChua = 0;
// m s cc ch s trng nhau, ngha l thuc hin duoc php 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();
// Tm nhng vj tr don trng trong hai dy c lp
while (kiemTra.hasNext())// Khi cn phn t tip theo
// Kim tra xem ln luot cc vj tr ca hai dy c trng nhau hay khng
if (kiemTra.next().equals(thu.next())) nViTri++;
// Thng bo kt qu ra mn hnh
System.out.println(nChua + " chu so doan trung.");
System.out.println(nViTri + " vi tri doan trung.");
}
}
Dich v thuc hin chuong trnh:
java NhapDoanSo 3 2 2 2 7
s cho kt qua:
4 chu so doan trung
1 vi tri doan trung
4. Map (nh x)
Map dinh nghia cc nh xa tu cc kho (keys) vo cc gi tri. Luu : cc kha phai
l duy nht (khng cho php lp). Mi ko duoc nh xa sang nhiu nht mt gi tri, duoc
goi l nh xa don.
Cc nh xa khng phai l cc tp hop, giao din Map cung khng phai l mo rng cua cc
Collection. Song, php nh xa c th xem nhu l mt loai tp hop theo nghia: cc kho
(key) tao thnh tp hop v tp hop cc gi tri (value) hoc tp cc cp <key, value>.
Giao din Map khai bo nhung hm sau:
Object put(Object key, Object value); // Ty chn
Chn vo mt cp <key, value>
Object get(Object key);
Doc gi tri duoc xc dinh boi key nu c nh xa, nguoc lai cho null nu khng c
nh xa ung voi key.
Object remove(Object key); // Ty chn
Loai bo nh xa duoc xc dinh boi key.
boolean containsKey(Object key);
Cho gi tri true nu key duoc nh xa sang mt gi tri no d, nguoc lai l false.
boolean containsValue(Object value);
Cho gi tri true nu value duoc nh xa boi mt key no d, nguoc lai l false.
Trang 89
int size();
Cho s cc cp nh xa <key, value>.
boolean isEmpty();
Cho gi tri true nu nh xa rng, nguoc lai l false.
Mt s php ton thuong dng
void putAll(Map t); // Ty chon
Sao lai cc nh xa tu t.
void clear(); // Ty chon
Xo di tt ca cc nh xa.
Set keySet();
Xc dinh tp cc kho.
Collection values();
Xc dinh tp hop cc gi tri.
Set entrySet();
Xc dinh tp cc nh xa <key, value>.
Cc lp HashMap v HashTable
Hai lop ny ci dt giao din Map v duoc xy dung trong java.lang. Chng cho php tao
ra cc nh xa moi c th rng hoc c nhung kch thuoc ty .
V d 6.6
Vit chuong trnh nhap vo cc trong luong v in ra tan suat cua cc trong luong
d trong cc nhm cch nhau 5 don vi (kg).
import java.util.*;
public class NhomTrongluong {
public static void main(String args[]){
// Tao ra mt nh xa d luu tn sut ca mi nhm
Map demNhom = new HashMap();
int nArgs = args.length;
// oc cc trong luong duoc nhp vo t di s v chia nhm cch nhau 5 don vj.
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);
// Tng s ln trong luong trong cng nhm, nu l ln du (demCu = null) th dt l 1.
Integer demMoi = (demCu == null)?
new Integer(1): new Integer(demCu.intValue()+1);
demNhom.put(nhomTL, demMoi);
}
// Ly ra tp cc gi trj t nh xa demNhom
List keys = new ArrayList(demNhom.keySet());
// Sp xp lai theo cc nhm trong luong
Collections.sort(keys);
ListIterator keyIterator = keys.listIterator();
// Tm tn sut ca cc trong luong duoc nhp vo trong cc nhm
while(keyIterator.hasNext()) {
Integer nhom = (Integer) keyIterator.next();
Integer dem = (Integer) demNhom.get(nhom);
int demInt = dem.intValue();
// S dung hm fill() ca lp Array d tao ra xu gm demInt cc du '*'
char[] bar = new char[demInt];
Trang 90
Arrays.fill(bar, '*');
System.out.println(nhom+"\t" + new String(bar));
}
}
}
Dich v chay chuong trnh NhomTrongLuong voi cc tham s:
java NhomTrongLuong 75 72 93 12 34
s cho kt qua:
*
*
1. **
95 *
Nhu vy, nhm 10 kg c 1, 35 kg c 1, 75 kg c 2 v 95 kg c 1.
4. SortedSet (tp duc sp) v SortedMap (nh x duc sp)
Cc cu trc tp hop (set) v nh xa (map) c giao din dc bit l SortedSet v
SortedMap nhu trong hnh H6-5 d ci dt nhung cu trc c cc phn tu duoc sp theo
thu tu chi dinh.
Giao din SortedSet
SortedSet l giao din mo rong cua Set cung cap cc hm d xu l cc tap duoc sp.
SortedSet headSet(Object toElem);
Cho lai tp duoc sp gm nhung phn tu dung truoc toElem.
SortedSet tailSet(Object fromElem);
Cho lai tp duoc sp gm nhung phn tu cui dung sau fromElem.
SortedSet subSet(Object fromElem, Object toElem);
Cho lai tp duoc sp gm nhung phn tu k tu fromElem dn toElem.
Object first();Cho lai phan tu dau tin (cuc tiu) cua tap duoc sp.
Object last();Cho lai phan tu cuoi cng (cuc dai) cua tap duoc sp.
Comparator comparator()
Cho lai thu tu so snh cua cu trc duoc sp, cho null nu cc phn tu duoc sp theo thu
tu tu nhin (tng dn)
Giao din SortedMap
SortedMap l giao din mo rong cua Map cung cap cc hm d xu l cc nh xa duoc
sp theo thu tu cua kho (key).
SortedMap headMap(Object toKey);Cho lai nh xa duoc sp gom nhng phan tu dung
truoc toKey.
SortedMap tailMap(Object fromKey);Cho lai nh xa duoc sp gom nhng phan tu cuoi
dung sau fromKey.
SortedMap subMap(Object fromKey, Object toKey);Cho lai nh xa duoc sp gm nhung
phn tu k tu fromKey dn toKey.
Object firstKey();Cho lai phan tu dau tin (cuc tiu) cua nh xa duoc sp.
Object lastKey();Cho lai phan tu cuoi cng (cuc dai) cua nh xa duoc sp.
TreeSet v TreeMap
Hai lop ny ci dt hai giao din SortedSet v SortedMap tuong ung. Chng c bn loai
ton tu tao lp nhu sau:
TreeSet()
TreeMap()
Trang 91
Tao ra nhng tap hoc nh xa moi v rong, duoc sp theo thu tu tng dan cua cc
phn tu hoc cua kho.
TreeSet(Comparator c)
TreeMap(Comparator c)
Tao ra nhng tap hoc nh xa moi duoc sp v xc dinh thu tu so snh theo c.
TreeSet(Collection c)
TreeMap(Map m)
Tao ra nhng tap hoc nh xa moi duoc sp v c cc phan tu lay tu c hoc tu m
tuong ung.
TreeSet(SortedSet s)
TreeMap(SortedMap m)
Tao ra nhung tp hoc nh xa moi duoc sp v c cc phn tu ly tu s hoc tu m tuongung.
Trang 92
Chuong 3: XU L NGOAI LJ
Di voi nguoi lp trnh ho c th gp mt trong cc li sau:
- Li c php (syntac error)
- Li logic thut ton
- Li lc thuc thi ( runtime error)
- Di voi li c php nguoi lp trnh c th pht hin v sua li, dua vo trnh bin dich,
dy l li d pht hin v sua chua, tuy nhimn dy cung l li gy kh khn v chn nan
di voi nguoi moi hoc lp trnh.
- Di voi li thut ton, dy l li kh pht hin v sua chua nht, tuy nhin trong bi ny
ta khng bn lun v vn d ny.
- Di voi li lc thuc thi, ta hon ton c th kim sot duoc chng, thng thuong li
runtime thuong do nguyn nhn khch quan nhu: truy cp vo mt dia nhung dia ny
lai chua sn sng, hay thuc hin php chia nhung mu s lai bng 0, kt ni voi my tnh o
xa nhung my d lai khng tn tai, khi mt li runtime xy ra JVM s pht sinh mt
ngoai l, nu mt chuong trnh khng cung cp m su l ngoai l c th kt thc khng
bnh thuong, trong bi hm nay ta s bn v vn d su l ngoai l trong java.
- Moi lop bit l trong java du duoc dn xut tu lop co so Throwable, ta c th tao ra lop
ngoai l ring bng cch mo rng lop Throwable
I. Mc dch cua vic xu l ngoi l
Mt chuong trnh nn c co ch xu l ngoai l thch hop. Nu khng, chuong trnh s
bi ngt khi mt ngoai l xay ra. Trong truong hop d, tt ca cc ngun ti nguyn m h
thng d cp khng duoc giai phng. Diu ny gy lng ph ti nguyn. D trnh truong
hop ny, tt ca cc ngun ti nguyn m h thng cp nn duoc thu hi lai. Tin trnh ny
di hoi co ch xu l ngoai l thch hop.
V du, xt thao tc vo ra (I/O) trong mt tp tin. Nu vic chuyn di kiu du liu
khng thuc hin dng, mt ngoai l s xay ra v chuong trnh bi huy m khng dng tp
tin lai. Lc d tp tin d bi hu hai v cc ngun ti nguyn duoc cp pht cho tp tin
khng duoc tra lai cho h thng.
II. M hnh su l ngoi l cua java
M hnh su l ngoai l cua java dua trn ba hoat dng chnh: dc ta ngoai l, nm
ra ngoai l, v bt ngoai l.
- Mi phuong thuc du c th pht sinh cc ngoai l, cc ngoai l c th pht sinh cn
duoc m ta chi tit trong lnh khai bo cua phuong thuc, vic khai bo ny duoc goi l dc
ta ngoai l.
- Khi mt cu lnh trong phuong thuc gy li, m nguoi lp trnh khng cung cp m xu
l li, th ngoai l duoc chuyn dn phuong thuc goi phuong thuc d, vic ny duoc goi l
nm ra bit l, ta c th nm ra bit l mt cch tuong minh (diu ny s duoc gioi thiu
sau).
- Sau khi JVM nm ra mt ngoai l, th h thng thi hnh java bt du tin trnh tm m xu
l li. M xu l li hay cn goi l m xu l bit l, java runtime s tm m xu l li bng
cch ln nguoc tro lai chui cc phuong thuc goi nhau, bt du tu phuong thuc hin tai.
Chuong trnh s kt thc nu khng tm thy m xu l bit l. Qu trnh tm kim ny goi
l bt bit l.
Trang 93
III. D}c ta ngoi l
Dc ta ngoai l l khai bo cho trnh bin dich bit l phuong thuc ny c th gy ra
ngoai l lc thi hnh.
D khai bo bit l ta su dung tu kho throws trong khai bo phuong thuc, v du:
public voidmyMethod() throwsIOException, RemoteException
tu kho throws chi cho trnh bin dich java bit rng phuong thuc ny c th nm ra ngoai
l IOException v RemoteException, nu mt phuong thuc nm ra nhiu ngoai l th cc
ngoai l duoc khai bo cch nhau boi du phy ,
III. Nm ra ngoi l
Mt phuong thuc sau khi d khai bo cc bit l, th ban (hoc chuong trnh thuc thi java)
c th nm ra cc di tuong bit l, c kiu m ta d khai bo trong danh sch throws. C
php cua lnh nm ra ngoai l:
throw ExceptionObject;
Ch :
- Ban phai ch giua lnh khai bo bit l v lnh nm ra ngoai l
- Mt phuong thuc chi c th nm ra cc ngoai l m n duoc khai bo
IV. Bt ngoi l
Mt ngoai l (exception) trong chuong trnh Java l du hiu chi ra rng c su xut
hin mt diu kin khng bnh thuong no d.
Khi mt ngoai l xay ra, di tuong tuong ung voi ngoai l d duoc tao ra. Di tuong
ny sau d duoc truyn cho phuong thuc l noi m ngoai l xay ra. Di tuong ny chua
thng tin chi tit v ngoai l. Thng tin ny c th duoc nhn v v duoc xu l. Cc ngoai
l ny c th l mt ngoai l chun cua Java hoc c th l mt ngoai l do ta tao ra. Lop
Throwable duoc Java cung cp l cha cua tt ca cc ngoai l trong Java (lop du tin
trong cy thua k).
Sau khi ban d bit cch khai bo v nm ra bit l, th phn vic quan trong nht l
bt v xu l bit l.
Vn d di voi nguoi lp trnh java l phai bit duoc doan m no cua anh ta c th
gy ra li. Khi ho d khoanh vng duoc doan m c th gy ra li ho s dt doan m, c
kha nng gy ra li d trong khi try ( thu lm), v dt doan m xu l li trong khi catch
( bt giu). Khun dang tng qut nhu sau:
try{
// Cc lnh c kha nng gy li
}
catch ( TypeException1 ex){
// M duoc thuc thi khi mt ngoai l TypeException1 duoc pht sinh trong khi try
}
catch ( TypeException2 ex){
// M duoc thuc thi khi mt ngoai l TypeException2 duoc pht sinh trong khi try
}
...
catch ( TypeExceptionN ex){
// M duoc thuc thi khi mt ngoai l TypeExceptionN duoc pht sinh trong khi try
} finally{
// khi lnh nay lun duoc thuc hin cho d ngoai l c xay ra trong khi try hay khng.
}
Trang 94
Nu khng c mt ngoai l no pht sinh trong khi try th cc mnh d catch s bi
bo qua, trong truong hop mt trong cc cu lnh bn trong khi try gy ra mt ngoai l th,
th java s bo qua cc cu lnh cn lai trong khi try d di tm m xu l ngoai l, nu kiu
ngoai l so khop voi kiu ngoai l trong mnh d catch, th m lnh trong khi catch d s
duoc thuc thi, nu khng tm thy mt kiu ngai l no duoc so khop java s kt thc
phuong thuc d v chuyn bit l d ra phuong thuc d goi phuong thuc ny qu trnh ny
duoc tip tuc cho dn khi tm thy m xu l bit l, nu khng tm thy m xu l bit l
trong chui cc phuong thuc goi nhau, chuong trnh c th chm dut v in thng bo li ra
lung li chun System.err
V d:
Thuc hin
khi try
Tm khi x l li
(khi catch) d
thuc hin
Nu ngoai l sinh ra
trong khi try l mt
th hin ca lp
ngoai l
Thuc hin khi
catch ng vi
ngoai l 1
Nu ngoai l sinh ra
trong khi try l mt
th hin ca lp
ngoai l
Thuc hin khi
catch ng vi
ngoai l 2
false
true
true
false

Nu ngoai l sinh ra
trong khi try l mt
th hin ca lp
ngoai l
Thuc hin khi
catch ng vi
ngoai l 1
true
C ngoai xy
ra trong khi
try
yes
no
Thuc hin
khi 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 trnh ny ta se thu duoc mt dng in ra mn hnh nhu sau:
Loi chia cho 0
Trong doan chuong trnh trn khi chia mt s cho 0 s gp ngoai l ArithmeticException,
bit duoc ngoai l ny c th xy ra do vy ta bt n v xu l trong khi
catch(ArithmeticException ex), o dy ex l mt di tuong cua lop ArithmeticException
chua cc thng tin v ngoai l xy ra, ta c th ly c thng tin v ngoai l chng han nhu
ly v m ta ngoai l nhu sau:
System.out.println(a.getMessage()).
V. Khi finally
Khi mt ngoai l xut hin, phuong thuc dang duoc thuc thi c th bi dung m khng
duoc hon thnh. Nu diu ny xay ra, th cc doan m pha sau (v du nhu doan m c
chuc nng thu hi ti nguyn, nhu cc lnh dng tp vit o cui phuong thuc) s khng
bao gio duoc goi. Java cung cp khi finally d giai quyt vic ny. Thng thuong khi
finally chua cc cu lnh mang tnh cht don dep nhu: dng kt ni CSDL, dng tp
tin,.
try{
//Cc lnh c kha nng nm ra ngoai l
}
catch(Exception1 ex1){

}
catch(Exception2 ex2){

}
catch(Exceptionn exn){

}
finally{
//M lnh don dep
}
Khi finally l tuy chon, khng bt buc phai c. Khi ny duoc dt sau khi catch
cui cng. Chuong trnh s thuc thi cu lnh du tin cua khi finally ngay sau khi gp
cu lnh return hay lnh break trong khi try.
Trang 96
Khi finally bao dam lc no cung duoc thuc thi, bt chp c ngoai l xay ra hay
khng.
Hnh minh hoa su thuc hin cua cc khi try, catch v finally.
try block
catch block finally block
finally block
No Exception Exception occurs
VI. Mt s lp ngoi l chun cua Java
Danh sch mt s lp ngoi l
Tn lp ngoi l nghia
Throwable Dy l lop cha cua moi lop ngoai l trong Java
Exception Dy l lop con truc tip cua lop Throwable, n
m ta mt ngoai l tng qut c th xy ra
trong ung dung
RuntimeException Lop co so cho nhiu ngoai l java.lang
ArthmeticException Li v s hoc, v du nhu chia cho 0.
IllegalAccessException Lop khng th truy cp.
IllegalArgumentException Di s khng hop l.
ArrayIndexOutOfBoundsExeption Li truy cp ra ngoi mang.
NullPointerException Khi truy cp di tuong null.
SecurityException Co ch bao mt khng cho php thuc hin.
ClassNotFoundException Khng th nap lop yu cu.
NumberFormatException Vic chuyn di tu chui sang s khng thnh
cng.
AWTException Ngoai l v AWT
IOException Lop cha cua cc lop ngoai l I/O
FileNotFoundException Khng th dinh vi tp tin
EOFException Kt thc mt tp tin.
NoSuchMethodException Phuong thuc yu cu khng tn tai.
InterruptedException Khi mt lung bi ngt.
Trang 97
Chuong 4: LAP TRNH DA TUYEN
I. Cc kin thc lin quan
1. Tin trnh ( process)
Tin trnh l mt th hin cua mt chuong trnh dang xu l. So huu mt con tro
lnh, tp cc thanh ghi v cc bin. d hon thnh tc vu cua mnh, mt tin trnh cn cn
dn mt s ti nguyn khc nhu: CPU, b nho, cc tp tin, cc thit bi ngoai vi..
Cn phn bit duoc giua tin trnh v chuong trnh. Mt chuong trnh l mt th hin thu
dng, chua cc chi thi diu khin my tnh d thuc hin muc dch g d; khi cho thuc thi
chi thi ny th chuong trnh s bin thnh tin trnh
C th ni tm tt tin trnh l mt chuong trnh chay trn h diu hnh v duoc quan l
thng qua mt s hiu goi l the
2. Tiu trnh ( thread )
Mt tiu trnh l mt don vi xu l co ban trong h thng. Mi tiu trnh xu l tun
tu cc doan code cua n, so huu mt con tro lnh, mt tp cc thanh ghi v mt vng nho
stack ring, cc tiu trnh chia se CPU voi nhau ging nhu cch chia se giua cc tin trnh.
Mt tin trnh so huu nhiu tiu trnh, tuy nhin mt tiu trnh chi c th thuc v mt tin
trnh, cc tiu trnh bn trong cng mt tin trnh chia se nhau khng gian dia chi chung,
diu ny c nghia l cc tiu trnh c th chia se nhau cc bin ton cuc cua tin trnh. Mt
tiu trnh cung c th c cc trang thi ging nhu cc trang thi cua mt tin trnh.
3. H diu hnh don nhim, da nhim
HDH don nhim l HDH chi cho php 1 tin trnh chay tai mt thoi dim, v du HDH
DOS l HDH don nhim.
- HDH da nhim cho php nhiu tin trnh chay tai mt thoi dim, v du HDH
windows, Unix, Linux l cc HDH da nhim
HDH da nhim uu tin: cc tin trnh duoc cp pht thoi gian su dung CPU theo muc
uu tin khc nhau
HDH da nhim khng uu tin: cc tin trnh khng c muc uu tin no ca, chng tu
gic nha quyn kim sot CPUsau khi kt thc phn cng vic
Ch : trong thuc t mi my thuong chi c 1 CPU, nn khng th c nhiu tin trnh
chay tai mt thoi dim. Nn thng thuong su da chuong chi l gia lp. Chng duoc gia lp
bng cch luu tru nhiu tin trnh trong b nho tai mt thoi dim, v diu phi CPU qua
lai giua cc tin trnh.
4. Cc trng thi cua tin trnh
Trang thi cua mt tin trnh tai mt thoi dim duoc xc dinh boi hoat dng hin
thoi cua tin trnh d. Trong qu trnh sng mt tin trnh thay di trang thi do nhiu
nguyn nhn nhu: ht thoi gian su dung CPU, phai cho mt su kin no d xy ra, hay
doi mt thao tc nhp/xut hon tt
Tai mt thoi dim mt tin trnh c th nhn mt trong cc trang thi sau dy:
1. Tao moi: tin trnh dang duoc thnh lp
2. Running: cc chi thi cua tin trnh dang duoc xu l, hay ni cch khc tin trnh
dang so huu CPU
3. Blocked: tin trnh dang cho duoc cp ti nguyn, hay cho mt su kin no d xy
ra
4. Ready: tin trnh dang cho cp CPU d xu l
5. Kt thc: tin trnh d hon tt vic xu l
Trang 98
5. Min gng ( Critical Section )
a) Vn d tranh chp ti nguyn
Ta xt tnh hung sau:
gia su A c 500$ trong ti khoan ngn hng
A quyt dinh rt ra 100$ tu ti khoan ngn hng, thao tc cua A gm 2 buoc:
1) ly ra 100$
2) giam s ti khoan di 100$
Tnh hung giua 2 thao tc 1 v
2, B tra A 300$, do vy B cp
nht vo trong ti khoan cua A l 800$ ( =500$ +300$), sau d A tip tuc cng vic 2,
n cp nht lai trong ti khoan l 400$, nhu vy B d tra A 300$, nhung A khng nhn
duoc.
b) Min gng (Critical Section)
Doan chuong trnh trong d c th xy ra cc mu thun truy xut trn ti nguyn
dung chung duoc goi l min gng ( Critical Section )
6. Kho cht (deadlock)
Mt tp cc tin trnh duoc dinh nghia l o trong tnh trang kho cht nu nhu, mi tin
trnh trong tp hop du du cho doi mt s ti nguyn dang bi nm giu boi cc tin
trnh khc, nhu vy khng c tin trnh no c th tip tuc xu l, cung nhu giai phng
ti nguyn cho cc tin trnh khc su dung, tt ca cc tin trnh trong tp hop du bi
kho vinh vin!.
II. Lp trnh da tuyn trong Java
Voi Java ta c th xy dung cc chuong trnh da lung. Mt ung dung c th bao gm
nhiu lung. Mi lung duoc gn mt cng vic cu th, chng duoc thuc thi dng thoi voi
cc lung khc.
C hai cch d to ra lung
Cch 1: Tao ra mt 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 lnh cua tuyn
}
M i to Kt thc
Running Ready
Blocked
S chuyn trng thi ca mt tin trnh
A
500
$
1
2 500-
50
Trang 99
}
Cch 2: Tao ra mt lop trin khai tu giao din Runnable, ghi d phuong thuc run
class MyThread implements Runnable{
public void run(){
//M lnh cua tuyn
}
}
1. Lp Thread
Lop Thread chua phuong thuc tao dung Thread() cung nhu nhiu phuong thuc huu ch
c chuc nng chay, khoi dng, tam ngung, tip tuc, gin doan v ngung tuyn. D tao ra
v chay mt tuyn ta cn lm 2 buoc:
Mo rng lop Thread v Ghi d phuong thuc run()
Goi phuong thuc start() d bt du thuc thi tuyn
Lop Thread khng c nhiu phuong thuc lm, chng chi c mt vi phuong thuc huu
dung duoc lit k sau:
public voidrun()
duoc java goi d thuc thi tuyn thi hnh, ban phai ghi d phuong thuc ny d thuc thi
nhim vu cua tuyn, boi v phuong thuc run()cua lop Thread chi l phuong thuc rng
public voidstart()
khi ta tao ra tuyn n chua thuc su chay cho dn khi, phuong thuc start() duoc goi, khi
start() duoc goi th phuong thuc run() cung duoc kch hoat
public voidstop()
c chuc nng ngung tuyn thi hnh, phuong thuc ny khng an ton, ban nn gn null
vo bin Thread d d dung tuyn, thay v su dung phuong thuc stop()
public voidsuspend()
C chuc nng tam ngung tuyn, trong java 2, phuong thuc ny t duoc su dung, boi v
phuong thuc ny khng nha ti nguyn m n lm giu, do vy c th nguy co dn dn
deadlock ( kho cht ), ban nn dng phuong thuc wait(), d tam ngung tuyn thay v
su dung phuong thuc suspend()
public voidresume()
Tip tuc vn hnh tuyn nu nhu n dang bi ngung, nu tuyn dang thi hnh th
phuong thuc ny bi bo qua, thng thuong phuong thuc ny duoc dng kt hop voi
phuong thuc suspend(), k tu java 2 phuong thuc ny cn voi phuong thuc suspend()bi
tu chi, do vy ban nn dng phuong thuc notify () thay v su dung phuong thuc
resume()
public static voidsleep( long millis) Threadows I nterruptedException
dt tuyn thi hnh vo trang thi ngu, trong khoang thoi gian xc dinh bng mili giy.
ch sleep() l phuong thuc tinh.
public voidinterrupt()
lm gin doan tuyn thi hnh
public staticboolean isInterrupt()
kim tra xem tuyn c bi ngt khng
public voidsetpriority( int p)
n dinh d uu tin cho tuyn thi hnh, d uu tin duoc xc dinh l mt s nguyn thuc
doan [1,10]
public final voidwait() throws I nterruptException
Trang 100
dt tuyn vo trang thi cho mt tuyn khc, cho dn khi c mt tuyn khc thng bo
th n lai tip tuc, dy l phuong thuc cua lop co so Object
public final voidnotify ()
dnh thuc tuyn dang cho, trn di tuong ny
public final voidnotifyAll() dnh thuc tt ca cc tuyn dang cho trn di tuong ny
isAlive() Tra v True, nu lung l vn cn tn tai (sng)
getPriority() Tra v muc uu tin cua lung
join() Doi cho dn khi lung kt thc
isDaemon() Kim tra nu lung l lung mt lung chay ngm (deamon)
setDeamon(boolean on) Dnh du lung nhu l lung chay ngm
V d: Ta tao ra 2 tuyn thi hnh song song, mt tuyn thuc hin vic in 200 dng Dai
hoc su pham k thut Hung Yn, trong khi tuyn ny dang thuc thi th c mt tuyn khc
vn tip tuc in 200 dng chu cho mung ban dn 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 thut Hung Yn" );
}
}
class ChaoJV extends Thread{
public void run (){
for ( int i = 1; i <= 200; i++ )
System.out.println ( "cho mung ban dn voi java" );
}
}
khi ta chay chuong trnh thy kt qua xen k nhau nhu
..
Dai hoc su pham k thut Hung Yn
Dai hoc su pham k thut Hung Yn
cho mung ban dn voi java
Dai hoc su pham k thut Hung Yn
cho mung ban dn voi java
Dai hoc su pham k thut Hung Yn
cho mung ban dn voi java
cho mung ban dn voi java
...
Trang 101
2. Vngdi cua Thread
Hnh sau th hin trang thi cua tuyn trong vng doi cua chng
3. Lung chy ngm (deamon)
Mt chuong trnh Java kt thc chi sau khi tt ca cc lung thuc thi xong. Trong
Java c hai loai lung:
- Lung nguoi su dung
- Lung chay ngm (deamon)
Nguoi su dung tao ra cc lung nguoi su dung, trong khi cc lung deamon l cc
lung chay nn. Lung deamon cung cp cc dich vu cho cc lung khc. My ao Java
thuc hin tin trnh thot, khi d chi cn duy nht lung deamon vn cn sng. My ao
Java c t nht mt lung deamon l lung garbage collection (thu luom ti nguyn -
don rc). Lung don rc thuc thi chi khi h thng khng c tc vu no. N l mt lung c
quyn uu tin thp. Lop lung c hai phuong thuc d lm vic voi lung deamon:
- public void setDaemon(boolean on)
- public boolean isDaemon()
4. Giao din Runnable
O muc truoc ban d tao ra cc lung thuc hin song song voi nhau, trong java ta
cn c th tao ra cc tuyn thi hnh song song bng cch trin khai giao din Runnable.
Chc ban s tu hoi, d c lop Thread ri tai sao lai cn c giao din Runnable nua, chng
khc g nhau?, cu tra loi o ch, java khng h tro k thua bi, nu chuong trnh cua ban
vua mun k thua tu mt lop no d, lai vua mun da tuyn th ban bt buc phai dng
giao din Runnable, chng han nhu ban vit cc Applet, ban vua mun n l Applet, lai
vua mun thuc thi nhiu tuyn, th ban vua phai k thua tu lop Applet, nhung nu d k
thua tu lop Applet ri, th ban khng th k thua tu lop Thread nua.
Ta vit lai v du trn, nhung ln ny ta khng k thua lop Thread, m ta trin khai
giao din 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 thut Hung Yn");
}
}
}
class ChaoJV implements Runnable{
public void run (){
for ( int i = 1; i <= 200; i++ ) {
System.out.println ( "cho mng ban dn vi java" );
}
}
}
Cho chay v du ny ta thy kt qua ra khng khc g voi v du truoc.
5. Thit lp d uu tin cho tuyn
Khi mt tuyn duoc tao ra, n nhn mt d uu tin mc dinh, di khi ta mun diu
chinh d uu tin cua tuyn d dat duoc muc dch cua ta, tht don gian, d dt d uu tin
cho mt tuyn ta chi cn goi phuong thuc setPriority() v truyn cho n mt s nguyn s
ny chnh l d uu tin m ban cn dt.
Ta vit lai v du trn nhu sau: Thm vo phuong thuc main() 2 dng lnh:
t.setPriority(1); //Tuyn ny c d uu tin l 1
t1.setPriority(10); // Tuyn ny c d uu tin l 1
Chay lai chuong trnh ny sau khi sua v truoc khi sua ta thy tuyn t1 duoc cp thoi gian
su dung CPU nhiu hon tuyn t, l do l ta d dt d uu tin cua tuyn t1, lon hon d uu
tin cua tuyn t
Ch :
1. d uu tin cua mt tuyn biu thi boi mt s nguyn nm trong doan tu 1 dn 10,
mt li s pht sinh nu ta gn cho n d uu tin, nm ngoi khoang ny
2. 2) nu mt tuyn khng duoc dt d uu tin th n s nhn d uu tin mc dinh
( bng 5 ), ta c th kim tra diu ny bng cch goi phuong thuc getPriority()
6. Nhm tuyn (Thread Group)
- Nhm tuyn l mt tp hop gm nhiu tuyn, khi ta tc dng dn nhm tuyn ( chng
han nhu tam ngung, ) th tt ca cc tuyn trong nhm du nhn duoc cng tc dng
d, diu ny l tin loi khi ta mun quan l nhiu tuyn thuc hin cc tc vu tuong tu
nhau.
D tao mt nhm tuyn ta cn:
+ tao ra mt nhm tuyn bng cch su dung phuong thuc tao dung cua lop
ThreadGroup()
ThreadGroup g=new ThreadGroup(ThreadGroupName);
ThreadGroup g=
new ThreadGroup(ParentThreadGroup,ThreadGroupName);
Dng lnh trn tao ra mt nhm tuyn g c tn l ThreadGroupName, tn cua tuyn
l mt chui v khng trng voi tn cua mt nhm khc.
+ dua cc tuyn vo nhm tuyn dng phuong thuc tao dung cua lop Thread() :
Thread =new Thread (g, new ThreadClass(),ThisThread);
Trang 103
7. Dng b cc tuyn thi hnh
Khi nhiu tuyn truy cp dng thoi vo ti nguyn dng chung, m ti nguyn ny
lai khng th chia se, cho nhiu tuyn, khi d ti nguyn dng chung c th bi hong. V
du, mt lung c th c gng doc du liu, trong khi lung khc c gng thay di du liu.
Trong truong hop ny, du liu c th bi sai.
Trong nhung truong hop ny, ban cn cho php mt lung hon thnh tron ven tc
vu cua n, v ri th moi cho php cc lung k tip thuc thi. Khi hai hoc nhiu hon mt
lung cn thm nhp dn mt ti nguyn duoc chia se, ban cn chc chn rng ti nguyn
d s duoc su dung chi boi mt lung tai mt thoi dim.
Boi trong java khng c bin ton cuc, chng ta chi c thuc tnh cua di tuong, tt
ca cc thao tc c th dn dn hong hc du thuc hin qua phuong thuc, do vy java cung
cp tu kho synchronized, tu kho ny duoc thm vo dinh nghia cua phuong thuc bo
cho java bit dy l mt phuong thuc dng b, mi di tuong s c mt b quan l kho,
b quan l kho ny chi cho 1 phuong thuc synchronized cua di tuong d chay tai mt
thoi dim
Mu cht cua su dng b ha l khi nim monitor (gim st), hay cn goi
semaphore (co hiu). Mt monitor l mt di tuong m duoc kha dc quyn. Chi
mt lung c th c monitor tai mi thoi dim. Tt ca cc lung khc c gng thm nhp
vo monitor s bi tr hon, cho dn khi lung du tin thot khoi monitor. Cc lung khc
duoc bo cho doi monitor. Mt lung c th monitor mt di tuong nhiu ln.
Trang 104
Chuong 5: NHAP XUT (Input/Output)
Mt chuong trnh thuong xuyn lm vic voi du liu, d c th luu tru lu di chng ta
phai luu tru v nhn lai du liu tu thit bi luu tru ngoi, ngun thng tin ngoi khng chi
gm du liu duoc luu tru trn dia tu, dia CD m n c th l du liu cua mt chuong trnh
khc, hoc c th l duoc luu tru trn mang d chng duoc luu tru o du chng cung
chi c 1 s dang nhu: di tuong, k tu, hnh anh hoc m thanh, d du liu duoc luu tru
duoi hnh thuc no, luu tru o du th java du truu tuong ho thnh cc lung, diu ny l
rt tinh vi n lm cho ta khng cn phai quan tm du liu duoc luu tru o du, duoi dang
thuc nhu th no, n dng nht moi ngun du liu voi nhau:
D nhn v cc thng tin, mt chuong trnh mo mt lung lin kt voi di tuong ngun(
tp tin, b nho, Socket) v doc cc thng tin tun tu.
Tuong tu d ghi thng tin ra cc thit bi ngoi bng cch mo mt lung dn di tuong dch
v ghi thng tin ra mt cch tun tu nhu
Lung l su truu tuong ho o muc cao, do vy bt k du liu duoc doc vo tu du hoc ghi
ra du, th thut ton doc/ghi tun tu du tua nhu sau:
Trang 105
I. Lp lung
Java dua ra nhiu lop lung, d xu l moi loai du liu, java chia lung ra thanh 2 loai:
lung byte ( byte stream) v lung k tu (character stream), lop InputStream v
OutputStream l hai lop co so cho moi lung nhp xut huong byte, v lop Reader/ Writer
l hai lop co so cho vic doc ghi huong k tu.
Lop RandomAccessFile k thua tu lop Object v trin khai giao din, InputStream v
OutputStream, dy l lop duy nht h tro ca doc ln ghi.
1.1. Lp nhp, xut hung k t
Reader v Writer l hai lop co so truu tuong cho lung huong k tu, hai lop ny cung cp
mt giao din chung cho tt ca cc lop doc/ ghi huong k tu, mi ln doc/ ghi ra lung l
doc 2 byte tuong ung voi mt k tu unicode, Sau day l m hnh phn cp cc lop doc/ ghi
huong k tu
1.2. Lung hung byte
D c th doc ghi 1 byte, ta phai su dung lung huong byte, hai lop InputStream v
OutputStream l hai lop co so truu tuong cho cc lung huong byte, mi ln doc/ ghi ra
lung l doc/ ghi 8 bit du liu ra lung, Hnh sau th hin mi quan h phn cp giua lop
doc/ ghi huong byte
Trang 106
Su tuong tu giua hai lung huong byte v huong k tu
Lop Reader v InputStream c mt giao din ging nhau, chng chi khc nhau v kiu du
liu doc vo, v du lop Reader c cc phuong thuc sau gip cho vic doc mt k tu hoc
mt mang cc k tu
int read()
int read(char cbuf[])
int read(char cbuf[], int offset, int length)
Th trong lop InputStream cung c cc phuong thuc voi tn tuong tu cho vic doc
mt byte hoc mt mang cc byte
int read()
int read(byte cbuf[])
int read(byte cbuf[], int offset, int length)
Cung tuong tu vy lop Writer v OutputStream cung c mt giao din tuong tu
nhau, v du lop Writer dinh nghia cc phuong thuc d ghi mt k tu, mt mang cc k tu ra
lung
int write(int c)
int write(char cbuf[])
int write(char cbuf[], int offset, int length)
Th lop OutputStream cung c cc phuong thuc tuong ung, d ghi mt byte, mt
mang byte ra lung
int write(int c)
int write(byte cbuf[])
int write(byte cbuf[], int offset, int length)
Xu l tp tin
D xu l tp tin ngoai tr, ta su dung cc lung lin quan dn tp tin nhu
FileInputStream v FileOutputStream cho vic doc ghi tp huong byte, FileReader v
FileWriter cho vic doc ghi huong k tu, thng thuong mun su dung lung tp tin ta su
dung hm tao cua cc lop tuong ung d lin kt lung voi mt tp 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 d: Vit chuong trnh file copy, thuc hin vic copy mt tp, ta s vit chuong trnh ny
su dung ca 2 lung huong byte v huong k tu
import java.io.*;
// chuong trnh copy s dung lung hung 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 trnh copy s dung lung hung 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();
}
}
Lung d liu
D doc/ ghi cc kiu du liu nguyn thuy, ta su dung lung DataInputStream v
DataOutputStream, lop DataInputStream trin khai giao din DataInput, cn lop
DataOutputStream trin khai giao din DataOuput
Cc phuong thuc sau duoc dinh nghia trong giao din DataOutput
void write(byte[] b) Ghi mt mang byte ra lung
void write(byte[] b, int off, int len) Ghi mt mang byte ra lung k tu vi tr off,
Trang 108
len byte
void write(int b) Ghi mt byte ra lung
void writeBoolean(boolean v) Ghi mt gi tri logic ra lung
void writeByte(int v) Ghi ra lung phn thp cua v
void writeBytes(String s) Ghi mt xu ra lung
void writeChar(int v) Ghi mt k tu ra lung
void writeChars(String s) Ghi mt xu k tu ra lung
void writeDouble(double v) Ghi mt s double ra lung
void writeFloat(float v) Ghi mt s thuc ra lung
void writeInt(int v) Ghi mt s nguyn ra lung
void writeLong(long v) Ghi mt s long ra lung
void writeShort(int v) Ghi mt s short ra lung
void writeUTF(String str) Chi mt xu k tu Unicode ra lung
Cc phuong thc sau duc djnh ngha trong giao din DataI nput:
boolean readBoolean() doc mt gi tri logic tu lung
byte readByte() doc mt byte tu lung
char readChar() doc mt k tu tu lung
double readDouble() doc mt s double tu lung
float readFloat() doc mt s float tu lung
void readFully(byte[] b) doc mt mang byte tu lung v ghi vo
mang
voidreadFully(byte[] b, int off, int len) doc len byte tu lung v ghi vo mang
tu vi tr off
int readInt() doc mt s nguyn
String readLine() doc mt xu k tu cho dn khi gp k tu
xung dng v bo qua k tu xung dng
long readLong() doc mt s long
short readShort() doc mt s short
int readUnsignedByte() doc mt s nguyn khng du trong
khoang 0..255
in treadUnsignedShort() doc mt s nguyn khng du trong
doan tu 0..65535
String readUTF() doc mt xu k tu Unicode
int skipBytes(int n) Bo qua n byte tu lung
Sau dy l mt v du nho v lung nhp xut du liu, v du ny ghi du liu ra tp ri 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 nguyn
out.writeLong(123456789); // ghi s long
Trang 109
out.writeDouble(123.456789); // ghi s thuc chnh xc kp
out.writeFloat(123.456789f); // ghi s thuc chnh xc don
out.writeBoolean(true); // ghi gi trj logic
out.writeUTF("Day la mot xau ki tu"); // ghi mt xu
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 nguyn
System.out.println("Gia tri long " + in.readLong()); // doc lai s nguyn di
System.out.println("Gia tri double " + in.readDouble());// doc lai s thuc chnh xc kp
System.out.println("Gia tri float " + in.readFloat()); // doc lai s thuc chnh xc don
System.out.println("Gia tri boolean " + in.readBoolean()); // doc lai gi trj logic
System.out.println("Gia tri xau " + in.readUTF()); // doc lai mt xu unicode
}
catch (EOFException e) { System.out.println("loi");}
in.close();
}
}
1.3. Lung in n
V cc lung xut ghi du liu ra duoi dang nhi phn do vy ban khng th dng lnh
type, hoc cc chuong trnh soan thao asciii d xem duoc, trong java c th su dung lung
in n d xut du liu ra duoi dang asciii. Lop PrintStream v PrintWriter s gip ta lm vic
ny. Hai lop ny thuc hin chuc nng nhu nhau, du xut ra du liu dang asciii.
Mot so phuong thuc cua lop PrintStream:
boolean checkError() dn ht du liu ra v kim tra li lung
void close() dng lung
void flush() dn du liu trong vng dm ra
void print(boolean b) ghi gi tri logic ra lung
void print(char c) ghi k tu
void print(char[] s) ghi mt mange k tu
void print(double d) ghi mt s thuc d chnh xc kp
void print(float f) ghi mt s thuc
void print(int i) ghi mt s nguyn
void print(long l) ghi mt s nguyn di
void print(Object obj) ghi mt di tuong
void print(String s) ghi mt xu
void println() tao ra mt dng trng
void println(boolean x) ghi gi tri logic ra lung v xung dng
void println(char x) ghi k tu v xung dng
Trang 110
void println(char[] x) ghi mt mange k tu v xung dng
void println(double x) ghi mt s thuc d chnh xc kp v xung dng
void println(float x) ghi mt s thuc v xung dng
void println(int x) ghi mt s nguyn v xung dng
void println(long x) ghi mt s nguyn di v xung dng
void println(Object x) ghi mt di tuong v xung dng
void println(String x) ghi mt xu v xung dng
protected void setError() dt trang thi li cua lung l true
void write(byte[] buf, int off, int
len)
ghi mang byte tu vi tr off len k byte ra lung
void write(int b) ghi mt byte ra lung
Hm to cua lp PrintStream:
PrintStream(OutputStream out) tao ra mt lung moi
PrintStream(OutputStream out, boolean autoFlush) tao ra mt lung moi voi chuc nng
AutoFlush ( tu dn)
Mt s phuong thuc cua lop PrintWriter
boolean checkError() dn ht du liu ra v kim tra li lung
void close() dng lung
void flush() dn du liu trong vng dm ra
void print(boolean b) ghi gi tri logic ra lung
void print(char c) ghi k tu
void print(char[] s) ghi mt mange k tu
void print(double d) ghi mt s thuc d chnh xc kp
void print(float f) ghi mt s thuc
void print(int i) ghi mt s nguyn
void print(long l) ghi mt s nguyn di
void print(Object obj) ghi mt di tuong
void print(String s) ghi mt xu
void println() tao ra mt dng trng
void println(boolean x) ghi gi tri logic ra lung v xung dng
void println(char x) ghi k tu v xung dng
void println(char[] x) ghi mt mange k tu v xung dng
void println(double x) ghi mt s thuc d chnh xc kp v xung dng
void println(float x) ghi mt s thuc v xung dng
void println(int x) ghi mt s nguyn v xung dng
Trang 111
void println(long x) ghi mt s nguyn di v xung dng
void println(Object x) ghi mt di tuong v xung dng
void println(String x) ghi mt xu v xung dng
protected void setError() dt trang thi li cua lung l true
void write(byte[] buf, int off, int
len)
ghi mang byte tu vi tr off len k byte ra lung
void write(int b) ghi mt byte ra lung
void write(int c) Ghi mt k tu don
void write(String s) Ghi mt xu
void write(String s, int off, int len) Ghi mt xu len k tu tnh tu vi tr off
Cc hm to cua lp PrintWriter
- PrintWriter(OutputStream out) tao ra mt PrintWriter khng c chuc nng tu dn tu mt
di tuong OutputStream.
- PrintWriter(OutputStream out, boolean autoFlush) tao ra mt PrintWriter voi chuc nng
tu dn tu mt di tuong OutputStrea.
- PrintWriter(Writer out) tao ra mt PrintWriter khng c chuc nng tu dn tu mt di
tuong Writer
- PrintWriter(Writer out, boolean autoFlush) tao ra mt PrintWriter voi chuc nng tu dn tu
mt di tuong Writer
Sau dy l mt v du v lung in n, v du ny in ra mt tp mt s nguyn, mt s
thuc v mt xu k tu, sau khi chay chuong trnh ban c th su dung lnh 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. Lung dm
V cc thao tc voi cung, mang thuong lu hon rt nhiu so cc thao tc voi b nho
trong, do vy chng ta cn phai c mt k thut no d d tng tc d doc/ghi, k thut d
chnh l vng dm, voi vng dm ta s giam duoc s ln doc ghi lung, trong java ta c th
tao ra vng dm voi cc lop
BufferInputStream, BufferOutputStream, BufferReader, BufferWriter, thng thuong ban s
ni cc lung cua ban vo lung dm.
Trang 112
Cc phuong thuc tao dung lung dm:
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)
1p tin truy cp ngu nhin
Tt ca cc lung xt trn chi c th doc, hoc ghi, chng khng th doc ghi dng
thoi, chi duy nht c mt lop cho php ta doc ghi dng thoi, d l lop RandomAccessFile,
lop ny trin khai giao din InputData v OutputData, nn chng c tt ca cc phuong thuc
cua ca 2 lop ny, ngoi ra chng cn c cc phuong thuc sau:
- public void seek(long pos) chuyn con tro dn vi tr pos tnh tu vi tr du tin, ch vi tr
du tin tnh tu 0
- public long getFilePointer() tra v vi tr con tro tp tnh bng byte, k ta du tp
- public long length() tra v d di cua tp
- public void writeChar(int v) ghi k tu unicode ra tp voi byte cao duoc ghi truoc
- public final void writeChars(String s) ghi mt xu k tu ra tp
Tuong tu ging C/C++ khi ban mo mt tp truy cp ngu nhin ban phai chi r ch d lm
vic l doc r, hay ghi w hay doc ghi dng thoi rw, v du nhu ban mun mo tp a.txt
theo ch d doc ghi dng thoi th ban dng c php RandomAccessFile =new
RandomAccessFile(C:/ a.txt, rw)
Chuong trnh duoi dy minh hoa cch dng lop RandomAccessFile. N ghi mt gi
tri boolean, mt int, mt char, mt double toi mt file c tn abc.txt. N su dung phuong
php seek( ) d tm vi tr dinh vi bn trong tp tin (bt du tu 1). Sau d n doc gi tri s
nguyn, k tu v double tu tp tin v hin thi chng ra mn hnh.
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 thc seek() d di chuyn con tr dn 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();
}
}
Kt qua xut ra cua chuong trnh:
II. Lp File
Lop File cung cp giao din chung d xu l h thng tp dc lp voi mi truong cua
cc my tnh. Mt ung dung c th su dung cc chuc nng chnh cua File d xu l tp hoc
cc thu muc (directory) trong h thong tp. D xu l cc ni dung cua cc tp th su dung
cc lop FileInputStream, FileOutputStream v RandomAccessFile.
Lop File dinh nghia cc thuc tnh phu thuc vo mi truong (platform) duoc su dung d xu l
tp v tn goi cc duong dn trong cc thu muc mt cch dc lp voi mi truong.
public static final char separatorChar
public static final String separator
Dinh nghia cc k hiu hoc cc xu su dung d ngn cch cc thnh phn trong tn
cua duong dn. K hiu / d ngn cch cho Unix, \ duoc su dung d ngn cch cc
muc cua duong dn trong Window.
V d: C:\book\Java l tn duong dn trong Window.
public static final char pathSeparatorChar
public static final String pathSeparator
Dinh nghia cc k hiu hoc cc xu su dung d ngn cch cc tp hoc tn thu muc
trong danh sch cua cc duong dn. K hiu ngn cch : cho Unix, ; duoc su dung
d phn cch cc duong dn trong Window.
V du: C:\book; C:\Java; D:\Anh\ABC; A:\Docs l danh sch cc duong dn trong Window.
File(String pathName)
Gn duong dn c tn pathName cho di tuong cua lop File. pathName c th l
duong dn tuyt di (c du ca tn dia, tn cua tt ca cc muc ln luot theo cy thu
muc) hoc duong dn tuong doi (bt dau tu thu muc hin thoi).
V du:
File ch1 = new File(File.separator + book + File.separator + chuong1);
File(File direct, String filename)
Trang 114
Gn tp c tn filename o thu muc direct cho di tuong cua lop File. Nu direct l
null th filename duoc xu l o thu muc hin thoi, nguoc lai tn duong dn s l di
tuong direct ghp 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 vn vo cc h thng tp d bit duoc cc thng tin v tp
v cc thu muc.
Lop File cung cp cc hm d nhn duoc cc biu din phu thuc vo mi truong cua
duong dn v cc thnh phn cua duong dn.
String getName()
Hm getName() cho lai tn cua tp trong thu muc chi dinh. V du, tn cua
C:\java\bin\javac l javac.
String getPath( )
Hm getPath() cho lai tn cua duong dn (tuyt di hoc tuong di) chua tp chi dinh.
String getAbsolutePath()
Hm getAbsolutePath() cho lai tn cua duong dn tuyt di chua tp chi dinh.
long lastModified()
Hm ny cho lai thoi gian dang s long cua ln sua di tp ln cui cng.
long length()
Hm ny cho lai kch thuoc cua tp tnh theo byte.
boolean equals(Object obj)
Hm ny so snh tn cc duong dn cua cc di tuong tp, cho kt qua true nu
chng dng nht voi nhau.
boolean exists()
boolean isFile()
Hai hm ny cho kt qua true nu tp d tn tai trn duong dn hin thoi.
boolean isDirectory()
Hm ny cho kt qua true nu thu muc d tn tai trn dia hin thoi.
boolean createNewFile() throws I OException
Mt tp moi l rng duoc tao ra o thu muc hin thoi chi khi tp ny chua c.
boolean mkdir()
boolean mkdirs()
Tao ra cc duong dn duoc xc dinh trong di tuong cua File.
boolean renameTo(File dest)
Hm ny di tn tp hin thoi thnh dest.
String[] list()
Hm ny hin thi danh sch cc tp o thu muc hin thoi.
boolean delete()
Hm ny xo tp hin thoi.
V d 8.1 Vit chuong trnh d doc v hin thi cc tp trong mt 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 di tuong ca File ly tn t agrs[0]
listDirectory(entry); // Hin thj cc muc trong danh muc chi djnh
}
public static void listDirectory(File entry) {
try {
if(!entry.exists()) {
System.out.println(entry.getName() +"not found.");
return;
}
if (entry.isFile()){
// Nu di s ca chuong trnh l mt tp th hin thj tp d
System.out.println(entry.getCanonicalPath());
} else if(entry.isDirectory()){
// Nu di s ca chuong trnh l mt danh muc th doc ra (list())
String[] fileName = entry.list();
if (fileName ==null)return;
for (int i = 0; i<fileName.length; i++){
// Tao ra di tuong ca File d x l tng muc
File item = new File(entry.getPath(), fileName[i]);
// Goi d qui hm listDirectory()d hin thj tng tp.
listDirectory(item);
}
}
}catch(IOException e){System.out.println("Error:" +e);
}
}
}
Dich xong c th chay trong mi truong DOS:
java DirectoryLister c:\users\lan
Tt ca cc tp trong danh muc c:\users\lan s duoc hin ln.
Mt s v d ng dng
V d 1:V d minh ha vic nhp d liu t bn phm
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 d 2 Xy dng gi nhp d liu cho ring mnh
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 d 3 Su dng gi nhp d liu trong chuong trnh J ava
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 d 4. Minh ha vic dc, 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 d 5: Minh hoa su dung lung
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 ngu nhin
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 TRNH DO HOA AWT
Mt kha nng cua Java l cho php ta xy dung cc ung dung c giao din d hoa
hay cn goi l GUI (Grapthical User Interface). Khi Java duoc pht hnh, cc thnh phn
d hoa duoc tp trung vo thu vin mang tn Abstract Window Toolkit (AWT). Di voi
mi h nn, thnh phn AWT s duoc nh xa sang mt thnh phn nn cu th, bng cch su
dung truc tip m native cua h nn, chnh v vy n phu thuc rt nhiu vo h nn v n
cn gy li trn mt s h nn. Voi ban pht hnh Java 2, cc thnh phn giao din duoc
thay bng tp hop cc thnh phn linh hoat, da nng, manh m, dc lp voi h nn thuc
thu vin Swing. Phn lon cc thnh phn trong thu vin Swing du duoc t v truoc tip
trn canvas bng m lnh cua Java, ngoai tru cc thnh phn l lop con cua lop
java.awt.Window hoc Java.awt.Panel vn phai duoc v bng GUI trn nn cu th. Thnh
phn Swing t phu thuc vo h nn hon do vy t gp li hon v dc bit n su dung t ti
nguyn cua h thng hon cc thnh phn trong thu vin awt. Mc d cc thnh phn awt
vn duoc h tro trong Java 2 nhung, tuy nhin Sun khuyn ban nn su dung cc thnh phn
Swing thay cho cc thnh phn awt, tuy nhin cc thnh phn trong thu vin Swing khng
th thay tt ca cc thnh phn trong thu vin awt. Chng chi thay th mt phn cua awt
nhu: Button, Panel, TextFeild, v.v. Cn cc lop tro gip khc trong awt nhu : Graphics,
Color, Font, FontMetrics, v.v. vn khng thay di. Bn canh d cc thnh phn Swing cn
su dung m hnh su l su kin cua awt.
I. Gii thiu v h thng d ho cua Java
1. Gii thiu chung
Thit k API cho lp trnh d hoa cua Java l mt v du hon hao v cch dng lop, su
k thua v giao din. API cho lp trnh d hoa bao gm mt tp rt nhiu lop nhm tro gip
xy dung cc thnh phn giao din khc nhau nhu: cua s,nt n, vn ban, menu, hp
kim, v.v. Mi quan h k thua giua cc thnh phn ny duoc m ta trong hnh sau:
Componient Dy l lop (truu tuong) cha cua moi lop giao din nguoi dng. Lop ny
cung cp cc thuc tnh, hnh vi co ban nht cua tt ca cc thnh phn giao din.
Container L mt vt chua dng d ghp nhm cc thnh phn giao din khc. Mi
vt chua c mt lop quan l hin thi, lop quan l hin thi c trch nhim b tr cch
thuc hin thi cc thnh phn bn trong. Hai vt chua hay duoc su dung nht la
JFrame v JPanel.
Jcomponient L lop cha cua moi thnh phn Swing ligth weight, duoc v truc tip
ln canvas bng m lnh Java.
Window Duoc su dung d tao ra mt cua s, Thng thuong ta hay su dung hai lop
con cua n l JFrame v JDialog.
JFrame l cua s khng lng bn trong cua s khc.
JDialog l mt cua s duoc hin thi duoi dang modal.
JAplet l lop cha cua moi lop ung dung aplet.
JPanel l mt vt chua, luu giu cc thnh phn giao din nguoi dng.
Graphics l lop truu tuong cung cp ngu canh d hoa d v cc di tuong d hoa
nhu: Duong thng, duong trn, hnh anh
Trang 121
Color lop ny biu din mt mu sc.
Font lop ny biu thi cho mt font d hoa.
FontMetrics l mt lop truu tuong dng d xc dinh cc thuc tnh cua Font.
Tt ca cc thnh phn d hoa trong thu vin Swing duoc nhm trong gi javax.swing. Da
s cc thnh phn trong thu vin Swing du c tip du ngu l J, V du mt nt lnh trong
thu vin Swing c tn l JButton, mt memu c tn l JMenu.
Tt ca nhung lop khc duoc lit k trong hnh duoi dy
Ch : Dung pha trn cc thnh phn giao din swing v awt trong cng mt ung dung.
Chng han nhu dung nn dt mt JButton vo mt Panel v dung nn dt Button vo
JPanel. Vic lm ny c th gy li.
Object
AWTEvent
Font
FontMetric
Color
Grapthics
Componient Container Panel Applet
Window Frame
Dialog
JComponent
JApplet
JFrame
JDialog
Cc thnh phn
khc trong gi
javax.swing duoc k
tha t JComponent
LayoutManage
r
BorderLayout
FlowLayout
GridLayout
CardLayout
GridBagLayout
Trang 122
Mt lop duoc k thua tu lop JComponent duoc th hin trong hnh sau:
2. Mt s phuong thc cua lp Component
Lop Component cung cp cc thuc tnh, phuong thuc chung cho cc lop con cua
n. Sau dy l mt s phuong thuc cua lop Component :
- Dimension getSize(): cho lai di tuong thuc lop Dimension gm width (chiu rng),
height (chiu cao) xc dinh kch thuoc cua mot thnh phan tnh theo pixel.
- void setSize(int width, int height) v void setSize(Dimension d) dt lai kch thuoc cua
thnh phn.
- Point getLocation(): cho lai toa d (kiu Point) trn cng bn tri (toa d gc) cua thnh
phn dang xt.
JComponent
JTextComponent
AbstracButton JMenuItem JCheckBoxMen
JtoggleButton
JMenu
JRadioMenu
JButton
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): dt lai cc toa d duoc chi
dinh cho mt thnh phn.
- Rectangle getBounds(): cho lai duong bin l hnh chu nht Rectangle bao gm toa d
gc v chiu di, chiu rng cua hnh chu nht.
- void setBounds(int x, int y) v void setBounds(Rectangle r):dt lai duong bin cho mt
thnh phn.
- void setForeground(Color c):duoc su dung d dt mu v cho thnh phn d hoa
- void setBackground(Color c):dt mu nn cho thnh phan do hoa. Cc tham s cua hai
hm ny l di tuong cua lop Color s duoc gioi thiu o phn sau.
- Font getFont(): duoc su dung d bit duoc font cua cc chu dang xu l trong thnh
phn d hoa.
- void setFont(Font f):dt lai font chu cho mt thnh phn.
- void setEnabled(boolean b):Nu di s b cua hm getEnabled() l true th thnh phn
dang xt hoat dng bnh thuong, nghia l c kha nng kch hoat (enable), c th tra loi cc
yu cu cua nguoi su dung v sinh ra cc su kin nhu mong mun. Nguoc lai, nu l false
th thnh phn tuong ung s khng kch hoat duoc, nghia l khng th tra loi duoc cc yu
cu cua nguoi su dung.
- Luu : Tt ca cc thnh phn giao din khi khoi tao du duoc kch hoat
- void setVisible(boolean b):Mt thnh phn d hoa c th duoc hin thi ln mn hnh
(nhn thy duoc) hoc bi che giu ty thuc vo di s cua hm setVisible() l true hay
false.
3. Lp Container
Lop Container l lop con cua lop truu tuong Component. Cc lop chua (lop con cua
Container) cung cp tt ca cc chuc nng d xy dung cc giao din d hoa ung dung, trong
d c phuong thuc add() duoc nap chng dng d b sung mt thnh phn vo vt chua v
phuong thuc remove() cung duoc nap chng d g bo mt thnh phn ra khoi vt chua.
4. To 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 cc giao din ung dung GUI.
Kich ban chung d tao ra mt cua s l:
- Tao ra mt frame c tiu d g d, v du My Frame :
JFrame myWindow= new JFrame(My Frame);
- Xy dung mt cu trc phn cp cc thnh phn bng cch su dung hm
myWindow.getContentPane().add() d b sung thm JPanel hoc nhung thnh phn
giao din khc vo Frame:
V du: myWindow.getContentPane().add(new JButton(OK));// Dua vo mt nt
(JButton) c tn OK vo frame
- Dt lai kch thuoc cho frame su dung hm setSize():
myWindow.setSize(200, 300);// Dt lai khung frame l 200 ( 300
- Gi khung frame d lai bng hm pack():
myWindow.pack();
- Cho hin frame:
myWindow.setVisible(true);
Trang 124
II. Trnh quan l hin th| trong Java
Khi thit k giao din d hoa cho mt ung dung, chng ta phai quan tm dn kch
thuoc v cch b tr (layout) cc thnh phn giao din nhu: JButton, JCheckbox,
JTextField, v.v. sao cho tin loi nhat doi voi nguoi su dung. Java c cc lop dam nhim
nhung cng vic trn v quan l cc thnh phn giao din GUI bn trong cc vt chua.
Bang sau cung cp bn lop quan l layout (cch b tr v sp xp) cc thnh phn GUI.
Tn lp M ta
FlowLayout Xp cc thnh phn giao din truoc tin theo hng tu tri qua phai,
sau d theo ct tu trn xung duoi. Cch sp xp ny l mc dinh
di voi Panel, JPanel ,Applet v JApplet.
GridLayout Cc thnh phn giao din duoc sp xp trong cc luoi hnh chu
nht ln luot theo hng tu tri qua phai v theo ct tu trn xung
duoi trong mt phn tu chua. Mi thnh phn giao din chua trong
mt .
BorderLayout Cc thnh phn giao din (t hon 5) duoc dt vo cc vi tr theo cc
huong: north (bc), south (nam), west (ty), east (dng) v center
(trung tm)). Cch sp xp ny l mc dinh di voi lop Window,
Frame, Jframe, Dialog v JDialog.
GridBagLayout Cho php dt cc thnh phn giao din vo luoi hnh chu nht,
nhung mt thnh phn c th chim nhiu nhiu hon mt .
null Cc thnh phn bn trong vt chua khng duoc sp lai khi kch
thuoc cua vt chua thay di.
Cc phuong php thit dt layout
D ly v layout hay d dt lai layout cho vt chua, chng ta c th su dung hai phuong
thuc cua lop Container:
LayoutManager getLayout();
void setLayout(LayoutManager mgr);
Cc thnh phn giao din sau khi d duoc tao ra th phai duoc dua vo mt phn tu chua
no d. Hm add() cua lop Container duoc nap chng d thuc hin nhim vu dua cc
thnh phn vo phn 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, di s index duoc su dung d chi ra vi tr cua cn dt thnh phn giao din
comp vo. Di s constraints xc dinh cc huong d dua comp vo phn tu chua.
Nguoc lai, khi cn loai ra khoi phn tu chua mt thnh phn giao din th su dung cc hm
sau:
void remove(int index)
Trang 125
void remove(Component comp)
void removeAll()
1. Lp FlowLayout
Lop FlowLayout cung cp cc hm tao lp d sp hng cc thnh phn giao din:
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 RI GHT
Di s aligment xc dinh cch sp theo hng: tu tri, phai hay trung tm,
horizongap v verticalgap l khoang cch tnh theo pixel gia cc hng cc ct.
Truong hop mc dinh th khoang cch giua cc hng, ct l 5 pixel.
2. Lp GridLayout
Lop GridLayout cung cp cc hm tao lp d sp hng cc thnh phn giao din:
GridLayout()
GridLayout(int rows, int columns)
GridLayout(int rows, int columns, int hoiongap, int verticalgap)
Tao ra mt luoi hnh chu nht c rows ( columns c khoang cch giua cc hng
cc ct l horizongap, verticalgap. Mt trong hai di s rows hoc columns c th l
0, nhung khng th ca hai, GridLayout(1,0) l tao ra luoi c mt hng.
3.Lp BorderLayout
Lop BorderLayout cho php dt mt thnh phn giao din vo mt trong bn huong: bc
(NORTH), nam (SOUTH), dng (EAST), ty (WEST) v o gia (CENTER).
BorderLayout()
BorderLayout(int horizongap, int verticalgap)
Tao ra mt layout mc dinh hoc c khoang cch giua cc thnh phn (tnh bng
pixel) l horizongap theo hng v verticalgap theo ct.
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 mc dinh l CENTER, nguoc lai, c th chi dinh huong d dt cc thnh
phn comp vo phn tu chua theo constraint l mt trong cc hng trn.
III. Xu l s kin trong Java
Cc ung dung voi GUI thuong duoc huong dn boi cc su kin (event). Vic nhn
mt nt, mo, dng cc Window hay g cc k tu tu bn phm, v.v. du tao ra cc su kin
(event) v duoc gui toi cho chuong trnh ung dung. Trong Java cc su kin duoc th hin
bng cc di tuong. Lop co so nht, lop cha cua tt ca cc lop con cua cc su kin l lop
java.util.EventObject.
Trang 126
Hnh H7-20 Cc lop xu l cc su kin
Cc lop con cua AWTEvent duoc chia thnh hai nhm:
Cc lop m ta v ngu nghia cua cc su kin,
Cc lop su kin o muc thp.
1. ngha cua cc lp
a. ActionEvent
Su kin ny duoc pht sinh boi nhung hoat thuc hin trn cc thnh phn cua GUI. Cc
thnh phn gy ra cc su kin hnh dng bao gm:
- JButton - khi mot nt button duoc khch hoat,
- JList - khi mot muc trong danh sch duoc kch hoat dp,
- JmenuItem, JcheckBoxMenu, JradioMenu - khi mot muc trong thuc don duoc chon,
- JTextField - khi g phm ENTER trong truong vn ban (text).
b. AdjustmentEvent
Su kin ny xy ra khi ta diu chinh (adjustment) gi tri thanh cun (JScollBar)
Scrollbar - khi thuc hin mt ln cn chinh trong thanh truot Scrollbar.
Lop ny c phuong thuc int getValue(): cho lai gi tri hin thoi duoc xc dinh boi ln cn
chinh sau cng.
c. I temEvent
Cc thnh phn cua GUI gy ra cc su kin v cc muc gm c:
java.lang.Object
java.util.EventObject
java.awt.event
ActionEvent AdjustmentEvent ComponentEven
t
ItemEvent TextEvent
ContainerEvent FocusEvent
InputEvent
PaintEvent
WindowEvent
KeyEvent MouseEven
t
java.awt.AWTEvent
Trang 127
- JCheckbox - khi trang thi cua hp kim tra Checkbox thay di.
- CheckboxMenuItem - khi trang thi cua hp kim tra Checkbox ung voi muc cua
thuc don thay di.
- JRadioButton- khi trang thi cua hp chon (Option) thay di.
- JList - khi mt muc trong danh sch duoc chon hoc bi loai bo chon.
- JCompoBox - khi mt muc trong danh sch duoc chon hoc bi loai bo chon.
Lop ItemEvent c phuong thuc Object getI tem(): Cho lai doi tuong duoc chon hay vua bi
bo chon.
d. TextEvent
Cc thnh phn cua GUI gy ra cc su kin v text gm c:
TextArea - khi kt thc bng nhn nt ENTER,
TextField - khi kt thc bng nhn nt ENTER.
e. ComponentEvent
Su kin ny xut hin khi mt thnh phn bi n di/hin ra hoc thay thay di lai kch thuoc.
Lop ComponentEvent c phuong thuc:
Component getComponent()
Cho lai doi tuong tham chiu kiu Component.
f. ContainerEvent
Su kin ny xut hin khi mt thnh phn duoc b sung hay bi loai bo khoi vt chua
(Container).
g. FocusEvent
Su kin loai ny xut hin khi mt thnh phn nhn hoc mt focus.
h. KeyEvent
Lop KeyEvent l lop con cua lop truu tuong InputEvent duoc su dung d xu l cc
su kin lin quan dn cc phm cua bn phm. Lop ny c cc phuong thuc:
int getKeyCode()
- Di voi cc su kin KEY_PRESSED hoc KEY_RELEASED, hm ny duoc su dung d
nhn lai gi tri nguyn tuong ung voi m cua phm trn bn phm.
char getKeyChar()
- Di voi cc su kin KEY_PRESSED, hm ny duoc su dung d nhn lai gi tri nguyn,
m Unicode tuong ung voi k tu cua bn phm.
i. MouseEvent
Lop MouseEvent l lop con cua lop truu tuong InputEvent duoc su dung d xu l cc tn
hiu cua chut. Lop ny c cc phuong thuc:
int getX()
int getY()
Point getPoint()
Cc hm ny duoc su dung d nhn lai toa d x, y cua vi tr lin quan dn su kin do
chut gy ra.
void translatePoint(int dx, int dy)
Hm translate() duoc su dung d chuyn toa d cua su kin do chut gy ra dn (dx,
dy).
int getClickCount()
Trang 128
Hm getClickCount() dm s ln kch chut.
j. PaintEvent
Su kin ny xut hin khi mt thnh phn duoc v lai, thuc t su kin ny xy ra khi
phuong thuc paint()/ update() duoc goi dn.
k. WindowEvent
Su kin loai ny xut hin khi thao tc voi cc Window, chng han nhu: dng,
phng to, thu nho.. mt cua s. Lop ny c phuong thuc:
Window getWindow()
Hm ny cho lai doi tuong cua lop Window ung voi su kin lin quan dn Window
d xay ra.
Kiu su kin Ngun gy ra su kin Phuong thuc dang k, g bo
di tuong lng nghe
Giao din
Listener lng
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. Mt s lp diu hp
Giao din Listener lng nghe
Lop diu hop tuong ung
AcitionListener
Khng c lop diu hop tuong ung
AdjustmentListener AdjustmentAdapter
ItemListener Khng c lop diu hop tuong ung
TextListener
Khng c lop diu hop tuong ung
ComponentListener ComponentAdapter
ContainerListener ContainerAdapter
FocusListener FocusAdapter
KeyListener KeyAdapter
MouseMotionListener MouseMotionAdapter
WindowListener WindowAdapter
Mt s v d minh ha
/* 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 nt lnh
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 cc diu khin
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));
}
}
Lp trnh 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 TRNH CO SO D LIJU
I. Tng quan
Mt hua hen lon cua java l kha nng xy dung cc ung dung CSDL dc lp voi h
nn, cng ngh ny duoc bit dn voi ci tn JDBC (Java Database Connectivity),
JDBC duoc thit k tuong di don gian.
M hnh JDBC dua ra mt tp cc lop v cc phuong thuc d giao tip voi ngn du
liu. JDBC API duoc tch hop vo ngay nn java nn ban khng cn phai ci dt g
thm khi truy cp CSDL.
II. Cc ku trnh diu khin JDBC
Cc trnh diu khin JDBC c th phn thnh 4 kiu sau phu thuc vo cch thuc
hoat dng, cch kt ni voi CSDL.
Kiu 1 : J DBC su dng cu ni ODBC (J DBC-ODBC Bridge )
ODBC l mt cng ngh cua Microsoft dng d kt ni dn cc h co so du liu
thng qua trnh diu khin Driver cua h co so du liu d. Mi h co so du liu cung
cp mt trnh diu khin (Driver) c kha nng lm vic (doc, cp nht,..) duoc co so
du liu cua chng . Trnh diu khin ny s duoc dng k voi b quan l ODBC .
ODBC API l mt tp cc hm API d truy cp vo CSDL thng qua cc trnh diu
khin, nguoi lp trnh s su dung cc hm API trong giao din ny d truy cp vo
CSDL.
Cu ni JDBC ODBC l mt trnh diu khin su dung m java d goi lai cc hm
trong JDBC API. Bng cch ny ban c th kt ni duoc voi nhiu h quan tri co so
du liu khc nhau.
D c th kt ni vo mt h CSDL cu th no d (chng han nhu: Access, SQL
Server, MySQL) su dung cu ni JDBC-ODBC ban cn phai c:
- Trnh diu khin (Driver) cua dng d truy cp vo h CSDL d. Thng thuong
trnh diu khin ny duoc cung cp boi chnh cc hng san xut h CSDL v n
thuong duoc ci dt vo trong my khi ban ci dt h quan tri CSDL.
- Cu ni JDBC-ODBC, dy l trnh diu khin duoc cung cp min ph boi hng
Sun v n duoc ci dt tu dng khi ban ci dt JDK.
Trang 144
V rng trnh diu khin ODBC phai duoc ci dt vo trong my truoc khi ban c th
su dung nn n chi thch hop cho cc ung dung my don, hoc duoc chay trn my
chu trong m hnh nhiu tng (Multi - tier), khng thch hop cho cc ung dung chay
trn my khch nhu: Aplet, Fat Client.
Kiu 2 : J DBC kt ni trc tip vi cc trnh diu khin co so d liu .
Kiu kt ni ny su dung m java truc tip goi cc hm trong trnh diu khin dc
th cua mi h co so du liu m khng phai qua trung gian ODBC . Do vy kiu kt
ni ny nhanh v hiu qua hon cu ni JDBC ODBC, nhung phai c trnh diu
khin co so dc th do nh pht trin cung cp hoc cua mt hng thu ba no d.
Java Application ,
Applet , Servlet
JDBC Driver
ODBC
Database driver
Database
M
JAVA
M Native
{
{
{
M hnh truy cp CSDL qua cu ni JDBC
Trang 145
Kiu 3 : J DBC kt ni thng qua cc ng dng mng trung gian
Voi kiu kt ni ny, my chu s chiu trch nhim kt ni voi co so du liu .
My khch chi su dung nhung trnh diu khin gon nhe (thin) c kha nng giao tip
voi ung dung trung gian thng qua mang d truy vn du liu .
Kiu 4 : J DBC kt ni thng qua cc trnh diu khin hon ton m java
Java Application ,
Applet , Servlet
JDBC Driver
Database driver
M
JAVA
M Native
{
{
Database
M hnh kt ni truc tip
Java Application ,
Applet , Servlet
JDBC Driver
Java Middle Ware
Java Native driver
Database
M
JAVA
M JAVA
{
{
Mng
Trang 146
Kiu ny cho php my khch su dung trnh diu khin gon nhe ni kt truc tip vo trnh
diu khin co so du liu dc th trn my chu o xa thng qua mang Internet .
III. Cc lp trong JDBC API dng d truy cp CSDL
JDBC API bao gm cc lop v cc giao din duoc chua trong hai gi: java.sql v
javax.sql. Gi java.sql chua cc giao din v gi cho php ta thuc hin cc thao tc co ban
di voi CSDL, gi javax.sql chua cc lop v giao din gip ta thuc hin cc tnh nng cao
cp.
1. Mt s giao din v lp trong gi java.sql
a) Mt s giao din
Tn giao din M ta nghia
CallableStatement Giao din chua cc phuong thuc cho php ta lm vic voi thu
tuc luu tru ni
DatabaseMetaData Cho php ta xem cc thng tin v CSDL
PreparedStatement Giao din ny cho php ta thuc thi cc cu lnh SQL chua
tham s
ResultSetMetaData
Connection Th hin mt kt ni dn CSDL
Driver Giao din m mi trnh diu khin phai ci dt
ResultSet Th hin mt tp cc ban ghi ly v tu CSDL
Statement Giao din cho php ta thuc hin cc pht biu SQL
Java Application ,
Applet , Servlet
JDBC Driver
Java Native driver
CSDL
M
JAVA
M JAVA
{
{
Internet
Trang 147
b) Mt s lp
Tn lp nghia
Date Lop biu din kiu DATE
DriverPropertyInfo Chua cc thuc tnh cua trnh diu khin d nap
Timestamp Lop biu din cho SQL TimeTemp
DriverManager Lop quan l cc trnh diu khin
Time Lop biu din kiu DATE
Types Lop dinh nghia cc hng tuong ung voi cc kiu du liu SQL, hay
cn goi l kiu du liu JDBC
2. Mt s lp v giao din trong gi javax.sql
Tham khao ti liu v JDBC
IV. Kt ni CSDL vi JDBC
D c th lm vic voi CSDL, mt chuong trnh java (hay bt cu chuong trnh vit
bng ngn ngu no khc) phai tun theo cc buoc sau:
Mo kt ni dn CSDL.
Thuc hin cc lnh lm vic voi CSDL nhu: truy vn, cp nht
Dng kt ni, giai phng ti nguyn.
Cc buoc d xy dung mt ung dung CSDL voi JDBC:
1. Chun bj
a) Ci dt J DBC v trnh diu khin:
Mt ung java chi c th kt ni v lm vic duoc voi du liu trong CSDL thng qua
cc trnh diu khin v cc thu vin JDBC API.
Truoc khi truy cp vo h CSDL no ban phai c trong tay trnh diu khin tuong
ung voi h CSDL d. Ban c th download cc trnh diu khin cho mt s h CSDL quen
thuc tu dia chi java.sun.com/jdbc
b) Ci dt CSDL
Ban cn lua chon v ci dt mt h quan tri CSDL, d quan tri phn du liu cua
chuong trnh. Dy l lua chon cua ban tuy theo tnh cht cua du liu trong chuong trnh
cung nhu muc tin ban c d c th mua duoc h quan tri d.
Sau khi ban lua chon duoc h quan tri CSDL ph hop ban tin hnh ci dt CSDL:
tao bang, view, thu tuc luu tru..
Ch : D c th truy cp vo CSDL cua h quan tri CSDL no th ban phai c trong
tay trnh diu khin tuong ung.
2. Thit lp kt ni
Dy l buoc quan trong nht bao gm hai buoc:
Trang 148
a) Np trnh diu khin
JDBC su dung mt b trnh quan l diu kin (DiverManager), mi trnh diu khin
(Driver) cho php ta lm vic voi mt CSDL cu th, cho nn nu ban c 3 CSDL do
3 nh cung cp khc nhau cung cp th ban cn phai c 3 trnh diu khin khc nhau.
D nap v dng k trnh diu khin ban su dung lnh Class.forName(URL)
Trong d URL l mt chui m ta cc thng tin v tn cua trnh diu khin dng kt
ni voi co so du liu, chng han lnh
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
dng d nap trnh diu khin JDBC-ODBC
Ch : Vi mi trnh diu khin khc nhau th URL cua phuong thc Class.forName()
s khc nhau. Nn d c th nap dng trnh diu khin ban nn thao khao ti liu di km
cua cc trnh diu khin, d bit duoc URL tuong ung.
b) To mt kt ni
Buoc tip theo ban tao mt kt ni dn CSDL thng qua trnh diu khin m ban
vua nap o buoc trn. Doan m dng d tao mt kt ni thng thuong nhu sau:
Connection con = DriverManager.getConnection(url, "myLogin", "myPassword");
Trong d :
- url l chui chua thng tin kt ni dn CSDL, nu ban su dung cu ni JDBC-ODBC th
url l jdbc:odbc:DataSourceName, chng han ti d tao mt DNS tn l TestDB voi tn
truy cp l theht, mt khu truy cp l theht th cu lnh kt ni dn CSDL l
Connection con = DriverManager. getConnection(jdbc:odbc:TestDB,"theht", "theht");
- myLogin l tn truy cp, nu mt khng c mt khu ban c th truyn cho n mt xu
rng
- myPassword l mt khu truy cp, nu mt khng c mt khu ban c th truyn cho n
mt xu rng
Ch : Thng thung chui URL c djnh dng nhu sau:
jdbc:subprotocol:subname
Trong d:
subprotocol l giao thuc con tuong ung voi loai CSDL
subname l tn cua ngun du liu (Thng thuong n l tn cua CSDL)
Mt vi v du:
V d 1: Nap trnh diu khin v kt ni dn CSDL cua MySQL
Trang 149
Trnh diu khin d tury cap vo CSDL cua MySQL, ban c th download tai dia chi
MySQL.com, sau khi download ban c mot tp tin duy nhat d duoc nn theo chuan jar, dt
classpath tro dn tp tin ny
- Nap tnh diu khin cua MySQL
Class.forName("com.mysql.jdbc.Driver");
- Kt ni dn CSDL
Connection conn = DriverManager.getConnection(
"jdbc:mysql://ServrName/DBName?user=UserName&password=Pass");
- ServerName: l tn cua my chu CSDL
- DBName: l tn cua CSDL
- UserName: l tn truy cp CSDL
- Pass: l mt khu truy cp
V d 2: Nap trnh diu khin v kt ni dn CSDL cua SQL Server 7.0, 2000
C rt nhiu trnh diu khin cho MS SQL Server, da phn cc trnh diu khin du l cc
san phm thuong mai, c mt trnh diu khin m ta nn su dung d l trnh diu khin do
chnh hng Microsoft cung cp, trnh diu khin ny hon ton Free v h tro dy du cc
tnh nng cua Sql Server.
- Dia chi download www.microsoft.com
- Sau khi download v tin hnh ci dt ban s c 3 tp tin trong thu muc ci dt:
install_dir/lib/msbase.jar
install_dir/lib/msutil.jar
install_dir/lib/mssqlserver.jar
install_dir: l thu muc ci dt
- Dt classpath tro dn 3 tp tin trn
- Np trnh diu khin
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
- Kt ni dn CSDL
Connection conn = DriverManager.getConnection(
" jdbc:microsoft:sqlserver://ServerName:ServerPort;DatabaseName=DBName",
"UserName","Password");
hoc
Connection conn = DriverManager.getConnection
"jdbc:microsoft:sqlserver://ServerName:ServerPort;User=UserName;Password=Pass
word;DatabaseName=DBName");
Trang 150
+ServerName: L tn cua my chu SQL
+ServerPort: S hiu cng cua SQL, nu trong qu trnh ci dt m ban khng dt
lai th gi tri ny l 1433
+UserName: Ti khoan dng nhp vo SQL
+Password: Mt khu tuong ung voi ti khoan dng nhp
- Chuyn CSDL lm vic
conn.setCatalog("DBName");
+ DBName: l tn CSDL
V du hon 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 d 3: Nap trnh diu khin v kt ni dn CSDL cua Access voi cu ni JDBC-ODBC
cua Sun System
truy cap vo CSDL cua Access ta khng can phai tai xuong v ci dt vo my driver
no ca v n duoc tch hop vo Java, trnh diu khin ny do sun cung cap n c tn l cau
noi JDBC-ODBC
- Np trnh diu khin
Class.forName("sun.jdbc.odbc. J dbcOdbcDriver ");
- Mo kt noi bng cch su dung DataSource Name
+ Vo control panel chay chuong trnh ODBC DataSource 32 bit
+ Tao mt DataSource Name c tn l MyDB
Connection conn = DriverManager.getConnection(" jdbc:odbc:MyDB");
- Mo kt noi bng cch su dung File DataSource
Connection conn = DriverManager.getConnection(jdbc:odbc:Driver={Microsoft
Access Driver (*.mdb)};DBQ=C:/Path/DatabaseName.mdb";)
MyDB: tn cua DataSource Name m ban d tao
Path: duong dn dn CSDL
Trang 151
DatabaseName: tn CSDL
V du hon 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 lm vic vi 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 bng
stmt.executeUpdate("Create Table tbl(a text(50), b text(50))");
//Chn 1 bn ghi vo CSDL
stmt.execute("Insert Into tbl values('Xin cho'','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 d 4: Nap trnh diu khin v kt ni dn CSDL cua Oracle 8i, 9i
Trnh diu khin d tury cap vo CSDL cua Oracle, ban c th tm thay n trong thu muc
%ORACLE_HOME%/JDBC/lib
Class.forName("oracle.jdbc.OracleDriver ");
// Ly v kt ni dn CSDL
Connection conn = DriverManager.getConnection("jdbc:oracle:oci8:@theht",
"theht","abc");
- @theht l tn cua my chu CSDL
- theht l tn truy cp CSDL
- abc l mt khu truy cp
Trang 152
V. Tuong tc vi CSDL
Tt ca cc lnh m ta dng d tc dng ln CSDL du c th thuc hin thng qua
mt trong ba di tuong sau:
Di tung M ta
Satement Dng d thuc thi cc lnh SQL khng c tham s
PreparedStatement Dng d thuc thi cc lnh SQL c chua tham s
CallableStatement Dng d lm vic voi thu tuc luu tru ni
1. To ra mt J DBC Statements
Mt di tuong Statements s gip ban gui mt lnh SQL dn h quan tri CSDL, sau
khi tao di tuong Statements ban c th thuc hin cc lnh SQL nhu SELECT d ly
v du liu hay UPDATE d cp nht du liu, d tao di tuong Statements ban su
dung phuong thuc createStatement cua di tuong connection m ban vua tao ra
trong buoc II.
Statement stmt = con.createStatement();
Tai thoi dim ny ban chua c pht biu SQL no d truyn dn CSDL, by gio
chng ta s su dung phuong thuc execute cua di tuong ny d thuc thi mt lnh
SQL, chng han nhu doan lnh sau su dung phuong thuc executeUpdate d thuc thi
mt cu lnh truy vn cp nht
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 cc tp kt qua c th cp nht v c th cun con tro
theo ca hai chiu, d tao ra tp kt qua c th cp nht duoc v cho php cun ca hai chiu
ban su dung mu sau:
Statement stmt = con.createStatement(ResultSetType, ConcurencyType);
Trong d :
Tham s ResultSetType cho bit tp kt qua (ResultSet) nhn duoc khi thuc thi cu lnh
executeQuery() c cun duoc hay khng.
Tham s ConcurencyType tnh cht cua tp kt qua (ResultSet) nhn duoc khi thuc thi
cu lnh executeQuery() c cho php cp nht hay khng. Thuc ra vic c cp nht
duoc hay khng cn phu thuc vo trnh diu khin v h quan tri c h tro cp nht
hay khng.
Sau dy l bang cc gi tri m tham s ResultSetType c th nhn
Trang 153
Kiu ResultSet
TYPE_FORWARD_ONLY
Cho bit ResultSet nhn duoc chi c th duyt theo mt
chiu tu BOF dn EOF
TYPE_SCROLL_INSENSITIVE
Cho php duyt theo ca hai chiu nhung khng thy
duoc su thay di du liu cua nguoi dng khc
TYPE_SCROLL_SENSITIVE
Cho php duyt theo ca hai chiu nhung thy duoc su
thay di du liu cua nguoi dng khc
Sau dy l bang cc gi tri m tham s ConcurencyType c th nhn
Kiu ConcurencyType
CONCUR_READ_ONLY
Cho bit ResultSet khng th cp nht duoc, hay chi doc
CONCUR_UPDATEABLE
Cho bit ResultSet c th cp nht duoc
a) Thc hin cc lnh DDL (Data Difinetion Language)
D thuc thi cc lnh DDL ban su dung phuong thuc executeUpdate cua di tuong
Statement theo mu:
stmt.executeUpdate(DDL_SQL_STRING);
Trong d:
stmt l mt di tuong thuc lop Statement
DDL_SQL_STRING l mt cu lnh DDL
Ch : Phuong thuc executeUpdate tra v gi tri 0 nu cu lnh m n thuc thi l mt cu
lnh DDL
b) Thc thi cc lnh cp nht CSDL
D thuc thi cc lnh cp nht nhu: INSERT, UPDATE, DELETE ban su dung
phuong thuc executeUpdate() cua di tuong Statement theo mu:
stmt.executeUpdate(DML_SQL_STRING);
Trong d:
stmt: l mt di tuong thuc lop Statement
DML_SQL_STRI NGl mt cu lnh cp nht
Ch : Phuong thc executeUpdate tra v mt s nguyn th hin s ban ghi duc anh
huong sau lnh ny, d bit duoc s ban ghi duoc anh huong ban c th thuc hin theo mu
sau:
[int recordEffect=] stmt.executeUpdate(DML_SQL_STRING);
V d1: Thm mt ban ghi vo bang sinhvien
stmt.executeUpdate(INSERT INTO sinhvien(masv, tensv) values (\01\, \Nguyn
vn An);
V d2: Xo cc ban ghi cua bang sinhvien c masv=01
stmt.executeUpdate(DELETE sinhvien WHERE masv=01);
Trang 154
V d 3: Sua lai tn cua sinh vin c masv=01 thnh Nguyn Vn B
stmt.executeUpdate(UPDATE sinhvien SET tensv=\Nguyn Vn B\ WHERE
masv=01);
Cp nht li d liu
D cp nht lai du liu ban su dung mnh d UPDATE SQL, thuc thi chng thng
qua phuong thuc executeUpdate
V d 4: ban mun cng thm phu cp cho tt ca cc nguoi c trnh d dai hoc ln 10 dng
ban lm
stmt.executeUpdate( "UPDATE COFFEES " + "SET CP=PC+10 WHERE
td=dh);
Thm ban ghi vo bang CSDL
D chn du liu vo bang ban su dung phuong thuc executeUpdate cua di tuong
Statement, v du ban mun chn thm mt ban ghi vo bang COFFEES ban lm 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 liu tu bang CSDL ban su dung phuong thuc executeUpdate cua di
tuong Statement. V du ban mun tt ca cc ban ghi cua bang COFFEES ban lm
sau:
Statement stmt = con.createStatement();
stmt.executeUpdate( "DELETE FROM COFFEES");
c) Thc thi cu lnh truy vn (Query Language)
D thuc thi cu lnh truy vn ban su dung phuong thuc executeQuery() cua di
tuong Statement theo mu sau:
ResultSet rs=stmt.executeQuery(QUERY_SQL_STRING);
Trong d:
stmt: l mt di tuong thuc lop Statement
QUERY_SQL_STRI NG l mt cu lnh truy vn du liu
rsl mt di tuong cua lop ResultSet
Ch : Phuong thuc executeQuery tra v mt tp kt qua tu CSDL duoc chua trong di
tuong ResultSet, nn thng thuong ban s ly v tham chiu dn kt tp qua bng cch:
ResultSet rs=stmt.executeQuery(QUERY_SQL_STRING);
Trang 155
V du sau ly v tt ca cc ban ghi cua bang SinhVien v hin thi ra mn hnh
ResultSet rs=stmt.executeQuery(SELECT * FROM SinhVien);
While(rs.next())
{ //.. Xu l tp kt qua
}
d) Xu l tp kt qua ResultSet
Cc phuong thc dng d di chuyn con tro
Cc phuong thuc sau dng d di chuyn con tro:
Phuong thc nghia
next
Di chuyn con tro sang ban ghi k trong tp ban ghi, phuong thuc tra
v true nu vic di chuyn l thnh cng nguoc lai cho false
previous
Di chuyn con tro v ban ghi truoc ban ghi hin tai, phuong thuc tra v
true nu vic di chuyn l thnh cng nguoc lai cho false
last
Di chuyn con tro v ban ghi cui cng trong tp ban ghi, phuong thuc
tra v true nu vic di chuyn l thnh cng nguoc lai cho false
first
Di chuyn con tro v ban ghi du tin trong tp ban ghi, phuong thuc
tra v true nu vic di chuyn l thnh cng nguoc lai cho false
afterLast
Di chuyn con tro v truoc ban ghi du tin trong tp bn ghi
beforeFirst
Di chuyn con tro v sau ban ghi cui cng trong tp ban ghi
absolute(int pos)
Di chuyn con tro v ban ghi thu pos tnh tu ban ghi du tin nu pos
l s duong, hoc di chuyn v ban ghi thu pos tnh tu ban ghi cui
cng nu pos l s
relative(int pos)
Di chuyn con tro v truoc ban ghi hin tai pos ban ghi nu pos l s
m, hoc di chuyn v pha sau pos ban ghi so voi ban ghi hin tai nu
pos l s duong
Su dng cc phuong thc getXXX
Ta su dung phuong thuc getXXX d nhn v gi tri hin tai cua mt ct tuong ung, tuy
theo kiu du liu cua ct m ban su dung phuong thuc getXXX tuong ung, v du nu
ct c kiu l VARCHAR th ban su dung phuong thu getString
V d: lit k tt ca cc 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 ct //COF_NAME c kiu VARCHAR
String s = rs.getString("COF_NAME");
float n = rs.getFloat("PRICE");
// Su dung phuong thuc getFloat v ct PRICE c kiu float
Trang 156
System.out.println(s + " " + n);
}
Ch : Ban c th su dung thu tu ct khi ly v du liu thay cho tn ct
Chng han trong v du trn 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 dy l bang cc phuong thc tuong ng vi kiu d liu 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 trn vi tr duoc dnh x trn hng cua phuong thuc getXXX, th ta c
th su dung phuong thuc ny d nhn v gi tri cua ct c kiu du liu tuong ung, vi
tr dnh X th phuong thuc d l phuong thuc su dung thch hop nht
Cp nht tp ResultSet
Trong phn truoc ta dng cc lnh SQL- DML d cp nht truc tip vo bang cua
CSDL. Trong phn ny ta su dung cc phuong thuc trong JDBC 2.0 d thuc hin cung
cng vic d.
Diu ban cn phai ch l ta cp nht du liu cua bang thng qua cc ResultSet, th
nn cc ResultSet ny cn phai l cc ResultSet cp nht duoc.
Ta c cc phuong thuc updateXXX() khc nhau ung voi cc kiu du liu m JDBC
h tro. Tuong tu nhu phuong thuc getXXX() khi ta nhn thng tin tu bang. Nhu
updateFloat(),updateInt(),updateString(),
Sau khi gn ga tri cho cc truong bng cc phuong thuc updateXXX() tuong ung,
ban xc nhn vic cp nht bng phuong thuc updateRow(). Phuong thuc ny hoat dng
tuong tu nhu phuong thuc commit(), phuong thuc updateRow() c nhim vu ghi lai su thay
di di voi voi hng hin tai (dang sua) vo trong bang CSDL trn dia.
Nhu vy khc voi cc lnh SQL-DML, co ch cp nht ny chi c tc dung di voi
ban ghi hin hnh. Th nn d sua lai ban ghi no ban phai di chuyn con tro ban ghi vo
ban ghi cn sua bng mt trong cc phuong thuc d lit trong phn truoc.
Ta cung c mt phuong thuc tuong tu nhu phuong thuc rollback() l phuong thuc
cancelRowUpdate(). Khi goi phuong thuc ny cc thay di do goi phuong thuc
updateXXX() k tu sau cu lnh updateXXX() ln truoc s bi v hiu ho.
V d: Cp nht ResultSet
rs.first(); // Nhay dn ban ghi du tin
rs.updateString(tensv, Nguyn Van Hung); // gn ga tri moi cho ct tensv
rs.updateRow(); // Xc nhn su thay di
rs.last(); // Nhay dn ban ghi cui cng
rs.updateString(tensv, Nguyn Van Dat); // gn ga tri moi cho ct tensv
rs.cancelRowUpdate(); // Huy bo vic cp nht trn
Thm ban ghi mi
Trang 158
Ngoi vic su dung cc lnh SQL-DML d thm cc ban ghi trong bang. ta cn c
th thm chng bng cch thng qua cc phuong thuc cua di tuong ResultSet cp nht
duoc.
Mt ResultSet cp nht duoc lun tn tai mt ban ghi dc bit goi l insertrow d
dng cho vic thm mt ban ghi moi. Ban ghi ny khng l mt thnh phn cua ResultSet.
Thuc cht n chi l mt vng dm d thm mt ban ghi moi.
Cc buc d thm mt ban ghi mi vo tp ResultSet
Di chuyn con tro dn ban ghi tam insertrow bng phuong thuc moveToInsertRow();
Thuc hin vic din cc gi tri vo cc ct tuong ung bng cc phuong thuc
updateXXX();
Sau khi chc chn rng cc gi tri thm vo l dng. Ta goi phuong thuc insertRow()
d xc nhn vic thm moi ban ghi vo bang v ResultSet.
V d: Thm ban ghi vo ResultSet
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // Nap trnh diu khin
Connection cn=DriverManager.getConnection("jdbc:odbc:t"); // Ly v kt ni
Statement st=cn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE); //Tp ResultSet c th cp nht duoc
ResultSet rs=st.executeQuery("SELECT * FROM sinhvien"); //Ly v tp ResultSet
rs.moveToCurrentRow(); //Buc 1: Di chuyn con tro dn ban ghi tam d thm moi
rs.updateString("masv","005"); //Buc 2: Gn ga tri cho cc ct bng phuong
//updateXXX() tuong ung
rs.updateString("tensv","Nguyn Tu Ho");
rs.updateDate("namsinh",new Date(2004,5,30));
rs.insertRow(); //Buc 3: Xc nhn su thm moi
Ch :
+Nu khi gn gi tri cho cc ct m ta bo st mt s ct khng gn gi tri khi d cc
ct d s nhn cc gi tri NULL. Khi d nu ct d c thuc tnh khng cho php nhn ga
tri NULL th ban s nhn duoc mt ngoai l SQLException.
+ Khng c phuong thuc d ta huy bo vic thm moi ban ghi. Tuy nhin d huy bo
vic thm moi ban chi cn di chuyn con tro ban ghi ra khoi ban ghi tam bng mt trong
cc phuong thuc di chuyn chuyn con tro.
Xo ban ghi
D xo mt ban ghi ban c th su dung cc lnh SQL-DML, ban c th thuc hin
vic ny bng cc phuong thuc cua di tuong ResultSet.
Cc buoc d xo mt ban ghi khoi ResultSet
Trang 159
Di chuyn con tro dn ban ghi cn xo
Goi phuong thuc deleteRow();
Ch : Tuy vo trnh diu khn m vic xo duc thc hin ngay hay ch l dnh du
xo. d bit chc chn ban nn tham khao ti liu di km voi Driver ban su dung.
V d: Xo ban ghi
rs.first(); // Xa ban ghi du tin
rs.deleteRow();
rs.absolute(3); // Xo ban ghi thu 3
rs.deleteRow();
rs.last(); // Xo ban ghi cui cng
rs.deleteRow();
2. Su dng di tung Prepared Statements
Khi no su dung di tuong Prepared Statements?, cu tra loi duoc phn tch sau:
- Mi khi thuc thi mt lnh SQL th DBMS lai phai phn tch lai c php cua lnh, sau d
ti uu lnh SQL, cng vic ny mt rt nhiu thoi gian, nu ban cn chn 100 dng vo
CSDL, th th ban phai su dung 100 lnh executeUpdate d chn 100 dng, do vy phai
mt 100 ln phn tch lnh, 100 ln ti uu ho lnh, ban s dt cu hoi c cc no m chi
cn phn tch lnh, ti uu lnh chi mt ln m thi, vng cch d chnh l di tuong
Prepared Statements.
- Di khi ban mun thuc hin mt lnh SQL m cc thng s cu th lai chua bit, trong
truong hop ny bt buc ban phai su dung truy vn tham s ho, tuy nhin di tuong
Statement lai khng h tro truy vn tham s ho
V d: Sau cp nht mt s dng cua bang COFFEES su dung di 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 thy qua v du trn d:
+ Ly v di tuong PreparedStatement ban su dung phuong thuc prepareStatement
cua di tung Connection v truyn vo mt cu lnh SQL chua tham s
+ Gn gi tri cho cc tham s ban su dung phuong thuc setXXX(index, value)
+ Thuc thi truy vn voi cc tham s vua cung cp ban goi phuong thuc
executeUpdate() cua doi tuong prepareStatement.
3. Gi thu tc luu tr bng J DBC
JDBC cho php ban goi mt thu tuc luu tru trong CSDL, tu trong ung dung vit
bng java, d c th goi mt thu tuc luu tru truoc tin ban tao ra mt di tuong
CallableStatement di tuong ny c phuong thuc prepareCall gip ban c th goi thu
tuc luu tru ni
Cc buoc: 1. CallableStatement cs = con.prepareCall("{call tn_thu_tuc_luu_tru}");
2. Goi thu tuc executeXXX() tuong ung d thuc thi thu tuc luu tru.
VI. Quan l giao d|ch
Khi mt kt ni duoc tao, n duoc dt trong trang thi auto- commit, tuc l n tu
dng commit sau khi thuc thi thnh cng mt lnh don, tuy nhin ban c th dt lai
ch d auto- commit d ban c th quyt dinh commit hay rollback lai mt nhm
lnh. Nhu doan m sau:
con.setAutoCommit(false);
V d:
// Tt ch d auto-commit
con.setAutoCommit(false);
// tc dng ln 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();
// Xc nhn commit
con.commit();
// dt lai ch d auto-commit
con.setAutoCommit(true);
V d: Lp truy cp 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 d: Lop truy cp 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 d:Lp truy cp 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 TRNH SOCKET
I. Cc kin thc lin quan
Truoc khi bt du hoc bi ny cc ban cn doc lai cc kin thuc lin quan sau:
- Giao thuc, yu cu ti thiu cc ban phai nm duoc 3 giao thuc : IP, TPC, UDP
- Cch dnh dia chi IP, dia chi dang tn min, giao thuc chuyn di dia chi IP thnh dia chi
tn min, v nguoc lai
- Mt s dia chi dc bit: dia chi lp, dia chi broadcash, multicash
- Cng giao thuc
- Phn bit duoc su khc nhau, ging nhau giua 2 giao thuc TCP v UDP
1. Gii thiu Socket
Socket l mt giao din lp trnh ung (API - Application Program Interface) dung
mang, thng qua giao din ny ta c th lp trnh diu khin vic truyn thng giua 2 my
su dung cc giao thuc muc thp nhu TCP, UDP, Socket l mt su truu tuong ho o muc
cao, c th tuong tuong, n nhu l mt thit bi truyn thng 2 chiu tuong tu nhu tp tin,
chng ta gui/ nhn du liu giua 2 my, tuong tu nhu vic doc/ ghi trn tp tin.
D lin lac thng qua Socket, ta cn tin hnh cc thao tc:
- To lp hay mo mt Socket
+ Gn mt Socket voi mt dia chi, dia chi ny chnh l dia chi cua my m n cn lin lac
+ Thuc hin vic lin lac, c 2 kiu lin lac tuy thuc vo ch d kt ni:
a) Lin lc trong ch d khng kt ni:
Hai tin trnh lin lac voi nhau khng kt ni truc tip
mi thng dip gui di phai km theo dia chi cua nguoi nhn
Hnh thuc lin lac ny c dc dim:
nguoi gui khng chc chn thng dip cua ho c dn tay nguoi nhn khng
mt thng dip c th gui nhiu ln
thng dip gui sau c th dn dch truoc thng dip gui truoc d
b) Lin lc trong ch d kt ni:
C mt duong kt ni ao duoc thnh lp giua 2 tin trnh, truoc khi mt kt ni duoc
thnh lp th mt trong 2 tin trnh phai doi tin trnh kia yu cu kt ni, c th su dung
Socket d lin lac theo m hnh Client/Server. Trong m hnh ny server su dung loi goi
listen v accept d lng nghe v chp nhn mt yu cu kt ni
2. Lp trnh Socket trong java
Java cung cp mt s lop cho php cc ung dung mang c th trao di voi nhau qua
co ch Socket, cu th lop Socket cung cp cho ta co ch lin lac trong ch d kt ni (su
dung giao thuc TCP) v lop DatagramSocket cho php cc ung dung mang lin lac voi
nhau trong ch d khng kt ni (su dung giao thuc UDP), tt ca cc lop lin quan dn vic
lp trnh Socket duoc java nhm lai v d trong gi java.net
II. Khao st mt s lp trong gi java.net
1. Lp I netAddress
Mi mt my khi tham gia truyn thng cn phai c mt dinh danh, dinh danh ny
phai l duy nht, dinh danh ny duoc th hin bng dia chi IP hoc dia chi duoi dang
Trang 165
tn min. Lop InetAddress biu thi cho mt dia chi cua mt my no d, khi ta mun
lin lac voi mt my o xa, ta phai bit duoc dia chi IP cua my o xa, tuy nhin dia
chi IP th rt kh nho, di khi ta khng th bit chnh xc dia chi IP cua my d, boi
v nhiu nguyn nhn khc nhau nhu: my d khoi dng tu xa hoc duoc ni vo
nh cung cp dich vu Internet, do vy mi ln kt ni vo nh cung cp dich vu ISP
ta lai c 1 dia chi IP khc nhau. Vy th th lm th no d ta c th lin lac voi my
o xa khi ta chi bit dia chi my d duoi dang tn min?, cu tra loi l lop
InetAddress d lm diu d cho ta, lop ny tu dng chuyn dia chi dang tn min
thnh dia chi IP v nguoc lai.
Lop I netAddress cung cp mt s phuong thuc tinh (static) dng d chuyn di dia chi
duoi dang tn min thnh dia chi IP v nguoc lai. C mt s phuong thuc sau m ban cn
quan tm:
Phuong php M ta
Public voidequals( Object obj) So snh 2 di tuong
Publicbyte[] getAddress() Ly v dia chi IP duoi dang mang byte
publicstatic InetAddress[]
getAllByName(String host)
throws UnknownHostException
Tra v mang di tuong InetAddress, v mt my
c th c nhiu dia chi IP (do c nhiu card
mang), nn phuong thuc ny tra v mt mang
chua tt ca cc dia chi tuong ung voi tn min.
publicstatic InetAddress
getByName(String host)
throws UnknownHostException
Tra lai di tuong InetAddress c tn duoc chi
ra, tn ny l mt xu k tu duoi dang tn min
hoc dia chi IP
publicString getHostAddress() Tra v dia chi IP cua my chu
publicString getHostName() Tra v tn cua my chu
publicstatic InetAddress
getLocalHost()
throws UnknownHostException
Tra v di tuong InetAddress kt hop voi chnh
my d
publicboolean isMulticastAddress() Kim tra xem dia chi ny c phai l dia chi
Multicast khng
Ch :
Trong gi java.net cn lop Inet4Address v lop Inet6Address hai lop ny th hin cho
cc dia chi IP version 4 v IP version 6, n gm tt ca cc thnh phn cua lop
InetAddress
Ta cn thm mnh d import lop java.net.I netAddress truoc khi c th su dung n.
Trang 166
Phuong thuc getByNames c gng phn giai tn min thnh dia chi IP tuong ung bng
cch: Truoc tin n di tm trong cache, nu khng tm thy n tm tip trong tp host,
nu vn khng tm thy n s c gng kt ni dn my chu DNS d yu cu phn giai
tn ny thnh dia chi IP, nu khng th phn giai duoc tn ny th n s sinh ra mt
ngoai l UnknownHostException, th nn ban cn dt chng vo mt khi try ..catch.
V d 1: Minh hoa cch su dung cc phuong thuc getByName d tao ra mt 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");
}
}
}
Kt qua chay chuong trnh nhu sau:
www.theht.edu.vn/127.0.0.1Ngoi cch truyn vo phuong thuc getByName mt xu k tu
th hin tn my ban ta th truyn vo mt xu th hin dia chi IP cua my nhu sau:
InetAddress address = InetAddress.getByName("192.168.101.1");
V d 2: Tao ra mt InetAddress tuong ung voi my 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.");
}
}
}
Kt qua chay chuong trnh nhu sau:
Trang 167
theht1/192.168.101.1V du 3: Nu my ban c ci nhiu card mang ban c th ly v mt
mang cc 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");
}
}
}
Kt qua chay chuong trnh 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 kt qua nhu trn l do my cua ti
c ci 4 card mang, tuong ung voi mi card mang ti dt mt dia chi IP cho n.
Nu my cua ban c ni mang Internet ban c th kim tra xem my chu
www.microsoft.com cua Microsoft duoc ci bao nhiu b giao tip mang bng cch
thayInetAddress.getAllByName("www.theht.edu.vn"); boi
InetAddress.getAllByName("www.microsoft.com");
V d 4: Ly v tn my khi bit dia chi IP cua n, d ly v tn cua my ta su dung
phuong thuc getHostNamenhu 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
Kt qua ra nhu sau:
theht
V d 5: Ly v dia chi IP cua my khi bit tn cua my, d ly v dia chi IP cua my 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.");
}
}
}
Kt qua in ra nhu sau:
My address is 192.168.101.1Ta c th ly v dia chi IP tuong ung voi mt tn min bt ky
khng nht thit l my cuc b nhu trn, chng han ban c th ly v dia chi IP cua my
www.theht.edu.vn hoc 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.");
}
}
}
Kt qua in ra nhu sau:
Address is 192.168.101.1
Trang 169
V d 6: Kim tra xem hai dia chi tn min c cng mt dia chi IP hay khng. d kim tra
diu ny 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.");
}
}
}
Kt qua cho nhu sau:
Hai dia chi nay khac nhau
V d 7: Xy dung chuong trn HostLookup tuong tu nhu chuong trnh NSLookup cua
Windows, chuong trnh ny c nhim vu khi ban g vo dia chi IP th n s tra v dia chi
tn min 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();
}
}
//Hm kim tra xem dja chi host dui dang tn min hay dja 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. Lp URL v URI
Lop URL l mt lop rt don gian gip ban trong vic dinh vi v ly v du liu tu
mang, m ban khng cn phai quan tm dn giao thuc duoc su dung, dinh dang cua du liu
hoc khng cn quan tm dn cch giao tip voi my chu.
To ra mt URL
Khng ging nhu di tuong InetAddress ban c th su dung hm tao cua lop URL d tao ra
mt di tuong URL moi. C su hm tao khc nhau cua lop URL cho php ban tao ra cc
URL voi cc yu cu khc nhau. Tt ca cc hm tao ny du nm ra ngoai l
MalformedURLException nu ban tao ra mt URL tu mt giao thuc khng duoc h tro
hoc cc thng tin cung cp trong URL khng chnh xc th ban s nhn duoc mt ngoai l
MalformedURLException
a) To ra mt URL t mt xu
public URL(String url) throws MalformedURLException
Ging nhu cc hm tao khc ban chi cn dng ton tu newv cung ging cc hm tao khc
cua lop n nm ra ngoai l MalformedURLException.
V d 1: Tao ra mt URL tu mt xu v bt ngoai l sinh ra
try {
URL u = new URL("http://www.utehy.edu.vn/");
}
catch (MalformedURLException ex) {
System.err.println(ex);
}
V d 2: V du ny tao ra mt s URL v kim tra xem giao thuc tuong ung voi cc URL
c duoc h tr trong virtual machine cua ban hay khng
/* 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");
}
}
}
Kt qua chay trn my cua ti nhu sau:
http is supported
https is supported
ftp is supported
mailto is supported
b) To ra mt URL t cc phn ring le
Hm tao ny cho gm ba phn ring bit, chng cho bit: Giao thuc, tn my chu,
tp tin m URL ny su dung.
public URL(String protocol, String hostname, String file)
throws MalformedURLException
Hm tao ny s tu dng dt port l gi tri mc dinh, tuy theo giao thuc m ban chi
dinh n s su dung m gi tri mc dinh ny l khc 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 trnh trn tao ra mt URL chi dn http://www.microsoft.com/index.html,
cng mc dinh l 80
Trang 173
D tao ra mt URL voi mt cng chi dinh ban su dung hm tao sau:
public URL(String protocol, String host, int port, String file) throws
MalformedURLException
V du: Tao ra mt URL gn voi my localhost trn cng 8080
try {
URL u = new URL("http", "localhost", 8080, "/index.html");
}
catch (MalformedURLException ex) {
System.err.println(ex);
}
V du ny tao ra mt URL tro dn http://localhost: 8080/index.html
c) To ra mt URL t mt URL khc
Hm tao ny cho php ban tao ra mt URL tu mt URL khc, c php 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 ny th u1 dang tro dn http://www.ibiblio.org/javafaq/index.html cn u2 th
dang tro dn http://www.ibiblio.org/javafaq/ mailinglists.html.
Mt vi phuong thc cua lp URL
- public String getHost( ) tra v tn cua my chu
- public int getPort( ) tra v cng duoc su dung
- public int getDefaultPort( ) tra v cng mc dinh cua giao thuc duoc su dung. V du nhu :
http=80, email=25, ftp=23...
- public String getFile( ) tra v tn tp tin
- public String getPath( ) // Java 1.3 tra v duong dn dn file, duong dn ny thuong l
mt 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 mt query string trong URL
V du: Trong v du ny 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 getUserI nfo( ) // Java 1.3 tra v user name
- public String getAuthority( ) // Java 1.3
Trang 174
V du sau minh hoa cc phuong thuc trn
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
Kt qua chay chuong trnh 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) Nhn v d
liu t URL
Ban c th nhn v du liu duoc chi dinh trong URL bng cch su dung cch 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 ny s kt ni dn my chu v yu cu ly v mt InputStream gn voi ti
nguyn duoc chi dinh trong URL.
Trang 175
V du sau ly v ni dung cua trang web duoc chi dinh v in ra mn hnh
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
Kt 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 cho cc ban</font></p></body></html>
- Phuong thcpublic URLConnection openConnection( ) throws IOException
Phuong thuc ny mo mt socket kt ni dn my chu. Nu phuong thuc ny tht bai
n nm 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 cn mt phuong thuc duoc nap chng nhu sau:
public URLConnection openConnection(Proxy proxy) throws IOException
Phuong thuc ny rt huu dung khi trong mang cua ban c su dung proxy
- Phuong thcpublic 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
Kt qua chay nhu sau:
I got a sun.net.www.protocol.http.HttpURLConnection$HttpInputStreamNu thay URL
u = new URL("http://localhost:80/index.html"); boi URL u = new
URL("http://localhost:80/print.gif"); kt qua thu duoc nhu sau:
I got a sun.awt.image.URLImageSource
3. Lp Socket
Lop ny duoc dng cho ca my chu v my khch. Di voi my khch n thuong dng d
kt ni dn my chu, cn di voi my chu n thuong dng d dp lai kt ni tu my khch.
Thng thuong ta tao ra mt Socket bng cch su dung hm tao cua lop Socket. Sau dy l
mt s hm tao cua lop Socket.
3.1 Mt s hm to cua lp Socket
a) public Socket(String host, int port) throws UnknownHostException, I OException
Ta thuong su dung hm tao ny d kt ni dn my chu. Trong hm tao ny tn cua
my l mt xu k tu, tn cua my chu c th l tn mn hoc dia chi IP. Nu nhu khng
tn tai my ny th n s nm ra mt ngoai l UnknownHostException. Nu Socket khng
th mo v bt cu l do no th n nm ra ngoai l I OException.
Trang 177
V d: Kt ni dn 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 hm tao ny d kt ni dn my chu khi bit mt I netAddress gn voi
n.
V du sau kt cung kt ni dn my chu www.theht.edu.vn trn cng 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
Nu my cua ban c nhiu b giao tip mang th khi kt ni dn my chu ta cn chi
ra kt ni duoc thit lp thng qua giao din mang no.
Nu tham s port nhn gi tri 0 thi java runtime s chon ngu nhin mt cng no 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
Hm tao ny cung tuong tu nhu hm tao trn.
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. Ly v thng tin gn vi Socket
- Phuong thuc public InetAddress getInetAddress( ) dng d ly v di tuong InetAddress
tuong ung voi my 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( ) dng d ly v cng cua my 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( ) dng d ly v cng cua my cuc b dng d
giao tip voi my 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( ) dng d ly v di tuong
InetAddress gn voi card mang dng d giao tip.
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 mn hnh mt s thng tin gn 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 dng d ly
v mt OutputStream. Vic gui du liu dn my remote duoc thng qua OutputStream ny.
- Phuong thuc public InputStream getInputStream( ) throws IOException phuong thuc ny
dng d nhn v mt InputStream. Vic nhn du liu tu my remote duoc thuc hin thng
qua InputStream ny.
3.3. Dng Socket
Khi kt ni khng cn duoc su dung nua ban cn goi phuong thuc close() mt cch
tuong minh d dng Socket lai. Khi goi dn phuong thuc close java s tu dng dng hai
lun nhp xut gn voi n. Vic dng Socket lai s giai phng mt s ti nguyn cua h
thng.
public void close( ) throws IOException
Mt Socket s tu dng dng lai nu xy ra mt trong cc tnh hung sau:
- Ca hai lung nhp xut gn voi Socket du duoc dng lai.
- Khi chuong trnh kt thc.
- Hoc khi b thu rc cua java duoc tin hnh.
Tuy cc Socket cung tu dng dng lai khi cn thit, nhung mt thi quen thuc hnh
tt l nn goi dn phuong thuc close() khi khng cn dng dn n nua.
D dam bao Socket lun duoc dng lai cho d c ngoai l xy ra hay khng. th ch
hop l nht d dng Socket lai l trong khi finally.
V du sau th hin diu 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 {
// Dng Socket lai
if (connection != null) connection.close( );
}
Trang 181
- Phuong thuc public boolean isClosed( ) (chi c trong java 1.4 tro ln) phuong thuc ny
tra v tru nu nhu Socket d duoc dng lai, nhn v false trong truong hop nguoc lai. Th
nn d dm bao cc thao tc nhp xut khng xy ra li ban nn su dung mu chuong trnh
sau:
if (socket.isClosed( )) {
// do something...
}
else {
// do something else...
}
Tuy nhin nu Socket chua bao gio duoc mo th phuong thuc ny tra v false.
- Phuong thuc public boolean isConnected( ) (Chi c trong java 1.4 tro ln) phuong thuc
ny tra v true nu ban d tngkt ni dn my o xa hay chua v nhn v false trong
truong hop nguoc lai.
Th nn d kim tra xem Socket c dang mo hay khng ban cn su dung doan
chuong trnh sau:
boolean connected = socket.isConnected( ) && ! socket.isClosed( );
- Phuong thuc public boolean isBound( ) (chi c trong java 1.4 tro ln) phuong thuc ny
tra v true nu nhu Socket duoc lin kt voi mt cng cuc b no d.
3.4. Truyn trong ch d haft duplex
K tu phin ban java 1.3 c thm hai phuong thuc:
public void shutdownInput( ) throws IOException
public void shutdownOutput( ) throws IOException
Hai phuong thuc ny cho php ban dng lung nhp hoc xut gn voi Socket lai.
khi ny ban chi c th truyn hoc nhn mt chiu (haft duplex).
V du nhu khi ban kt ni dn web server d yu cu mt trang bt ky sau khi yu cu xong
th lung xut l khng cn cn thit nua. do vy ta nn dng lai d giai phng ti nguyn.
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( );
/*
Dng lung xut lai. Sau khi dng lung xut ban vn c th su dung lung nhp mt cch
bnh thuong
*/
connection.shutdownOutput( );
// read the response...
}
catch (IOException ex) {
}
finally {
try {
Trang 182
if (connection != null) connection.close( );
}
catch (IOException ex) {}
}
4. Lp ServerSocket
Lop ny chi dng cho pha my chu. N thuong duoc su dung d lng nghe mt kt ni
dn.
4.1. Mt s hm to cua lp 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
Cc hm tao ny xc dinh cng, d di cua hng doi d luu tru cc yu cu kt ni
dn v giao din mang duoc su dung. By gio ta xt cu th tung hm tao:
- Hm tao public ServerSocket(int port) throws BindException, IOException
Hm tao ny s tao ra mt ServerSocket lng nghe trn cng port. Nu nhu port =0
th h thng s chon mt gi tri cng cn ri tip theo. Tuy nhin trong truong hop ny my
khch kh c th kt ni dn n v khng bit r cng. Tuy nhin trong mt s truong hop
n rt huu dung.
V du: Tao mt ServerSocket lng nghe trn cng 80.
try {
ServerSocket httpd = new ServerSocket(80);
}
catch (IOException ex) {
System.err.println(ex);
}
Ch :
- Nu khng th tao ra mt ServerSocket th n s nm ra ngoai l IOException
- Nu port d duoc su dung cho mt chuong trnh khc ri th ngoai l BindException s
duoc nm ra.
V du tm xem cc cng trn my 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
}
}
- Hm topublic ServerSocket(int port, int queueLength) throws IOException,
BindException
Hm tao ny s tao ra mt ServerSocket lng nghe trn cng port v tao ra mt hng
doi cho php queueLength kt ni nm trong hng cho.
V d: Tao ra mt ServerSocket lng nghe trn cng 3456 v cho php ti da 100
yu cu kt ni dng thoi.
try {
ServerSocket httpd = new ServerSocket(3456, 100);
}
catch (IOException ex) {
System.err.println(ex);
}
- Hm topublic ServerSocket(int port, int queueLength, InetAddress bindAddress)
throws BindException, IOException
Hm tao ny c nhim vu tuong tu hm tao truoc d. Tuy nhin ServerSocket chi
lng nghe trn b giao tip mang duoc chi ra trong tham s thu 3. Nu my cua ban c
nhiu b giao tip mang th ban cn phai chi ra ServerSocket ny s lng nghe trn b giao
tip no.
V d: Gia su rng my cua ban c hai b giao tip mang, mt b giao tip mang c
dia chi 162.163.10.5 v mt b giao tip mang khc c dia chi 192.168.101.1. D tao ra
mt ServerSocket lng nghe trn cng 3456, b giao tip mang 162.163.10.5 (chu khng
phai l 192.168.101.1) v cho php 100 yu cu kt ni.
try {
ServerSocket httpd = new ServerSocket(3456, 100,
InetAddress.getByName("162.163.10.5"));
}
catch (IOException ex) {
System.err.println(ex);
}
- Hm topublic ServerSocket( ) throws IOException // Java 1.4
Hm tao ny tao ra mt ServerSocket, tuy nhin n chua thuc su lng nghe trn cng
no ca. Th nn ban cung chua th goi phuong thuc accept d chp nhn cc kt ni. D
thu su lin kt voi mt cng no d ban cn goi phuong thuc bind(), dy l phuong thuc
chi c trong java 1.4 tro ln.
public void bind(SocketAddress endpoint) throws IOException // Java 1.4
public void bind(SocketAddress endpoint, int queueLength) // Java 1.4
throws IOException
Trang 184
Hm tao ny cung rt huu dung khi ban cn dt mt s thuc tnh cho ServerSocket
truoc khi n thuc su chp nhn cc kt ni.
Thng thuong ban su dung mu sau:
//Tao ra mt ServerSocket chua thuc su lin kt voi mt cng no d.
ServerSocket ss = new ServerSocket( );
// Thit dt mt s thuc tnh cho Socket...
//Tao ra mt di tuong SocketAddress d lin kt
SocketAddress http = new InetSocketAddress(80);
//Lin kt ServerSocket voi cng 80
ss.bind(http);
4.2. Chp nhn v dng kt ni
a) Chp nhn kt ni
Vic tao ra mt ServerSocket chua thuc su chp nhn cc kt ni dn. D chp nhn
kt ni dn ta cn goi dn phuong thuc accept() phuong thuc ny s tam ngung tuyn thi
hnh hin tai cho dn khi c mt yu cu kt ni dn. Khi c yu cu kt ni dn th tuyn
duoc tip tuc v hm ny tra v cho ta mt di tuong Socket. Vic giao tip voi my khch
duoc tin hnh thng qua Socket ny.
Ch : Phuong thuc accept() chi chp nhn mt kt ni dn m thi. do vy d c th chp
nhn nhiu kt ni dn ban cn phai lp lai vic goi dn phuong thuc accept() bng cch
dua chng vo mt vng lp nhu sau:
V du:
Chuong trnh trn my 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 trnh trn my khch
//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 trnh trn ban chay Server mt ln sau d ban c th chay nhiu chuong trnh
my khch.
b) Dng kt ni
Khi kt ni khng cn duoc su dung dn nua th ta cn dng lai d giai phng cc
ti nguyn. Kt ni cung tu dng duoc dng lai trong mt s truong hop nhu: Chuong trnh
kt thc, b thu rc duoc tin hnh..., Tuy nhin mt phong cch lp trnh tt l lun dng
lai mt cch tuong minh khi khng cn su dung dn n nua.
V du:
ServerSocket server = new ServerSocket(port);
//Lm mt s vic
server.close( );
Trong java 1.4 b sung thm hai phuong thuc:
- public boolean isClosed( ) //Nu kt ni dang mo th tra v tru v nguoc lai, tuy
nhin nu kt ni chua duoc mo th n cung tra v false
- public boolean isBound( ) // Tra v true nu n d tung duoc lin kt voi
mt cng no d.
Th nn d kim tra xem ServerSocket c dang mo hay khng ta phai lm nhu sau:
public static boolean isOpen(ServerSocket ss) {
return ss.isBound( ) && ! ss.isClosed( );
}
5. Lp DatagramSocket
Lop ny dng d tao ra mt Socket d lin lac bng giao thuc UDP.
6. Lp DatagramPacket
Lop ny th hin cho mt gi du liu duoc gui di bng giao thuc UPD. N duoc su dung
voi lop DatagramSocket.
III. TCP Socket
- Lin lac trong ch d kt ni s c mt duong kt ni ao duoc thnh lp giua 2
tin trnh, truoc khi mt kt ni duoc thnh lp th mt trong 2 tin trnh phai doi tin trnh
kia yu cu kt ni. Trong m hnh ny server phai lng nghe v chp nhn mt yu cu kt
ni dn tu Client
Trang 186
- D vit cc chuong trnh lin lac voi nhau trong ch d kt ni ta cn phai vit 2
chuong trnh: mt cho server, mt cho client, chuong trnh server c nhim vu lng nghe v
phan hi kt ni moi, cn chuong trnh pha client th khoi xuong yu cu kt ni
- Lin lac trong ch d kt ni s su dung giao thuc TCP, d gui v nhn du liu
Vit chuong trnh pha server
D thit lp mt server ta theo cc buoc sau:
Buc 1) tao ra mt di tuong ServerSocket v lin kt n voi mt cng, ta c th lm vic
ny thng qua hm tao hoc khoi gn truc tip cho cc truong
v du:
ServerSocket s=new ServerSocket(port [, sequelLength]);
Hoc
ServerSocket s=new ServerSocket();
s.bind(InetAddress addr, port);
Buc 2) chp nhn kt ni bng cch goi phuong thuc accept() cua di tuong
ServerSocket, sau khi goi phuong thuc, tuyn ny s bi phong toa cho dn khi c mt kt
ni dn, phuong thuc ny tra v mt di tuong Socket, ta s su dung di tuong ny d giao
tip voi my khch
Socket connectToClient=s.accept();
Buc 3) nhn v cc di tuong outputStream v inputStream tu di tuong Socket nhn v
tu phuong thuc accept o buoc 2, cc di tuong ny s gip ta gui/nhn du liu tu my
client, di tuong outputStream cho php ta gui du liu dn client, d nhn duoc cc di
tuong ny ta goi phuong thuc getOutputStream() trn di tuong Socket, d nhn tham
chiu dn di tuong outputStream vn lin kt voi di tuong ny, v goi phuong thuc
getInputStream() d nhn mt tham chiu dn di tuong inputStream vn lin kt voi di
tuong Socket ny.
Chng ta c th su dung di tuong inputStream v outputStream d nhn/gui du liu
duoi dang th, hoc ta c th ni n voi mt lung nhp/xut khc d nhn v du liu mong
mun.
Buc 4) Xu l du liu gui dn tu client v gui gui tra du liu.
Vit chuong trnh pha my khch
Vic vit chuong trnh cho client gm mt s buoc co ban sau:
Buc 1) tao ra mt Socket d kt ni dn my chu, ni kt dn my chu duoc thuc hin
thng qua hm tao cua lop Socket, thng thuong ta su dung hm tao 2 di nhu sau:
Socket connectToServer=new Socket(serverName,port);
Hm tao ny c 2 di: di thu nht cho bit tn cua my chu( tn ny c th l tn min
hoc dia chi IP hoc c th l mt di tuong InetAddress kt hop voi my chu) cn di thu
2 cho bit s hiu cng m server dang lng nghe
Buc 2) Nhn v cc di tuong inputStream v outputStream kt hop voi di tuong Socket
connectToServer, buoc ny tuong tu nhu buoc 3 trong phn vit chuong trnh cho server
Buc 3) xu l du liu nhn v/ gui di thng qua 2 di tuong outputStream v inputStream
Buc 4) dng kt ni d giai phng ti nguyn, thng thuong vic dng kt ni duoc khoi
xuong tu pha my khch
Trang 187
V du 1: Nhn v trang index.html tru my chu web www.theht.edu.vn v in ra mn hnh
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 d 2: Xy dung chuong trnh EchoClient v EchoServer.
Xy dung chuong trnh pha my 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);
}
}
}
Xy dung chuong trnh pha my khch
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 d: ta vit mt v du don gian nhu sau:
Trang 190
* chuong trnh pha client c giao din sau:
khi ta kch chut vo nt kt ni chuong trnh cua ta s kt ni voi my chu
sau khi nhp chiu di, chiu rng v kch chut vo nt tnh, du liu gm c chiu di v
chiu rng s duoc gui dn my chu, my chu thuc hin vic tnh din tch v gui kt qua
tra lai cho my khch, du liu nhn v tu my chu duoc hin thi trong kt qua
khi ta kch chut nt dng, chuong trnh cua ta s dng kt ni v kt thc chuong trnh
* chuong trnh trn my chu chi c nhim vu, lng nghe kt ni v tnh ton din tch cua
hnh nhn duoc
M ngun pha my 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(); // chp nhn kt ni
// ly v di tuong nhp/xut
DataInputStream in = new DataInputStream(connectToClient.getInputStream());
DataOutputStream out = new DataOutputStream(connectToClient.
getOutputStream());
//Vng lp v tn d phuc vu yu cu
while (true) {
a = in.readDouble();// ly chiu di
b = in.readDouble();// ly chiu rng
kq = a * b;// tnh kt qu
out.writeDouble(kq);// tr v kt qu cho my khch
out.flush();// dn ht DL ra
}
}
catch (IOException ex) { }
}
public static void main(String[] args)
{
Trang 191
Server server1 = new Server();
}
}
M ngun pha my khch:
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; // lung nhp
DataOutputStream out; //lung xut
boolean isConnect = false; //bin kim tra xem d kt ni 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("Chiu di");
jLabel1.setBounds(new Rectangle(16, 15, 77, 21));
this.getContentPane().setLayout(null);
jLabel2.setBounds(new Rectangle(16, 46, 86, 21));
jLabel2.setText("Chiu rng");
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("Kt 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("Kt ni");
jtfConnect.setVerticalAlignment(javax.swing.SwingConstants.CENTER);
jtfConnect.setVerticalTextPosition(javax.swing.SwingConstants.CENTER);
jtfConnect.addActionListener(new Frame1_jtfConnect_actionAdapter(this));
jtfCompute.setText("Tnh");
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) // nu chua kt ni th kt ni
{ try {
// lng nghe kt ni dn my ch trn cng 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)) // nu chua kt ni th bo li
JOptionPane.showMessageDialog(this, "Ban phai ket noi truoc khi tinh",
"loi", JOptionPane.ERROR_MESSAGE);
try {
out.writeDouble(Double.parseDouble(jtfDai.getText())); // gi chuu di
out.writeDouble(Double.parseDouble(jtfRong.getText())); //gi chiu rng
out.flush(); // dy ht d liu ra
jtfKetQua.setText(String.valueOf(in.readDouble())); // nhn v kt qu v
// hin thj trong kt qu
}
catch (NumberFormatException ex) {
// nu nhp sai thi bo li
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 dp ng bin c khi kch chut vo nt dng
void jtfClose_actionPerformed(ActionEvent e) {
try { connectToServer.close(); // dng kt ni }
catch (IOException ex) { }
System.exit(0); // thot khi chuong trnh
}
}
// tao ra lp diu hop, d dp ng su kin kch chut vo nt kt ni
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 lp diu hop, d dp ng su kin kch chut vo nt tnh
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 lp diu hop, d dp ng su kin kch chut vo nt dng
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);
}
}
Vn d mt ngun nhiu khch
Trong v du trn ta nhn thy, my chu chi c th phuc vu duy nht mt khch. Trong thuc
t di voi mt s bi ton yu cu mt my chu phai phuc vu nhiu my khch tai mt thoi
dim, v du nhu Web server, Database server, cc my chu ny cho php nhiu my
nhiu my khch kt ni dng thoi, ta c th lm duoc vic ny bng k thut da lung.
Tht don gian, ban chi cn tao ra mt lung phuc vu cho mi khch, v dua thm vo doan
m tua nhu sau:
ServerSocket s = new ServerSocket(port);
while (true) {
Socket connectToClient = s.accept();
new HandleClient(connectToClient);
}
Ta sua lai v du trn d c th phuc vu duoc nhiu my khch, chuong trnh pha my
khch vn giu nguyn, ta chi thay di chuong trnh trn my chu nhu sau:
package net.theht;
import java.io.*;
import java.net.*;
public class Server{
public static void main(String[] args)
{ try { //lng nghe kt ni trn cng 2004
ServerSocket s = new ServerSocket(2004);
while (true) {
Socket connectToClient = s.accept(); // chp nhn kt ni
new HandleClient(connectToClient);//chay mt lung 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) { }
//Vng lp v tn d phuc vu yu cu
while (true)
{ try {
a = in.readDouble(); // ly chiu di
b = in.readDouble(); // ly chiu rng
kq = a * b; // tnh kt qua
out.writeDouble(kq); // tra v kt qua cho my khch
out.flush(); // dn ht DL ra
}
catch (IOException ex1) { }
}
}
}
sau khi sua lai ban cho khoi dng server, sau d cho chay 2 tin trnh client, ban s thu
duoc mn hnh kt qua nhu sau:
Lin lac trong ch d phi kt ni
Vic lin lac trong ch d khng kt ni, khng yu cu phai c 1 server lun lng
nghe kt ni, khi lin lac trong ch d khng kt ni java su dung giao thuc UDP trong vic
diu khin truyn v nhn du liu. Do vy khng c xc nhn v du liu gui, khng th bit
duoc du liu gui di c dn duoc dch khng, khng th bit duoc du liu nhn v c bi
trng lp khng Ban l nguoi lp trnh, ban phai giai quyt diu d, chu khng phai lop
giao thuc mang hay java, Trong thuc t ho mc k cho li sy ra, boi ho khng du nng luc
Trang 196
d lm diu d, th nn giai php an ton cho ban l Socket dng, boi l Socket dng su
dung giao thuc TCP, nn nhung diu lo lng d khng bao gio sy ra.
D lin lac trong ch d khng kt ni ta su dung lop DatagramSocket v lop
DatagramPacket, lop DatagramSocket cho php ta gui/ nhn v cc gi du liu tu my o
xa, lop DatagramPacket cho cung cp cho ta cng cu dng gi du liu UDP, d di tuong
DatagramSocket gui di hoc nhn v.
Ta giai thch thng qua chuong trnh chat, chuong trnh gm c 2 chuong trnh, hai
chuong trnh ny l ngang hng khng c chuong trnh no l chu ca, cc lnh cn thit d
lin lac duoc trong ch d khng kt ni duoc in dm
M chuong trnh thu nht:
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 bo cc bin cn thit
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));
jbtGid.seGixt(Giu");
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 di tuong DatagramSocket di tuong ny s nhn d //liu t cng 2004
s = new DatagramSocket(2004);
}
catch (SocketException ex) { }
}
private void nhan() {
while (true) {
// vng dm d nhn d liu
byte[] dat = new byte[100];
// tao ra di tuong DatagramPacket d nhn gi d liu
rev = new DatagramPacket(dat, dat.length);
try {
s.receive(rev);// nhn v d liu
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();// dng kt ni
}
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 di tuong DatagramPacket d gi gi d liu
sen = new DatagramPacket(dat, dat.length, local, 4002);
try {
s.send(sen); // Gi d liu 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 trnh 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));
jbtGid.seGixt(Giu");
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);
}
}
Tm lai d lin lac trong ch d khng kt ni ta cn vit trn mi my cc lnh cn
thit sau:
tao ra di tuong DatagramSocket d nhn v gui du liu, bng hm tao cua n nhu sau:
s = new DatagramSocket(port);
Hm tao ny s tao ra di tuong DatagramSocket hoat dng trn cng duoc chi ra.
tao cc di tuong DatagramPacket dng d lm gi du liu trong vic gui/nhn du liu,
bng cch su dung ham tao cua lop DatagramPacket
+ DatagramPacket(byte[] buf, int length) thuong dng hm tao ny khi nhn du liu
+length.DatagramPacket(byte[] buf, int length, InetAddress address, int port) hm tao ny
thuong dng khi doc du liu tu my tnh v cng duoc chi ra
+ DatagramPacket(byte[] buf, int offset, int length) hm tao ny thuong dng trong vic
nhn du liu c d di length , bt du tu dim offset
+ DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port) nhn v
du liu trn my, cng duoc chi ra, v ct vo trong vng dm buf
-gui du liu bng phuong thuc send, cua lop DatagramSocket
datagramSocket.sen(datagramSocket)
- Nhn du liu bng phuong thuc receive, cua lop DatagramSocket
datagramSocket.receive(datagramSocket)
V d 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. Cc khi nim MAIL
Ngy nay e-mail hay thu din tu d tro nn ph bin v hu nhu khng th thiu
trong th gioi Internet. E-mail cho php gui thng dip tu noi ny dn noi khc tuong tu
nhu cch gui thu truyn thng thng qua buu din. Trong cch thng thuong ban phai cung
cp dia chi nguoi gui (sender), dia chi nguoi nhn (reciept) sau d nguoi gui mang thu dn
buu din nho buu din chuyn thu di. Buu din s chuyn thu dn hp thu cua nguoi nhn.
Di voi thu din tu e-mail gui qua h thng Internet hay mang th co ch gui/nhn
cung hon ton tuong tu. Cc my chu (mail server) cung cp cho ban dia chi mail (cn goi
l e-mail address). Ban ghi dia chi mail cua ban v cua nguoi nhn, sau d nhp vo ni
dung cn gui. Mail server s gui thu cua ban dn mt my chu hay mail server cua dia chi
nguoi nhn. Mail server noi nhn s ct thu vo mt noi thch hop (mail box hay cn goi l
hp thu) trn my chu. Nguoi nhn s tin hnh dng nhp (hay cng goi l login) vo hp
thu cua my chu d doc ni dung e-mail gui cho mnh.
D thng nht giua cc my chu mail trn ton th gioi v cch thuc gui nhn mail
di hoi hnh thnh cc chun v mail. Diu ny gip cho vic goi nhn cc thng dip duoc
dam bao, lm cho nhung nguoi o cc noi khc nhau c th trao di thng tin voi nhau.
C 2 chun v Mail thuong duoc cc my chu mail h tro l X.400 v SMTP
(Simple Mail Transfer Protocol). SMTP thuong di km voi chun POP3 v do han ch cua
SMTP m ngy nay nguoi ta dng chun mo rng cua n l ESMTP (Extended SMTP).
Muc dch chnh cua X.400 l cho php cc mail c th duoc truyn nhn thng qua cc loai
mang khc nhau bt chp cu hnh phn cung, h diu hnh mang, giao thuc truyn dn
duoc dng. Cn muc dch cua chun SMTP miu ta cch diu khin cc thng dip trn
mang Internet. Diu quan trong cua chun SMTP l gia dinh my nhn phai dng giao thuc
SMTP gui Mail cho mt Server lun lun hoat dng. Sau d, nguoi nhn s dn ly Mail
cua ho tu Server khi no ho mun dng giao thuc POP (Post Office Protocol), ngy nay
POP duoc cai tin thnh POP3 (Post Officce Protocol vertion 3). Cc giao thuc Mail thng
dung : chun X.400, chun MAIP, SMTP (ESMTP), POP3. Trong chuong ny ta s su
dung hai giao thuc :POP3 v SMTP d gui nhn mail.
M hnh gui nhn mail
Truoc khi di vo phn chnh chng ta cng n lai mt s khi nim co so sau:
Sende
r
Reveicer
Mail Server trung
gian
Mail Server ngui
gi
Mail Server ngui
nhn
Mang Mang
Trang 206
Mail server: l mt chuong trnh chay duoi dang mt dich vu. dich vu ny c nhim vu
nhn mail tu my khch gui dn, phn phi mail dn my chu khc, cho php my
khch truy cp vo d ly mail, luu tru mail Chnh v vy truoc khi ban gui nhn mail
ban phai bit dia chi cua my chu mail (my dang chay dich vu mail). Dia chi ny
thuong duoc goi l mail host.
Giao thc gui mail (Mail transport protocol): D gui mail dn my chu, trnh khch
phai su dung mt giao thuc tr chuyn voi mail server. Tuong tu nhu trnh duyt su
dung giao thuc HTTP d tr chuyn voi Web server. Cc my khch mun bt tay voi
trnh chu v gui mail ln my chu s su dung giao thuc SMTP (Simple Mail Transport
Protocol). SMTP kh ni ting v duoc hu cc my chu mail trn th gioi h tro. Dia
chi cua my chu nhn mail gui di duoc goi l outgoing mail address. Trnh chu tip
nhn mail theo giao thuc SMTP duoc goi l SMTP Server. Trnh khch su dung giao
thuc SMTP d gui thu di duoc goi l SMTP Client.
Giao thc luu tr v nhn mail (mail store protocol): Khi trnh chu mail tip nhn
duoc mail. N tin hnh luu tru mail theo mt cch thuc no d d trnh khc c th d
dng truy cp vo v nhn mail v. Hin nay POP3 (Post Office Protocol) v IMAP
(Internal Message Access Protocol) l hai giao thuc luu tru v ly mail tu hp thu
(Inbox) duoc nhiu mail server su dung. Dia chi cua my chu luu tru mail cho php
my khch truy cp vo d nhn mail v duoc goi l incoming mail address. Cc
chuong trnh mail Client thuong su dung giao thuc POP3 d nhn mail tu trnh chu.
Trnh chu tip nhn yu cu cua trnh khch theo giao thuc POP3 duoc goi l POP
Server.
SMTP Relay: Cc mail server nu nhn duoc mail khng thuc dia chi do mnh quan
l, khi d n c trch nhim gui mail dn my chu khc voi cng giao thuc SMTP.
Trong truong hop ny mail server (noi chuyn tip thu di) dng vai tr nhu mt trnh
khc (mail client) di voi my chu noi nhn. Cu th. Internet mail l mt h thng
chuyn mail lin tuc giua cc my chu mail voi nhau cho dn khi no mail dn duoc
my chu dch. Cc mail server da phn h tro tnh nng Relay.
POP before SMTP (Chng thc quyn truy cp theo giao thc POP truc khi su
dng SMTP): D trnh tnh trang my chu mail duoc loi dung d gui mail mt cch
at. Co ch POP before SMTP yu cu my khch mun su dung dich vu mail cua my
chu phai truoc ht phai dng nhp (login) vo ti khoan (account) theo giao thuc POP.
Nu qu trnh dng nhp thnh cng, co ch gui mail bng SMTP moi c th thuc hin
duoc.
Mail client, Web mail: l chuong trnh dng d nhn mail v tu trnh chu v cho php
gui mail ln trnh chu. Nu mail client duoc vit duoi giao din Web th n duoc goi l
Web mail.
II. Gui mail vi thu vin c sn cua java
Java cung cp cho ban mt thu vin nho gon gip ban c th guu mail mt cch d
dng, tuy nhin voi thu vin ny ban khng c duoc cc tnh nng cao cp nhu gui
file dnh km, D su dung cc tnh nng cao cp ban xu thu vin Mail API (gioi
thiu trong phn sau). Thu vin ny c lop SmtpClient dng d gui mail.
D gui mail ban cung cp dia chi cua nguoi gui (from), dia chi cua nguoi nhn (to),
dia chi cua mail server (my chu tip nhn mail do ban gui ln) cng voi ni dung
m ban mun gui. Duoi dy l mt chuong trnh don gian dng d gui mail dn dia
Trang 207
chi thek44a2@yahoo.com nho vo my chu mail utehy.edu.vn (my chu mail cua
truong DHSP KT Hung Yn). Dia chi nguoi gui c th dt tuy . Nhung thuong l
dia chi cua ban d nguoi nhn sau khi doc thu xong c th hi 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 di tuong gi mail theo giao thc SMTP, host l dja chi ca my ch nhn mail do ta
gi ln */
SmtpClient mailer = new SmtpClient(host);
// Thit lp dja chi ca ngui gi v ngui nhn
mailer.from(from);
mailer.to(to);
//Ly v lung xut gn vi mail
PrintStream ps = mailer.startMessage();
//Din cc thng tin khc
ps.println("From:" + from);
ps.println("To:" + to);
ps.println("Subject:" + subject);
ps.println();// Thm CRLF vo truc phn ni dung
ps.println(body);
//Kt thc qu trnh gi mail
mailer.closeServer();
System.out.println("Mail has been sent");
}
}
Ch : Hy thay dia chi From, To bng dia chi e-mail m ban mun gui.
III. Gii thiu java mail API
Lop SmtpClient cua java m chng ta su dung trn dy chi gip ban gui mail o muc
don gian nht voi ni dung mail o dang thun vn ban. Mt ung dung mail pha my khch
thuong c cc chuc nng phuc tap hon nhu : Gui file dnh km, du liu duoc nhng ca hnh
anh, m thanhD thuc hin nhung chuc nng ny java dua ra mt thu vin ring chuyn
xu l cc thao tc gui nhn mail.
1. Ci dt thu vin java mail
Mc dinh cc thu vin java mail API khng duoc ci dt khi ban ci JDK. Thu vin
ny gm ba phn:
Phn thu nht l hat nhn cua cc tc vu xu l mail, n duoc dng gi trong tp mail.jar.
Ban c th download tu dia chi http://java.sun.com/javamail/index.html
Trang 208
Phn thu hai l JavaBean Activation FrameWork cn cho moi phin ban cua java mail.
Thu vin ny mang tn activation.jar. voi thu vin ny ban c th tai xung tu
http://java.sun.com/products/javabean/glasgow/jar.html
Phn thu ba l cc lop doc hay nhn mail tu trnh chu. Trong java 1.4 thu vin ny c
tn mail.jar
Ban dt bin mi truong classpath=%CLASSPATH%; C:\JBuilderX\lib\mail.jar;
C:\JBuilderX\lib\activation.jar;
Ch : Khi ban ci JBuilder hai thu vin ny cung duoc tu dng ci dt vo my, ban c
th tm thy n trong thu muc Jbuilder_Home/lib
2. Cc buc gui nhn mail
Cc buc d nhn mail:
Tao di tuong mail Session.
Tao di tuong storechun bi ly mail v. D tao di tuong Store ban yu cu nguoi
dng nhp vo tn v mt khu chung thuc quyn truy cp hop php.
Su dung di tuong Store d ly v di tuong Folder. Mi Folder s chua mt loai m
ban mun ly. Nhu Folder Inbox chua cc thu vin gui dn. Folder trash chua cc thu
vua bi xo. Folder sent chua cc thu vua gui di
Duyt di tuong Folder d ly v danh sch cc thu.
Cc buc d gui mail
Yu cu nguoi gui chon giao thuc d gui (SMTP) v nhn (POP3 hay IMAP). Luu
cc thng tin ny vo di tuong Session.
Tao di tuong Message. Di tuong ny s chua cc thng tin v mail cn gui di nhu dia
chi nguoi gui, dia chi nguoi nhn, tiu d mail, ni dung mail
Goi phuong thuc Transport.send() hoc phuong thuc sendMessage cua di tuong
Transport d gui thu di.
3. Cc lp co ban xu l thao tc gui nhn mail
Ta tm hiu cc gi trong thu vin java mail. Hu ht cc ung dung mail client cn
import cc thu vin javax.mail, javax.mail.interner, javax.mail.activation.
3.1. Cc lp lin quan dn vic gui mail
3.1.1. Lp Session
Lop ny th hin mt phin kt ni toi mail server. Truoc khi truy cp (gui/nhn)
ban cn phai tao ra mt di tuong Session th hin cho mt phin lm vic. v du:
//Tao di tuong Properties chua thng tin khoi tao nu c
Properties props=new Properties();
/*gn gi tri cho cc thuc tnh bng phuong thuc
props.setProperty(PropertyName, PropertyValue) */
//Tao di tuong Session
Session session =Session.getDefaultInstance(props,null);
Hoc ban c th goi phuong thuc getInstance() cua lop Session thay cho
getDefaultInstance() d tao ra th hin cua di tuong Session nhu sau:
//Tao di tuong Properties chua thng tin khoi tao nu c
Properties props=new Properties();
Trang 209
/*gn gi tri cho cc thuc tnh bng phuong thuc
props.setProperty(PropertyName, PropertyValue)*/
//Tao di tuong Session
Session session =Session.getInstance(props,null);
Trong ca hai phuong thuc khoi tao di tuong Session nu trn. cc thuc tnh cu
hnh duoc dt trong di tuon Properties nn truoc khi ban ban gui nhn mail ban cn thit
dt cc thuc tnh ny. v du:
props.setProperty("mail.host","utehy.edu.vn");
props.setProperty("mail.from","theht@utehy.edu.vn");
O dy thuong th ban truyn null cho tham s thu hai voi nghia su dung co ch
chung thuc (authentication) mc dinh cua mail server.
Su khc nhau giua hai phuong thuc ny l getInstance() th lun tao ra mt Session
moi cn getDefaultInstance() th khng tao ra mt th hin moi cua Session nu nhu n d
duoc tao ra trong cng java virtual machine.
3.1.2. Lp Message
Sau khi c di tuong Session ban, d gui mail ban ban cn tao ra di tuong Message.
Tuy nhin t khi ban lm vic truc tip voi di tuong ny m ban thuong lm vic voi cc
lop con cua n, lop MimeMessage. v du, ban tao thng dip mail d chun bi gui di nhu
sau:
MimeMessage message =new MimeMessage(mailsession);
Nu ni dung cua thng dip l thun vn ban, ban c th thit dt ni dung thu gui bng
lnh:
message.setText(content);
Nu ban chi dinh Mime cho ni dung cn gui nu n khng phai l thun vn ban nhu sau:
message.setContent(content,"text/html");
Nu ni dung khng phai thun vn ban th ban phai chi dinh Mime cho n, d noi nhn
mail s cn cu vo Mime d hin thi dng ni dung cua thng dip nhn duoc.
Mt thi quen tt nn c l dt cho mail mt tiu d (subject). Nguoi nhn cn cu
vo tiu d thu d bit duoc ni dung vn tt m ta trong thu. Phuong thuc setSubject() s
gip ta lm vic d. V du:
Session.setSubject("Xin chao");
3.1.3. Lp Address
Sau khi ban tao ra di tuong Session v Message, tip dn ta su dung lop Address d
tao ra dia chi cua nguoi guu v nguoi nhn. Lop Address l lop truu tuong, ban su
dung lop con cua n l InternetAddresss. V du ban tao dia chi mail tu lop ny nhu
sau:
Address address =new I nternetAddresss("theht@utehy.edu.vn");
Hoc
I nternetAddresss address =new I nternetAddresss("theht@utehy.edu.vn");
Nu ban mun dia chi e-mail c thm thng tin din giai ban thm su dung c php
nhu sau:
Address address =new I nternetAddresss("theht@utehy.edu.vn", "Hoang Trong The");
Thng tin din giai ny s duoc hin thi thay khi nguoi nhn doc thu thay cho dia
chi mail from.
Trang 210
Sau khi tao xong dia chi cua nguoi gui, dia chi cua nguoi nhn ban cn gn n vo
thng dip cn gui di. Java cung cp cho ban ba loai dia chi ph bin:
Kiu d|a chi nghia
Message.RecipientType.TO Dia chi noi dn
Message.RecipientType.CC Dia chi nguoi gui cn luu
Message.RecipientType.BCC Dia chi nguoi gui cn tham khao
Ban goi phuong thuc addRecipient() cua di tuong Message d gn dia chi cn gui.
V d:
//Tao dia chi
Address toAddress=new InternetAddresss(thek44a2@yahoo.com);
Address ccAddress=new InternetAddresss(theht@walla.com);
//Gn dia chi cho nguoi nhn
message.addRecipient(Message.RecipientType.TO, toAddress);
message.addRecipient(Message.RecipientType.CC, ccAddress);
D dt 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 khng quan trong, ban c th dt cho n mt dia chi e-mail
khng c thuc, nu ban dt dia chi cua nguoi gui khng c thuc th nguoi nhn khng th
phan hi (reply) lai cho ban.
Ta c th dt dia chi cua nguoi gui l mt danh sch (mang) d nguoi nhn c th
phan hi lai cho nhiu nguoi cng mt lc. Ban goi phuong thuc addFrom() nhu
sau:
Address address[]=
Message.addFrom(address);
Ch : java mail khng cung cp co ch kim tra xem dia chi cua nguoi gui c hop l hay
khng. D kim tra mt dia chi mail c hop l hay khng khng phai l d, thng thuong
don gian nht ban kim tra xem trong dia chi d c k tu @ hay khng?
3.1.4. Lp Transport
Lop Transport cung cp cc phuong thuc gui mail dn mail server. Don gian ban goi
phuong thuc tinh send() cua lop Transport d gui di tuong thng dip di. V du:
Transport.send(message);
Hoc ban c th chon giao thuc gui mail tu di tuong Session, tao kt ni dn trnh
chu mail v goi phuong thuc sendMessage() d gui mail di:
Transport transport;
transport =mailSession.getStransport("smtp");
transport.connnect(host, user, password);
// hoc bn c th gi phuong thc transport.connnect();
transport.sendMessage(message, message.getAllRecipients());
transport.close();
Trang 211
Cch thu hai ny nhanh hon cch thu nht trong truong hop ban mun gui mt s
luong lon cc mail, kt ni vn duoc duy tr cho dn khi ban goi phuong thuc
transport.close(), trong khi kt ni vn cn mo ban c th gui bao nhiu thu tuy m
khng phai kt ni lai voi mail server. Trong khi phuong thuc transport.send() phai
kt ni, dng kt ni mi khi c mt thng dip duoc gui di, do vy mt thoi gian.
3.2. Cc lp lin quan dn vic nhn mail
Lp Store v lp Folder: L hai lop ny phuc vu chu yu cho vic nhn v doc
mail chua trong hp thu cua mail server. D su dung hai lop ny truoc tin ban cn chi dinh
giao thuc nhn mail. C hai giao thuc nhn mail chnh l POP3 v IMAP.
V du nu su dung giao thuc POP3 th ban khai bo gi com.sun.mail.pop3 nhu sau:
import com.sun.mail.pop3.*;
Cn nu ban su dung giao thuc IMAP th ban khai bo gi com.sun.mail.imap nhu
sau:
import com.sun.mail.imap.*;
Tuong tu nhu lop Transport trong thao tc gui mail, ban dng di tuong Session, goi
phuong thuc getStore() d ly v di tuong Store phuc vu cho muc dch kt ni voi
mail server d nhn mail.
Store store =mailSession.getStore("pop3");
D kt ni vo 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 mun ly thu
user/password l ti khoan dng nhp vo hp thu cua ban.
Nu kt ni thnh cng ban ly v di tuong Folder d duyt mail.
Folder folder = store.getFolder(INBOX);
folder.open(Folder.READ_ONLY);
Message message[]=folder.getMessages();
Cc thng dip mail duoc luu tru trn mail theo mt cu trc cy, tuong tu nhu cu trc cy
thu muc cua h diu hnh. INBOX m chi thu muc chua thu gui dn.
Ch : Voi giao thuc POP3 ban chi c th ly mail tu INBOX voi giao thuc IMAP (mo
rng cua giao thuc POP3) ban c th nhn mail trong cc thu muc TRASH, SENT
Phuong thuc getMessages() tra v mt mang cc di tuong Message. Ban goi
phuong thuc getConten() d ly v ni dung cua mail nhu sau:
for(int i=0;i<message.lenth();i++)
System.out.println(((MimeMessage)message[i]).getConten());
Mt d doc xong thu ban dng hp thu v ngt kt ni:
folder.close(true);
store.close();
Di s true cho bit c cp nht cc lnh xo mail hay khng (s d cp trong phn
sau).
Trang 212
III. Gui mail
1. Gui mail don gian
Chuong trnh SendMailAPI duoi dy s goi mail di theo giao thuc SMTP,
SendMailAPI l chuong trnh java thun tu su dung thu vin java mail. N tuong tu
chuong trnh SenMailApp chng ta d tm hiu trong phn truoc. Mc d vy thay v su
dung lop SmtpClien ban su dung cc 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 tin ban tao ra mt di tuong Properties d chua cc thng tin: tn my chu mail,
cng cua mail server.. bng cu lnh
Properties props = new Properties();
props.put("mail.smtp.host", smtpHost);
props.put("mail.smtp.port", "" + smtpPort);
mc dinh cng cua mail s l 25, nu mail hoat dng trn mt cng khng phai l 25 th ban
phai chi r cng cua mail server bng dng lnh:
props.put("mail.smtp.port", "" + smtpPort);
Tip theo ban ly v mt phin kt ni bng dng lnh:
Session session = Session.getDefaultInstance(props, null);
Trang 213
Tip theo ban tao ra di tuong thng dip v din cc thng tin cn thit vo:
Message msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(from));
msg.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
msg.setSubject(subject);
msg.setText(content);
Cui cng d gui thu di ban goi phuong thuc:
Transport.send(msg);
Ban c th thay dng lnh ny bng doan lnh sau:
Transport tp= session.getTransport("smtp");
tp.connect();
tp.sendMessage(msg,msg.getAllRecipients());
tp.close();
Nu ban chua gn dia chi mail server v cng cua n th ban phai goi phuong thuc:
tp.connect(host,user,password);
Do ban dang gui mail nn cc thng tin dng nhp user,password khng cn thit,
ban c th cung cp cho n mt xu rng nhu sau:
tp.connect(host,,);
2. Gui thu vi ni dung c djnh dng HTML
Nu ni dung thu l thun vn ban ban goi phuong thuc
Message.setText(StringMsg) d gn ni dung cho di tuong thng dip cn gui di. Nu ni
dung thu khng phai l dang thun vn ban ban cn goi phuong thuc
Message.setConten(StringMsg, MimeType) voi MimeType l mt xu cho bit kiu ni
dung duoc chua trong mail.
V du sau minh hoa cch gui thu voi ni 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";
//Gn ni dung l mt xu c djnh dang HTML
String content = "<p><b><font face=\".VnArialH\" size=\"8\">Xin cho cc
ban</font></b></p><p><font face=\".VnTimeH\">Chc mt ngy 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);
//Gn kiu ni 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 trn ban gn ni dung l mt xu c dinh dang HTML, d bo cho
nguoi nhn bit ni dung bn trong thu c dinh dang HTML ban goi phuong thuc
msg.setContent(content, "text/html");
3. Gui thu vi file dnh km
Thu vin java mail API cho php ban gui mail voi cc file dnh km. Nhung file ny
thuong duoc nhng vo phn ni dung mail gui di o dang m ho tung phn doan
(Multi part MIME). Mt Message duoc xem l gm nhiu phn doan. Mi phn
doan duoc goi l mt BodyPart, Tt ca cc BodyPart duoc goi l MultiPart. Dua vo
hai lop BodyPart v MultiPart ta c th tao ra mt mail phuc tap c th phn tch boi
noi nhn. Chuong trnh SendMailAttachAPI.java duoi dy s cho thy k thut gui
mail voi file dnh km.
//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";
//Tn ca file dnh km
String fileName = "C:/test.txt";
//tao di 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 di tuong thng dip
Trang 215
Message msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(from));
msg.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
msg.setSubject(subject);
/* Tao di tuong Multipart, di tuong ny dng d cha cc BodyPart */
Multipart multiPart = new MimeMultipart();
//Tao ra di tuong BodyPart d cha ni dung mail
BodyPart msgBodyPart = new MimeBodyPart();
msgBodyPart.setText(content);
//Thm di tuong msgBodyPart vo multiPart
multiPart.addBodyPart(msgBodyPart);
/*Tao di tuong BodyPart th hai, di tuong ny dng d cha phn file dnh km */
msgBodyPart = new MimeBodyPart();
DataSource source = new FileDataSource(fileName);
msgBodyPart.setDataHandler(new DataHandler(source));
//Gn tn tp tin cho BodyPart
msgBodyPart.setFileName(fileName);
//Cho bit dy l phn cha file dnh km
msgBodyPart.setDisposition("attachment");
//Thm di tuong msgBodyPart vo multiPart
multiPart.addBodyPart(msgBodyPart);
//Gn multiPart cho di tuong thng dip
msg.setContent(multiPart);
//Gi thng dip di
Transport tp = session.getTransport("smtp");
tp.connect("utehy.edu.vn", "", "");
tp.sendMessage(msg, msg.getAllRecipients());
tp.close();
}
}
Ch : Ban c th dnh km bao nhiu file tuy , bng cch tao ra nhiu BodyPart khc
nhau.
IV. Nhn mail
1. Nhn mail don gian
D nhn mail, ban kt ni vo mail server d ly v cc Message trong thu muc
INBOX. V du GetMailAPI sau minh hoa cch nhn mail tu trnh chu v hin thi ra mn
hnh.
//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 di 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 di tuong Store
Store store = session.getStore("pop3");
store.connect(smtpHost, "thek44a2", "abc");
//Ly v thu muc INBOX
Folder folder = store.getFolder("INBOX");
if (folder == null) {
System.out.println("No folder");
System.exit(1);
}
//M thu muc INBOX vi ch d chi doc
folder.open(Folder.READ_ONLY);
//Ly v cc di tuong Message v hin thj ra mn hnh
Message[] messages = folder.getMessages();
for (int i = 0; i < messages.length; i++) {
printMessage(messages[i]);
}
/*ng kt ni nhung khng xo cc Message t mail server */
folder.close(false);
store.close();
}
public static void printMessage(Message m) throws Exception {
//In phn tiu d thu
//Ly v cc dja chi gi
Address[] from = m.getFrom();
if (from != null) {
for (int i = 0; i < from.length; i++) {
System.out.println("From: " + from[i]);
}
}
//Ly v cc dja chi nhn 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]);
}
}
//Ly v tiu d thu
String subject = m.getSubject();
if (subject != null) {
System.out.println("Subject: " + subject);
}
//Ly v ngy thu duoc gi
Date d = m.getSentDate();
if (d != null) {
System.out.println("Date: " + d);
Trang 217
}
//Thm mt hng xung dng d phn cch phn tiu d v phn chnh ca thu
System.out.println();
//In ni dung ca 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 {
//jnh dang ny s duoc gii thiu trong phn sau
System.out.println("Unrecognized Content Type");
}
}
}
Ch : Ban c th khng cn dng di tuong Store, ban c th thay doan chuong trnh sau:
Store store = session.getStore("pop3");
store.connect(smtpHost, "thek44a2", "abc");
//Ly v thu mc INBOX
Folder folder = store.getFolder("INBOX");
Boi doan chuong trnh
URLName urlName=new
URLName("pop3","utehy.edu.vn",110,"INBOX","thek44a2","abc");
Folder folder = session.getFolder(urlName);
Bng cch ny ban khng cn phai tao ra di tuong Store
2. Ly v cc thng tin di km vi mail
Ban c th ly v cc thng tin di km voi thu nhu: ngy gui, tiu d
phuong thuc printInfo sau s in ra mn hnh cc thng tin di km voi thu.
public static void printInfo(Message m)throws Exception
{ //Ly v dja chi ca ngui gi
String from = InternetAddress.toString(m.getFrom());
if (from != null) System.out.println("From: " + from);
//Hoc
Address[] from = m.getFrom();
if (from != null) {
for (int i = 0; i < from.length; i++) {
System.out.println("From: " + from[i]);
}
}
//Ly v cc dja chi d phn hi
String replyTo = InternetAddress.toString(m.getReplyTo());
Trang 218
if (replyTo != null)
System.out.println("Reply-to: "+ replyTo);
//Hoc
Address[] reply = m.getReplyTo();
if (reply != null) {
for (int i = 0; i < reply.length; i++) {
System.out.println("Reply: " + reply[i]);
}
}
//Ly v cc dja chi TO
String to = InternetAddress.toString(m.getRecipients(Message.RecipientType.TO));
if (to != null) System.out.println("To: " + to);
//Ly v cc dja chi CC
String cc = InternetAddress.toString(m.getRecipients(Message.RecipientType.CC));
if (cc != null) System.out.println("Cc: " + cc);
//Ly v cc dja chi BCC
String bcc = InternetAddress.toString(m.getRecipients(Message.RecipientType.BCC));
if (bcc != null) System.out.println("Bcc: " + to);
//Ly v tiu d ca thu
String subject = m.getSubject();
if (subject != null) System.out.println("Subject: " + subject);
//Ly v ngy thu duoc gi
Date sent = m.getSentDate();
if (sent != null) System.out.println("Sent: " + sent);
//Ly v ngy thu duoc nhn
Date received = m.getReceivedDate();
if (received != null) System.out.println("Received: " + received);
}
3. Nhn mail vi cc file dnh km
Nu ni dung thu c chua file dnh km ban c th tch phn dnh km, phn thu ra.
V du GetMailAttach.java minh hoa cch kim tra mail c file dnh km hay khng?, nu
c th ghi ni dung cua file dnh km xung 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 mt 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);
//Ly v Store
Store store = session.getStore("pop3");
//Kt ni vi mail server
store.connect(smtpHost, "thek44a2", "abc");
//Ly v thu muc INBOX
Folder folder = store.getFolder("INBOX");
//Nu khng c thu muc ny th thot
if (folder == null) {
System.out.println("No folder");
System.exit(1);
} //M thu muc d ly thu theo ch d chi doc
folder.open(Folder.READ_ONLY);
//Ly v cc thu trong Mail Box
Message[] messages = folder.getMessages();
//X l tng thu mt
for (int i = 0; i < messages.length; i++) {
//Ly v ni dung ca thu
Object body = messages[i].getContent();
//Kim tra xem ni dung thu c nhiu phn hay khng?
if (body instanceof Multipart) {
//Ni dung thu gm nhiu phn
processMultipart( (Multipart) body);
}
else { //Ni dung thu chi c mt phn
processPart(messages[i]);
}
}
// ng kt ni, nhung khng xo cc thu
folder.close(false);
store.close();
}
//Phuong thc x l thu gm nhiu Part
public static void processMultipart(Multipart mp) throws MessagingException {
for (int i = 0; i < mp.getCount(); i++) {
processPart(mp.getBodyPart(i));
}
}
//Phuong thc x l mt Part
public static void processPart(Part p) {
try {
//Th ly v tn file ca Part
String fileName = p.getFileName();
/* y v du hiu cho bit Part c phi l phn file dnh km khng */
String disposition = p.getDisposition();
/* Kim tra xem Part c phi l file dnh km khng?
Ch khng nn s dung disposition.equals(Part.ATTACHMENT), v disposition c th
nhn gi trj null khi d phuong thc equals s nhn mt ngoail
*/
Trang 220
if (Part.ATTACHMENT.equals(disposition)) {
//Nu Part l phn cha file dnh km
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);
}
//Ly v lung xut gn vi tp tin
FileOutputStream out = new FileOutputStream(f);
//Ly v lung nhp gn vi Part
InputStream in = new BufferedInputStream(p.getInputStream());
//Khai bo vng nh tam d doc ni dung t Part
byte buffer[] = new byte[in.available()];
in.read(buffer); //oc ni dung t part vo vng nh dm
out.write(buffer); //Ghi vng nh dm ra tp
out.flush(); //Ghi dn ht vng dm ra tp
out.close(); //ng lung gn vi tp
in.close();//ng lung gn vi Part
}
else { //Part khng phi l phn cha file dnh km
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 hp thu voi quyn doc/ghi nhu sau:
Folder folder = store.getFolder("INBOX");
folder.open(Folder.READ_ONLY);
Message[] messages = folder.getMessages();
Tip dn dt co xo:
Messages[i].setFlag(Flags.Flag.DELETE,true);
Tip dn dng kt ni, mail server s tu dng xo mail
folder.close(true);//Ch bt buc phai l tham s true
2. Kim tra trng thi c cua mail
// Kim tra trng thi cua cc c :
//D dnh du 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 vo thng rc
if (messages[i].isSet(Flags.Flag.DRAFT)) {
System.out.println("Draft");
}
//D duoc gn 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 TRNH PHN TN VI
JAVA RMI ( REMOTE METHOD INVOKE)
Lp trnh phn tn voi RMI l mt trong nhung vn d nng bong cua nn cng
nghip phn mm ngy nay. D gip cc ban c cc kin thuc co ban v lp trnh phn tn
v cng ngh lp trnh phn tn RMI. Chuong ny ta thao lun v cc kha canh d.
Sau khi hoc xong chuong ny nguoi hoc c th:
Hiu duoc khi nim v lp trnh phn tn v cng ngh RMI
ung dung cng ngh RMI d xy dung cc ung dung phn tn
Chuyn tham s cho phuong thuc triu goi tu xa v nhn kt qua tra v tu phuong thuc
triu goi tu xa
I. RMI v lp trnh phn tn di tung
Thng thuong m lnh cua mt chuong trnh khi thuc thi duoc tp trung trn cng
mt my, dy l cch lp trnh truyn thng. Su pht trin nhu vu bo cua mang my tnh
dc bit l mang Internet ton cu, d khin cc chuong trnh truyn thng ny khng cn
dp ung duoc yu cu nua. Cc chuong trnh by gio yu cu phai c su hop tc xu l, tuc
l m lnh cua n d khng tp trung trn mt my m duoc phn tn trn nhiu my. Khi
mt ung dung c m lnh thuc thi duoc phn tn trn nhiu my th chuong trnh d duoc
goi l chuong trnh phn tn v vic lp trnh d tao ra cc chuong trnh ny duoc goi l lp
trnh phn tn. C rt nhiu cng ngh lp trnh phn tn nhu: DCOM, CORBA, RMI,
EJB.. trong d RMI l cng ngh thun Java v d lp trnh nht.
Thng thuong nu cc di tuong duoc tp trung trn cng mt my th ban c th
triu goi cc phuong thuc cua n bng cch guu cho n mt thng bo, cu hoi dt ra l
lm th no d c th triu goi cc phuong thuc cua mt di tuong nm trn mt my khc.
dy chnh l ni dung cua lp trnh phn tn m lnh RMI (Remote Method Invoke tam
dich l triu goi phuong thuc tu xa). RMI l cch thuc giao tip giua cc di tuong Java c
m lnh ci dt (bao gm ca phuong thuc v thuc tnh) nm trn cc my khc nhau c th
triu goi ln nhau.
Hnh sau m hnh triu goi di tuong phn tn. Trn my A cc di tuong A1, A2
goi cc phuong thuc cua nhau duoc goi l triu goi phuong thuc cuc b (local method
invoke) dy l cch lp trnh huong di tuong truyn thng vn su dung, tuong tu cc di
tuong B1, B2, B3 l cc di tuong cuc b.
Tuy nhin cc di tuong Java c th triu goi phuong thuc cua mt di tuong nm
trn mt my khc dua vo giao thuc triu goi tu xa RMI. Trong m hnh duoi dy th loi
triu goi phuong thuc cua di tuong B2 ( nm trn my B) tu di tuong A1 ( nm trn my
A) l loi goi phuong thuc tu xa.
Trang 223
II. Gi phuong thc t xa v cc vn d pht sinh
Vic triu goi mt phuong thuc tu xa thoat nhn c ve don gian nhung thuc t lai
phuc tap hon triu goi phuong thuc cuc b. Cc di tuong trn hai my khc nhau hoat
dng trn hai tin trnh khc nhau (c hai khng gian dia chi khc nhau) nn vic tham
chiu bin dia chi di tuong l khc nhau. V du khi ban truyn mt di tuong cho mt
phuong thuc triu goi tu xa th thuc su ban truyn mt tham chiu di tuong dn phuong
thuc tu xa, tuy nhin vng nho thuc su cua di tuong lai nm trn mt my khc. Loi goi
phuong thuc cuc b lun tra v kt qua thng qua ngn xp trong khi loi goi phuong thuc
tu xa kt qua tra v phai thng qua kt ni mang chnh v vy cc su c v truyn thng
lun c th sy ra, nhu vy vic bt v kim sot li trong cc ung dung phn tn l rt dt.
III. Vai tr cua cc lp trung gian
Di voi loi goi phuong thuc cuc b, cc tham s truyn vo phuong thuc cung nhu
kt qua tra v tu phuong thuc duoc thuc hin thng qua ngn xp (stack) trong khi loi goi
phuong thuc tu xa phai duoc dng gi v chuyn qua mang.
D don gian v trong sut di voi nguoi lp trnh di tuong Java trn hai my khc
nhau khng triu goi phuong thuc cua nhau mt cch truc tip m thng qua lop trung gian.
Lop trung gian tn tai o ca hai pha: pha my khch (noi goi phuong thuc cua di tuong o
xa) v my chu (noi di tuong thuc su duoc ci dt). Pha my khc lop trung gian ny
duoc goi l stub (lop mc), pha my chu lop trung gian duoc goi l skeletion (lop ni).
Ta c th hnh dung lop trung gian stub v skel l hai nguoi trung gian gip cc di
tuong o xa c th giao dich duoc voi nhau.
My A
A1
A2
My B
B1
B2
B3
My C
C
Hnh 1: M hnh triu goi cc phuong thuc tu xa
Trang 224
Trong hnh trn ban c di tuong C1 duoc ci dt trn my C. trnh bin dich Java
gip ta tao ra hai lop trung gian C1_stub v C1_skel. Lop C1_stub duoc mang v my A.
Khi A1 trn my A triu goi phuong thuc cua di tuong C1 n s chuyn loi goi phuong
thuc cho lop trung gian C1_stub. Lop trung gian C1_stub c trch nhim dng gi cc tham
s chuyn tham s qua mang dn phuong thuc duoc triu goi cua di tuong C1. Trn my
C lop trung gian C1_Skel c nhim vu nhn cc tham s v chuyn vo vng dia chi thch
hop sau d goi phuong thuc tuong ung. Kt qua tra v (nu c) cua phuong thuc do C1 tra
v s duoc lop C1_Skel dng gi v chuyn nguoc v cho trnh khch. Trn my khch lop
trung gian C1_Stub chuyn giao kt qua cui cng lai cho A1. Bng co ch ny A1 lun
nghi rng di tuong C1 dang tn tai ngay trn cng my voi n nhu cc di tuong cuc b
khc. Hon nua nho c lop trung gian C1_Stub m khi kt ni mang gp su c th lop trung
gian stub s lun bit cch thng bo li dn di tuong A1.
Thuc t lm cch no A1 tham chiu duoc dn C1, mt khi khng c di tuong C1 duoc
ci dt trn my A? C1_Stub trn my A chi thuc hin vic chuyn tham s, nhn kt qua
tra v nu c v thuc hin cc giao thuc mang, n khng phai l hnh anh cua C1. D lm
duoc diu ny di tuong C1 cn cung cp mt giao din tuong ung voi cc phuong thuc m
cc di tuong trn my khc c th triu goi. Chng ta tip tuc lm sng to du ny khi ni
v giao din tu xa.
IV. Ci d}t di tung phn tn
1. Giao din t xa
Khi ban mun tao ra mt su vt tu xa th ban che mat na ci dt nn bng cch
truyn qua mt giao din. Vy khi khch thu duoc mt tham chiu dn di tuong tu
xa th thuc cht d l mt giao din.
My A
C
1
_
s
t
u
b
A1
A1
B1_stub
My C
C
1
_
s
k
e
l
C1
My B
B1
B1_skel
Hnh 2: Goi phuong thc ca di tuong thng qua lp trung gian
Trang 225
Khi tao ra mt giao din tu xa, th ban phai tun theo cc huong dn sau:
Giao din tu xa phai l mt giao din public, tuc l khi tao ra mt giao din tu xa ta phai
thm tu kho public vo truoc dinh nghia giao din. Bng khng, khi ban tham chiu
dn di tuong tu xa ban s thu duoc mt ngoai l
Giao din tu xa phai l giao din duoc k thua tu giao din Remote
Mi phuong php trong giao din tu xa phai khai bo RemoteException trong mnh d
throws bn bt cu ngoai l no khc, tuc l tt ca cc phuong thuc trong giao din tu xa
du phai nm ra ngoai l RemoteException
Nu tham s truyn cho phuong thuc hoc gi tri nhn v tu thuc triu goi tu xa l mt
di tuong th di tuong d phai trin khai giao din Remote hoc giao din Serializable
Thng thuong ban thuong thy mt giao din tu xa c cu trc 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 d 1-1: Sau dy l mt giao din tu xa don gian cua ung dung HelloRMI
HelloRMI .java
import java.rmi.*;
public interface HelloRMI extends Remote{
public String sayHello() throws RemoteException;
}
Nhn vo giao din ny ta thy n ging bt ky giao din no khc ngoai tru n duoc
mo rng tu giao din Remote v tt ca cc phuong thuc trong giao din ny du phai nem
ra ngoai l RemoteException, ban hy nho rng tt ca cc phuong thuc duoc khai bo trong
giao din s tu dng l public, th nn trong giao din trn ban c th bo tu kho public khi
khai bo phuong thuc sayHello.
Ban tin hnh bin dich javac HelloRMI.java ban s thu duoc tp tin HelloRMI.class
2. Trin khai giao din t xa
Sau khi ban tao ra giao din tu xa, cng vic tip theo m ban cn phai lm l trin
khai tt ca cc phuong thuc trong giao din tu xa.
V du 1-2: Sau dy l ci dt cua giao din tu xa HelloRMI
HelloRMI I mpl.java
import java.rmi.*;
public class HelloRMIImpl implements HelloRMI {
public String sayHello() throws RemoteException
{
return "Hello RMI";
}
}
Vn d dt ra l lm th no d ci dt di tuong HelloRMI ln mt my (my 2) v goi
phuong thuc sayHello() cua HelloRMI tu my khc (my 1)? Nhu d nu o trn ta khng
goi duoc phuong thuc sayHello cua HelloRMI mt cch truc tip m cn c thm hai lop
trung gian l HelloRMIImpl_Stub v HelloRMIImpl_Skel. Dua vo lop
Trang 226
HelloRMIImpl.class, trnh bin dich rmic.exe cua Java s gip ta tao ra hai lop trung gian
Stub v Skel. Ban mo cua s DOS Prompt v g vo dng lnh
Rmic HelloRMI Impl.class
Kt qua ban s thu duoc hai tp HelloRMI Impl_Stub.class v HelloRMI Impl_Skel.class
3. Ci dt, dng k di tung t xa
Buoc tip theo sau khi ban ci dt giao din tu xa l cng vic dng k n voi trnh
rmiregistry theo mu sau:
V du 1-4: V du sau l chuong trnh dng k v ci dt doi tuong HelloRMIImpl voi trnh
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 mt th hin ca di tuong t xa
HelloRMI h=newHelloRMIImpl();
try {
// Khai bo di tuong c kh nng triu goi t xa
UnicastRemoteObject.exportObject(h);
// dng k n vi trnh rmiregistry
Naming.bind("//localhost/hello", h);
// c th thay phuong thc bind bi phuong thc rebind nhu sau:
// Naming.rebind("//localhost/hello", h);
}
catch (MalformedURLException ex) {
}
catch (AlreadyBoundException ex) {
}
catch (RemoteException ex) {
}
}
}
Cng vic du tin ban phai lm khi ci dt di tuong tu xa l tao ra mt th hin
cua di tuong tu xa.
HelloRMI h=new HelloRMI Impl(); ban c th thay bng dng lnh
HelloRMI I mpl h=new HelloRMI Impl();
Tip theo ban goi phuong thuc tinh exportObject cua lop UnicastRemoteObject d my ao
java bit di tuong h (HelloRMI) l di tuong c kha nng truy xut tu xa.
UnicastRemoteObject.exportObject(h);
Luu d su dung duoc lop UnicastRemoteObject ban phai khai bo import
java.rmi.server.*; o du chuong trnh
Trang 227
Buoc cui cng l ban dt cho di tuong h mt ci tn goi nho v dng k tn ny
voi b dng k rmiregistry. Phuong thuc tinh cua lop Naming s thuc hin diu ny
Naming.bind("[rmi:]//hostname[:port]/name", h);
Phuong thuc bind c hai tham s: tham s thu nht l mt chui dinh vi URL, di s
thu hai l ban thn di tuong cn dng k
Chui dinh vi URL c dinh dang nhu sau:
[rmi:]//hostname[:port]/name
Trong d:
mri l tn giao thuc,dy l phn tuy chon, mc dinh giao thuc l rmi nn ban c th bo
qua.
Hostname l tn cua my chu hoc dia chi IP cua my chu noi di tuong phn tn dang
tn tai.
Port l s hiu cng cua chuong trnh rmiregistry, dy l tham s tuy chon, nu bo qua
tham s ny th cng mc dinh l 1009
Name l tn goi nho cua di tuong phn tn
Phuong thuc bind s di vo vng lp v han cho kt ni tu my kch.
Cc chuong trnh pha my khch s dua vo chui dinh vi URL m ta dng k voi trnh
rmiregistry d truy tm tham chiu dn di cn dng.
Ban c th khoi dng b dng k rmiregistry ny o du? Ban mo cua s DOS-Prompt
v cho chay chuong trnh rmiregistry ny tu dng lnh nhu sau:
C:\J DK1.4\bin\rmiregistry.exe
Nu trong WintNT th ban c th chay n nhu mt dich vu bng dng lnh start
C:\J DK1.4\bin\rmiregistry.exe
Sau khi khoi dng chuong trnh rmiregistry bng mt trong hai cch ban khng thy
phan hi g ca boi v dy l chuong trnh chay duoi dang dich vu (service).
Mc dinh rmiregistry lng nghe cc kt ni trn cng 1009. Ban c th chi dinh
cng khc cho n. V du lnh sau s khoi dng rmiregistry trn cng 2004
C:\Jdk1.4\bin\rmiregistry.exe 2004
Ch :
Trong java 1 hostname khng th l localhost, nghia l nu ban mun thu nghim trn
my cuc b th ban phai truyn cho n mt dia chi IP chng han nhu 127.0.0.1 hoc tn cua
my (d bit tn cua my cua mnh ban vo Control Panel\Net Work chon the
Indentification v ban s thy tn my cua mnh trong phn Computer Name)
RMI s khng lm vic chung no ban chua ci ho giao thuc TCP/IP.
Nu ban dang kim thu trn my cuc b th ban c th dng k voi trnh rmiregistry don
gian nhu sau:
Naming.bind(hello,h);
Nu ban dng k mt di tuong moi voi mt ci tn goi nho d duoc su dung cho mt
di tuong khc ban s nhn duoc mt ngoai l AlreadyBoundException. D ngn can diu
ny ban nn dng phuong thuc Naming.rebind() thay cho phuong thuc Naming.bind() v
Naming.rebind() b sung mt ci tn moi nu n chua c v thay th mt ci tn d tn tai
voi mt di tuong moi.
Cho d phuong thuc main() kt thc th di tuong tu xa ban tao ra v dng k cho n
mt ci tn vn cn d chung no m rmiregistry vn cn dang chay v ban khng goi
Trang 228
phuong thuc Naming.unbind() th su vt ny vn cn d. Boi l do ny, khi ban pht trin
ung dung cua mnh th ban cn phai tt rmiregistry v cho chay lai n mi khi ban bin dich
lai di tuong tu xa.
Ban khng nht thit phai khoi dng rmiregistry nhu mt tin trnh ngoi. Nu ban bit
rng ung dung cua mnh l ung dung duy nht s dng s dng k. Th ban c th bt du
n o bn trong chuong trnh cua mnh bng dng lnh:
LocateRegistry.createRegistry(Port);
o dy Port l s hiu cng. Diu ny l tuong duong voi vic chay rmiregistry Port tu du
nhc cua DOS-Prompt
4. Vit trnh khch triu gi phuong thc cua di tung ci dt t xa
Trnh khch triu goi di tuong phn tan RMI c th l mt trong cc kiu ung dung
sau: ung dung console
ung dung c giao din d hoa
ung dung Servlet
trang JSP

Diu duy nht ban phai lm trong chuong trnh khch l tra cuu v ly v giao din
tu xa tu trnh chu. Tu d tro di vic triu goi phuong thuc tu xa ging nhu l triu
goi phuong thuc cua bt ky di tuong cuc b no khc.
Sau dy l mu chuong trnh pha trnh khch triu goi di tuong phn tn RMI
import java.rmi.*;
import java.rmi.registry*;
public Client
{
public static void main(String args[]) throws RemoteException
{
// ly v tham chiu di tuong phn tn bng phuong thuc Naming.lookup()
RemoteInterface r=(RemoteInterface)Naming.lookup([rmi:]//hostname[:port]/name);
// triu goi cc phuong thuc cua di tuong tu xa
}
}
V d 1-5: Sau dy l trnh khch triu goi di tuong HelloRMI
Client.java
import java.rmi.*;
import java.rmi.registry*;
public Client
{ public static void main(String args[]) throws RemoteException
{// ly v tham chiu di tuong phn tn bng phuong thuc Naming.lookup()
HelloRMI r=( HelloRMI)Naming.lookup(//localhost/hello);
// triu goi phuong thuc sayHello cua di tuong tu xa
System.out.println(HelloRMI.sayHello());
}
}
Trang 229
D truy tm di tuong o xa, chuong trnh my khch goi phuong thuc
Naming.lookup(); Phuong thuc ny chi yu cu di s l chui cho bit dia chi cua my
chu v tn dng k cua di tuong.
RemoteInterfacer=(RemoteInterface)Naming.lookup([rmi:]//hostname[:port]/name);
Mc dinh phuong thuc Naming.lookup() tra v mt tham chiu Object nn ban cn phai
p kiu sang giao din tu xa.
Ban c th hnh dung phuong thuc Naming.lookup() dng vai tr nhu mt dich vu tm
kim di tuong trn my chu, n lin lac voi trnh rmiregistry trn my chu v yu cu tra
v tham chiu di tuong cho ban su dung. Cn Naming.bind() dng vai tr nhu dich vu
dng k.
Bin dich v chay trnh khch
Javac Client.java
Tt ca d sn sng, ban hy chay chuong trnh khch nhu sau:
Java Client
Kt qua thu duoc l loi cho Hello RMI
Hnh 3 din dat co ch goi phuong thuc tu xa cua cc di tuong RMI mt cch tng qut:
Dng k di tuong voi trnh rmiregistry bng cch goi phuong thuc Naming.bind() hoc
Naming.rebind().
My khch mun goi phuong thuc cua di tuong trn my chu truoc ht cn phai goi
phuong thuc Naming.lookup() d truy tm tham chiu dn di tuong o xa theo tn.
B dng k s tra v tham chiu cua di tuong o xa thng qua giao din tu xa.
Dua vo giao din tu xa m trnh khch c th goi cc phuong thuc cua di tuong o xa.
Khi mt phuong thuc duoc goi, loi goi s duoc chuyn dn lop trung gian _Stub. Lop
trung gian ny c nhim vu dng gi cc tham s v chuyn dn lop trung gian _Skel
trn trnh chu.
Lop trung gian trn my chu s tip nhn cc tham s gui dn tu trnh khch v truc tip
yu cu di tuong thuc thi phuong thuc v chuyn kt qua (nu c) v cho trnh khch.
.
V du 2: Vit lop Calculator, lop ny c cc phuong thuc add, less, mul, div dng d thuc
hin cc php ton tuong ung cng, tru, nhn v chia
Buc 1: to ra giao din t xa
- Mo mt trnh soan thao bt ky g vo ni dung nhu sau:
My khch My ch
rmiregistry
HelloRMIIm
pl
Naming.bin
d
Naming.rebi
nd
Client
Naming.looku
p
1
2
3
HelloRMI
HelloRMIImpl_Stub HelloRMIImpl_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 vo thu muc C:\NetWork\Server
- Mo cua s DOS-Prompt v g vo dng lnh bin dich nhu sau:
Buc 2: Ci d}t giao din t xa
- Mo trnh soan thao bt ky g vo ni dung sau:
// CalculatorI mpl.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 ci tn CalculatorImpl.java
- Mo cua s DOS_Prompt v g vo dng lnh sau d bin dich
Trang 231
sau khi bin dich ban thu duoc tp tin CalcultatorImpl.class
Buc 3 To ra cc lp trung gian _Stub v _Skel
Ban mo cua s DOS_Prompt v g vo dng lnh
Sau khi thuc hin xong lnh ny ban s thu duoc hai lop trung gian l
CalcultatorImpl_Stub v CalcultatorImpl_Skel trong cng thu muc C:\network\server
Buc 4: Dng k di tung t xa vi trnh rmiregistry
- Ban mo trnh soan thao bt ky v g vo ni 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 ci tn CalculatorSetup.java trong vo thu muc c:\network\server
- Mo cua s DOS_Prompt g vo dng lnh sau:
Trang 232
Buc 5: Khoi dng d|ch v dng k tn rmiregistry
Ban mo cua s DOS-Prompt, chuyn vo thu muc C:\NetWork\Server v g vo dng lnh
sau:
Chuong trnh dang k d duoc khoi dng
Buc 6: Khoi dng trnh setup
Ban mo cua s DOS-Prompt khc g vo dng lnh
Ch : Nu ban khng chuyn vo thu muc C:\NetWork\Server truoc khi khoi dng dich
vu dang k th ban s nhn duoc mt li
Trang 233
Chuong 11: JAVA JSP (JAVA SERVLET)
Trang 234
Chuong 12: EJB (ENTERPRISE JAVA BEANS)
Chuong ny ta s nghim cuu v xy dung mt trong nhung thnh phn th vi cua
java d l JavaBean mt m hnh quan trong trong kin trc cua Java.
Cc vn d chnh s duoc d cp trong chuong ny
JavaBean v cng ngh phn mm
Tm hiu cc thnh phn cua JavaBean
Tm hiu b phn tch Introspector cua java
Xy dung v su dung JavaBean
Tch hop JavaBean voi cc cng ngh thnh phn khc
I. Tng quan v JavaBean
JavaBean l mt cng ngh lp trnh huong thnh phn cua Sun dua trn nn tang
cua ngn ngu Java. JavaBean l mt giao din lp trnh dng d tao ra nhung khi m xy
dung sn v c th dng lai duoc. Nhung thnh phn JavaBean c th duoc nhng vo
mt ung dung, lin kt voi thnh phn JavaBean khc hay duoc dng d kt ni voi cc
ung dung. Bng cch su dung JavaBean cc nh pht trin ung dung c th giam khi
luong m m ho phai vit. Ho c th tu vit ra chng hoc c th mua lai cua mt hng
pht trin thu ba khc (third party).
JavaBean thuc cht l mt lop Java nhu cc lop Java thng thuong khc, nhung n
duoc vit theo mt quy tc quy dinh truoc, Ban khng cn phai vit thm bt cu m
phu no hay su dung nhung mo rng ngn ngu dc bit no d tao ra mt Bean.
Diu duy nht ban phai lm hoi sua cch dt tn cho cc phuong thuc cua mnh.
Chnh tn phuong thuc moi bo cho cng cu xy dung bit dy c l mt thuc tnh
hay mt su kin hay chi l mt phuong thuc thng thuong.
II. Xy dng thnh phn JavaBean
Nhu d gioi thiu o trn JavaBean thuc cht l mt lop java thng thuong. Nhu vy
mt JavaBean cung c cc thuc tnh v cc phuong thuc. Mt cu hoi ban dt ra l lm th
no d nguoi dng Bean cua ban c th bit duoc trong Bean d c nhung thuc tnh,
phuong thuc no, kiu cua chng ra lm sao? Diu ny d duoc cc nh thit k java giai
quyt mt cch rt don gian. D bit duoc cc thuc tnh v cc phuong thuc cua mt Bean
ban chi cn tun thu theo quy tc dt tn sau:
Voi mt thuc tnh c tn l xxx, th ban tao ra hai phuong thuc: getXxx() v setXxx().
Luu rng k tu thu nht sau get hay set phai vit hoa. Kiu tra v cua phuong
thuc get cung chnh l kiu cua di phuong thuc set v thuong th chng cung l
kiu cua thuc tnh xxx. Ban cung ch cho l tn cua thuc tnh v kiu cho get v
set l khng lin quan.
Voi mt thuc tnh boolean, ban c th dng cch tip cn get v set o trn, nhung
ban cung c th dung is thay cho get.
Cc phuong thuc thng thuong cua Bean khng tun theo quy tc trn, nhung chng
phai l phuong thuc public.
Nu Bean cho php dng k thnh gia th voi mt thnh gia (listener) XxxListener ban
phai c hai phuong thuc tuong ung di km l addXxxListener(XxxListener) v
Trang 235
removeXxxListener(XxxListener). Phn lon cc bin c v thnh gia l c sn ban c
th tu tao ra cc bin c v thnh gia ring cua mnh.
1. Thuc tnh cua Bean
Thuc tnh thuc cht l mt bin nm bn trong mt lop, thng thuong cc thuc
tnh thuong duoc dt muc truy cp l private. d truy cp dn cc thuc tnh private ny ta
thuong dng hai phuong thuc: get mang nghia l ly gi tri cua thuc tnh v set hm
nghia gn gi tri cho thuc tnh. V du voi mt Bean don gian c tn l xBean nhu sau:
public class xBean
{
private String myName;
public String getName() { return myName;}
public void setName(String newName) { myName=newName;}
}
Thuc tnh myName trong lop xBean duoc ly v gn gin tri thng qua phuong
thuc getName v setName. Nhu ban thy giua tn thuc tnh v tn phuong thuc get v
set l khng lin quan dn nhau. Khi B phn tch (Instrospector) cua java thy trong
Bean c hai phuong thuc tn l getName v setName n s hiu rng bn trong Bean ny
c mt thuc tnh tn l name (v c hai phuong thuc tn l getName v setName).
V d: Trnh by cch tao ra cc thuc tnh v cch xy dung cc phuong thuc get v
set
public class Bean1 {
private String str; // thuc tnh kiu String
private int i; // thuc tnh kiu int
private int[] arr; // thuc tnh kiu mng int
private boolean b; // thuc tnh kiu logic
private float f; // thuc tnh kiu float
private java.io.DataInputStream is; // thuc tnh kiu di tuong
private java.io.DataOutputStream os;
public String getStr() { //Phuong thc get cho thuc tnh str
return str;
}
public void setStr(String str) { //Phuong thc set cho thuc tnh str
this.str = str;
}
public int getI() { //Phuong thc get cho thuc tnh i
return i;
}
public void setI(int i) { //phuong thc set cho thuc tnh i
this.i = i;
}
//Phuong thc get cho thuc tnh arr thuc tnh ny l mt //mng nn gi trj tr v l mt
mng
public int[] getArr() { return arr; }
//Phuong thc set cho thuc tnh arr, thuc tnh ny l mt //mng nn tham s l mt
nng
public void setArr(int[] arr) { this.arr = arr; }
Trang 236
//Phuong thc get cho thuc tnh b, do thuc tnh ny kiu //logic nn 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; }
//nu thuc tnh l mt di tuong th phuong thc get tr //v mt di tuong kiu di
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) Cc thuc tnh th hin s thay di (Bound Property)
JavaBean l cc thnh phn ring bit nhung n vn c th tuong tc voi cc di
tuong khc thng qua co ch truyn thng dip (message). Khi mt thuc tnh cua mt
Bean A thay di n c th thng bo cho cc di tuong khc bit l thuc tnh cua A d
thay di d di tuong ny thuc hin cng vic g d chng han nhu cp nht lai gi tri cua
n theo thuc tnh cua A.
Co ch ci dt d mt thuc tnh c th thng bo cho cc di tuong khc bit khi n
thay di rt don gian chi cn ci dt hai phuong thuc dng d dng k v loai bo mt
di tuong listener nhu sau:
public void add<PropertyName>Listener(PropertyChangeListener lst)
public void remove<PropertyName>Listener(PropertyChangeListener lst)
V d: ban c mt JavaBean A c mt thuc tnh size cho bit kch c g d. Khi thuc tnh
size thay di d cc di tuong khc du bit su thay di ny ta ci dt nhu sau:
public class BeanA
{float size;
private PropertyChangeSupport changeSize=new PropertyChangeSupport(this);
public void addSizeListener(PropertyChangeListener lst){.}
public void removeSizeListener(PropertyChangeListener lst){.}
}
Cc di tuong mun nhn duoc thng bo tu JavaBean ny du phai ci dt giao
din PropertyChangeListener , sau d dng k voi thnh phn BeanA nho cc phuong
thuc m ban xy dung o buoc trn. Phuong thuc duy nht m ban phai ghi d khi ci dt
giao din PropertyChangeListener l public void propertyChange(PropertyChangeEvent
evt) {..}
Cc thu tuc trn dy chi thuc hin nhim vu dng k v tao di tuong Listener m
thi. D cc di tuong Listener ny c th nhn bit duoc su thay di cua thuc tnh size ta
phai goi phuong thuc firePropertyChange cua di tuong PropertyChangeSupport tu thnh
phn BeanA nhu sau:
public void firePropertyChange (String propertyName, Object oldValue, Object
newValue)
Phuong thuc ny s thng bo dn moi di tuong listener (bng cch goi phuong
thuc propertyChangecua listener) d dng k voi thnh phn JavaBean. Su thay di bao
Trang 237
gm gi tri truoc khi thay di (oldValue) v gi tri sau khi thay di (newValue) v tn
thuc tnh duoc thay di.
Duoi dy l ci dt lop BeanA v mt lop d thu nghim thuc tnh nhn bit su
thay di size
//BeanA.java
import java.beans.*;
public class BeanA {
//Khai bo thuc tnh size
private float size;
// changeSize c nhim vu qun l cc di tuong listener d dng //k v gi thng bo
dn chng mi khi thuc tnh size thay di
PropertyChangeSupport changeSize = newPropertyChangeSupport(this);
public float getSize() { return size; }
//Phuong thc gn gi trj cho cho thuc tnh size
public void setSize(float newSize) {
float oldSize = size; size = newSize;
//Nu c thay di v kch thuc th thng bo dn tt c cc di //tuong d dng k lng
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 nghim BeanA vua ci dt o trn
// TestBeanA.java
import java.beans.*;
public class TestBeanA {
public static void main(String[] args) {
// tao ra mt di tuong BeanA
BeanA ba = new BeanA();
//ng k di tuong lng nghe vi di tuong ba
ba.addSizeListener(new MyListener());
//thay di gi trj ca thuc tnh size
ba.setSize(333);
} }
//Tao ra di tuong c kh nng lng nghe su thay di ca thuc tnh
class MyListener implements PropertyChangeListener {
//Phuong thc duy nht cn phi ci dt, phuong thc ny //duoc triu goi mi khi
thuc tnh thay di
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);
}
}
Kt qua khi chay chuong trnh nhu sau:
Change size old value 1.0 new value 333.0
Ch :
Trong v du trn tn cua phuong thuc dng d dng k l addSizeListener v tn cua
phuong thuc dng d g bo dng k l removeSizeListener tuy nhin ban c th dt
cho n mt ci tn thuy thch chng han nhu dangKyLangNghe d dng k di
tuong lng nghe hay huyBoLangNghe d huy bo di tuong lng nghe.
Cc di tuong s khng bit dn su thay di cua thuc tnh size cho dn khi ban goi
phuong thuc firePropertyChange cua di tuong PropertyChangeSupport.
b) Cc thuc tnh rng buc (Constrain Property)
Han ch cua cc thuc tnh bound o trn l cc di tuong chi phan ung lai khi gi tri
cua thuc tnh d bi thay di. Java cung cp mt kha nng khc manh hon d l tao ra cc
thuc tnh bi rng buc (constrain property). Tuong tu nhu thuc tnh bound mi khi thuc
tnh constrain dinh thay di gi tri (chi du dinh chu chua thay di) n s thng bo dn tt
ca cc di tuong dang lng nghe. Di tuong lng nghe c th tu chi su thay di v nhu vy
gi tri cua thuc tnh vn giu nguyn gi tri ban du. Nguoc lai nu tt ca cc di tuong
lng nghe du khng phan di su thay di th lc d thuc tnh ny moi nhn duoc gi tri
moi.
D mt thuc tnh c th thng bo cho cc di tuong khc bit khi n sp thay di
gi tri rt don gian ban chi cn ci dt hai phuong thuc dng d dng k v loai bo
mt di tuong listener nhu sau:
public void add<PropertyName>Listener(VetoableChangeListener lst)
public void remove<PropertyName>Listener(VetoableChangeListener lst)
Cc di tuong mun nhn duoc thng bo tu JavaBean ny du phai ci dt giao
din VetoableChangeListener, sau d dng k, loai voi thnh phn BeanA nho cc
phuong thuc m ban xy dung o buoc trn. Phuong thuc duy nht m ban phai ghi
d khi ci dt giao din VetoableChangeListener l
public void vetoableChange(PropertyChangeEvent evt) throws PropertyVetoException
{.. }
Di tuong lng nghe khng dng cho thay di thuc tnh n chi cn nm ra mt
ngoai l PropertyVetoException, thnh phn JavaBean c thuc tnh constrain s bt
ly v huy bo vic thay di gi tri cho thuc tnh.
Cung nhu thuc tnh bound, khi thuc tnh constrain c du dinh thay di gi tri trong
phuong thuc set n cn thng bo dn cc di tuong d dng k lng nghe
(listener) voi n bng phuong thuc fireVetoableChange cua di tuong
VetoableChangeSupport tu thnh phn JavaBean nhu sau:
public void fireVetoableChange (String propertyName, Object oldValue, Object
newValue)
Trang 239
Phuong thuc ny s thng bo dn moi di tuong listener (bng cch goi phuong
thuc vetoableChange cua listener) d dng k voi thnh phn JavaBean.
Nhn xt: Di tuong VetoableChangeSupport cung tuong tu nhu di tuong
PropertyChangeSupport dng d quan l cc di tuong listener. PropertyChangeSupport
duoc dng voi cc thuc tnh bound cn VetoableChangeSupport dng cho thuc tnh
constrain.
Duoi dy l mt ci dt cho mt JavaBean B c thuc tnh size. Mi khi size thay di n s
thng bo cho cc thnh phn khc bit thng qua di tuong listener. Di tuong listener
ny s tu chi khng cho thay di nu size >100.
// BeanB.java
import java.beans.*;
public class BeanB {
//Khai bo thuc tnh size
private int size = 0;
// vetoAgent v nhim vu qun l tt c cc di tuong listener //d dng k
private VetoableChangeSupport vetoAgent = new VetoableChangeSupport(this);
//Phuong thc ly v gi trj ca thuc tnh size
public int getSize() { return size; }
//Phuong thc dng d thay di gi trj ca thuc tnh size
public void setSize(int newSize) {
int oldSize = size;
try { // Thng bo dn tt c cc di tuong d dng k lng nghe
vetoAgent.fireVetoableChange("size", oldSize, newSize);
}
catch (PropertyVetoException ex) {
// Nu c mt listener no d phn di khng cho php thay di //gi trj ca thuc
tnh size th kt thc phuong thc
return;
}
//Nu tt c cc listener du khng phn di su thay di th // tin hnh gn gi trj mi
cho thuc tnh size
size = newSize;
}
//Phuong thc dng d dng k di tuong lng nghe
public void addSizeListener(VetoableChangeListener lst) {
vetoAgent.addVetoableChangeListener(lst);
}
//Phuong thc dng d g b di tuong lng nghe
public void removeSizeListener(VetoableChangeListener lst) {
vetoAgent.removeVetoableChangeListener(lst);
}
}
V du sau dng d test thu BeanB vua tao
// TestBeanB.java
import java.beans.*;
public class TestBeanB {
public static void main(String[] args) {
Trang 240
//Tao ra mt di tuong BeanB
BeanB b = new BeanB();
//ng k di tuong lng nghe
b.addSizeListener(new MyListener());
//Gn gi trj 10 (10<100) cho thuc tnh size
b.setSize(10);
System.out.println("size=10");
System.out.println(">Sau khi gan thuoc tinh size= "+b.getSize());
//Gn gi trj 123 (123>100) cho thuc tnh size
b.setSize(123);
System.out.println("size=123");
System.out.println(">Sau khi gan thuoc tinh size= "+b.getSize());
//Gn gi trj 234 (234>100) cho thuc tnh size
b.setSize(234);
System.out.println("size=234");
System.out.println(">Sau khi gan thuoc tinh size= "+b.getSize());
//Gn gi trj 56 (56>100) cho thuc tnh size
b.setSize(56);
System.out.println("size=56");
System.out.println(">Sau khi gan thuoc tinh size= "+b.getSize());
}
}
//Ci dt lp lng nghe bin c VetoableChangeListener
class MyListener implements VetoableChangeListener {
//Ghi d phuong thc vetoableChange
public void vetoableChange(PropertyChangeEvent evt) throws
PropertyVetoException {
int oldSize = ( (Integer) evt.getOldValue()).intValue();
int newSize = ( (Integer) evt.getNewValue()).intValue();
String propName = evt.getPropertyName();
//Nu newSize>100 th khng cho thay di bng cch nm ra mt //ngoai l
PropertyVetoException
if (newSize > 100)
throw new PropertyVetoException(
"Gia tri gan cho Size lon hon 100", evt);
}
}
Kt qua khi chay chuong trnh
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. Xy dng cc phuong thc cho J avaBean
Cc phuong thuc cua JavaBean duoc xy dung nhu cc phuong thuc thng thuong.
3. To ra J avaBean c kha nng lng nghe bin c
Mt JavaBean c th duoc thit k d lng nghe mt s bin c do cc di tuong
khc gui dn. D c th lng nghe v xu l cc bin c do cc di tuong khc gui dn
JavaBean cua ban chi cn trin khai cc giao din tuong ung v ci dt cc phuong thuc
cn thit trong cc giao din d, sau d dng k n voi cc di tuong ngun.
V d: D JavaBean cua ban c th xu l cc bin c v chut do cc di tuong khc gui
dn, JavaBean cua ban chi cn ci dt giao din 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) {
}
}
Nhn xt: Nhu ban thy vic tao ra mt JavaBean c th lng nghe cc bin c hon ton
tuong tu nhu vic tao ra cc di tuong lng nghe bin c khc.
4. To ra J avaBean c th dng k di tung lng nghe bin c
Ngoi vic ban c th tao ra cc JavaBean c th lng nghe bin c do cc di tuong
khc gui dn ban cn c th tao ra cc JavaBean c kha nng dng k v gui di cc bin c
dn cc di tuong lng nghe khc. Lc ny JavaBean cua ban duoc coi l di tuong ngun
(di tuong pht sinh bin c- Event Source). Cc di tuong khc mun lng nghe v xu l
bin c do JavaBean cua ban gui dn n phai ci dt giao din lng nghe tuong ung v phai
dng k n voi JavaBean cua ban.
4.1. Dng k di tung listener vi thnh phn J avaBean
D cc thnh phn khc c th dng k duoc di tuong listener voi thnh phn
JavaBean th ban thn thnh phn JavaBean cua ban phai ci dt hai phuong thuc theo
khun mu (pattern) sau:
public synchronized void add<EventListener>(<EventListener> lst)
public synchronized void remove<EventListener>(<EventListener> lst)
V d: D cc di tuong khc c th dng k di tuong listener cho tnh hung nhn chut
th JavaBean cua ban phai ci dt hai phuong thuc dng k nhu sau:
Trang 242
public synchronized void addMouseListener(MouseListener l)
public synchronized void removeMouseListener(MouseListener l)
Thnh phn JavaBean cn luu lai danh sch cc listener d dng k. Khi mun
chuyn giao tnh hung. JavaBean s goi dn tung phuong thuc tuong ung cua cc listener
ny. Nu c nhiu listener cng dng k th JavaBean cua ban thuong luu lai danh sch cc
di tuong listener d dng k bng mt Vecto nhu sau:
//Tao ra mt Vecto d luu lai danh sch cc listener d dng k
private transient Vector mouseListeners=new Vector();
//Phuong thuc dng k di tuong listener
public synchronized void addMouseListener(MouseListener l) {
//Nu listener dng k chua c trong danh sch th thm n vo
if (!mouseListeners.contains(l)) {
mouseListeners.addElement(l); // Thm vo danh sch
}
}
//Phuong thuc dng d loai bo mt listener
public synchronized void removeMouseListener(MouseListener l) {
if (mouseListeners != null && mouseListeners.contains(l)) {
mouseListeners.removeElement(l);
}
}
Hai phuong thuc trn chi l hnh thuc dng d dng k v loai bo cc di tuong lng
nghe m thi. Thuc cht n chua gui di bt cu thng bo no dn di tuong lng nghe. Khi
mt JavaBean mun thng bo dn cc di tuong lng nghe n chi cn duyt trong danh
sch cc di tuong d dng k lng nghe bin c v goi phuong thuc tuong ung m di
tuong listener d ci dt.
Duoi dy l mt v du minh hoa, ta xy dung thnh phn JavaBean c kha nng tip
nhn cc di tuong listener dng d xu l tnh hung chut.
// MouseBean.java
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.*;
public class MouseBean
extends JPanel {
// Mt Vecto luu tr cc di tuong listener
private transient Vector mouseListeners = new Vector();
// Tao ra mt nt lnh
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 thc dng d loai b di tuong lng nghe bin c
Trang 243
public synchronized void removeMouseListener(MouseListener l) {
if (mouseListeners != null && mouseListeners.contains(l)) {
mouseListeners.removeElement(l);
}
}
//Phuong thc dng d dng k di tuong lng nghe bin c
public synchronized void addMouseListener(MouseListener l) {
if (!mouseListeners.contains(l)) {
mouseListeners.addElement(l);
}
}
/*Phuong thc ny dng d thng bo dn tt c cc di tuong lng nghe bin c khi c
su kin mouseClick sy ra trn di 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 chut duoc kch trn nt lnh th thng bo dn tt c cc di tuong d dng k
lng nghe bng cch goi phuong thc fireMouseClicked */
void jButton1_mouseClicked(MouseEvent e) {
fireMouseClicked(e);
}
}
//Tao ra lp lng nghe su kin chut ca nt lnh
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 dy l ung dung d test thu thnh phn MouseBean. C mt thnh gia lng nghe bin
c click trn MouseBean. Khi ban kch chut trn MouseBean th thnh gia ny s xut hin
mt hp thng bo (message).
// Frame1.java
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Frame1
extends JFrame {
//tao ra di 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 di tuong lng nghe vi di 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 kch chut vo MouseBean th hin thj hp thng bo
void mouseBean1_mouseClicked(MouseEvent e) {
JOptionPane.showMessageDialog(this, "Ban vua kich chuot vao MouseBean","Test
MouseBean",JOptionPane.INFORMATION_MESSAGE);
}
}
//Tao ra di tuong lng 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);
}
}
Kt qua chay chuong trnh sau khi ban kch chut vo MouseBean
Trang 245
4.2. Kha nng dng k mt listener (unicast) v nhiu listener (milticast) cua thnh phn
J avaBean
Thng thuong mt JavaBean cho php dng k nhiu di tuong lng nghe bin c.
Co ch cho php nhiu listener cng duoc dng k d xu l cng mt tnh hung duoc goi
l milticast. Tuy nhin, voi co ch ny di lc s dn dn truong hop xm pham ln nhau,
chng han listener ny th cho php thay di gi tri cua thuc tnh trong khi listener khc lai
ngn can. Chnh v vy mt vi thnh phn JavaBean chi cho php dng k mt listener m
thi (unicast), nu c nhiu hon mt listener duoc dng k th phuong thuc dng k cua
JavaBean cn duoc thit k d nm ra mt ngoai l l: TooManyListenerException nhu
sau:
public void add<EventListenerType>(<EventListenerType>lst) throws
TooManyListenerException
Doan chuong trnh sau tao ra hai phuong thuc add v remove chi cho php dng k
mt listener m thi:
MouseListener saveListener=null;
/* Phuong thuc dng k di tuong listener*/
public void addMouseListener(MouseListener lst) throws TooManyListenerException
{ if(saveListener==null){
saveListener=lst;
} else{
/*
Nu d c mt listener no d duoc dng k th nm ra mt ngoai l
*/
throw new TooManyListenerException();
}
//Phuong thuc ny dng d loai bo di tuong listener
public void removeMouseListener(MouseListener lst)
{
saveListener=null;
}
D hiu r hon, duoi dy ta s vit mt v du minh hoa cho su tranh chp khi c
nhiu di tuong listener cng dng k xu l mt tnh hung. Chuong trnh ny dng lai
thnh phn BeanB d thit k o phn du (xem v du v thuc tnh rng buc contrain
property). Thuc tnh size cua thnh phn BeanB l thuc tnh rng buc, truoc khi thay di
gi tri cua thuc tnh n cn hoi kin cua tt ca listener. D minh hoa ta s tao ra hai di
tuong listener l MyListener21 chi cho php thay di thuc tnh size khi gi tri moi lon hon
50 cn MyListener22 chi cho php thay di thuc tnh size khi gi tri moi lon hon 100.
Chuong trnh su dung hai di tuong listener cng xu l mt tnh hung.
//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);
}
}
Kt qua chay chuong trnh:
old size:0 set new size 30
size after setting:30
old size:30 set new size 90
size after setting:30
Quan st kt qua chay chuong trnh ta thy tt ca gi tri lon hon 50 du khng th
gn duoc cho thuc tnh size, mc d listener thu hai l myListener22 cho php gn
gi tri >50 v <100 nhung listener thu nht l myListener22 lai khng cho php, nhu
vy trong truong hop listener thu hai myListener22 ci dt m khng bit rng
myListener21 d duoc ci dt truoc d th nguoi dng cui s bi nhm ln.
Chnh v vy java phn bit hai cch dng k listener l unicast v multicast. Tuy
nhin theo khuyn khch th cc thnh phn JavaBean nn duoc xy dung d h tro co ch
dng k nhiu di tuong listener (multicast).
Trang 247
III. Tm hiu Instrospector
1. I nstrospector l g?
Mt cu hoi ban dt ra l khi ban ko mt JavaBean tu thanh cng cu v tha vo
Form (trong mt mi truong pht trin truc quan no d chng han nhu Jbuilder chng
han), lm th no d mi truong pht trin truc quan ny c th bit duoc trong JavaBean
cua ta c nhung thuc tnh, phuong thuc, su kin no,..?.
Vn d ny d duoc giai quyt bng tnh phan xa (reflect), co ch phan xa gip ta c
th pht hin ra cc thuc tnh, phuong thuc, su kin cua mt lop bt ky (k ca lop v
danh). Diu ny l hon hao d giai quyt vn d Bean m khng yu cu ban phai lm
thm bt cu thu thut ngn ngu no nhu vn bi yu cu trong cc ngn ngu lp trnh truc
quan khc.
Trong thuc t, mt trong nhung l do chnh m phan xa duoc thm vo cho java l
d h tro JavaBean (mc d n cn duoc dng trong tun tu ho v goi cc phuong
thuc dng tu xa). Nhung nhung nguoi thit k java lai mun cung cp mt cng cu
chun, khng nhung lm cho JavaBean don gian hon trong su dung m cn cung cp
mt ng cua chun d tao ra cc JavaBean phuc tap hon. Cng cu ny chnh l lop
I nstrospector, phuong php quan trong nht cua lop ny l static getBeanInsfo().
Ban truyn tham chiu Class cho lop ny v n hon ton di hoi lop d v cho lai
mt di tuong BeanI nfo, dua vo BeanI nfo ny ban c th m xe d tm ra cc
thuc tnh, phuong thuc, su kin cua JavaBean.
2. Cch m I nstrospector lm vic
V du khi ra c hai phuong thuc nhu sau:
public int getSize()
public void setSize(int newSize)
Theo cch ny java hiu rng ban mun tao ra mt thuc tnh c tn l size c kiu int. Hay
khi tao ra cc thuc tnh rng buc (contrain property) ta vit:
public addSizeListener(VetoableChangeListener lst)
public removeSizeListener(VetoableChangeListener lst)
java s hiu l c mt thuc tnh size cn goi dn hai phuong thuc ny mi khi mun dng
k hay loai bo mt di tuong listener dng d quan st su thay di cua thuc tnh.
Tm lai nu cc phuong thuc duoc thit k theo mt mu (pattern) no d th n s
duoc dem dng vo muc dch ring. Thuong th ta dng cc mu sau khi xy dung cc
phuong thuc dnh cho thuc tnh v su kin.
Thit k cc phuong thc mu dng cho thuc tnh
Di voi mi thuc tnh ban cn xy dung hai phuong thuc get v set theo mu
sau dy:
public <propertyType> get<PropertyName>()
public void set<PropertyName>(<propertyType>newValue)
Trong d:
propertyType l bt cu kiu du liu no nguyn thuy hay di tuong
PropertyName l tn cua thuc tnh
Ch :
Nu thuc tnh c kiu boolean th phuong thuc get c th thay bng phuong thuc
is
Trang 248
Java chi hiu l ban dinh tao ra mt thuc tnh nu nhu c du ca hai phuong thuc get
v set
Kiu tra v cua phuong thuc get thuong l kiu cua di phuong thuc set
Thit k cc phuong thc mu dng cho s kin
D xy dung mt su kin no d cho mt thnh phn JavaBean ta cn xy dung hai
phuong thuc add v remove theo mu sau dy:
public void add<EventListenerType>(<EventListenerType>evt)
public void remove<EventListenerType>(<EventListenerType>evt)
Trong d EventListenerType l di tuong tnh hung m JavaBean mun cc thnh phn
khc tuong tc duoc voi mnh. V du d thnh phn JavaBean c th dng k duoc cc tnh
hung Action ta vit
public void addActionListener (ActionListener lst)
public void removeActionListener (ActionListener lst)
3. Tm hiu lp BeanI nfo
Khi ban tao ra BeanB (xem lai lop ny trong phn thuc tnh rng buc) ban c th
tao ra mt lop phu khc l BeanBBeanI nfo.java lop ny duoc dn xut tu lop
SimpleBeanI nfo c nhim vu cung cp cc thng tin v thnh phn JavaBean m ta xy
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
Cc phuong thuc quan trong m ban cn quan tm l:
Phuong thuc getI con() phuong thuc ny duoc goi khi cc mi truong pht trin truc
quan mun ly v biu tuong cho JavaBean.
Phuong thuc getPropertyDescriptors() phuong thuc ny gip cho Instrospector d dng
ly v cc thuc tnh cua JavaBean.
Phuong thuc getMethodDescriptors() phuong thuc ny gip cho Instrospector d dng
ly v cc phuong thuc cua JavaBean
Bng cch xy dung lop BeanInfo di km voi JavaBean cua ban. Trnh bin dich d
dng tm ra cc thuc tnh, phuong thuc, su kin. Truoc khi mun bit JavaBean cua
ban c nhung thnh phn no trong Bean cua ban truoc tin n di tm trong lop
BeanInfo tuong ung, nu khng tm thy BeanInfo di km voi lop lc d n my su
dung co ch phan xa hay di tm cc phuong thuc duoc thit k theo mu.
IV. Dng gi JavaBean
Truoc khi xut ban JavaBean ban thuong dng gi n vo trong mt tp .jar chun.
D cc cng cu xy dung truc quan bit trong tp dng gi ny l mt JavaBean ban cn
tao tp m ta dng gi bng cch sau:
Su dung mt trnh soan thao bt ky d tao ra tp tin BeanB.mf nhu sau:
Manifest-Version: 1.0
Name BeansDir/BeanB.class
Name BeansDir/BeanBInfo.class
Java-Bean: True
Ghi lai voi ci tn g d chng han BeanB.mf
Dng thu nht cho bit phin ban, tu dng thu hai tro di cho bit trong tn cua cc lop
c trong tp dng gi, dng cui cng cho bit don vi dng gi ny l mt JavaBean.
Ban tin hnh dng gi bng lnh jar hon ton tuong tu nhu ban dng gi cc lop
khc.

You might also like