Java Advance Moi

download Java Advance Moi

of 340

Transcript of Java Advance Moi

Chng X

PAGE on Vn Ban Lp trnh Java nng cao

MC LC

1MC LC

5LI NI U

Chng I: 8LP TRNH A LUNG

81.1 Tin trnh, a nhim v a lung

101.1.1 Cc lung trong Java

151.1.2 Cc trng thi ca Thread

171.2 Cc mc u tin ca lung

201.3 Cc nhm lung

211.4 ng b ho

211.4.1 Cc hm ng b

241.4.2 S trao i gia cc lung khng ng b

271.4.3 ng b vic truy cp vo cc ti nguyn chia s

311.5 Vn tc nghn

331.6 a lung trong Applet

Chng II: 42LP TRNH RMI V PHN TN I TNG

422.1 Triu gi phng thc ca i tng t xa RMI

432.1.1 Triu gi phng thc t xa

432.1.2 Kin trc RMI Java

462.2 Thit lp mi trng triu gi t xa

462.2.1 Trn my phc v (Server)

542.2.2 Trn my khch (Client)

572.2.3 Trin khai ng dng Web

572.3 Truyn tham s trong cc li gi phng thc t xa

592.3.1 Truyn i tng n trnh ch theo tham tr

592.3.2 Chuyn i tng n chng trnh ch theo tham chiu

672.3.3 Truyn gi i tng t xa

682.4 S dng RMI vi Applet

722.5 Ngn ng nh ngha giao din Java (IDL) v CORBA

722.5.1 Ngn ng nh ngha giao din IDL

772.5.2 Pht trin ng dng vi IDL v CORBA

812.6 Nhn xt v phng thc lp trnh phn tn RMI

Chng III: 84LP TRNH MNG

843.1 Kt ni vi Server

873.2 M hnh tnh ton Client/Server

903.3 Phc v nhiu chng trnh Client

913.3.1. Xy dng chng trnh ng dng c lp

933.3.2 Xy dng ng dng nhng applet

1003.4 M hnh Client/Server s dng dch v khng kt ni

1023.5 Truy cp vo cc trang Web

1023.5.1 Xem ni dung ca trang Web

1043.5.2 Tm cc tp tin Web Server

1063.6 Dch v th in t E-mail

1073.6.1 nh dng th in t

1073.6.2 Gi th in t

1103.6.3 Kt ni theo b nh v ti nguyn URL tm tin

Chng IV: 117LP TRNH VI SWING NNG CAO

1174.1 Cu trc cy Tree

1174.1.1 Cy n gin

1214.1.2 Son tho cy v ng i

1254.1.3 nh s cc nt trn cy

1264.1.4 Thay i biu din cc nt ca cy

1294.1.5 Hin th thng tin ca cc nt

1334.2 Cc bng d liu

1334.2.1 Bng n gin

1364.2.2 M hnh bng TableModel

1384.2.3 Hin th cc record d liu t c s d liu

1434.2.4 Sp xp cc hng trong bng

1484.2.5 Son tho bng

1544.3 Cc thanh trt v cc thc o tin

1544.3.1 Thanh trt Slider

1594.3.2 Thc tin JProgressBar

Chng V: 164JAVA BEAN

1645.1 Gii thiu v JavaBean

1655.2 Ti sao phi pht trin JavaBean?

1655.3 B cng c pht trin Bean BDK

1665.3.1 BeanBox

1675.3.2 Xy dng chng trnh ng dng bng BeanBox

1685.3.3 Xy dng Applet t BeanBox

1685.4 To lp mi thnh phn Bean

1695.4.1 Kim tra cc thuc tnh v cc s kin ca Bean

1705.4.2 Pht sinh bo co v cc thuc tnh

1705.5 Thit lp cc thuc tnh cho Bean

1705.5.1 Cc thuc tnh n gin Simple Properties

1715.5.2 Cc thuc tnh bin Bound Properties

1735.5.3 Cc thuc tnh b khng ch Constrained Properties

1745.5.4 Cc thuc tnh ch s ho Indexed Properties

1745.5 Cc phn t lng nghe cc s kin trn cc thnh phn

1755.6 Thit lp mt Bean ring ca bn

1775.7 Ng cnh ca Bean

Chng VI: 185PHT TRIN CC DCH V SERVLET V JSP

1856.1 Gii thiu v Servlet

1886.2 u im ca Servlet

1886.3 Mi trng thc hin Servlet

1896.3.1 M t Servlet n

1896.3.2 M t Servlet gp

1906.3.3 M t Servlet nhng

1906.3.4 Ci t trnh ch Apache Tomcat

1916.4 Kin trc ca Servlet

1916.4.1 Giao din Servlet

1926.4.2. Lp c s HttpServlet

1946.5 Dch v ci t Servlet

1956.5.1 Dch chng trnh Servlet

1966.5.2 Thc hin Servlet

1976.6 Chu trnh sng ca cc Servlet

1986.6.1 Khi ng Servlet

1986.6.2 Tng tc vi cc Client

1996.6.3 Hu b Servlet

1996.7 X l cc yu cu

2006.7.1 Truy tm thng tin

2006.7.2 Gi thng tin

2046.7.3 X l cc d liu mu

2086.8 Cc phin lm vic Session

2106.9 S truyn thng gia cc Servlet

2116.10 Servlet kt ni cc c s d liu

2116.10.1 Vai tr ca Servlet trong m hnh kt ni CSDL

2126.10.2 X l giao dch vi JDBC

2156.11 JSP

2156.11.1 Kin trc ca JSP

2176.11.2 Cc m hnh truy cp ca JSP

2186.11.3 Cc phm vi i tng

2196.11.4 C s c php ca JSP

2236.11.5 Cc hnh ng ca JSP

Chng VII: 232VN BO MT V AN NINH THNG TIN

2327.1 Gii thiu v vn bo mt, an ton h thng thng tin

2357.2 B np lp v kim tra byte code

2357.2.1 Vit b np lp ClassLoader ring

2397.2.2 Kim tra byte code

2427.3 Lp SecurityManager v Permission

2437.3.1 Vn bo mt trong Java 2 Platform

2457.3.2 Cc tp chnh sch bo mt

2537.3.3 B qun l bo mt tu bin

2567.4 Vn bo mt trong gi java.security

2577.4.1 Du vt thng ip

2617.4.2 Ch k s

2687.5 Vn chng thc

2697.5.1 Giy chng nhn Certificate X.509

2717.5.2 Lp giy chng nhn

2737.5.3 K giy chng nhn

2797.5.4 K nhn cc tp JAR

Chng VIII: 285LP TRNH THEO CHUN QUC T V BN A HO PHN MM

2858.1 Vn biu din d liu ph thuc vo vn ho ca tng dn tc

2868.2 Lp Locale

2898.3 Cc d liu s v n v tin t

2948.4 Ngy thng v thi gian

3008.5 Vn bn Text

3008.5.1 Sp xp vn bn

3068.5.2 Ranh gii ca cc vn bn Text

3118.6 Bc ti nguyn

3118.6.1 Bn a ho ti nguyn

3128.6.2 t ti nguyn vo cc bc

3208.7 Bn a ho cc giao din ho

335DANH SCH CC THUT NG ANH - VIT V T VIT TT

338TI LIU THAM KHO

339CH MC

LI NI U

Mt c tnh rt quan trng ca ngn ng lp trnh hng i tng Java l to ra mi trng thc hin c lp vi cc nn, n cho php bn s dng cng mt phn mm trn cc nn khc nhau nh Windows, Solaris, Linux, Macintosh, v.v. iu ny thc s cn thit khi rt nhiu chng trnh c np xung t Internet chy c ngay trn nhng nn khc nhau. Ngha l, Java h tr ta thc hin c tng Vit chng trnh mt ln v thc thi c mi ni.

Java l ngn ng hng i tng thc s, mi th trong chng trnh u l i tng, ngoi tr cc kiu d liu nguyn thu nh cc kiu gi tr s. Mt chng trnh vit bng Java, ng theo t tng ca cch tip cn hng i tng, l mt tp cc i tng trao i vi nhau bng cch gi v nhn thng ip. Nh vy, Java h tr to ra nhng phn mm c cht lng cao, p ng cc yu cu ca ngi s dng phn tn trn mng, c tnh m cao, tu bin theo khch hng, an ton, v tin cy vi nhiu c ch pht trin nh: lp trnh a lung, lp trnh phn tn i tng vi phng php triu gi t xa (RMI), lp trnh mng, pht trin cc dch v Servlet trn cc Server, cc gii php bo mt thng tin XE "bo mt thng tin" nh ch k, chng ch s, hay cc vn quc t ho XE "quc t ho" , bn a ho phn mm, v.v.

Tip theo cun Lp trnh hng i tng vi Java [1] (ti bn nm 2005), cun sch ny gii thiu tip phn lp trnh hng i tng nng cao vi Java. Ni dung ca cun sch c trnh by trong tm chng.

Chng I gii thiu v c ch x l a lung XE "x l a lung" , mt c tnh quan trng ca Java. N h tr to ra cc chng trnh thc thi bi nhiu lung ng thi v mt logic. Trn cc my tnh n b x l nh ca chng ta hin nay, thc cht c ch a lung thc hin theo nguyn l chia s thi gian, nhng trn nhng my nhiu b x l, hay trn mng cc my tnh, chng c th thc hin ng thi v mt vt l, ngha l thc hin song song nhm tng hiu qu ca h thng my tnh v tng tc x l.

Ngy nay, cng ng nhng ngi lp trnh hng i tng bt u ngh rng i tng c mi ni, c bit c nhiu trong m ngun m. Nhng i tng ny, tt nhin c h tr trao i c vi nhau theo nhng giao thc chun trn mng. Tn dng cc i tng chnh l tng ca Java-RMI (phng thc lp trnh triu gi t xa), c trnh by chng II. Lp trnh phn tn i tng bng cch triu gi phng thc t xa RMI l cch hp tc gia cc i tng Java c nhng m lnh ci t (bao gm cc phng thc v thuc tnh) nm trn cc my khc nhau (chnh xc l nm trn cc JVM my o Java khc nhau), c th triu gi ln nhau trao i tin nhm tn dng nhng i tng vi hng trm triu dng m lnh c thit k v xy dng sn, phn tn trn mng, ang hot ng rt hiu qu.

Khi ni ti lp trnh mng, ta thng ngh n cch trao i gia mt chng trnh phc v (Server) vi mt hay nhiu chng trnh khch (Client). Chng trnh khch gi mt yu cu ti cho chng trnh phc v, v chng trnh ny x l d liu tr li cho chng trnh khch. Nh vy, khi chng trnh khch mun gi i cc yu cu th trc ht phi tm cch kt ni vi Server. Server c th chp nhn hay t chi s kt ni ny. Mt khi s kt ni c thit lp th Client v Server trao i vi nhau thng qua cc Socket. Chng III cp n vic s dng cc lp trong gi java.net cng vi cc phng thc kt ni mng v trao i tin gia cc my vi nhau ch yu theo m hnh Client/Server.

Chng IV trnh by cch s dng cc lp ca gi javax.swing pht trin to lp cc cu trc cy v cc bng d liu. Ngi lp trnh thng xuyn phi hin th, t chc thng tin v cc thnh phn ca h thng di dng cu trc cy hay cu trc bng XE "cu trc bng" . Nhm xy dng Swing c nhiu c gng to ra cc iu khin, cy v bng gip ngi lp trnh s dng chng d dng hn. Gi javax.swing h tr chng ta t chc, biu din tin di dng ho rt trc quan v tin li, hon ton p ng nguyn l thy v cm nhn, cch m chng trnh biu din ngi dng thy, theo di c v cch m h c th tng tc (cm nhn c), cng nh cch thc hin vi h thng ging nh chng ta mong mun.

M hinh phn mm thanh phn gm: cac thanh phn c xem nh l ht nhn; cac Container (b cha), ni cac i tng c lp ghep li to thanh chng trinh v ngi lp trnh vit thm cac dong lnh thc hin s tng tac gia cac thanh phn theo mt kch bn hon thnh nhim v ca bi ton t ra. Mt Container la ni cac thanh phn co th t ng ky va to ra cac giao din cho cac thanh phn khac bit cach tng tac vi nhau. Java Bean la mt m hinh thanh phn hoan chinh, h tr cac tinh nng chung cho kin truc thanh phn, cc thuc tinh, cc s kin, v.v., c trnh by chng trnh V.

Chng VI gii thiu xu hng rt quan trng ang c tp trung pht trin ng dng hin nay, l cch xy dng cc chng trnh dch v Java pha my ch (Server). Servlet l thnh phn chnh c s dng pht trin cc chng trnh dch v Java pha my ch. Servlet l s pht trin m rng ca CGI m bo Server thc hin c cc chc nng ca mnh. Ta c th s dng Servlet ca Java tu chnh li mt dch v bt k, nh Web Server, Mail Server, v.v. Phn cui ca chng VI c dnh gii thiu v JSP, mt ngn ng khng ch h tr to ra nhng trang Web c lp vi cc nn, c lp vi cc Server, m cn l cng ngh Java rt hiu qu th hin nguyn l WYSIWYG (Nhng g bn nhn thy l bn c c chng).Vn bo mt v m bo an ninh h thng phn mm c trnh by chng VII. Bo mt v m bo an ton h thng l vn thi s ang c nhiu ngi tp trung nghin cu v trin khai ng dng. m bo an ton cho h thng, ta nn s dng c nhng b np lp ClassLoader chung ca h thng (mc nh) v nhng b np lp ring, kt hp vi lp qun tr an ninh SecurityManager kim sot s hot ng ca cc on m lnh. Ni chung, ta nn xy dng nhng lp qun tr an ninh ring cho tng ng dng vi nhng chnh sch cp quyn thc hin cho ph hp. Hn na, c th d dng thc hin bng cch s dng cc thut ton mt m c ci t trong cc lp gi java.security k nhn v xc thc tp tin hay chng trnh, c bit l cc ch k in t v cc chng ch s. Trong thi i hi nhp kinh t th gii hin nay, s trao i gia cc cng ty d ln hay nh vi nhau, phn ln u s dng nhng ngn ng khc nhau. Vn trao i thng tin gia cc dn tc, gia nhiu cng ng trn th gii vi nhau lun gp phi nhng kh khn, tr ngi do vic qui nh cch vit v hiu v cc thng ip XE "thng ip" , s liu hay cc i lng nh n v tin t, thi gian l rt khc nhau. Thc t cho thy, c nhiu ngi trn th gii c th c v hiu c ting Anh. Song, ngi s dng s cm thy thoi mi, t tin hn khi s dng nhng Applet hay chng trnh ng dng hin th cc thng tin c vit bng ting ca dn tc h v biu din d liu theo nhng hnh dng m h quen thuc. Java 2 Platform cung cp cc c trng c s thc hin vic quc t ho, cho php tch cc mc d liu ph thuc vo cc nn vn ho t nhng phn mm v lm cho thch ng vi nhng nhu cu ca ngi dng (a phng ho hay cn gi l bn a ho). Nhiu ngi lp trnh tin rng, h cn quc t ho nhng phn mm ca mnh bng cch s dng Unicode v dch cc thng bo sang ngn ng giao din ca ngi s dng. Song, nh chng VIII chng ta s thy, cn nhiu vn lin quan n vic quc t ho trong lp trnh hn l s h tr ca Unicode. Ngy thng, thi gian, tin t lu hnh v cc s liu c qui nh biu din thng khc nhau theo nhng vng khc nhau trn th gii. Do vy, trong mi chng trnh chng ta cn s dng mt cch no nh dng li cc thc n, tn ca cc mc, cc thng ip, cc thng bo ca h thng, v.v., theo nhng ngn ng, hnh dng khc nhau nhm p ng tt hn nhng yu cu ca khch hng. Chng VIII c dnh gii quyt nhng vn nu trn.

Cun sch ny c bin son theo yu cu ca gio trnh mn hc lp trnh nng cao ging dy, hc tp cho sinh vin, hc vin cao hc v gio vin cng ngh thng tin. N c th c s dng nh l ti liu tham kho cho cn b nghin cu v nhng ngi tham gia cc d n pht trin phn mm ng dng gii quyt nhng bi ton ca thc t t ra.

Tc gi xin by t lng bit n chn thnh ti cc bn ng nghip trong Phng Cc H thng phn mm tch hp, Vin Cng ngh thng tin, Vin Khoa hc & Cng ngh Vit Nam. Xin cm n Nh xut bn Khoa hc v K thut h tr v to iu kin cun sch c xut bn.

Mc d rt c gng, nhng ti liu ny chc chn khng trnh khi nhng sai st. Chng ti mong nhn c cc kin ng gp ca bn c c th chnh l kp thi.

Th gp xin gi v: Nh xut bn Khoa hc v K thut 70 Trn Hng o, H Ni.

H Ni thng 2 nm 2006

Tc gi

Chng I

LP TRNH A LUNG

Chng I gii thiu:

a nhim, tin trnh v lung

X l a lung trong Java Mc u tin ca lung,

Vn ng b ho XE "ng b ho" v bi ton tc nghn1.1 Tin trnh, a nhim v a lung

Chng ta hu nh quen vi khi nim a nhim XE "a nhim" : cng mt thi im c nhiu hn mt chng trnh thc hin ng thi trn cng mt my tnh. V d, bn c th cng lc va in mt ti liu ng thi son tho mt vn bn khc. Ni chung, c hai k thut a nhim:

a nhim da trn cc tin trnh

a nhim da trn cc lungMi tc v c thc hin theo mt tin trnh XE "tin trnh" , c xem nh mt chng trnh n. mc th, a nhim da trn cc tin trnh cho php nhiu tin trnh (nhiu chng trnh n) thc hin ng thi trn mt my tnh. V d, trong khi son tho vn bn (chy chng trnh x l vn bn, nh Microsoft Word), ta ng thi chy chng trnh bng tnh in t. mc tinh hn, a nhim da trn cc lung cho php cc phn ca cng mt chng trnh thc thi ng thi trn cng mt my tnh. Tng t nh mt chng trnh x l vn bn c th thc hin ng thi vic in ra my in, ng thi thc hin to khun dng cho mt vn bn. iu ny thc hin c khi hai tc v c thc thi theo nhng ng thc hin c lp nhau. Hai tc v c xc nh tng ng vi hai phn (b phn) thc hin ng thi ca mt chng trnh. Mi phn nh th ca chng trnh nh ngha mt ng thc hin ring c gi l lung (thc hin).

Nh vy, mt tin trnh c th bao gm nhiu lung XE "lung" . Cc tin trnh c cc tp ring cc bin d liu. Cc lung ca mt tin trnh c th chia s vi nhau v khng gian a ch chng trnh, cc on d liu v mi trng x l, ng thi cng c vng d liu ring thao tc ([3], [6]).

d hiu hn v m hnh ny, chng ta c th hnh dung tin trnh nh mt x nghip v cc lung nh l nhng cng nhn lm vic trong x nghip . Cc cng nhn ca x nghip cng chia s nhau din tch mt bng v cc ti nguyn ca c x nghip. Song, mi cng nhn li c ch lm vic c xem nh l ch ring ca h v nhng ngi khc khng truy cp c.

Vic to ra mt cng nhn (tuyn dng lao ng) d hn nhiu vic lp ra mt x nghip, v mun c mt x nghip th phi c t nht mt s cng nhn v phi p ng mt s tiu chun no theo qui nh.

Tng t chng ta c th quan st mi quan h gia tin trnh v lung v phng din thng tin. Cc cng nhn trong x nghip, theo mc nh, c quyn bit v mi s thay i, mi vic xy ra trong x nghip. Nhng ni chung, nhng bin ng ca mt x nghip th bnh thng nhng x nghip khc khng bit c, tr nhng x nghip c thng bo trc tip.

Trong mi trng n lung, mi thi im ch cho php mt tc v thc thi. iu ny thng dn n lng ph v tc x l ca CPU l rt ln m khng c s dng ht cng sut, v d nh chng trnh phi ch ngi s dng nhp d liu vo. K thut a nhim XE "a nhim" cho php tn dng c nhng thi gian ri ca CPU thc hin nhng tc v khc.

C th tng tng, mi lung nh ang thc hin trong mt ng cnh c lp, nh th n s hu CPU vi thanh ghi, b nh v m chng trnh ring bit. Thc ra, i vi h thng ch c mt CPU, th mi thi im ch c mt lung thi hnh. CPU s nhanh chng c chuyn i gia cc lung to ra o gic l cc lung c thi hnh cng mt lc. Nhng thc cht chng c thc hin theo ch chia s thi gian XE "chia s thi gian" . H thng mt CPU h tr tnh ng thi logic XE "ng thi logic" , ch khng phi tnh ng thi vt l. Tnh ng thi logic c thc thi khi nhiu lung thc hin vi nhng dng iu khin c lp v ring r. Trong h thng nhiu CPU, thc t l nhiu lung thc hin ng thi cng mt lc, t c tnh ng thi v mt vt l. Mt c tnh quan trng ca Java l x l a lung XE "a lung" , ngha l n h tr tnh ng thi logic, d c hay khng tnh ng thi vt l.

K thut a nhim da trn cc lung c mt s u im hn da trn cc tin trnh:

Cc lung c th chia s cng mt khng gian a ch,

Vic dch chuyn ng cnh thc hin gia cc lung yu cu chi ph t hn,

S truyn thng gia cc lung thng yu cu chi ph thp hn.

a nhim c th thc hin c theo hai cch:

Ph thuc vo h iu hnh, n c th cho tm ngng chng trnh m khng cn tham kho cc chng trnh ,

Cc chng trnh ch b dng li khi chng t nguyn nhng iu khin cho chng trnh khc.

Cch th nht cn c gi l h thng a nhim theo quyn u tin cn cch th hai c gi l h thng a nhim cng tc. V d, Window 3.1 l h thng a nhim cng tc, Window NT (v Window 95 32 bit) l h thng a nhim theo quyn u tin.

Nhiu h iu hnh hin nay h tr a lung nh: SUN Solaris, Window NT, Window 95, OS/2, v.v. Java h tr a nhim da trn cc lung v cung cp cc c tnh mc cao cho lp trnh a lung.

1.1.1 Cc lung trong Java

Nh trn nu, mt lung l mt mch thc hin trong mt chng trnh (mt tin trnh) v n c th thc hin ring bit. thi im thc hin, cc lung XE "lung" ca mt chng trnh c th cng s dng chung mt khng gian b nh, v vy c th chia s vi nhau v d liu v m lnh. Chng cng c th cng chia s vi nhau trong mt tin trnh thc thi mt chng trnh.

Cc lung trong Java c php thc thi ng thi m khng cn ng b, ngha l nhiu tc v khc nhau c th thc hin ng thi. V phn ln cc my tnh l n b x l CPU, nn my o Java (JVM XE "JVM" ) s dng c ch cho php mi lung c c hi thc hin mt khong thi gian ngn sau nhng quyn iu khin cho nhng lung khc.

tn dng c nhng kh nng trong mu hnh lp trnh a lung XE "lung" ca Java, cn phi hiu r cc phng din sau:

To lp cc lung,

Bi v cc lung c th chia s vi nhau cng mt khng gian b nh, nn vic ng b ho truy nhp vo d liu, m chung l rt quan trng.

V cc lung c th nhng trng thi khc nhau, do vy, cn phi hiu r s chuyn i gia cc trng thi nh th no.

To lp cc lungJava s dng mt c ch trong mi lung c mt c hi chy trong mt thi khong tng i nh v ngay sau li kch hot lung khc thc hin.

Java cung cp hai gii php to lp lung:

1. Thit lp lp con ca Thread XE "Thread" 2. Ci t lp x l lung t giao din Runnable.

(i) Cch th nht:Trong Java c mt lp c xy dng sn l Thread, lp c s xy dng nhng lp mi k tha nhm to cc lung thc hin theo yu cu.

V d, lp MyClass c m rng da trn c s k tha XE "k tha" lp Thread nhm to ra cc lung thc hin. Cc tin trnh XE "tin trnh" trong h thng bt u thc hin mt a ch c bit c xc nh bi hm c tn l main(). Tng t khi mt lung ca lp MyClass c to ra th n gi hm run() thc hin. Hm ny c vit thc thi nhng cng vic yu cu trong mi lung c to ra.

class MyClass extends Thread{

// Mt s thuc tnh

public void run(){

// Cc lnh cn thc hin theo lung }

// Mt s hm khc c vit hay c b sung

}

Khi chng trnh chy n s gi mt hm c bit c khai bo trong Thread l start() bt u mt lung c to ra.

V d 1.1 To ra hai lung thc hin ng thi hin th cc t trong dy ("Hm nay", "bo co", "bi tp", "ln,", "mn hc", "lp trnh Java.") ln mn hnh.

Chng trnh ny to ra hai lung l thread1 v thread2 t lp MyThread. Sau n khi ng c hai lung v thc hin mt chu trnh lp do i cho n khi cc lung kt thc hoc cht. Hai lung ny hin th ln lt nhng dng ch "Hm nay", "bo co", "bi tp", "ln,", "mn hc", "lp trnh Java." sau khi ch mt khong thi gian ngn ngu nhin gia cc ln thc hin. Bi v c hai lung cng hin th ln mn hnh nn chng trnh phi xc nh lung no c th c hin th thng tin trn mn hnh ti nhng thi im khc nhau trong khi chng trnh thc hin.

import java.lang.Thread;

import java.lang.System;

import java.lang.InterruptedException;

class ThreadTest1 {

public static void main(String args[]){

Mythread thread1 = new Mythread("Thread 1:");

Mythread thread2 = new Mythread("Thread 2:");

thread1.start();

thread2.start();

boolean thread1IsAlive = true;

boolean thread2IsAlive = true;

do{

if(thread1IsAlive && !thread1.isAlive()){

thread1IsAlive = false;

System.out.println("Thread 1 is dead.");

}

if(thread2IsAlive && !thread2.isAlive()){

thread2IsAlive = false;

System.out.println("Thread 2 is dead.");

}

} while (thread1IsAlive || thread2IsAlive);

}

}

class Mythread extends Thread {

static String message[] ={"Hm nay", "bo co", "bi tp", "ln,", "mn hc", "lp trnh Java."};

public Mythread (String id){

super(id);

}

public void run(){

String name = getName();

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

randomWait();

System.out.println(name + message[i]);

}

}

void randomWait(){

try{

sleep((long)(1000*Math.random()));

}catch (InterruptedException x){

System.out.println("Interruped");

}

}

}Chng trnh trn mi khi thc thi s cho kt qu khc nhau. S d nh vy l v chng trnh s dng b m s ngu nhin xc nh mt lung s i trong thi gian ngu nhin trc khi hin th thng bo ln mn hnh. Sau y l kt qu trong mt ln chy th :

Thread 1: Hm nay

Thread 2: Hm nay

Thread 1: bo co

Thread 2: bo co

Thread 2: bi tp

Thread 1: ln,

Thread 1: mn hc

Thread 2: ln,

Thread 2: mn hc

Thread 1: Lp trnh Java.

Thread 1: is dead.

Thread 2: Lp trnh Java.

Thread 2: is dead.Kt qu trn cho thy lung thread1 thc hin trc v hin th dng ch Hm nay ln mn hnh, sau i c thi hnh tip trong khi thread2 ang hin th dng ch Hm nay. Khi n lt, lung thread1 hin th tip dng ch bo co, ri li nhng cho thread2 hin th tip dng ch bo co v sau l bi tp. Lun phin thc hin nh vy cho n khi cc lung kt thc.

Lp ThreadTest1 c mt hm main(). Hm ny to ra hai i tng mi l thread1 v thread2 ca lp Mythread. Sau hm main() khi ng c hai lung trn bng hm start().

Lu : Java khng h tr a k tha XE "k tha" . Do vy, nu ngi lp trnh mun to ra mt lp k tha t mt lp c s v thc hin c theo lung th n cng ng thi phi k tha t lp Thread XE "Thread" . iu ny khng thc hin c. Do vy, ta phi thc hin theo cch th hai.

(ii) Cch th hai: Java gii quyt hn ch trn bng cch xy dng lp trn c s ci t giao din lung Runnable to ra cc lung thc hin. Ngi lp trnh thit k cc lp thc hin theo lung bng cch ci t theo giao din Runnable nh sau.

class MyClass implements Runnable{

// Cc thuc tnh

// Np chng hay vit mt s hm

// Vit hm run()

. . .

}

V d 1.2 Ta cng c th to mt chng trnh tng t chng trnh trn, nhng to ra lung l i tng ca lp MyClass ci t giao din Runnable. Cc i tng ca lp MyClass s c thc hin di dng lung bng cch chuyn chng nh nhng i s cho hm to dng ca lp Thread.

import java.lang.Thread;

import java.lang.System;

import java.lang.InterruptedException;

import java.lang.Runnable;

class ThreadTest2 {

public static void main(String args[]){

Thread thread1 = new Thread(new MyClass("Thread 1:"));

Thread thread2 = new Thread(new MyClass("Thread 2:"))

thread1.start();

thread2.start();

boolean thread1IsAlive = true;

boolean thread2IsAlive = true;

do{

if(thread1IsAlive && ! thread1.isAlive()){

thread1IsAlive = false;

System.out.println("Thread 1 is dead.");

}

if(thread2IsAlive && ! thread2.isAlive()){

thread2IsAlive = false;

System.out.println("Thread 2 kt thc.");

}

} while (thread1IsAlive || thread2IsAlive);

}

}

class MyClass implements Runnable {

static String message[] = {"Hm nay", "bo co", "bi tp", "ln,", "mn hc", "lp trnh Java."};String name;

public MyClass (String id){

name = id;

}

public void run(){

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

randomWait();

System.out.println(name+message[i]);

}

}

void randomWait(){

try{

Thread.currentThread().sleep((long)(3000*Math.random()));

}catch (InterruptedException x){

System.out.println("Interruped!");

}

}

}Chy chng trnh trn cho ta mt trong cc kt qu nh sau :

Thread 1: Hm nay

Thread 1: bo co

Thread 2: Hm nay

Thread 2: bo co

Thread 1: bi tp

Thread 1: ln,

Thread 2: bi tp

Thread 2: ln,

Thread 2: mn hc

Thread 1: mn hc

Thread 1: lp trnh Java.

Thread 1: kt thc.

Thread 2: lp trnh Java.

Thread 2: kt thc.

Hm main() ca lp ThreadTest2 khc vi hm main() ca ThreadTest1 ch to ra thread1 v thread2. Lp ThreadTest1 to ra lung l mt thc th mi ca lp Mythread. Cn ThreadTest2 th khng to ra lung mt cch trc tip bi v lp MyClass khng phi l lp con ca lp Thread. V vy, trc tin lp ThreadTest2 to ra hai i tng ca lp MyClass v sau chuyn chng cho Thread() to lp cc lung ca lp Thread. Hm to dng Thread() c lp ThreadTest2 s dng vi i s l i tng ca bt k lp no ci t giao din Runnable. Phn cn li ca hm main() trong lp ThreadTest2 tng t nh ThreadTest1.

Hm run() ca hai lp ThreadTest1 v ThreadTest2 gn nh ging nhau, ch khc tn s dng.

1.1.2 Cc trng thi ca Thread XE "Thread" Mt lung c th mt trong cc trng thi sau: ([3], [6])

New: Khi mt lung mi c to ra vi ton t new() v sn sng hot ng. Runnable: Trng thi m lung ang chim CPU thc hin, khi bt u th n gi hm start(). B lp lch phn lung ca h iu hnh s quyt nh lung no s c chuyn v trng thi Runnable v hot ng. Cng cn lu rng mt thi im, mt lung trng thi Runnable c th hoc khng th thc hin.

Non runnable (blocked): T trng thi runnable chuyn sang trng thi ngng thc hin (b chn XE "b chn" ) khi gi mt trong cc hm: sleep(), suspend(), wait(), hay b chn li Input/output. Trong trng thi b chn c ba trng thi con:

Waiting: khi trng thi Runnable, mt lung thc hin hm wait() th n s chuyn sang trng thi ch i (Waiting).

Sleeping: khi trng thi Runnable, mt lung thc hin hm sleep() th n s chuyn sang trng thi ng (Sleeping).

Blocked: khi trng thi Runnable, mt lung b chn XE "b chn" li bi nhng yu cu v ti nguyn, nh yu cu vo/ra (I/O), th n s chuyn sang trng b chn (Blocked).

Mi lung phi thot ra khi trng thi Blocked quay v trng thi Runnable, khi

Nu mt lung c cho i ng (sleep) sau khong thi gian bng s micro giy n c truyn vo tham s ca hm sleep(n).

Nu mt lung b chn li v vo/ra v qu trnh ny kt thc.

Nu lung b chn li khi gi hm wait(), sau c thng bo tip tc bng cch gi hm notify() hoc notifyAll(). Nu mt lung b chn li ch monitor ca i tng ang b chim gi bi lung khc, khi monitor c gii phng th lung b chn ny c th tip tc thc hin (khi nim monitor c cp phn sau).

Nu mt lung b chn li bi li gi hm suspend(), mun thc hin th trc phi gi hm resume().

Nu ta gi cc hm khng ph hp i vi cc lung th JVM s pht sinh ra ngoi l IllegalThreadStateException.

Dead: Lung chuyn sang trng thi cht khi n kt thc hot ng bnh thng, hoc gp phi ngoi l khng thc hin tip c. Trong trng hp c bit, bn c th gi hm stop() kt thc (git cht) mt lung. 1.2 Cc mc u tin ca lung XE "mc u tin ca lung"

Trong Java, mi lung c mt mc u tin thc hin nht nh. Khi chng trnh chnh thc hin s to ra lung chnh (lung cha). Lung ny s to ra cc lung con, v c th tip tc. Theo mc nh, mt lung con s k tha XE "k tha" mc u tin ca lung cha trc tip ca n. Bn c th tng hay gim mc u tin ca lung bng cch s dng hm setPriority(). Mc u tin ca cc lung c th t li trong khong t MIN_PRIORITY (Trong lp Thread c mc nh bng 1) v MAX_PRIORITY (mc nh bng 10), hoc NORM_PRIORITY (mc nh l 5). Lung c mc u tin cao nht trong s cc lung ang chim dng ti nguyn s tip tc thc hin cho n khi:

N nhng quyn iu khin cho lung khc bng cch gi hm yield() N dng thc hin (b cht hoc chuyn sang trng thi b chn)

C mt lung vi mc u tin cao hn vo trng thi Runnable.

Khi b lp lch s chn lung mi c mc u tin cao nht trong s nhng lung trng thi Runnable thc hin.

Vn ny sinh l chn lung no thc hin khi c nhiu hn mt lung sn sng thc hin v c cng mt mc u tin cao nht? Ni chung, mt s c s s dng b lp lch la chn ngu nhin, hoc la chn chng thc hin theo th t xut hin.

V d 1.3 Chng ta hy xt chng trnh hin th cc qu bng mu xanh hoc ny (chuyn) theo nhng ng nht nh. Mi khi nhn nt Blue ball th c 5 lung c to ra vi mc u tin thng thng (mc 5) hin th v di chuyn cc qu bng xanh. Khi nhn nt Red ball th cng c 5 lung c to ra vi mc u tin (mc 7) cao hn mc thng thng hin th v di chuyn cc qu bng . kt thc tr chi bn nhn nt Close.

//Bounce.java

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

public class Bounce{

public static void main(String arg[]){

JFrame fr = new BounceFrame();

fr.show();

}

}

class BounceFrame extends JFrame{

public BounceFrame(){

setSize(300, 200);

setTitle("Bong chuyen");

addWindowListener(new WindowAdapter(){

public void windowClosing(WindowEvent e){

System.exit(0);

} });

Container contentPane = getContentPane();

canvas = new JPanel();

contentPane.add(canvas, "Center");

JPanel p = new JPanel();

addButton(p, "Blue ball", new ActionListener(){

public void actionPerformed(ActionEvent evt){

for(int i = 0; i < 5; i++){

Ball b = new Ball(canvas, Color.blue);

b.setPriority(Thread.NORM_PRIORITY);

b.start();

}

}

});

addButton(p, "Red ball", new ActionListener(){

public void actionPerformed(ActionEvent evt){

for(int i = 0; i < 5; i++){

Ball b = new Ball(canvas, Color.red);

b.setPriority(Thread.NORM_PRIORITY + 2);

b.start();

}

}

});

addButton(p, "Close", new ActionListener(){

public void actionPerformed(ActionEvent evt){

canvas.setVisible(false);

System.exit(0);

}

});

contentPane.add(p, "South");

}

public void addButton(Container c, String title, ActionListener a){

JButton b = new JButton(title);

c.add(b);

b.addActionListener(a);

}

private JPanel canvas;

}

class Ball extends Thread{

public Ball(JPanel b, Color c){

box = b; color = c;

}

public void draw(){

Graphics g = box.getGraphics();

g.setColor(color);

g.fillOval(x, y, XSIZE, YSIZE);

g.dispose();

}

public void move(){

if(!box.isVisible()) return;

Graphics g = box.getGraphics();

g.setXORMode(box.getBackground());

g.setColor(color);

g.fillOval(x, y, XSIZE, YSIZE);

x += dx;

y += dy;

Dimension d = box.getSize();

if(x < 0){

x = 0; dx = -dx;

}

if(x + XSIZE >= d.width){

x = d.width - XSIZE; dx = -dx;

}

if(y < 0){

y = 0; dy = -dy;

}

if(y + YSIZE >= d.height){

y = d.height - YSIZE; dy = -dy;

}

g.fillOval(x, y, XSIZE, YSIZE);

g.dispose();

}

public void run(){

try{

for(int i = 1; i rmic v1.2 ProductImpl

Kt qu l hai tp lp: ProductImpl_Stub.class v ProductImpl_Skel.class c sinh ra. i vi Java 2 SDK th tp th hai khng cn cn thit na. Nu lp t trong mt gi th gi rmic vi tn ca gi .(iv) Xc nh cc i tng dch v

truy cp c i tng t xa trn my phc v, khch hng cn c c i tng i din ti ni . Khch yu cu i tng nh th no? Phng thc chung l gi phng thc t xa ca mt i tng phc v XE "i tng phc v" v to ra mt i tng i din nhn kt qu tr li.

H thng RMI XE "RMI" cung cp mt b ng k (RMI registry) i tng t xa ta kt hp vi tn c thit lp theo URL dng //host/objectname gip ta xc nh c i tng phc v. Tn gi l dy cc k t (xu) xc nh duy nht.

// Server

ProductImpl p1 = new ProductImpl(L nng bnh, p);

Naming.bind(teaster);

i tng p1 c ghi danh vi tn gi nh teaster bng hm Naming.bind(), hoc hm Naming.rebind().

static Remote lookup(String url)

Tm n i tng t xa XE "i tng t xa" theo a ch url. Nu cha c i tng c ng k th pht sinh ngoi l NotBoundException.

static void bind(String name, Remote obj) Ghp (ng gi) name vi i tng t xa obj. Nu i tng c trong gi th pht sinh ngoi l AlreadyBoundException.

static void unbind(String name)

M ly name ra khi gi. Nu name khng c trong gi th pht sinh ngoi l NotBoundException.

static void rebind(String name)

Ghp (ng gi) name vi i tng t xa obj. Cho php thay th nhng name c ng gi.

static String[] list(String url)

Ly ra mt danh sch cc tn i tng (xu) c ng k a ch url.

Chng trnh khch truy cp n i tng phc v bng cch ch ra tn ca dch v v tn i tng, sau p v kiu ca giao din t xa nh sau:

// Client

Product p = (Product)Naming.lookup(rmi://yourserver.com/teaster);

i tng p trn my khch mun triu gi phng thc XE "phng thc" t xa ca i tng c tn c ng k l teaster my phc v th gi hm Naming.lookup() truy tm tham chiu ti i tng t xa.

RMI URL bt u bng rmi:/ sau l Server XE "Server" , s hiu cng lng nghe (tu chn), du / v sau l tn gi ca i tng triu gi t xa. V d:

rmi://localhost:99/teaster

S hiu cng mc nh l 1099. Chng trnh my phc v Server c vit y nh sau.

// Product.java: giao din t xa Productimport java.rmi.*;

public interface Product extends Remote{

public String getDescription()

throws RemoteException;

public double getPrice()

throws RemoteException;

}

// ProductImpl.java: ci t lp ProductImpl my Serverimport java.rmi.*;

import java.rmi.server.*;

public class ProductImpl extends

UnicastRemoteObject implements Product{

public ProductImpl(String s, double p)

throws RemoteException{

descr = s;

price = p;

}

public String getDescription()

throws RemoteException{

return descr;

}

public double getPrice()

throws RemoteException{

return price;

}

private String descr;

private double price;

}// ProductServer.java: Chng trnh phc v to ra 2 sn phm: L nng bnh // (c tn l teaster) v l vi sng (c tn l microwave).

import java.rmi.*;

import java.rmi.server.*;

import sun.applet.*;

public class ProductServer{

public static void main(String args[]){

try{

System.out.println("Ci t dch v ...");

ProductImpl p1 = new ProductImpl("L nng bnh", 200.5);

ProductImpl p2 = new ProductImpl("L vi sng", 350.2);

System.out.println("ng k dch v ...");

Naming.rebind("teaster", p1);

Naming.rebind("microwave", p2);

System.out.println("Cho my khch triu gi ...");

}catch(Exception e){

System.out.println("Error: " + e);

}

}

}

Tt c cc giao din, lp trn c th gp vo thnh mt gi. S dng javac dch chng v to ra cc tp lp ( .class) tng ng trn th mc hin thi.

(v) B ng k RMI XE "B ng k RMI" registry

Chng trnh dch v ca chng ta hon ton cha sn sng thc hin. Vn chnh ca chng ta l ci t i tng ca ProductImpl trn mt my v mt my khc (chng trnh khc) mun gi phng thc getDescription() bit c thng tin m t v gi bn ca cc sn phm c trn chng trnh phc v. Nh ni trc, ta khng th gi trc tip hm ca ProductImpl m phi thng qua cc lp trung gian Stub v Skel (khng cn thit i vi Java 2 SDK). Ta thc hin iu ny nh trnh bin dch rmic nh nu trn.

Hn na, my khch mun triu gi c phng thc xa th trc tin n phi lin lc c vi b ng k RMI XE "RMI" registry ca my xa . Cc hm giao din ca Java thc hin nhim v ny c gi l cc hm giao din API XE "API" JNDI. Cc hm JNDI my khch s lin lc vi RMI registry ca my ch nhn tham chiu ca i tng trong khi cc hm JNDI my ch li c nhim v ng k tn i tng vi RMI registry. khi ng RMI registry di nn Window 95 hoc NT th phi thc hin

start rmiregistry [port]

ca s lnh ca DOS Prompt hoc hp thoi Run, trong port l s hiu cng giao din ch phc v v tr li kt qu. V tt nhin, khi thit k cc i tng RMI, c th l cc i tng ci t chi tit trn my phc v, ta phi ghi nh ly s hiu cng ny cho khp. Nu khng ch nh s hiu cng th RMI registry ngm nh lng nghe cng 1099. khi ng registry mt cng khc, th phi ch ra s hiu ca cng trn dng lnh. V d, ng k cng 2001:

start rmiregistry 2001Mt vn khc ng quan tm y na l RMI registry khng cho php ng k hai i tng cng tn. Mun chnh sa li h thng chng trnh triu gi phng thc t xa, ta phi, hoc l khi ng li chng trnh RMI Registry, hoc l ngay t u khi thit k chng trnh Server ca i tng, ta s dng phng thc rebind() thay v phng thc bind() ng k vi RMI registry ca my phc v.

(vi) Chi tit v RMI registry v cc cch t ng k i tng

B ng k RMI XE "B ng k RMI" RMI registry c cp trn y nh mt dch v tm kim i tng. Cc i tng phc v mun chng trnh khch truy cp c t xa th phi ng k vi RMI registry. B ng k ny l mt chng trnh dch v chy hu trng, lng nghe mt cng c s hiu xc nh. Hin ti Java yu cu mt my o JVM chy RMI registry v mt my JVM chy chng trnh Server (trn cng mt my ch).

Mt dch v RMI registry c th tip nhn v qun l cng lc nhiu i tng dch v khc nhau. Java cho php lin lc vi b ng k RMI registry ly v danh sch cc i tng ch m n ang qun l thng qua phng thc list() ca i tng ng k nh v d di y.

//ListReg.java

import java.rmi.registry.*;

public class ListReg {

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

// a ch ca my ni m RMI Registry ang chy

String hostName = "localhost";

System.out.println("Connecting registry...");

// Kt ni vi b ng k

Registry reg = LocateRegistry.getRegistry(hostName);

// Ly v danh sch cc i tng do RMI Registry ang qun l

String objList[] = reg.list();

System.out.println("Resgitry object: ");

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

System.out.prtinln(objList[i]);

}

}

Java cho php nh lp trnh t to b ng k cho ring mnh m khng cn dng n rmiregistry.exe. to b ng k v t ng k i tng, ta s dng phng thc tnh createRegistry() ca lp LocateRegistry.

//CalculatorSetup.java

import java.rmi.server.*;

import java.rmi.*;

import java.rmi.registry.*;

public class ProductSetup {

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

// To b ng k registry

LocateRegistry.createRegistry(2510);

// To i tng

String name = My in;

double p = 150.0;

ProductImpl product = new ProductImpl(name, p);

// Yu cu JVM nhn dng product

UnicastRemoteObject.exportObject(product);

// ng k product vi dch v truy cp

System.out.println(registering object );

Naming.rebind(rmi://localhost:2510/printer, product);

System.out.println(waiting for client request );

}

}

Bin dch v cho thc thi chng trnh. Khi chng trnh hot ng, n tng ng vi hai chng trnh trc kia: rmiregistry.exe v ProductServer.

2.2.2 Trn my khch (Client)

By gi ta hy vit chng trnh trn my khch (chng trnh khch) yu cu chng trnh phc v cung cp nhng thng tin v cc sn phm t cc i tng ng k.

Vi Java, tt c cc thao tc kt ni v sao chp cc tp tin t mt my tnh v my khch u phi thng qua lp bo v gi l RMISecurityManager.

V d, nu bn mun cho chng trnh khch ProductClient c th np t ng ProductImpl_Stub.class t Webserver, th phi thit lp li c ch bo v an ninh my khch.

System.setSecurityManager(new RMISecurityManager());

H thng an ninh RMISecurityManager s s dng cc quyn c thit lp trong tp chnh sch jre\lib\security\java.policy kim sot vic kt ni t xa (jre l th mc cha cc ti nguyn to nn mi trng thc thi ca Java).

chng trnh khch kt ni c vi RMI registry v i tng phc v, ta cn s h tr ca tp chnh sch (tp thng c ui .policy). y, tp chnh sch cho php mt chng trnh ng dng to ra s kt ni mng qua cc cng c s hiu t nht l 1024. Cng RMI XE "RMI" mc nh l 1099 v Server c th s dng cc cng ( 1024. Ta c th son tp client.policy cho php kt ni cc cng ( 1024:

grant {

permission java.net.SocketPermission *:1024-65535, connect;

}

Khi thc hin chng trnh khch, ta phi s dng chnh sch (client.policy) (chi tit xem [2]).

java ProductClient Djava.security.policy=client.policyChng trnh my khch c vit nh sau.

// ProductClient.java: lp ProductClient trn my khch

import java.rmi.*;

import java.rmi.server.*;

public class ProductClient{

public static void main(String args[]){

System.setSecurityManager(new RMISecurityManager());

String url = "rmi://localhost/";

String name = ;

double price = 0.0;

// Thay bng "rmi://yourserver.com/"

// Khi Server chy trn my t xa yourServer.com

try{

Product c1 = (Product)Naming.lookup(url + "teaster");

Product c2 = (Product)Naming.lookup(url + "microwave");

name = c1.getDescription();

price = c1.getPrice();

System.out.println(name + ", gi bn: $ " + price);

price = c2.getPrice();

name = c2.getDescription();

price = c2.getPrice();

System.out.println(name + ", gi bn: $ " + price);

}catch(Exception e){

System.out.println("Error " + e);

}

System.exit(0);

}

}

+ Bin tu chn CODEBASE

Nh ta bit, khi thc thi, mt chng trnh Java da vo bin mi trng CLASSPATH XE "CLASSPATH" tm cc tp tin m byte code: *.class. C nhin, CLASSPATH gia my ch v my khch hon ton c th c thit lp khc nhau. Ta phi bit r, cc chng trnh trong h thng mun thc thi c th cn phi c CLASSPATH ph hp, chnh xc hn l cn cung cp nhng tp lp .class, tp thc thi th mc no, u c th thc thi chng.

Chng hn, trong v d ca chng ta, my phc v cn phi c cc tp tin m byte code th mc C:\server\product\Product.class, ProductImpl.class, ProductImpl_Stub.class, ProductImpl_Skel.class (tp ny khng cn thit Java 2 SDK), v ProductServer.class. Trong khi , ti my khch ta ch cn c hai tp tin th mc D:\Client\product\ ProductClient.class v ProductImpl_Stub.class, cn b chng trnh JDK c ci t th mc C:\j2sdk1.4.0\bin.

Thc t, chng ta thy, cch lm vic trn l cha th hin r tnh phn tn i tng XE "phn tn i tng" mt cch trit . Tht vy, khi m lp i tng triu gi t xa phi cp nht th cc lp giao din trung gian Skel v Stub ca n cng phi c cp nht theo. V c nhin, pha my khch cng phi cp nht phin bn Stub mi ny, iu ny du sao cng gy nn t nhiu bt tin. Cng ngh Java cung cp gii php cho php t ng np lp Stub t xa thng qua ty chn CODEBASE khi ng k i tng vi RMI registry trn my ch. Chng hn, ta ng k ProductServer nh sau:

c:\j2sdk1.4.0\bin>java Djava.rmi.server.codebase= http://192.168.0.9/rmi/product/ ProductServer

Khi ng k nh vy, Server ca chng ta ( y l my c a ch IP XE "IP" l 192.168.0.9), ngoi RMI registry ang hot ng, cn phi chy thm dch v Web, v phi bo m l ti a ch http://192.168.0.9/rmi/product/ th lun c tp tin m byte code _Stub.class. Bng cch ny, nh cung cp i tng triu gi t xa ch cn cung cp tp tin m byte code ca i tng m thi. V, khi my khch c yu cu RMI registry tr v tham chiu ca i tng, nu my khch cha c lp _Stub th RMI registry s hng dn my khch t ng np lp ny t a ch xc nh trong ty chn CODEBASE.

Trong v d 2.1, ta gi s tt c cc tp Product*.* v client.policy c t D:\user\product, cn Java 2 SDK ci t C:\j2sdk1.4.0. Ta thc hin cc bc ln lt nh sau:

1. Dch tt c cc tp ngun Java bt u bng ProductD:\user\product>C:\j2sdk1.4.0\bin\javac Product*.java

2. To ra cc lp trung gian

D:\user\product>C:\j2sdk1.4.0\bin\rmic v1.2 ProductImpl

3. Khi ng b ng k RMI registryD:\user\product>start C:\j2sdk1.4.0\bin\rmiregistry

4. Bt u thc hin chng trnh phc v

D:\user\product>start C:\j2sdk1.4.0\bin\java ProductServer

5. Thc hin chng trnh khch

D:\user\product>C:\j2sdk1.4.0\bin\java -Djava.security.policy=client.policy ProducClient

Kt qu s in ra:

L nng bnh, gi bn: 200.5 $

L vi sng, gi bn: 350.2 $

Lu : Ta c th thit lp bin mi trng bng cch t ng dn khi thc hin khng cn phi ch nh nh trn, v d

set classpath = D:\server\product; D:\client\product; c:\j2sdk1.4.0\bin2.2.3 Trin khai ng dng Web

Trin khai mt ng dng m ta s dng RMI th phi thn trng v nhiu vn c th ny sinh. Cc bc thc hin trn to ra nhiu tp lp (ui .class) tch bit v chng c th c t ba th mc con: server, download v client.

Th mc server cha tt c cc tp cn thit chy chng trnh Server. Trong v d trn, l cc tp lp: ProductServer.class, Product.class, ProductImpl.class, ProductImpl_Stub.class. Th mc download cha tt c cc tp s c np v my khch cng nh nhng lp ph thuc. Trong v d trn, ta cn b sung Product.class, ProductImpl_Stub.class vo th mc download.

Cui cng th mc client cha tt c cc tp cn thit bt u chy chng trnh client. Trong v d trn, l cc tp lp: ProductClient.class, Product.class v client.policy.

Gi s Web Server XE "Server" c khi ng trn my tnh ca bn. Bn cng c th nhn c dch v t ftp://java.sun.com/pub/jdk1.1/rmi/class-server.zip. Dch v ny tng i d ci t v c cc chc nng h tr cc tp lp.

+ Trc tin, chuyn th mc download vo th mc t liu ca Web Server.

+ Sau , son tho li tp client.policy. N phi cho php chng trnh khch nhng quyn sau:

Kt ni qua cc cng 1024, n c vi RMI registry v nhng ci t Server.

Kt ni vi cng HTTP XE "HTTP" (thng l 80) np cc tp lp trung gian Stub.

Tp client.policy cp quyn kt ni mng, sau khi c thay i v c dng:

grant{

permission java.net.SocketPermission

*:1024-65535, connect;

permission java.net.SocketPermission

*:80, connect;

};

2.3 Truyn tham s trong cc li gi phng thc XE "phng thc" t xa

Trong mt chng trnh Java, cc bin kiu i tng th c truyn theo tham chiu trong cc li gi hm. Ngha l khi i tng truyn cho phng thc b thay i bn trong thn phng thc th khi li gi phng thc kt thc, gi tr cc thnh phn ca i tng cng b thay i theo. Chng hn ta xt s hot ng ca chng trnh sau y:

class Number {

public int value = 0;

public Number(int v) {

this.value = v;

}

}

public class App {

public static void main(String[] args) {

Number num = new Number(12);

System.out.println("Gi tr trc khi gi hm: " + num.value);

incNum(num);

System.out.println("Gi tr sau khi gi hm: " + num.value); }

public static void incNum(Number n) {

n.value++;

}

}

Trong v d ny, ta to ra lp Number lu gi gi tr nguyn. Phng thc incNum() tip nhn tham s c kiu i tng l Number vi gi tr value khi u l 12. Bn trong phng thc, thnh phn ca bin i tng (tng value ln 1). Kt qu l sau khi li gi phng thc kt thc, i tng num c gi tr value thay i (tng ln 1).

Cng cn nn bit rng Java c hai kiu d liu chnh: kiu d liu nguyn thu v kiu d liu phc hp. Cc kiu d liu nguyn thu, nh int, float, double, char, byte, long, khi truyn cho cc hm th chng c xem nh l cc tham tr; ngc li, cc kiu d liu phc hp, c xem l cc i tng, th lun c truyn cho cc hm theo tham chiu. Ngha l, khi sa i chng trnh ni trn th gi tr ca i s truyn cho hm s khng thay i sau khi thc hin li gi hm v chng c gi theo tham tr.

public class App2 {

public static void main(String[] args) {

int num = 12;

System.out.println("Gi tr trc khi gi hm: " + num);

incNum(num);

System.out.println("Gi tri sau khi gi hm: " + num);

}

public static void incNum(int n) {

n++;

}

}

Tm li, trong Java, i tng c truyn theo tham chiu cn cc kiu d liu nguyn thu th c truyn theo tham tr. Vn ca chng ta y l truyn tham s qua cc li gi phng thc t xa th c xem l truyn theo kiu tham chiu hay tham tr. Tht s, truyn tham s cho cc li gi phng thc t xa trong RMI c hi khc so vi nguyn tc truyn tham s theo kiu thng thng:

1. Tt c cc kiu d liu nguyn thu u c truyn theo tham tr.

2. Tt c cc kiu d liu kiu lp mun truyn qua mng u buc phi ci t mt trong hai giao din Remote hoc Serializable. Cc i tng ci t giao din Remote s c truyn theo tham chiu, cn cc i tng ci t theo giao din Serializable s c truyn theo tham tr.

Lu : Nu trong cc li gi phng thc RMI, kiu d liu i tng nu khng ci t mt trong hai giao din Remote XE "Remote" hoc Serializable th s khng th dng lm tham s chuyn qua mng c.

2.3.1 Truyn i tng n trnh ch theo tham tr

Cc lp i tng thng dng ca Java nh String, Date, Time, u c ci t giao din Serializable cho nn chng c chuyn cho cc li gi hm hay phng thc xa theo kiu tham tr.

Vi c ch truyn tham s i tng theo tham tr, khi gi mt phng thc ca i tng t xa XE "i tng t xa" , nu trong li gi ca phng thc ny c yu cu tham s l kiu i tng, i tng s c ng gi v chuyn ton b n my ch (ni tip nhn tham s v thc thi phng thc). Ti my ch, i tng s c khi phc li trng thi ban u v a vo s dng. Qu trnh ng gi tham s c thc hin bi lp trung gian _Stub, ngc li, qu trnh m gi d liu khi phc li tham s s c thc hin bi lp _Skel XE "Skel" .

2.3.2 Chuyn i tng n chng trnh ch theo tham chiu

i vi lp trnh trn mt my cc b, vic truyn mt i tng c kch thc ln cho mt hm theo kiu tham tr khng phi l mt gii php hay do va tn b nh, va tn thi gian to bn sao ca i s. Trong k thut lp trnh triu gi t xa cng vy, vi mt i tng c kch thc ln, vic ng gi ton b i tng ri chuyn i chuyn li trn mng s nh hng n tc thc thi ca chng trnh. C cch no m trnh ch c th tham chiu v x l c trc tip i tng ang nm trn my khch hay khng? C ngha l, nu trnh ch c trnh khch truy xut t xa th chnh chng trnh khch cng c th c gi t xa bi trnh ch. Hay ni cch khc, trnh khch khng cn chuyn i tng cho trnh ch theo tr m c th chuyn theo tham chiu. Bng cch ny ta c th cho i tng trn trnh khch v trnh ch triu gi ln nhau.

Cch m chng trnh khch c th tham chiu c n i tng trn my ch l my ch yu cu phi thc thi giao din Remote XE "Remote" (chng hn ProductImpl extends Remote), tip n l sinh ra cc lp trung gian _Stub v _Skel, sau cng l dng RMI registry trnh khch tham chiu n. Chng ta s p dng iu tng t nh vy vi cc i tng trn trnh khch. Vi Java, cc i tng nu ci t giao din Remote th s c xem nh l c kh nng chuyn qua mng thng qua tham chiu ch khng cn phi ng gi chuyn i (to ra bn copy) theo tham tr nh trng hp ci t giao din Serializable. n gin ch c vy!

V d 2.2 Chng trnh sau ch ra cch sao chp cc tham bin v cc gi tr tr li khi thc hin ci t vi giao din Serializable. Chng trnh gii thiu cc sn phm t xa (marketing trn mng) theo s thch, tui v khch hng la chn tu theo h l nam hay n. Khch hng c th cho bit tui, chn mc nam (Male) hay n (Female), c th c hai v s thch (Hobbies) ri nhn nt Submit c c nhng sn phm m kho hng gii thiu. Trng hp khch tm tui 50, l n, s thch l my tnh (chn Computers) th s c gii thiu hai cun sch nh hnh 2.5.

Hnh 2.5 Gii thiu sn phm t my ch

thc hin c nhng cng vic trn, ta phi xy dng hai giao din t xa XE "giao din t xa" : Product, Warehouse, cc lp t xa ProductImpl, WarehouseImpl, WarehouseSever, WarehouseClient v mt lp cc b Customer.

Mt i tng thuc lp Customer c gi n cho Server XE "Server" . Bi v Customer khng phi l i tng t xa XE "i tng t xa" , v th mt bn sao ca n s c to ra Server. Chng trnh Server s gi tr li mt Vector (mt dy) cc sn phm ph hp vi s thch khch hng la chn.

Trc tin ta to ra giao din t xa cho sn phm.

// Product.java khai bo giao din t xa Product

import java.rmi.*;

import java.awt.*;

public interface Product extends Remote{

public String getDescription()

throws RemoteException;

static final int MALE = 1;

static final int FEMALE = 2;

static final int BOTH = MALE + FEMALE;

}

Thng tin v sn phm c lu tr bao gm: m t sn phm, cho lp ngi (nam / n) phm vi tui no v ph hp cho nhng s thch nht nh. Lp ProductImpl bn cnh vic ci t phng thc getDescription() nh khai bo trong giao din t xa, c gi l phng thc t xa, cn ci t phng thc match(), getImageFile() khng c trong giao din, c gi l phng thc cc b. Phng thc ny ch cho php gi cc b trong mt chng trnh, khng cho php triu gi t xa.

// ProductImpl.java ci t giao din t xa v b sung cc phng thc cc bimport java.rmi.*;

import java.rmi.server.*;

import java.awt.*;

public class ProductImpl extends

UnicastRemoteObject implements Product{

public ProductImpl(String n, int s, int age1, int age2,

String h, String img) throws RemoteException{

name = n; sex = s;

ageLow = age1; ageHig = age2;

hobby = h; imageFile = img;

}

public String getDescription() throws RemoteException{

return name;

}

public String getImageFile() throws RemoteException{

return imageFile;

}

public boolean match(Customer c){

if(c.getAge() < ageLow || c.getAge() > ageHig)

return false;

if(!c.hasHobby(hobby)) return false;

if((sex & c.getSex()) == 0) return false;

return true;

private String name;

private int ageLow;

private int ageHig;

private int sex;

private String hobby;

private String imageFile;

}

Tip theo, ta xy dng lp Customer ci t giao din Serializable, khng phi l lp t xa. Ngha l khng mt phng thc no ca n c th c triu gi t xa. Tuy nhin, cc i tng ca lp ny c th chuyn t mt my JVM ny sang my JVM khc.

// Customer.java to ra mt lp Customer cc b

import java.io.*;

public class Customer implements Serializable{

public Customer(int theAge, int theSex, String[] theHobbies){

age = theAge; sex = theSex;

hobbies = theHobbies;

}

public int getAge(){

return age;

}

public int getSex(){

return sex;

}

public boolean hasHobby(String aHobby){

if(aHobby == "") return true;

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

if(hobbies[i].equals(aHobby)) return true;

return false;

}

public void reset(){

age = sex = 0;

hobbies = null;

}

public String toString(){

String res = "Age: " + age + ", Sex: ";

if(sex == Product.MALE) res += "MALE";

else if(sex == Product.FEMALE) res += "FEMALE";

else res += "FEMALE OR MALE";

res += ", Hobbies: ";

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

res += " " + hobbies[i];

return res;

}

private int age;

private int sex;

private String[] hobbies;

}

Tng t nh i vi Product, ta to ra tip giao din t xa Warehouse.

// Warehouse.java khai bo giao din t xa cho kho hng tm kim hng theo yu cu.

import java.rmi.*;

import java.util.*;

public interface Warehouse extends Remote{

public Vector find(Customer c) throws RemoteException;

}

Ging nh lp ProductImpl, WarehouseImpl cng s c phng thc cc b v phng thc t xa. Phng thc cc b add() c s dng b sung (mua thm) cc sn phm vo kho hng. Phng thc find() l t xa, c triu gi tm cc sn phm tng ng trong kho hng.

// WarehouseImpl.java ci t mt lp t xa c c cc hm cc b.

import java.rmi.*;

import java.rmi.server.*;

import java.util.*;

public class WarehouseImpl extends

UnicastRemoteObject implements Warehouse{

public WarehouseImpl() throws RemoteException{

products = new Vector();

}

public synchronized void add(ProductImpl p) { // Local method

products.add(p);

}

public synchronized Vector find(Customer c) throws RemoteException{

Vector res = new Vector();

for(int i = 0; i < products.size(); i++){

ProductImpl p = (ProductImpl)products.get(i);

if(p.match(c)) res.add(p);

}

res.add(new ProductImpl("Core Java Book", Product.BOTH, 20, 100,

"", "corejava.jpg"));

c.reset();

return res;

}

private Vector products;

}Chng trnh WarehouseServer.java nhm to ra cc i tng t xa XE "i tng t xa" v ng k chng cho php triu gi t xa.

// WarehouseServer.java to ra lp dch v t xa.

import java.rmi.*;

import java.rmi.server.*;

public class WarehouseServer{

public static void main(String agrs[]){

try{

System.out.println("Constructing server implementations ...");

WarehouseImpl w = new WarehouseImpl();

fillWarehouse(w);

System.out.println("Binding server implementations to registry...");

Naming.rebind("central_warehouse", w);

System.out.println("Waiting for invocations from clients ...");

}catch(Exception e){

System.out.println("Error: " + e);

}

}

public static void fillWarehouse(WarehouseImpl w) throws RemoteException{

w.add(new ProductImpl("Blackwell Teaster", Product.BOTH,

18, 100, "Household",""));

w.add(new ProductImpl("Cosmetic Set", Product.FEMALE,

15, 50, "Beauty",""));

w.add(new ProductImpl("Learn Java in 21 Days Book", Product.BOTH, 20, 100, "Computers",""));

w.add(new ProductImpl("Handy Hand Grenade", Product.MALE,

16, 60, "Gardening",""));

w.add(new ProductImpl("Network Computer", Product.BOTH,

18, 80, "Computers",""));

// Tng t c th b sung nhiu mt hng khc

}

}

Cui cng l chng trnh khch. Sau khi cho bit tui (Age), la chn mc nam (Male), hay n (Female), c th c hai v s thch (Hobbies), ngi s dng nhn nt Submit th mt i tng mi c to ra v c truyn vo cho phng thc t xa find(). Nhng thng tin v sn phm tm thy s c hin th cho khch hng la chn.

// WarehouseClient.java triu gi t xa c c cc sn phm ph hp vi khch hng.

import java.awt.*;

import java.awt.event.*;

import java.io.*;

import java.util.*;

import java.rmi.*;

import java.rmi.server.*;

import javax.swing.*;

public class WarehouseClient{

public static void main(String agrs[]){

JFrame fr = new WarehouseClientFrame();

fr.show();

}

}

class WarehouseClientFrame extends JFrame

implements ActionListener{

public WarehouseClientFrame(){

initUI();

System.setSecurityManager(new RMISecurityManager());

try{

String url = "rmi://localhost/central_warehouse";

centralWarehouse = (Warehouse)Naming.lookup(url);

}catch(Exception e){

System.out.println("Error: Can't connect to warehouse! " + e);

}

}

private void callWarehouse(Customer c){

try{

Vector rec = centralWarehouse.find(c);

result.setText(c + "\n");

for(int i = 0; i < rec.size(); i++){

Product p = (Product)rec.get(i);

String t = p.getDescription() + "\n";

result.append(t);

}

}catch(Exception e){

result.setText("Error: " + e);

}

}

public void actionPerformed(ActionEvent evt){

Object[] hobbyObjects = hobbies.getSelectedValues();

String[] hobbyStrings = new String[hobbyObjects.length];

System.arraycopy(hobbyObjects, 0, hobbyStrings, 0,

hobbyObjects.length );

Customer c = new Customer(Integer.parseInt(age.getText()),

(male.isSelected()? Product.MALE : 0)

+ (female.isSelected()? Product.FEMALE : 0) ,

hobbyStrings);

callWarehouse(c);

}

private void initUI(){// Khi to mn hnh giao din cho khch hng

setTitle("Warehouse Client");

setSize(300, 300);

addWindowListener(new WindowAdapter(){

public void WindowClosing(WindowEvent e){

System.exit(0);

}

});

getContentPane().setLayout(new GridBagLayout());

GridBagConstraints gbc = new GridBagConstraints();

gbc.fill = GridBagConstraints.HORIZONTAL;

gbc.weightx = 100;

gbc.weighty = 0;

add(new JLabel("Age:"), gbc, 0, 0, 1, 1);

age = new JTextField(4);

age.setText("20");

add(age, gbc, 1, 0, 1, 1);

male = new JCheckBox("Male", true);

add(male, gbc, 0, 1, 1, 1);

female = new JCheckBox("Female", true);

add(female, gbc, 1, 1, 1, 1);

gbc.weighty = 100;

add(new JLabel("Hobbies"), gbc, 0, 2, 1, 1);

String[] choices = {"Gardening", "Beauty", "Computers", "Household"};

gbc.fill = GridBagConstraints.BOTH;

hobbies = new JList(choices);

add(new JScrollPane(hobbies), gbc, 1,2, 1,1);

gbc.weighty = 0;

gbc.fill = GridBagConstraints.NONE;

JButton submitButton = new JButton("Submit");

add(submitButton, gbc, 0,3, 2,1);

submitButton.addActionListener(this);

gbc.weighty = 100;

gbc.fill = GridBagConstraints.BOTH;

result = new JTextArea(4,40);

result.setEditable(false);

add(result, gbc, 0, 4, 2,1);

}

private void add(Component c, GridBagConstraints gbc,

int x, int y, int w, int h){

gbc.gridx = x;

gbc.gridy = y;

gbc.gridwidth = w;

gbc.gridheight = h;

getContentPane().add(c, gbc);

}

private Warehouse centralWarehouse;

private JTextField age;

private JCheckBox male, female;

private JList hobbies;

private JTextArea result;

}

Vic to ra tp client.policy v nm bc: dch, to ra lp trung gian, ng k RMI registry ri thc hin chng trnh phc v, chng trnh khch c thc hin tng t nh v d 2.1 nu trn.

2.3.3 Truyn gi i tng t xa XE "i tng t xa" Truyn cc i tng t xa t chng trnh phc v (Server) ti chng trnh khch (Client) l kh n gin. Chng trnh khch nhn c i tng trung gian Stub v lu vo bin i tng c cng kiu giao din t xa vi i tng c truyn i. Client c th truy cp vo i tng hin thi trn Server thng qua bin . Nn nh l ch c cc phng thc t xa (khai bo trong giao din t xa XE "giao din t xa" , giao din k tha t Remote) mi c php truy cp trong cc i tng Stub. Tt c cc phng thc cc b (khng khai bo trong giao din t xa) khng truy cp c bi Stub.

Trng hp mt lp con khng ci t giao din t xa, nhng lp cha ca n li ci t giao din t xa, v i tng ca lp con c truyn gi vi phng thc t xa th ch nhng phng thc ca lp cha l c chp nhn. hiu r hn vn ny, ta hy xt v d sau.

class BookImpl extends ProductImpl{

public BookImpl(String title, String theISBN, int sex,

int age1,int age2, String hobby, String img){

super(title + " Book", sex, age1, age2, hobby, img);

ISBN = theISBN;

}

public String getStockCode(){

return ISBN;

}

private String ISBN;

}

Gi s ta truyn mt i tng book ca lp BookImpl vi li gi phng thc getStockCode() t xa. i tng nhn c s l mt i tng Stub. Nhng i tng Stub ny khng i din cho book m n ch i din c cho i tng ca lp cha l ProductImpl. Mi quan h gia cc giao din v cc lp c m t nh hnh 2.5.

Trong trng hp ny, phng thc getStockCode()khng truy cp c t xa. Mun n truy cp c t xa th phi to ra giao din t xa XE "giao din t xa" , v d Stock k tha t Remote v BookImpl c vit li nh sau.

interface Stock extends Remote{

public String getStockCode() throws RemoteException;

}

class BookImpl extends ProductImpl{

public BookImpl(String title, String theISBN, int sex,

int age1,int age2, String hobby, String img){

super(title + " Book", sex, age1, age2, hobby, img);

ISBN = theISBN;

}

public String getStockCode() throws RemoteException{

return ISBN;

}

private String ISBN;

}

Khi mt i tng ca lp BookImpl c truyn vo li gi phng thc t xa, ni nhn s c quyn truy cp vo tt c cc phng thc t xa c khai bo c trong Remote v Stock. Nh vy mt i tng t xa c th l mt cun sch hoc khng. Cc i tng trung gian Stub c sinh ra bi chng trnh rmic theo c ch ca RMI v ngi lp trnh khng cn quan tm n chng. Ta c th s dng ton t instanceof kim tra xem i tng p c truyn i thuc loi no.

if(p instanceof Stock){

Stock s = (Stock)p;

String c = s.getStock();

//

}

2.4 S dng RMI vi Applet

Khi vit chng trnh ng dng nhng applet m s dng RMI th c mt s im c bit cn lu . Cc chng trnh applet c b qun l an ninh ring bi v n phi thc hin bn trong trnh duyt. V vy, khng cn s dng RMISecurityManager chng trnh khch.

Ngoi ra ta cng cn quan tm ni ct gi cc tp *_Stub.class, *Server.class. Khi m mt trang Web vi th APPLET, trnh duyt s np nhng tp trn v tham chiu n th ny. V th, cc i tng phc v XE "i tng phc v" bt buc phi c mt trn cng my ca trang Web. Ngha l trn my phc v phi c:

Trang Web M ca chng trnh applet Cc lp Stub Cc i tng phc v

B ng k RMI XE "RMI" registry V d 2.3 Ta xy dng mt chng trnh applet thc hin nh v d 2.2.

Khi thc hin cc chng trnh applet, ta cn phn tn cc tp m lnh nh sau:

java.rmi.registry.RegistryImpl u trn my ch v b ng k registry phi c chy trc khi khi ng applet.

WarehouseServer u trn my ch v b ng k registry phi c chy trc khi khi ng applet.

WarehouseImpl c th u trn my ch sao cho WarehouseServer c th tm c n.

WarehouseApplet th mc m th APPLET tham chiu c.

Cc tp lp _Stub.class phi cng th mc ca WarehouseApplet.

Chng trnh applet tm cc i tng trong danh sch ng k RMI registry trn my, ni cha chnh applet . tm c my ca n, ta s dng getCodeBase() v phng thc getHost().

String url = getCodeBase().getHost();

url = rmi:// + url;

centralWarehouse = (Warehouse)Naming.lookup(url + /centralWarehouse);

Chng trnh applet thc hin nh v d 2.2 c vit nh sau.

import java.awt.*;

import java.awt.event.*;

import java.applet.*;

import java.util.*;

import java.rmi.*;

import java.rmi.server.*;

import javax.swing.*;

public class WarehouseApplet extends JApplet implements ActionListener{

public void init(){

initUI();

String url = getCodeBase().getHost();

url = "rmi://" + url;

try{

centralWarehouse = (Warehouse)Naming.lookup(url +

"/central_warehouse");

}catch(Exception e){

showStatus("Error: Can't connect to warehouse! " + e);

}

}

private void callWarehouse(Customer c){

try{

products = centralWarehouse.find(c);

//descriptionListModel.clear();

result.setText(c + "\n");

for(int i = 0; i < products.size(); i++){

Product p = (Product)products.get(i);

String t = p.getDescription() + "\n";

result.append(t);

}

}catch(Exception e){

showStatus("Error: " + e);

}

}

public void actionPerformed(ActionEvent evt){

Object[] hobbyObjects = hobbies.getSelectedValues();

String[] hobbyStrings = new String[hobbyObjects.length];

System.arraycopy(hobbyObjects, 0, hobbyStrings, 0,

hobbyObjects.length );

Customer c = new Customer(Integer.parseInt(age.getText()),

(male.isSelected()? Product.MALE : 0)

+ (female.isSelected()? Product.FEMALE : 0) ,

hobbyStrings);

callWarehouse(c);

}

private void initUI(){

getContentPane().setLayout(new GridBagLayout());

GridBagConstraints gbc = new GridBagConstraints();

gbc.fill = GridBagConstraints.HORIZONTAL;

gbc.weightx = 100;

gbc.weighty = 0;

add(new JLabel("Age:"), gbc, 0, 0, 1, 1);

age = new JTextField(4);

age.setText("20");

add(age, gbc, 1, 0, 1, 1);

male = new JCheckBox("Male", true);

add(male, gbc, 0, 1, 1, 1);

female = new JCheckBox("Female", true);

add(female, gbc, 1, 1, 1, 1);

gbc.weighty = 100;

add(new JLabel("Hobbies"), gbc, 0, 2, 1, 1);

String[] choices = {"Gardening", "Beauty", "Computers", "Household"};

gbc.fill = GridBagConstraints.BOTH;

hobbies = new JList(choices);

add(new JScrollPane(hobbies), gbc, 1,2, 1,1);

gbc.weighty = 0;

gbc.fill = GridBagConstraints.NONE;

JButton submitButton = new JButton("Submit");

add(submitButton, gbc, 0,3, 2,1);

submitButton.addActionListener(this);

gbc.weighty = 100;

gbc.fill = GridBagConstraints.BOTH;

result = new JTextArea(4, 40);

result.setEditable(false);

add(result, gbc, 0, 4, 2,1);

}

private void add(Component c, GridBagConstraints gbc,

int x, int y, int w, int h){

gbc.gridx = x;

gbc.gridy = y;

gbc.gridwidth = w;

gbc.gridheight = h;

getContentPane().add(c, gbc);

}

private Warehouse centralWarehouse;

private JTextField age;

private JCheckBox male, female;

private JList hobbies; //, descriptions;

private JTextArea result;

private JButton submitButton;

private Vector products;

// private DefaultListModel descriptionListModel;

}

Nh ni trn, i vi cc chng trnh applet khng cn s dng b RMISecurityManager nn cng khng cn son tho tp client.policy. Nh chng ta bit chy c chng trnh applet th phi nhng chng vo th APPLET ca HTML, v d tp WarehouseApplet.html n gin nht c dng:

Qu trnh dch, thc hin chng trnh applet triu gi t xa cng gm nm bc, trong bn bc u ging nh v d 2.1. Bc th nm c th s dng trnh duyt IE m tp WarehouseApplet.html hoc s dng appletviewer ca JDK.

D:\users\Server\warehouse>C:\j2sdk1.4.0\bin\

appletviewer warehouseApplet.htmlKt qu chng trnh applet thc hin triu gi t xa tng t nh chng trnh c lp (v d 2.1).

Hnh 2.7 Chng trnh applet triu gi t xa

2.5 Ngn ng nh ngha giao din Java (IDL) v CORBA

Khc vi RMI XE "RMI" , CORBA cho php ta thc hin cc li gi gia cc i tng Java vi cc i tng vit bng cc ngn ng khc, v d i tng C++. CORBA XE "CORBA" ph thuc vo b mi gii yu cu ORB c sn sng trn c Server ln Client.

2.5.1 Ngn ng nh ngha giao din IDL

Sun xy dng Java IDL nh l ngn ng nh ngha giao din CORBA trong Java 2 SDK . Bn thn IDL XE "IDL" l ngn ng nh ngha giao din dng ngn ng t nhin [2].Vi CORBA, mt giao din trong IDL c th c vit n gin nh sau:

interface Product{

string getDescription();

};

y c s khc bit gia IDL XE "IDL" v Java. Trong IDL, kt thc vic nh ngha giao din l ; v string khng bt u bng ch in hoa S nh trong Java. Trong Java, cc xu (thuc lp String) bao gm cc k t Unicode XE "Unicode" 16-bit, cn trong CORBA, cc xu ch cha cc k t 8-bit. Do vy, nu ta gi i nhng xu 16-bit qua ORB v nhng k t trong xu c cc bit cao khc 0 th s pht sinh ngoi l. y chnh l mt vn khng tng thch gia cc ngn ng lp trnh.

Chng trnh dch Java IDL Compiler (trong J2sdk.1.4.0 l idlj.exe) lm nhim v dch cc nh ngha trong IDL sang Java. V d

idlj Product.idlChng trnh s to ra cc tp sau:

Product.java, nh ngha giao din

ProductHolder.java, nh ngha lp ct gi cho cc tham s out

ProductHelper.java, nh ngha lp tr gip

_ProductImplBase.java, nh ngha lp cha ca lp ci t

_ProductStub.java, nh ngha lp trung gian Stub trao i vi ORB.

Mt s giao din Java c sinh t ng sau cu lnh trn, nh:

/**

* Product.java .

* Generated by the IDL-to-Java compiler (portable), version "3.1"

* from Product.idl

* Wednesday, July 20, 2005 6:28:29 PM ICT

*/public interface Product extends ProductOperations, org.omg.CORBA.Object, org.omg.CORBA.portable.IDLEntity

{

} // interface Product/**

* ProductOperations.java .

* Generated by the IDL-to-Java compiler (portable), version "3.1"

* from Product.idl

* Wednesday, July 20, 2005 6:28:29 PM ICT

*/

public interface ProductOperations

{

String getDescription ();

} // interface ProductOperations/**

* ProductHelper.java .

* Generated by the IDL-to-Java compiler (portable), version "3.1"

* from Product.idl

* Wednesday, July 20, 2005 6:28:29 PM ICT

*/

abstract public class ProductHelper

{

private static String _id = "IDL:Product:1.0";

public static void insert (org.omg.CORBA.Any a, Product that)

{

org.omg.CORBA.portable.OutputStream out = a.create_output_stream ();

a.type (type ());

write (out, that);

a.read_value (out.create_input_stream (), type ());

}

public static Product extract (org.omg.CORBA.Any a)

{

return read (a.create_input_stream ());

}

private static org.omg.CORBA.TypeCode __typeCode = null;

synchronized public static org.omg.CORBA.TypeCode type () {

if (_typeCode == null)

{

_typeCode = org.omg.CORBA.ORB.init ().create_interface_tc (ProductHelper.id (), "Product"); }

return _typeCode;

}

public static String id ()

{

return _id;

}

public static Product read (org.omg.CORBA.portable.InputStream istream)

{

return narrow (istream.read_Object (_ProductStub.class));

}

public static void write (org.omg.CORBA.portable.OutputStream ostream, Product value)

{

ostream.write_Object ((org.omg.CORBA.Object) value);

}

public static Product narrow (org.omg.CORBA.Object obj)

{

if (obj == null)

return null;

else if (obj instanceof Product)

return (Product)obj;

else if (!obj._is_a (id ()))

throw new org.omg.CORBA.BAD_PARAM ();

else

{

org.omg.CORBA.portable.Delegate delegate = ((org.omg.CORBA.portable.ObjectImpl)obj)._get_delegate (); _ProductStub stub = new _ProductStub ();

stub._set_delegate(delegate);

return stub;

}

}

}

Java cng cung cp chng trnh dch ngc t tp .class (kt qu dch ca giao din trong Java) sang IDL nh sau:

rmic idl YourInterface.class Ta xt tip cch c t cc hm trong IDL XE "IDL" . Khi nh ngha mt phng thc, ta phi la chn cc tham s truyn v nhn kt qu. Mi tham s c th khai bo in, out hoc inout.

Nhng tham s khai bo in l nhng tham s c truyn d liu.

Nhng tham s khai bo out c s dng lu gi nhng kt qu trc khi quay tr li thc hin chng trnh chnh.

V d, phng thc XE "phng thc" locate() c th lu gi sn phm tm thy, c nh ngha trong IDL nh sau:

interface Warehouse{

boolean locate(in string descr, out Product p);

// };

i vi mi giao din, chng trnh dch IDL s sinh ra mt lp c hu t l Holder, c gi l lp ct gi. Nh trn ta thy, sau khi dch giao din Product (vit trong IDL) sang Java, ngoi tp Product.java, cn sinh t ng ra hai tp ProductHolder.java v ProductOperation.java. Mi lp lu gi u c mt bin public l value.

Khi gi mt phng thc, ta phi truyn vo cho i tng ct gi. Sau khi kt thc li gi hm, mun tm li kt qu th tm qua value ca i tng ct gi . V d:

Warehouse w = ;

String descr = ;

ProductHolder pHolder = new ProductHolder();

if(w.locate(descr, pHolder))

p = pHolder.value; Trong IDL, ta c th s dng cu trc sequence nh ngha cc mng c kch c bin i. V d, nh ngha mt kiu chui cc sn phm:

typedef sequence ProductSeq;

Sau ta c th s dng kiu d liu ny khai bo phng thc

interface Warehouse{

ProductSeq find(in Customer c);

. . .

};

Trong Java, cu trc sequence tng ng vi cu trc mng.

Nu mt phng thc c th pht sinh ngoi l, th trc ht ta phi nh ngha kiu ngoi l v sau s dng khai bo n vi t raises. V d, phng thc find() c th gp phi ngoi l BadCustomer.

interface Warehouse{

exception BadCustomer{ string reason;}

ProductSeq find(in Customer c) raises BadCustomer;

. . .

};

Chng trnh dch IDL s dch sang lp BadCustomer

final class BadCustomer extends org.omg.CORBA.UserException{

public BadCustomer(){;}

public BadCustomer(String _reason){reason = _reason;}

public String reason;

}

Cc giao din cng c th cha thuc tnh attribute. Mt thuc tnh c xem nh l mt bin th hin, nhng n c gn vi mt cp hm truy cp v cm truy cp. V d: giao din Book c thuc tnh isbn

interface Book{

attribute string isbn;

. . .

};Thuc tnh ny chuyn tng ng sang Java thnh cp hm c cng tn isbn:

String isbn()

// Accessor

void isbn(String _isbn) // Mutator

Nu thuc tnh khai bo l readonly th hm ny khng cn sinh ra.

CORBA h tr k tha gia cc giao din v s dng k php gn ging vi C++.

interface Book : Product{ /* */};

Du : k hiu cho s k tha.

Trong IDL, ta c th to ra mt nhm cc interface v to thnh module.

module corejava {

interface Product{ /* */};

interface Warehouse{ /* */};

. . .

};

Cc module c chuyn tng ng sang Java thnh package.

2.5.2 Pht trin ng dng vi IDL XE "IDL" v CORBA XE "CORBA" Java ra i vi mong mun to ra c nhng chng trnh ng dng c vit, dch mt ni nhng chy c mi ni. Tuy nhin, Java khng th thay th tt c cc ngn ng khc v nhiu lp trnh vin quen thuc vi C/C++, Visual Basic, v nhiu phn mm c pht trin rt hiu qu bng nhng ngn ng . Cng ng lp trnh mong mun tm c ting ni chung cho cc ngn ng lp trnh v th l CORBA ra i. CORBA tm dch l kin trc mi gii i tng chung c hnh thnh t t chc qun tr i tng quc t OMG vi s hp tc ca hn 800 cng ty. Mc ch ca OMG l a ra cch cc i tng vit bng nhng ngn ng lp trnh hng i tng khc nhau c th triu gi ln nhau theo m hnh i tng phn tn.

CORBA khng phi l ngn ng lp trnh, n l ngn ng c t. CORBA quy nh mt tp cc m t hm, kiu d liu, cch khai bo c t i tng ging nh giao din trong Java. Chnh v th CORBA XE "CORBA" cn c gi l ngn ng nh ngha giao din IDL.

Tt c cc chng trnh ng dng c lp v ng dng applet c pht trin trn Java 2 SDK u c kh nng kt ni c vi cc i tng CORBA.

ci t cc i tng CORBA, ta cn thc hin:1. S dng IDL vit giao din ch ra cch hot ng ca cc i tng.

2. S dng chng trnh dch IDL dch cc chng trnh vit trong cc ngn ng ch, sinh ra cc lp trung gian Stub v cc lp tr gip.

3. B sung m trnh ci t cho cc i tng Server vit bng ngn ng m bn la chn. Dch cc m trnh ci t .

4. Vit chng trnh phc v trong to lp v ng k cc i tng dch v. Phng thc ph hp nht ng k l s dng cc dch v t tn ca CORBA, mt dch v tng t nh rmiregistry.

5. Vit chng trnh khch trong xc nh cc i tng phc v v gi cc dch v ca chng.

6. Khi ng cc dch v t tn v chng trnh phc v trn my Server, sau l chng trnh khch trn Client.

V d 2.4 Trc tin chng ta xt v d, trong mt chng trnh khch (vit bng Java) mun triu gi cc i tng t xa XE "i tng t xa" my ch (vit bng C++) c s dng s h tr ca CORBA v c pht trin trn nn Java 2 SDK.

pha my ch, ta phi s dng omniORRB, c cung cp min ph http://www.uk.research.att.com/omniORB/index.html.

i tng C++ trong v d trn s dng bin mi trng Server, c khai bo trong giao din:

interface Env{

string getenv(in string name);

};

Lp ci t giao din ny trong C++ c th s dng hm getenv() ca th vin chun ca C.

class EnvImpl : public virtual _Sk_Env{

public:

virtual char* getenv(const char *name){

char* value = ::getenv(name);

return CORRBA::string_dup(value);

}

};

Nhn chung trn Server, ta phi vit chng trnh thc hin:

1. Khi ng ORB.

2. To ra i tng ca lp EnvImpl v ng k n vi ORB.

3. S dng tn gi nh Server lin kt vi i tng theo tn gi.

4. Ch li triu gi t xa ca chng trnh khch Client.

// EnvServer.cpp chng trnh C++ trn Server#include

#include "omnithread.h"

#include "Env.hh"

class EnvImpl : public virtual _sk_Env{

public:

virtual ~EnvImpl(){}

virtual char* getenv(const char* name);

};

char* EnvImpl::getenv(const char* name){

char* value = ::getenv(name);

return CORBA::string_dup(value);

}

void bindObjectToName(CORBA::ORB_ptr obj){

CosNaming::NamingContext_var rootContext;

try{

CORBA::Object_var initServ =

orb -> resolve_initial_references("NameService");

rootContext = CosNaming::NamingContext::_narrow(initServ);

if(CORBA::is_nil(rootContext)){

cerr 4)]);

super.write(toBase64[(inbuf[1] & 0x0F) = 0; i -= 2)

((CellEditorListener)listeners[i + 1]).editingCanceled(event);

}

}

Lu : Ngoi nhng kh nng cp trn, ta cn c th thao tc trn cc hng, cc ct ca bng. Ta c th t li kch c ca cc ct, b sung hay loi b mt s hng, la chn mt s hng, ct, mt s v che giu hay hin th chng, v.v. (chi tit hn c th xem [2]).

4.3 Cc thanh trt v cc thc o tin

Trong phn ny ta tm hiu v hai cng c iu khin tng t ca Swing: thanh trt cho php ta xc nh u vo theo mt i lng trong mt phm vi tuyn tnh v thc o tin cho php chng trnh a t l % hon thnh mt cng vic.

4.3.1 Thanh trt Slider

Tranh trt Slider XE "Tranh trt Slider" hay cn gi l thc o, gn ging nh thanh cun ScrollBar. Tuy nhin, ScrollBar c s dng di chuyn cng nhn cc vng d liu, cn Slider c s dng xc nh gi tr ca d liu trong mt l l cho trc, v d nh thc k ca hc sinh. ScrollBar ci t giao din Adjustable, cn Slider khng ci t giao din v c th xut hin nh mt giao din s dng chung cho c hai.

Cch chung nht to ra mt Slider c thc hin nh sau:

JSlider slider = new JSlider(min, max, initialValue);To ra mt thc o nm ngang c gi tr cc tiu l min, cc i l max v u c initialValue. Cc gi tr ca u c c dch chuyn trong khong t min ti max. Khi gi tr u c thay i, mt s kin ChangeEvent c gi ti tt c cc i tng ang lng nghe x l cho ph hp vi s thay i .

Trng hp s dng ton t to lp Slider() mc nh

JSlider slider = new JSlider()s to ra mt thc o c gi tr cc tiu l 0 v cc i l 100, u c gia (50).

Nu mun to ra thc o nm dc, ta s dng

JSlider slider = new JSlider(SwingConstraints.VERTICAL, min, max, initialValue); to c nhng thanh trt c cc vch o, v d cc vch nh cch nhau 5 n v, cc vch ln cch nhau 20, ta phi a thm cc rng buc:

slider.setMajorTickSpacing(20);

slider.setMinorTickSpacing(5);Lu , cc vch trn thc o l cc n v o, khng phi l pixel.

V d 4.10 Hy to ra cc loi thc o:

+ Thc o n gin Plain: khng c thang o,

+ Thc o Ticks: c thang o v cho php o mi cp ,

+ Thc o Snap to ticks: u c lun bm theo o c vch sn trn thc (lm trn theo mp vch gn nht),

+ Thc o Filled: o c xc nh bi u c c t mu,

+ Thc o o ngc Inverted: o cn li c t mu,

+ Thc o c nh s Labels: nhng o ch nh nh 0, 20, 40, 60, 80, 100 s c nh s tng ng,

+ Thc o c nh s Custom labels: nhng o ch nh nh 0, 20, 40, 60, 80, 100 s c nh nhn tu chnh, v d l A, B, C, D, E, F.Khi cc u c di chuyn th gi tr tng ng ca mi u c c hin th bn phi.

Hnh 4.14 Cc loi thc o v thanh trt

// SliderTest.java

import java.awt.*;

import java.awt.event.*;

import java.util.*;

import javax.swing.*;

import javax.swing.event.*;

public class SliderTest{

public static void main(String args[]){

JFrame fr = new SliderTestFrame();

fr.show();

}

}

// To ra khung chng trnh gm cc loi thc o v thanh trt khc nhau

class SliderTestFrame extends JFrame

{

private GridBagConstraints constr;

public SliderTestFrame(){

setTitle("Slider Test");

setSize(400, 300);

addWindowListener(new WindowAdapter(){

public void windowClosing(WindowEvent e){

System.exit(0);

}

});

// t layout cho khung chng trnh l GridBagLayout v cc rng buc

getContentPane().setLayout(new GridBagLayout());

constr = new GridBagConstraints();

constr.weighty = 100;

constr.gridheight = 1;

constr.gridwidth = 1;

constr.gridx = 0;

constr.gridy = 0;

// To ra thanh trt n gin Plain, khng c vch o

JSlider slider = new JSlider();

addSlider(slider, "Plain");

// To ra thanh trt Tick c vch o, v nh v c mi o t 0 n 100

slider = new JSlider();

slider.setPaintTicks(true);

slider.setMajorTickSpacing(20);

slider.setMinorTickSpacing(5);

addSlider(slider, "Ticks");

// To ra thanh trt Snap to ticks c vch o, nhng u c lun bm // theo vch thc.

slider = new JSlider();

slider.setPaintTicks(true);

slider.setSnapToTicks(true);

slider.setMajorTickSpacing(20);

slider.setMinorTickSpacing(5);

addSlider(slider, "Snap to ticks");

// To ra thc o Filled, khong cch o c t muslider = new JSlider();

slider.setPaintTicks(true);

slider.setMajorTickSpacing(20);

slider.setMinorTickSpacing(5);

slider.putClientProperty("JSlider.isFilled", Boolean.TRUE);

addSlider(slider, "Filled");

// To ra thc o Inverted, ngc li vi thc o trn, khong cch cn li // c t mu

slider = new JSlider();

slider.setPaintTicks(true);

slider.setMajorTickSpacing(20);

slider.setMinorTickSpacing(5);

slider.putClientProperty("JSlider.isFilled", Boolean.TRUE);

slider.setInverted(true);

addSlider(slider, "Inverted");

// To ra thc o Labels, thc c nh s cch nhau 20 n v

slider = new JSlider();

slider.setPaintTicks(true);

slider.setPaintLabels(true);

slider.setMajorTickSpacing(20);

slider.setMinorTickSpacing(5);

addSlider(slider, "Labels");

// To ra thc o Labels, nh nhn A, B, , F cch nhau 20 n v

slider = new JSlider();

slider.setPaintLabels(true);

slider.setPaintTicks(true);

slider.setMajorTickSpacing(20);

slider.setMinorTickSpacing(5);

Hashtable labelTable = new Hashtable();

labelTable.put(new Integer(0), new JLabel("A"));

labelTable.put(new Integer(20), new JLabel("B"));

labelTable.put(new Integer(40), new JLabel("C"));

labelTable.put(new Integer(60), new JLabel("D"));

labelTable.put(new Integer(80), new JLabel("E"));

labelTable.put(new Integer(100), new JLabel("F"));

slider.setLabelTable(labelTable);

addSlider(slider, "Custom Labels");

slider = new JSlider();

slider.setPaintTicks(true);

slider.setPaintLabels(true);

slider.setSnapToTicks(true);

slider.setMajorTickSpacing(20);

slider.setMinorTickSpacing(20);

}

public void addSlider(JSlider s, String descr){

// To lp trng text hin th s o c xc nh bi u c thanh trt

final TextField textField = new TextField(4);

// Cp nht li s o khi u c thanh trt di chuyn v x l cc s kin

s.addChangeListener(new ChangeListener(){

public void stateChanged(ChangeEvent event){

JSlider source = (JSlider)event.getSource();

textField.setText("" + source.getValue());

}

});

// B sung 3 thnh phn

constr.gridx = 0;

constr.anchor = GridBagConstraints.WEST;

constr.fill = GridBagConstraints.NONE;

constr.weightx = 0;

// B sung tn ca thc o

getContentPane().add(new JLabel(descr), constr);

// B sung thc o gia

constr.gridx++;

constr.anchor = GridBagConstraints.CENTER;

constr.fill = GridBagConstraints.HORIZONTAL;

constr.weightx = 0;

getContentPane().add(s, constr);

// B sung trng text hin th s o

constr.gridx++;

constr.anchor = GridBagConstraints.WEST;

constr.fill = GridBagConstraints.NONE;

constr.weightx = 200;

getContentPane().add(textField, constr);

// Tng ta y cho thc o tip theo

constr.gridy++;

}

}

JSlider() JSlider(int direction) JSlider(int min, int max) JSlider(int min, int max, int init) JSlider(int direction, int min, int max, int init)To ra thc o theo hng direction v cc gi tr min, max,init tng ng. Trong

+ direction c th l SwingConstraints.HORIZONTAL thc nm ngang hoc SwingConstraints.VERTICAL to ra thc nm dc. Mc nh l nm ngang.

+ min, max l cc o cc tiu, cc i. Mc nh l 0 v 100.

+ init l gi tr ban u ca u c. Gi tr mc nh l 50.

void setPaintTicks(boolean b): nu b l true th thc hin th

void setMajorTickSpacing(int units): t khong cch cc i gia cc vch void setMinorTickSpacing(int units): t khong cch cc tiu gia cc vch

void setPaintLabels(boolean b): nu b l true th thc hin th nhn

void setSnapToTicks(boolean b): nu b l true th u c lun bm theo vch o.

4.3.2 Thc tin JProgressBar

Thc tin JProgressBar l mt thnh phn n gin, n chnh l mt hnh ch nht c t mu mt phn ch ra tin thc hin ca mt thao tc (cng vic) no . Mc nh, thanh tin th hin s % hon thnh cng vic, v d cng vic ci t mt phn mm hon thnh cho n thi im .

Ta c th thit lp thc tin ging nh i vi thc o. V d to ra thc tin nm ngang:

JProgressBar progressBar = new JProgressBar(0, 100);hay to ra thc tin nm dc:

progressBar = new JProgressBar(SwingConstraints.VERTIVAL, 0, 100);Ta cng c th t cc o cc tiu, cc i thng qua phng thc setMinimum() v setMaximum().

Tuy nhin, thc tin khc vi thc o ch ngi s dng khng t chnh sa c o tin . Chng trnh ca ta phi gi setValue() thay i mc hon thnh cng vic.

Nu ta gi

progressBar.setStringPaint(true);

th thc tin s tnh n% hon thnh cng vic v hin th di dng xu n%. Nu mun hin th nhng thng tin khc th s dng phng thc setString(), v d:

if(progressBar.getValue() > 900)

progressBar.setString(Almost Done);V d 4.11 Xy dng chng trnh c mt thanh ghi tin th hin s tiu tn thi gian ca my tnh nh hnh 4.15. Thc tin c gi tr cc tiu l 0 k t lc nhn nt bt u v gi tr cc i l 1000 n v thi gian ca my tnh.

Vic thay i mc tiu tn thi gian thc tin c m phng bi lp SimulatedActivity. Lp ny ci t thc hin theo lung sao cho gi tr ca current tng ln 10 ln trong mt giy. Khi current t n target hoc lung thc hin b ngt th n kt thc.

class SimulatedActivity extends Thread{

private int current;

private int target;

// . . .

public void run(){

while(current < target && !interrupted()){

try{

sleep(100);

}catch(InterruptedException e){

return;

}

current++;

}

}

}Khi ta nhn nt Start, mt lung mi bt u thc hin. Ta bit rng javax.swing.Timer gi phng thc actionPerformed() lng nghe cc s kin v tnh thi gian hin thi current nh sau:

public void actionPerformed(ActionEvent evt){

int current = activity.getCurrent();

// Hin th thanh tin

textArea.append(current + "\n");

progressBar.setValue(current);

// Kim tra xem cng vic kt thc cha

if(current == activity.getTarget()){

activityMonitor.stop();

startButton.setEnabled(false);

}

}

Hnh 4.15 Thanh tin hon thnh cng vic

// ProgressTest.javaimport java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import javax.swing.event.*;

public class ProgressTest{

public static void main(String args[]){

JFrame fr = new ProgressTestFrame();

fr.show();

}

}

// Khung chng trnh thc hin m phng thanh tin tiu tn thi gian

class ProgressTestFrame extends JFrame

{

private Timer activityMonitor;

private JButton startButton;

p