Laptrinhj 2 Me

You might also like

Download as doc, pdf, or txt
Download as doc, pdf, or txt
You are on page 1of 213

KHOA CNG NGH THNG TIN B MN IN T - VIN THNG

V THNH VINH ON NGC PHNG

BI GING: LP TRNH NG DNG TRN IN THOI DI NG

TP BI GING (Lu hnh ni b)

THI NGUYN THNG 08/NM 2010

Chng 1: Gii thiu v lp trnh cho in thoi di ng.........................................................5 1.1. S tin ha ca in thoi di ng, cc mng v cc dch v........................................5 1.1.1. Mobile Phone Family...............................................................................................5 1.2.2. The flexible Mobile Phone ......................................................................................9 1.2.1. H thng truyn thng Cellular..............................................................................12 1.2.2. H thng truyn thng Short-Range......................................................................14 1.3. Trin khai ng dng di dng (Mobile Application Deployment)................................17 Chng 2: Lp trnh ng dng trn di ng vi J2me............................................................19 2.1. Gii thiu.......................................................................................................................19 2.1.1. Lch s ra i v pht trin ca J2me....................................................................19 2.1.2. Kin trc phn tng ca J2me ........................................................................20 2.2. Pht trin ng dng in thoi di ng bng J2me......................................................23 2.2.1. Cu hnh thit b kt ni c gii hn CLDC..........................................................23 2.2.2. Hin trng thit b thng tin di ng MIDP ..........................................................24 2.2.3. ng dng MIDlet...................................................................................................25 2.3. Mi trng pht trin.....................................................................................................26 2.3.1. Java Development Kit............................................................................................26 2.3.2. NetBeans.................................................................................................................27 2.3.3. To mt ng dng MIDP vi Netbean..................................................................28 2.4. MIDlet v mn hnh.......................................................................................................34 2.4.1. To ra mt i tng MIDlet.................................................................................34 2.4.2. Vng i ca mt MIDlet......................................................................................35 2.4.3. i tng Display..................................................................................................36 2.5. Giao din ngi dng cp cao.......................................................................................38 2.5.1. i tng Dislayable v Screen...........................................................................38 2.5.2. Thnh phn Form v Item ....................................................................................39 2.5.3. Thnh phn List, TextBox, Alert, Ticket..............................................................56 2.5.4. X l s kin..........................................................................................................65 2.6. Giao din ngi dng cp thp.....................................................................................95 2.6.1. Cc hm API mc thp..........................................................................................95 2.6.2. Lp Canvas.............................................................................................................96 2.6.3. Lp Graphics........................................................................................................108 2.7. Record Manager System h thng qun l vng bn ghi........................................127 2.7.1. RecordStore - vng bn ghi..................................................................................127 2.7.2. Cc vn lin quan n RMS............................................................................129 2.7.3. Cc hm API trong RMS.....................................................................................130 2.7.4. Duyt Record vi RecordEnumeration................................................................137 2.7.5. Sp xp cc record vi interface RecordComparator..........................................139 2.7.6. Tm kim vi RecordFilter...................................................................................143 Chng 3: Kt ni Internet vi J2me.....................................................................................150 3.1. Khung kt ni chung GCF...........................................................................................150 3.2. Cc giao thc c h tr trong GCF.........................................................................151 3

3.3. H tr giao thc HTTP trong MIDP...........................................................................153 3.3.1. S lc v giao thc HTTP ...............................................................................153 3.3.2. Cc hm API HttpConnection ........................................................................158 Chng 4: To Server bng cng ngh Servlet ca Java......................................................169 4.1. Chng trnh Servlet...................................................................................................169 4.2. Trnh ch Tomcat ..................................................................................................170 4.3. Cu hnh ng k Servlet vi Tomcat.........................................................................170 4.3.1. Ci t tnh ch Tomcat.......................................................................................170 4.3.2. Cu hnh ng k Servlet vi Tomcat.................................................................173 4.4. Vng i ca mt Servlet............................................................................................180 4.5. Cc hm API trong Servlet..........................................................................................182 4.6. S dng HttpServlet....................................................................................................183 Chng 5: Kt ni c s d liu vi Java..............................................................................191 5.1. C ch ODBC v JDBC..............................................................................................191 5.1.1. C ch ODBC.......................................................................................................191 5.1.2. C ch JDBC........................................................................................................194 5.2. Kt ni c s d liu vi JDBC..................................................................................197 5.2.1. Ci t Trnh iu khin.......................................................................................197 5.2.2. To c s d liu..................................................................................................199 5.2.3. Kt ni ti c s d liu vi JDBC.....................................................................199 5.2.4. Truy vn d liu...................................................................................................202 5.2.5. Trch xut d liu.................................................................................................202 5.2.6. X l cc lnh SQL INSERT/UPDATE/DELETE.............................................204 5.2.7. V d v kt ni ti c s d liu.........................................................................204 5.2.8. S dng i tng PreparedStatement................................................................208 5.2.9. S dng chuyn tc..............................................................................................211

Chng 1: Gii thiu v lp trnh cho in thoi di ng


1.1. S tin ha ca in thoi di ng, cc mng v cc dch v
1.1.1. Mobile Phone Family in thoi di ng c gi vi tn gi nh vy v ng dng u tin v quan trng nht ca n l cho php ngi dng c th di chuyn trong khi ang thc hin cuc gi. Trong kin trc ca mng di ng, cc trm c s (base station) chnh l nhng nhn t quan trng, cc trm ny lm nhim v kt ni vi in thoi di ng, m bo s tn ti cho mng di ng, v cho php mng di ng kt ni vi nhng thnh phn truyn thng hu tuyn khc. Bn cnh , cc trm c s v mng xng sng cn cho php ngi dng cc vng cell khc nhau c th truyn thng c vi nhau. Mng di ng tri qua nhiu th h, u tin l th h 1G, y l h thng truyn tn hiu tng t (analog), th h ny khng cung cp nhiu dch v, ch yu l cc dch v v m thanh. Th h th hai 2G, chuyn i t vic s dng tn hiu analog sang tn hiu s, t thm vo rt nhiu dch v mi nh SMS v trao i d liu vi mng Internet, nhng s thay i quan trng nht ca 2G so vi 1G l s phn chia gia nh mng v nh cung cp dch v. Trc nh cung cp mng l nhng ngi c quyn, h l ngi cung cp mng di ng cng l ngi quyt nh nhng dch v no s c cung cp my di ng ca ngi dng, sau khi mng 2G ra i v c s phn chia gia nh cung cp mng v nh cung cp dch v, th trng di ng c chia ra lm bn thnh phn chnh: Nh cung cp mng, nh cung cp dch v, ngi s dng v nh sn xut in thoi di ng.

Hnh 1.1: Nh cung cp dch v, ngi s dng v nh sn xut in thoi di ng trong th trng di ng. Gia cc thnh vin ny trong mng di ng c nhiu rng buc ln nhau, quan trng nht l mi quan h gia nh cung cp mng v nh sn xut in thoi di ng. thu ht khch hng, nh mng tha thun vi nh sn xut in thoi di ng, in thoi di ng c bn vi s lng ln hn v cng c nhiu ngi s dng mng in thoi di ng hn, mt khc nh mng cng a ra c mt lot cc dch v sn c cho in thoi di ng. Xa hn na, nh cung cp mng cn iu khin vic dch v no c i qua mng ca h v lm cho nhng nh cung cp dch v phi ph thuc vo quyt nh ca h. S c quyn ca nh cung cp mng s b suy gim i cng vi cng ngh khng dy nh WLAN v Bluetooth. Cc dng truyn thng ny cho php to ra nhng kiu dch v mi m khng cn phi ph thuc nhiu vo nh cung cp mng. Tuy nhin, do vn li nhun, s pht trin t do ca cc dng truyn thng trn cng b hn ch bi nh sn xut in thoi di ng. Nh cung cp dch v dng nh t do hn trong lp trnh to ra cc sn phm dch v mi, tuy nhin, nhiu khi vic to ra ng dng trn in thoi di ng li ng chm ti li ch ca nh cung cp mng, do s linh hot ca chic in thoi di ng li b km ch, v d nh h thng VoIP ch c th truyn theo kiu bn song cng, hay khi kt hp gia giao thc IP vi module GPRS, IP thng qua Bluetooth hay WLAN cng kh c h tr hay kh s dng mt vi dng in thoi, nhng

s hn ch ny cng khng ngn c vic to ra cc dch v th v, ch l vn thi gian. Th h mng di ng 3G. 3G l cng ngh truyn thng th h th ba, cho php truyn c d liu thoi v d liu ngoi thoi (ti d liu, gi email, tin nhn nhanh SMS, hnh nh,). H thng 3G yu cu mt mng truy cp radio hon ton khc so vi h thng 2G hin nay. Trong cc dch v ca 3G, cuc gi video thng c m t nh mt dch v trng tm ca s pht trin. Do chi ph cho bn quyn cc tn s phi trang tri trong nhiu nm trc khi t ti cc thu nhp do 3G em li, nn vic xy dng mng 3G i hi mt khi lng u t khng l. Cng v vy nhiu nh cung cp dch v vin thng ri vo kh khn v ti chnh, cng khin cho vic trin khai 3G ti nhiu nc b chm tr, ngoi tr Nht Bn v Hn Quc nhng nc tm b qua cc yu cu v bn quyn tn s, m t u tin cao vic pht trin h tng cng ngh thng tin vin thng quc gia. Nht Bn l nc u tin a 3G vo khai thc thng mi mt cch rng ri. Nm 2005, khong 40% cc thu bao ti Nht Bn l thu bao 3G, khin cho mng 2G dn bin mt ti nc ny. S thnh cng ca 3G ti Nht Bn ch ra rng in thoi video khng phi l ng dng hy dit (killer application). trong thc t, vic s dng in thoi video thi gian thc ch chim mt phn nh trong cc dch v ca 3G. Mt khc, vic ti v tp m nhc li c s dng nhiu nht, nht l gii tr. S pht trin ca 3G m ra rt nhiu trin vng v vic xy dng cc dch v mi cho cc nh pht trin phn mm, cc nh cung cp dch v, tuy nhin rt nhiu d n b v bi chnh ngi s dng cng khng bit h mong mun nhng g, v vy chng ta cn phi phn tch cn thn trc khi tin hnh mt d n phn mm cho in thoi di ng. ng dng trn in thoi di ng chia lm hai loi: Dch v c nhn v dch v truyn thng.

Hnh 1.2: Cc loi hnh dch v dnh cho in thoi di ng Dch v c nhn l tt c cc dch v c s dng bi khch hng trn in thoi di ng vi s gii hn hay khng tng tc vi nhng khch hng khc. Dch v truyn thng th ngc li, l cc dch v to ra s tng tc gia nhng ngi s dng. Dch v c nhn bao gm cc dch v nh l: lch, my nh, ti v logo, nhc trn in thoi di ng hay chi tr chi nh chi rn, bng bn... C dch v c nhn ln dch v truyn thng u c chia ra lm hai loi dch v c v khng c s h tr ca mng khng dy. Mng khng dy c h tr bi chun kt ni GSM, GPRS, EDGE, 3G, bluetooth, hay WLAN. Nh hnh trn, cc dch v c mu cam l cc dch v c sn trn hu ht cc in thoi di ng, cc dch v mu xanh da tri l cc dch v c th c ci t thm trn in thoi di ng, v cui cng l cc dch v mu xanh l cy, l nhng dch v ca tng lai. Dch v truyn thng vi s h tr ca mng khng dy c ha hn s to ra nhiu iu th v, v con ngi chng ta lun sng trong s tng tc vi nhng ngi khc, cc dch v ang pht trin nh SMS, dch v thoi video, ti WEB, xem phim trc tuyn... v cc tr chi tng tc ang l mt hng pht trin y trin vng cho cc nh cung cp dch v. Ngoi ra trong tng lai, khi mng 4G v 5G pht trin, chng ta li c thm nhiu loi dch v mi nh dch v peer to peer, dch v truyn thng ngang hng,

dch v sensor... iu cho thy rng in thoi di ng v mng di ng l mnh t mu m cho cc lp trnh vin. 1.2.2. The flexible Mobile Phone in thoi di ng ngy cng tr nn linh hot trong con mt ca cc nh pht trin ng dng, thng qua cc ngn ng lp trnh, vi ngn ng tin phong l Java vi phin bn nh gn J2me, in thoi di ng tr thnh mt mi trng lp trnh hp dn i vi cc lp trnh vin.

Hnh 1.3: Kin trc ca chic in thoi c th lp trnh Nhn vo hnh trn ta thy rng cc ng dng di ng (nh cc chng trnh Java) chy trn tng ng dng application suite, khung giao din ngi dng user interface framework cung cp tt c cc chc nng cho php ta iu khin in thoi di ng. Cc nh sn xut in thoi di ng thng truy nhp vo nn tng ca h (vi mt vi hn ch) bng cch s dng li v trnh iu khin phn cng kernel and hardware drivers nh l h iu hnh Symbian truy nhp vo nn tng phn cng. Gn nh mi th thuc v phn mm u c th truy cp c, ch c mt phn tnh khng th thay i c ca chic in thoi l nn tng phn cng.

Hnh 1.4: Giao din ngi dng, giao din kt ni v ti nguyn c sn ca in thoi di ng Ngoi kh nng lp trnh c, in thoi di ng cn c rt nhiu cc kh nng v chc nng khc, chng ta s nhm cc c tnh ny ca in thoi di ng ra thnh ba nhm l giao din ngi dng user interface, giao din kt ni communication interface, v ti nguyn sn c buit-in resources. Giao din ngi dng bao gm loa, microphone, camera, mn hnh, cc b cm ng, v bn phm. Ti nguyn c sn bao gm pin, b x l trung tm v b nh. Chng ta c bit quan tm ti nhm th ba l nhm giao din kt ni, giao din kt ni thng bao gm kh nng kt ni celular v short-range. Thay v vic s hu mt chic in thoi thng minh vi y cc chc nng v cht lng tt, chng ta nn tm hiu cch s dng v chia s mt cch thng minh nhng kh nng ca in thoi di ng. Thc vy, chnh s khc bit trong thit k ca cc chng loi in thoi di ng to ra nhiu tnh nng c bit, t mt chic in thoi n gin vi kh nng thoi c th tr thnh mt thit b u cui vi m nhc v hnh nh sng ng. Cng ngh mng khng dy cho php chng ta lm iu . Nhng nh pht trin ng dng c th bt u nhn nhn chic in thoi nh l mt tp hp cc kh nng c th c gp li v nhng mc ch no . Tuy nhin in thoi di ng khng ch b gii hn bi s kt hp ca cc thnh phn phn cng. Thm ch phn mm cng c s dng mt cch ht sc linh
10

hot. Mt trong nhng tng u tin l thit k lp trung gian (cross-layer). Giao thc cross-layer l tng ca vic thay i cc lp theo nhu cu. Mt s lp giao thc c th thm ch c b qua hay c nhm li theo mt cch mi. Bc cui cng mang n tnh linh hot cho nhng mc thp hn ca chng nghi thc (protocol stack). Trong khi tnh linh hot trn cc thit b di ng thng mi b hn ch i vi nhng phng php a m hnh (multi-modality), tng lai s c thng tr bi nhng cch tip cn software-defined radio. Trong khi multimodality ch ang chn trong s nhng cng ngh khng dy sn c khc nhau nh Bluetooth hay WLAN, software-defined radio c th t ng thay i cc phn radio theo cc chc nng cn thit. mc cao nht, n cng c th thay i t truyn thng short-range sang truyn thng cellular, trao i chng giao thc.

1.2. Cng ngh mng khng dy v kin trc


Trong phn ny chng ta s cng nhau cp n cng ngh khng dy v kin trc ca cc cng ngh khng dy c trn in thoi di ng. S hiu bit v cc cng ngh khng dy l tin cho cc phn lp trnh chng ta s c hc sau ny, c bit l phn lp trnh kt ni Internet vi in thoi di ng. C rt nhiu cng ngh khng dy ra i cng vi s pht trin ca mng in thoi di ng, cng ngh ra i sau thng c nhiu u im hn cc cng ngh c ra i trc, v gia cc cng ngh thng khc nhau kh nng h tr tc truyn d liu, giao thc c dng, phm vi truyn thng, v mc tiu th nng lng. Mt cch tng qut chng ta s tho lun v h thng vin thng short-range (mng vin thng tm gn) v cellular (mng t bo). Trc kia, cng ngh truyn thng quan trng bc nht l mng truyn thng cellular. Th h 1G ch trang b cng ngh ny lm nhim v chnh l iu khin m thanh v to mt kt ni mi n mng in thoi nh cung cp ch cn m rng mng. Tip theo, l s gii thiu ca cng ngh GSM. V sau l cc cng ngh nh Bluetooth v WLAN cng c gii thiu trong cc thit b. Cng ngh short-range trong tng lai l cng ngh siu bng rng (ultra wide band) v s pht trin ca cng ngh IEEE WLAN. Sau y chng ta s cng im nhanh mt vi cng ngh.

11

1.2.1. H thng truyn thng Cellular Ban u, dch v chnh ca in thoi di ng l m thanh. Nguyn l u tin ca n l cho php ngi dng trong khi di chuyn vn c th kt ni vi nhng ngi dng u cui c nh hay m rng hn l kt ni hai ngi dng in thoi di ng vi nhau. Nhng v truyn thng radio khng dy thin v suy hao trn ng truyn (path loss), cho nn vic lin lc ca ngi dng in thoi di ng b gii hn trong mt phm vi cho php. khc phc nhc im ny v cng phc v nhu cu trao i thng tin ngy cng cao ca ngi dng, mng in thoi di ng pht trin t ch h tr dch v hon ton l m thanh sang h tr d liu. Kin trc truyn thng c quyt nh bi truyn thng im im gia in thoi di ng v trm gc. Cc cng ngh c pht trin sau (GPRS, EDGE, 3G) c th c coi l cu ni gia mng khng dy v mng ton cu. Sau y, chng ta s cng tm hiu qua v cng ngh GSM. truyn thng tin s t in thoi di ng n mng, mch chuyn i d liu CSD (Circuit Switched Data) c s dng trong th h mng di ng 2G, CSD h tr tc ln ti 9.6 kbps. GSM (Global System Mobile Communication) h thng truyn thng di ng toan cu l h thng a truy nhp phn chia theo thi gian (TDMA), s dng khe thi gian kt ni, mi khe ai din cho mt knh ngi dung. tng tc truyn d liu trong h thng GSM, cng ngh HSCSD (High Speed Circuit Switched Data) - d liu chuyn mch tc cao c s dng. HSCSD l tiu chun GSM cui cng s dng chuyn mch thay v truyn d liu chuyn mch gi, khi s dng HSCSD mt kt ni thng trc c thit lp gia cc bn gi v c gi trao i d liu. Dch v thng tin di ng v tuyn chuyn mch gi GPRS (General Packet Radio Service) l s m rng ca CSD v HSCSD. GPRS tt hn HSCSD, n c a ra th h 2.5G v c th coi l bc pht trin n cng ngh 3G.

12

Hnh 1.5: S pht trin ca h thng truyn thng cellular. Khc vi CSD v HSCSD l cc cng ngh chuyn mch knh, GPRS l cng ngh chuyn mch gi. Ni mt cch n gin hn, GPRS l dch v truyn ti d liu thng qua tn hiu v tuyn, c pht trin da trn nn tng GSM. ng dng chnh ca GPRS l h tr dch v email v duyt web, v GPRS truyn ti d liu gia in thoi di ng vi nh cung cp (sau nh cung cp truyn ti tip d liu n mng internet) nn nu my c ci t cc phn mm/ng dng ph hp, bn s kt ni c vi th gii internet bn ngoi. tng cng tc truyn d liu cho GPRS, EDGE c pht trin, cng ngh EDGE hay cn gi l EGPRS, l mt cng ngh di ng c nng cp t GPRS cho php truyn d liu vi tc c th ln n 384 Kbps cho ngi dng c nh hoc di chuyn chm v 144 Kbps cho ngi dng di chuyn tc cao. EDGE dng phng thc iu ch 8-PSK tng tc d liu truyn. Chnh v th, trin khai EDGE, cc nh cung cp mng phi thay i trm pht sng BTS cng nh l thit b di ng so vi mng GPRS. Chuyn sang mng 3G, cng ngh UMTS (Universal Mobile Telecommunication System) c s dng, UMTS c chun ha bi t chc 3GPP v c pht trin ln t cc nc s dng GSM. tng tc truyn d liu cho mng 3G, UMTS c nng cp ln vi chun HSPDA (High Speed Downlink Packet Access), gi ng truyn tc cao, cho php cc mng hot ng trn h thng UMTS c kh nng truyn ti d liu vi tc cao hn hn. Cng ngh HSDPA hin nay cho php tc download t n 1.8, 3.6, 7.2 v 14.4 Mbps, v trong tng lai gn, tc hin nay c th c nng ln gp nhiu ln. Song song vi cng ngh HSDPA l cng ngh HSUPA (High Speed Uplink Packet Access Tng t HSDPA), HSUPA
13

cai thin tc tai d liu ln, v ly thuyt tc upload d liu ca cng ngh HSUPA co th at n 5.76Mbps. Cm t 3GPP LTE (The Third Generation Partnership Project Long Term Evolution) c dng ni v mt cng ngh di ng mi ang c pht trin v chun ha bi 3GPP. Vi LTE tc truyn d liu c th t ti 100Mbps vi download v 50 Mbps vi upload. 1.2.2. H thng truyn thng Short-Range ni v h thng truyn thng tm gn chng ta s cp n wireless personal area networks WPAN v wireless local area networks WLAN, Bluetooth v IEEE802.11.

Hnh 1.6: Cc cng ngh short range c t Bluetooth c pht trin u tin bi Ericsson vo nm 1999 v sau c chun ho bi Bluetooth Special Interest Group (SIG). Bluetooth l mt c t cng nghip cho truyn thng khng dy tm gn gia cc thit b in t. Cng ngh ny h tr vic truyn d liu qua cc khong cch ngn gia cc thit b di ng v c nh, to nn cc mng c nhn khng dy (Wireless Personal Area Network-PANs). Bluetooth cho php kt ni v trao i thng tin gia cc thit b nh in thoi di ng, in thoi c nh, my tnh xch tay, PC, my in, thit b nh v dng GPS, my nh s, v video game console. Bluetooth ngy cng c quan tm nhiu hn bi n cho php ngi dng c kt ni khng dy min ph, tiu hao t nng lng, gi thnh thit b li r v cng ngh ny c rt nhiu tp on ln h tr. Tuy nhin s pht trin ca Bluetooth cn hn ch do s gii hn

14

ca khong cch truyn, s lng kt ni, kh nng chng nhiu v kh nng bo mt ca n. Trong tng lai Bluetooth s tr nn mnh hn vi cng ngh siu bng rng UWB (ultra wide-band). UWB cho php tng tc truyn thng tm gn ln ti 400Mbps.

Hnh 1.7: ng dng ca bluetooth WLAN (mng LAN khng dy l mng cc b gm cc my tnh lin lc vi nhau bng sng radio) c chun ha bi cc chun IEEE (Institute of Electrical and Electronic Engineers) 802.11. Chun IEEE 802.11 nh ngha tng vt l v tng MAC cho mt mng ni b khng dy. Chun ny nh ngha ba tng vt l khc nhau cho mng LAN khng dy 802.11 l tri ph thng (direct spectrum), bc tn s (frequency hopper) v hng ngoi (infrared), mi tng hot ng mt di tn khc nhau v s dng cc tc 1 Mbps v 2 Mbps. Direct spectrum th r hn frequency hopper v khng ph thuc vo tm nhn nh infrared. Thnh t c bn ca kin trc 802.11 l t bo (cell), vi tn gi trong 802.11 l BSS (basic service set - b dch v c bn). Mi BSS thng gm mt vi my trm khng dy v mt trm c s trung tm c gi l AP (access point - im truy cp). Cc my trm (c th di ng hoc c nh) v trm trung tm lin lc vi nhau bng giao thc MAC IEEE 802.11 khng dy. C th kt ni nhiu trm AP vi nhau bng mng hu tuyn Ethernet hoc mt knh khng dy khc to mt h thng phn tn (DS distributed system). Cc my trm dng chun IEEE 802.11 c th nhm li vi nhau to thnh mt mng ad hoc - mng khng c iu khin trung tm v khng c kt
15

ni vi "th gii bn ngoi". Trong trng hp ny, mng c hnh thnh tc thi khi mt s thit b di ng tnh c thy mnh ang gn nhau trong khi ang c nhu cu lin lc m khng tm thy mt c s h tng mng sn c ti ch (chng hn mt BBS 802.11 vi mt trm AP). Tng t trong nh mng Ethernet hu tuyn 802.3, cc my trm trong mng LAN khng dy 802.11 phi phi hp vi nhau khi dng chung mi trng truyn dn (tn s radio). Giao thc MAC c nhim v iu khin s phi hp ny. MAC IEEE 802.11 l giao thc CSMA/CA (carrier sense multiple access with collision avoidance). Ethernet s dng CSMA (truy nhp song song cm ng sng mang vi kh nng trnh n va chm) vi s d tm xung t hiu qu hn. Nhng trong mi trng khng dy t nhin, s d tm xung t l khng kh thi cho mi thnh phn truyn thng v CSMA/CA c s dng. Bt c thit b truyn thng no cng s tm ra mi trng khng dy chc chn rng mi trng l ri - free trong mt khong thi gian. Ban u, mi trng ang free. Thit b bt u truyn gi tin ca n. Khi gi tin c nhn bi mt thit b khc mt cch thnh cng, n s pht sinh ra mt ghi nhn thng tin ti ngi gi rng gi tin c nhn. Nu vic truyn tin khng thnh cng, nguyn nhn c th l do mt vi li truyn hay thng l do s va chm vi vic truyn i ca mt thit b khc trong cng khong thi gian. C hai thit b u khng truyn c thnh cng khi chng chuyn d liu trong cng thi gian, trng hp ny c gi l collision s va chm. Chng cn phi truyn li. trnh gp phi hon cnh , thit b tranh chp s chn mt cch ngu nhin thi gian timeout trong mt khong thi gian no gi l ca s tranh chp, l khong thi gian delay cho n khi chng truyn li. Kch thc ca ca s tranh chp s c nhn i vi mi s tranh chp, thit b s tng hp li v reset v gi tr khi u sau ln truyn thnh cng u tin. Chin lc ny gi l Exponential back off. S tranh chp lm gim hin qu ca mi trng truyn thng khng dy, s va chm nn c pht hin cng sm cng tt. Mt s ghi nhn li l cch tt nht pht hin ra n, nhng nu l s mt mt thng tin ca mt gi d liu ln th khng phi l tng hay. Bn cnh l vn ca thit b u cui n, thit b ny tham gia vo trong hon cnh khi gia hai thit b khng th cm nhn c s tn ti ca nhau, gi d liu c th c truyn ti thit b th ba. Do

16

gi RTS (ready to send) v CST (clear to send) c s dng. By gi thit b khng trc tip truyn gi tin ca chng m thay vo thit b s gi gi tin RTS, nu nh thit b nhn khng nhn c th thit b gi s nhn c gi tin CTS. Gi tin RTS v CTS cng s dng nhng thng tin bit rng chng s c s dng mi trng truyn trong bao lu t cc hng xm ca n. Tuy vy s ng vn c th xut hin gia cc gi RTS hay gia RTS vi gi d liu truyn. Nhng thi gian ng s gim xung. Gi RTS v CTS ch dng gii quyt ng vi s ng nh.

1.3. Trin khai ng dng di dng (Mobile Application Deployment)


ng dng di ng c thnh cng, chng ta cn phi tr li c cc cu hi sau:

Lm th no cc khch hng chp nhn ng dng mi ? Lm th no ci tin dch v ? Lm th no trnh khi s n cp tng ? Lm th no a ra cho hng triu khch hng tim nng mt ng dng n nh v tin cy ?

Cu tr li cho nhng cu hi s ph thuc vo cc ng dng, nh hng ca cc nh pht trin v tm nhn ca cc nh kinh doanh. Cc nh pht trin ng dng lun lun c nhiu la chn qung b v iu khin dch v theo cch ring ca h. Tuy nhin, trn th trng in thoi di ng c nhng thnh phn kinh t quan trng, nhng i tc tim nng, c th gip nh pht trin ng dng thu ht hng triu khch hng vi kh nng tip th v knh phn phi tt. Cn tr ln nht i vi vic gii thiu thnh cng mt sn phm l s thiu i nim tin ca khch hng vo mt nh dch v mi cha c bit n. Do , trc khi tr nn c lp, mt nh cung cp dch v mi nn cn nhc cc la chn c a ra bi bn th ba. V d nh cc nh sn xut in thoi di ng, bi v h c mi quan h tt vi rt nhiu nh mng, nh phn phi ng dng, v l l do c th a ng dng ca bn ti ng o ngi dng. Thng thng, cc nh sn xut a ra cc phng php m phng, v marketing ca cc gii php n ngi dng v nh cung cp mng. Di y l mt vi v d:

Forum Nokia http://developer.nokia.com/


17

Sony-Ericsson DeveloperWorld http://developer.sonyericsson.com/ Motorola Motodev http://developer.motorola.com/ Ericsson Mobility World http://www.ericsson.com/mobilityworld/

Cc nh sn xut in thoi di ng c th gii thiu ng dng ca bn theo nhiu cch khc nhau. Cch n gin nht l gip nh pht trin ng dng lin h vi nh mng, hay a ng dng ln cc web shop. V d nh Nokia thng a ng dng thng quan trang web Nokia Catalogs (http://www.nokia.com/catalogs). Mc tip theo trong s cng tc gia nh pht trin ng dng v nh sn xut l a cc ng dng vo trong danh sch gii thiu hay danh sch cc ng dng c th load v. Do , nhng khch hng mua in thoi c th quyt nh download cc ng dng v s dng. Cc nh mng l mt thnh phn quan trng trong s qung b sn phm phn mm. Cc nh mng c cc dch v rt hiu qu trn portal ca h, cc nh pht trin c th s dng cc dch v ny truy nhp ti cc thng tin tnh cc, bo mt, qun l thit b, SMS,. Nh mng l mt thnh phn rt c uy th trong th trng in thoi di ng. Trc khi tha thun vi nh mng, nh pht trin ng dng cn phi xem xt bn thi hn v iu kin mt cch ht sc cn thn. Thng thng nh cung cp mng thng yu cu s c quyn, c ngha l ng dng khng th tn ti thng qua mt nh cung cp mng khc, iu s lm mt i hng triu khch hng. Trin khai mt ng dng di ng khng ch l vic ca nh pht trin ng dng, vi nhng dch v truyn thng, vic pht trin ng dng cn l s cng tc ca nhiu thnh phn kinh t, nhng thnh phn cung cp thng tin cc dch v a cc thng tin n khch hng. Ngoi nh cung cp mng, cn c nhiu thnh phn khc c th a ra cc dch v nh l dch v cp nhp thng tin v ti khon, dch v cho php ti v file nhc, dch v cp nhp tin tc thi s, dch v cung cp thng tin ti chnh, dch v lu tr d liu, duyt website, Vi xu hng m ngun m hin nay v ng dng truyn thng ca bn tr nn ph bin bn nn chn gii php kinh doanh ti khon thay v bn phn mm cho ngi dng.

18

Chng 2: Lp trnh ng dng trn di ng vi J2me


2.1. Gii thiu
2.1.1. Lch s ra i v pht trin ca J2me 2.1.1.1. Cc phin bn java Java ra i vo nhng nm 90 ca th k 20, ban u s xut hin ca Java khng gy c nhiu s ch , song n nm 1993 khi h thng web th gii ra i, Java lc khng nh l mt cng c lp trnh hon ho trn web vi cc ng dng nhng Applet. T n nay Java khng ngng pht trin v tr thnh mt cng c lp trnh y sc mnh, c bit l trong lnh vc pht trin cc ng dng Internet, m khng h thua km bt c mt ngn ng lp trnh no khc. Cho ti nay Java pht trin c c rt nhiu phin bn, Bt u t phin bn J2se, Java ngy cng m rng tm vi ca n vt ra ngoi phm vi nhng chic Destop vi hng lot cc phin bn ni ting J2se, J2ee, J2me:

Hnh 2.1: Tng quan v kin trc Java Phin bn chun J2se: Thit k chy trn destop v nhng my tnh kiu trm lm vic. Phin bn x nghip J2ee: a thm vo nhng h tr dnh cho Servlet, JSP v XML. Phin bn ny c nhm ti nhng ng dng trn nn web server. Phin bn nh gn J2me: Thit k cho nhng thit b vi b nh c hn, c v sc mnh mn hnh v tc x l km.
19

2.1.1.2. Phin bn J2me ca java J2me l mt thnh vin b nh trong gia nh h Java, hng n lp trnh trn nhng thit b thng tin gia dng t Internet-cho n cc my TV, my chp nh, in thoi di ng, Pocket PC J2me c pht trin t kin trc Java Card, Embeded Java v Personal Java ca phin bn Java 1.1. n s ra i ca Java 2 th Sun quyt nh thay th Personal Java v c gi vi tn mi l Java 2 Micro Edition, hay vit tt l J2me. ng vi tn gi, J2me l nn tng cho cc thit b khch hng c tnh cht nh, gn vi sc mnh x l v ti nguyn c hn. C rt nhiu thit b dng ny nh in thoi di ng, my quay phim, chp hnh. Nhng thit b ny khng c ty chn ti xung v ci t phn mm t xa nh PC. Phn mm iu khin thit b c ci sn trong qu trnh sn xut ra thit b p t bi nh sn xut. Vi s gii thiu ca J2me nhng thit b ny khng cn l tnh na, chng hon ton c th c ngi dng t lp trnh thm vo nhng tnh nng mi. J2me ci trn thit b sn c ty chn duyt, ti xung v ci t cng nh thc thi nhng ng dng Java. J2me khng phi l mt ngn ng mi, nhng s xut hin ca n cho php cng ngh Java c th chy trn cc thit b nhng, bng cch lc b i cc chc nng m cc thit b ny khng th h tr v thm vo cc chc nng m cc thit b ny cn. Vi s ra i v gii thiu ca Java dng cho mi trng nhng thit b di ng nh gn nh vy, chng ta gi y c kh nng tn dng hm th vin v sc mnh lp trnh ca Java vo cuc sng i thng. 2.1.2. Kin trc phn tng ca J2me J2me c xy dng pht trin ng dng chy trn nn cc thit b nhng, nhm cc thit b ny rt phong ph v gia chng thng c nhiu khc bit v c tnh (b nh, tc x l, kh nng kt ni mng), v d nh cc thit b in thoi, Screenphone, PDA, my chp nh c th c s khc nhau v kch c mn hnh, hay gia nhng chic in thoi vi mn hnh c ln nh nhau nhng li c s khc nhau v phn gii S phong ph v phc tp ny khin cho vic xy dng mt nn tng J2me chung cho tt c cc thit b l khng th, thay vo J2me c xy dng vi mt kin trc khc, l kin trc phn tng, trong cc thit b s c phn nhm theo c tnh (b nh, tc x l,
20

kh nng kt ni mng) mi nhm thit b tng ng vi mt nhm configuration-cu hnh J2me, cu hnh s c t nn tng Java trn nhm cc thit b ny, hay ni cch khc, cu hnh s nh ngha cc chc nng chung c bn nht cho cc thit b cng nhm. Tuy nhin, vi nhng gii hn v phn cng nh vy, kh nng pht trin ng dng da trn configuration l khng ln, hn na, gia cc thit b c cng cu hnh cng c nhiu c im, nhng kh nng ni tri khc nhau, cung cp mi trng lp trnh cho cc thit b chuyn bit trong cng mt nhm cu hnh v linh hot hn khi cng ngh thay i, cc thit b li mt ln na c phn nhm, nhm cu hnh s c phn nh hn v c gi l cc profile. Profile l nh ngha m rng thm cho mt phn loi cu hnh, n cung cp mt tp cc th vin lp trnh cho php to ra cc ng dng chy trn mt kiu thit b c bit. 2.1.2.1. Cu hnh Configuration Cu hnh s thc hin hai mc tiu chnh l:

nh ngha c t cho my o Java. C hai loi cu hnh CDC v CLDC:

nh ngha mt tp cc lp Java lp trnh.

Hnh 2.2: CLDC v CDC CDC Connected Device Configuration, cu hnh dnh cho thit b c kt ni: Ti thiu 512 kilobytes k c chy Java

21

Ti thiu 256 kilobytes dnh cho phn b k c thc thi chng trnh Kt ni mng, bng thng rng v thng trc CLDC Connected, Limited Device Configuration, cu hnh thit b c kt ni c gii hn: Ti thiu 128 kilobytes k c chy Java Ti thiu 32 kilobytes dnh cho phn b k c thc thi chng trnh Hn ch v giao din ngi dng Ngun nng lng thp (v d nh dng ngun pin)

Kt ni mng, thng l wireless vi bng thng v kh nng truy nhp Internet thp.

2.1.2.2. Profile Nh c gii thiu, profile s khc phc cc nhc im ca configuration, profile s b sung thm cc hm API mc cao hn c bit dnh ring cho mt nhm cc thit b.

Hnh 2.3: Cc Profile ca J2me Di y l mt s profile tiu biu:

22

MIDP Mobile Information Device Profile, profile dnh cho thit b thng tin di ng: nh ngha tp cc hm API b xung cc tnh nng nh h tr kt ni, cc thnh phn giao din ngi dng vo CLDC. Profile ny ch yu nhm vo i tng in thoi di ng v n cng ni ting bi l do . PDA Profile: Tng t nh MIDP, nhng PDAP nhm vo th trng cc my PDA c mn hnh v b nh ln hn

Foundation Profile: cho php m rng cc tnh nng ca CDC vi phn ln cc th vin ca b Core Java2 1.3

Ngoi ra cn c: Personal Basis Profile, Personal Profile, RMI Profile, Game Profile. phc v cho mc ch lp trnh trn thit b di ng th chng ta s ch i tm hiu v CLDC v MIDP.

2.2. Pht trin ng dng in thoi di ng bng J2me


2.2.1. Cu hnh thit b kt ni c gii hn CLDC Nh c gii thiu phn trn, CLDC l cu hnh dnh cho cc thit b kt ni c gii hn, vi nng lc x l, dung lng b nh, kh nng hin th v lu tr ti nguyn hn ch. V vy, CLDC cng c nhng hn ch v khc bit so vi nh ngha trong c t java: Khng h tr du chm ng ton hc, php tnh ny i hi rt nhiu ti nguyn, CPU v phn ln cc CPU cho cc thit b di ng khng h tr php tnh ny. CLDC khng h tr bin, ton t, hng, hm, lin quan n du chm ng. Khng h tr phng thc hy finalize(), vic dn dp ti nguyn trc khi i tng b xa c y v pha cc lp trnh vin. H tr hn ch cc x l ngoi l li, do thc hin qun l ngoi l h thng cn phi c mt cu hnh mnh m cc thit b CLDC li khng p ng c. Hn na, cc h thng nhng lun c c ch x l li ca ring n, thng thng l khi ng li phn cng.

23

Qu trnh xc minh lp: khc bit ca qu trnh xc minh lp ca CLDC l n thc hin xc minh lp qua hai bc, gim bt nhng yu cu ti nguyn trong qu trnh xc minh. Ngoi nhng hn ch trn, CLDC cng c nhng lp ring, c thit k cho ph hp vi c th ca mi trng cc thit b phn cng m n quan tm, trong , ng ch nht l b khung kt ni GCF (Generic Connection Framework): Kt ni mng vi J2me kh d dng vi gi java.net, gi ny c kch thc vo khong 200 kilobytes, bao gm khong 20 lp khc nhau. Kch c qu l qu kh i vi cc thit b di ng, hn na J2me cn cn phi h tr mt tp hp ln cc thit b c nhiu s khc nhau v kch c, hnh dng, kh nng mng v yu cu nhp xut file. ph hp vi cc thit b, J2me a ra m hnh khung kt ni chung trong cu hnh CLDC. tng ca n l: nh ngha mt cch tru tng cc hot ng mng v nhp xut file dng chung cho mt s lng ln cc thit b, ging nh mt b khung nn vy. mc CLDC, J2me ch nh ngha v to kt ni, giao thc thc s v cc phng thc trao i d liu ca giao thc c trao cho tng Profile. 2.2.2. Hin trng thit b thng tin di ng MIDP y l Profile c nh ngha dnh ring cho cc thit b di ng v l thnh phn chnh trong J2me. MIDP cung cp cc chc nng c bn cho hu ht cc dng thit b di ng, ph bin nht nh cc my in thoi di ng v cc my PDA. Tuy nhin MIDP c thit k cho cc my di ng c cu hnh rt thp, cho nn n khng phi khng c nhng hn ch. Trc khi ni v nhng hn ch v nhng khc bit ca MIDP so vi J2se, chng ta s cng im qua nhng yu cu phn cng, phn mm ca MIDP: Cc yu cu phn cng: Mn hnh phi h tr t nht 9654 pixel Phi c t nht mt kiu nhp liu cho ngi dng

24

Ti thiu 128 kilobytes k c dng chy cc thnh phn ca thit b di ng Ti thiu 8 kilobytes k c trng dng cho ng dng lu tr d liu cu hnh ring cho ng dng Ti thiu 32 kilobytes k c chy Java Kt ni mng khng dy V yu cu phn mm, h iu hnh trn thit b phi cung cp ti thiu c ch nh thi, x l ngoi l v x l ngt, c kh nng chy KVM v: Phn mm phi h tr cch ghi nh bitmap ra mn hnh

Phn mm phi chp nhn k t nhp vo v chuyn thng tin cho my

o Java H thng cng phi c kh nng c, ghi vo vng cng ca thit b. Phi c kh nng truy nhp n chc nng ni mng trn thit b. Hn ch v khc bit ca MIDP: Phn ln cc th vin ha trong J2se khng th dng trong MIDP, do kh nng hin th v x l hn ch ca cc thit b MIDP. Khng h tr qun l file v th mc, thay vo lu tr di hn, J2me cung cp cho bn mt chc nng khc tng ng l Record Manager System RMS, h thng qun l bn ghi. Nhng chc nng c bit m MIDP cung cp:

Download qua mng an ton qua vic h tr giao thc HTTPS Kim sot vic kt ni gia my di ng v server: v d, chng trnh

khng th kt ni ti server nu thiu s chp thun ca ngi s dng Thm cc API h tr Multimedia M rng cc tnh nng ca Form H tr kiu nh RBG 2.2.3. ng dng MIDlet MIDlet l mt ng dng c thit k cho MIDP profile, v l do , mt MIDlet khng ch tham chiu c n cc lp ca MIDP, m cn c th tham chiu c n cc lp ca CLDC.
25

Khng ging cc ng dng Java Destop truyn thng, ng dng MIDlet khng dng mt hm main lm im truy nhp, m dng mt lp con ca lp javax.microedition.midlet.MIDlet lm im truy nhp. Lp ny nh ngha mt s hm tru tng (abtract), cc hm ny s c gi n khi trng thi ca MIDlet thay i. Ton b cc lp, cc file cn thit cho ng dng MIDlet s c ng gi vo trong mt b c gi l MIDlet suite, n bao gm hai file .JAR v .JAD chun. File lu tr .JAR bao gm cc file .class, cc file ti nguyn ca ng dng v mt file thng k manifest mang thng tin m t v file JAR ny. File .JAD hay cn gi l b m t ng dng l file cha thng tin v MIDlet, n lm hai nhim v chnh: Cung cp thng tin cho b qun l ng dng v ni dung file .JAR, qua h thng s quyt nh xem MIDlet ny c thch hp chy trn thit b hay khng. Cung cp phng tin chuyn tham s cho MIDlet m khng phi thc hin thay i file .JAR T y, chng ta s tm hiu MIDlet, cch s dng cc thnh phn ca n cng nh cch bin dch, ng gi v thc thi mt ng dng MIDlet, xy dng ln cc ng dng dnh cho in thoi di ng.

2.3. Mi trng pht trin


2.3.1. Java Development Kit Chng ta cn JDK s dng trnh bin dch v thng dch ca n cho cc ng dng m chng ta to ra. JDK c th dng cho c CDC v CLDC, tuy nhin phi c phin bn t sdk 1.6 tr ln. Bn download JDK t trang Web ca sun: http://java.sun.com Sau tin hnh ci t nh bt k phn mm no khc, trong qu trnh chng trnh s hi bn ni t th mc, nu bn khng chn (browse) ng dn mi, chng trnh s s dng ng dn mc nh.

26

2.3.2. NetBeans Vic ci t NetBeans cng c tin hnh nh cc phn mm khc, tuy nhin cn phi ch n vic NetBeans tm folder ci t Java, nu nh NetBeans khng t tm c ngi dng cn cung cp cho NetBeans ng dn n th mc .

Hnh 2.4: Tm ng dn n th mc ci t Java Khi vic ci t hon tt, ca s sau s c hin ln, nhn nt Finish kt thc. Trong ca s ny c ty chn ng k NetBeans, v l mt sn phm m ngun m, bn c th b qua vic ng k ny m vn c s dng phn mm mt cch bnh thng :

27

Hnh 2.5: Kt thc vic ci t NetBeans 2.3.3. To mt ng dng MIDP vi Netbean to mt d n mi, hy nhn vo ty chn File v chn New Project :

Hnh 2.6: To mt d n mi Sau , hy chn kiu ca d n : d n Java, Java Web hay JavaME... to mt d n J2me bn hy chn JavaME :

28

Hnh 2.7: To d n J2me Bc tip theo NetBeans s yu cu bn t tn cho d n, trong ca s ny c ty chn Set as Main Project v Create Hello MIDlet, nu bn mun d n mi ny l d n chnh hy chn ty chn Set as Main Project, nu cn to mt lp hello world hy chn ty chn cn li. Bn cnh , bn cn phi chn ni lu gi Project ca mnh trong phn Project Location :

29

Hnh 2.8: t tn cho d n Ca s tip theo s yu cu bn chn phin bn CLDC v MIDP ph hp, vic ny cn ty thuc vo vic bn la chn pht trin d n ca bn trn nhng dng sn phm no ?:

Hnh 2.9: La chn phin bn CLDC v MIDP ph hp

30

Sau khi c d n mi, vic tip theo cn phi lm l vit code cho d n, trc tin hy to mt file mi, nu l file thc thi chnh, bn hy chn MIDlet :

Hnh 2.10: To file mi cho d n t tn cho file mi (lu rng tn file ny phi trng vi tn lp c to ra trong file) :

Hnh 2.11 : t tn cho file Di y l mt on code: import javax.microedition.lcdui.*;

31

import javax.microedition.midlet.*; public class vd extends MIDlet implements CommandListener{ private Form mainForm; public vd(){ mainForm = new Form("Lap trinh tren nen J2ME"); mainForm.append(new StringItem(null,"Hello J2ME")); mainForm.addCommand (new Command("Exit", Command.EXIT, 0)); mainForm.setCommandListener(this); } public void startApp(){ Display.getDisplay(this).setCurrent(mainForm); } public void pauseApp(){} public void destroyApp(boolean un){} public void commandAction(Command c, Displayable s){ notifyDestroyed(); } } Bn hy copy on code ny, vo file vd va c to ra:

Hnh 2.12 : Son code cho d n

32

Sau khi c code ri bn hy nhn ctrl+s lu v cng l dch chng trnh. By gi bn ch nt m xanh c hnh mi tn nm trn thanh cng c, hy nhn n chy ng dng trn b m phng (nu d n ca bn l d n chnh Main Project), nu khng bn hy kch chut phi vo tn d n v chn run. Sau y l kt qu thc thi ca chng trnh trn b m phng:

Hnh 2.13: Kt qu thc thi ca chng trnh vd Mt chng trnh c th chy trn nhiu b m phng khc nhau, sau khi chng trnh c build, bn hy nhn chut phi vo tn ca d n v chn run with, mt ca s s hin ra cho php bn chn cc mu m phng in thoi khc nhau (iu ny rt c ch trong vic kim tra phm vi thc thi ca chng trnh trn cc dng in thoi):

Hnh 2.14:
33

La chn b m phng thc thi chng trnh i vi mi d n J2me c to ra, trong folder m bn chn lu d n s c cu trc cy th mc nh sau:

Hnh 2.15: Cu trc th mc ca mt Project Trong : Folder src s cha m ngun ca d n (cng vi cc ti nguyn hnh nh, m thanh nu c). Folder dist s cha cc sn phm cui cng ca d n. Bn ch cn copy 2 file .JAR v .JAD trong th mc ny vo in thoi di ng, ci t t file .JAD l chng trnh ca bn c th s dng c.

2.4. MIDlet v mn hnh


Khi to giao din cho mt ng dng J2me trn in thoi di ng, c hai c trng m chng ta cn ghi nh l hai lp MIDlet v Display, mt ng dng ch c mt MIDlet v mt MIDlet ch c mt Display. 2.4.1. To ra mt i tng MIDlet Chng ta c th to ra MIDlet bng cch xy dng mt lp k tha lp MIDlet, vi ba phng thc: Abtract void destroyApp(boolean b): MIDlet chun b shutdown.
34

Abtract void startApp(boolean b): MIDlet c t vo trng thi kch hot. Abtract void pauseApp(boolean b): MIDlet chun b dng

Hnh 2.16: To mt ng dng MIDlet V MIDlet l lp abtract cho nn nht thit trong lp k tha phi c ba phng thc nh trn. Cn c vo cc chc nng v c im ca cc hm chng ta c th a ra quyt nh s thc hin nhng cng vic g bn trong nhng hm ny. Cc hm API ca MIDlet: Phng thc abtract void destroyApp (boolean unconditional) abtract void pauseApp ( ) final void startApp( ) final void notifyDestroyed( ) final void notifyPaused( ) final void resumeRequest( ) final String getAppProperty(String key ) M t MIDlet chun b shutdown MIDlet chun b dng Midlet c t vo trng thi kch hot MIDlet yu cu c shutdown MIDlet yu cu c dng li MIDlet yu cu c kch hot Ly thuc tnh t file JAR hoc JAD

2.4.2. Vng i ca mt MIDlet Mt MIDlet i qua nhiu chu trnh ca vng i hot ng v lun trong mt trong ba trng thi sau: Paused (tm ngng): mt MIDlet c t trong trng thi paused sau khi phng thc khi dng c gi, nhng trc khi khi ng bi b qun l

35

ng dng. Khi MIDlet c khi ng, n c th chuyn i xen k gia trng thi pause v active (kch hot) bt k thi im no trong sut vng i ca n. Active (kch hot): MIDlet ang chy. Destroyed (hy): MIDlet chm dt, gii phng ti nguyn v b b qun l ng dng ng li. 2.4.3. i tng Display

Hnh 2.17: Phn cp lp Display Mi mt MIDlet c mt tham chiu ti i tng Display, i tng ny c th tr v thng tin mn hnh hin thi: phm vi mu h tr, phn giiV cha nhng chc nng truy vn cc i tng c th hin th trn mn hnh, l cc i tng Displayable. i tng Display c th xem l b qun l mn hnh iu khin nhng thng tin no s c hin th trn thit b v hin th khi no. Mc d ch c duy nht mt i tng Display cho mt MIDlet, nhng c th c nhiu i tng Displayable bn trong MIDlet cng hin th ra mn hnh. Chng ta thng s dng cc phng thc sau ca lp Display: Static Display getDisplay(MIDlet m): ly v i tng Display cho MIDlet. Displayable getCurrent(): ly v i tng Displayable hin thi ca mn hnh. Void setCurrent(Displayable d): hin th i tng Displayable. Cc hm API ca Display: Phng thc static Display getDisplay (MIDlet m) Displayable getCurrent ( ) M t Ly v i tng Display object cho MIDlet Ly v i tng Displayable hin hnh

36

void setCurrent (Alert alert, Displayable Hin th cnh bo trn i tng nextDisplayable) void nextCurrent (Displayable nextDisplayable) boolean isColor ( ) int numColors ( ) void callSerially ( ) Displayable hin hnh Hin th mt i tng Displayable mi Thit b c h tr mu S mu m thit b h tr Yu cu gi i tng Runnable sau khi

v li v d v to i tng Display cho mt MIDlet: import javax.microedition.lcdui.*; import javax.microedition.midlet.*; public class vd extends MIDlet { private Display di; private Form fr; public vd(){ di=Display.getDisplay(this); fr=new Form("vdform"); } public void startApp(){ di.setCurrent(fr); } public void pauseApp(){} public void destroyApp(boolean un){} }

37

2.5. Giao din ngi dng cp cao


2.5.1. i tng Dislayable v Screen

Hnh 2.18: Phn cp lp Displayable Mt i tng Displayable l mt thnh phn c hin th trn thit b. MIDP cha 2 lp con ca lp Displayable l Screen v Canvas. Mt i tng Screen khng phi l mt ci g hin ra trn thit b, m lp Screen ny s c tha k bi cc thnh phn hin th mc cao, chnh cc thnh phn ny s c hin th ra trn mn hnh. Canvas hay cn gi l khung v, l thnh phn giao din cp thp ca J2me. Nhng thnh phn giao din cp thp nh Canvas s cho php ta v trc tip ln mn hnh to ra cc thnh phn ha sinh ng hay xy dng Game. Ngoi MIDlet v mn hnh ra, ci cn phi quan tm khi to giao din cho chng trnh chnh l cc i tng c th hin th c trn mn hnh Displayable, trong cc i tng ny, i tng m chng ta s s dng nhiu nht chnh l Form, Form l mt trong nhng khung cha c bn, ch khi to c khung cha c bn, ngi lp trnh mi c th a c cc i tng giao din bc cao mong mun vo Form v xut ln mn hnh.

38

2.5.2. Thnh phn Form v Item Mt Form ging nh mt khung cha, mi thnh phn giao din m ta mun hin th ra mn hnh u nm trong khung cha ny, v cc phng thc ca Form s quyt nh hin th cc thnh phn ny khi no v nh th no. Mt Item l mt thnh phn giao din c th thm vo Form. Ni chung Mt Form ch n gin l mt khung cha cc thnh phn, m mi thnh phn c tha k t lp Item, bao gm: ChoiceGroup, DateField, Gauge, ImageItem, StringItem, TextField. 2.5.2.1. Form Mt Form khng khc g mt ca s, ca s c c ch cun th, c th ct gi bt c thnh phn giao din no. Form ban u c to ra s ch l mt ca s trng, c th thm cc thnh phn giao din vo trong Form bn cn dng phng thc append ca i tng Form, phng thc append ny s tr v mt ch s bo ni thnh phn c nh v, thnh phn u tin c a vo ca s s c ch s l 0. Cc thnh phn giao din sau khi c a vo trong Form s c t ng sp xp theo th t t tri qua phi, t trn xung di. Form c cc phng thc xc nh s thnh phn trn mt Form v truy cp ch s (v tr) ca mt thnh phn no hin c trong Form. Form c nhng phng thc chn (insert), thay th (replace) v xa (delete) nhng i tng thnh phn. c th chn, thay th v xa cc thnh phn mt cch chnh xc th ngi lp trnh cn xc nh ch s (v tr) ca thnh phn cn xa, chn hay thay th. Cc API thng dng vi Form: Phng thc Form (String s) Form (String s, Item[] items) int append(Displayable d) void delete(int i) M t To Form vi nhn l s, nhn ny ging nh title ca Form. To Form v thm cc mc Item trong mng vo Form. Thm thnh phn Displayable vo Form. Xa thnh phn Displayable ti v tr

39

void insert(int i1, Item i) String getLabel( ) void setLabel (String s) V d to ra mt Form:

th i Chn Item i vo v tr i Ly v nhn cho Item Gn nhn cho Item

Hnh 2.19: Kt qu thc thi chng trnh to ta mt Form import javax.microedition.lcdui.*; import javax.microedition.midlet.*; public class vd extends MIDlet{ private Display di; private Form fr; public vd(){ di=Display.getDisplay(this); // to Form vi nhn l vdform fr=new Form("vdform"); } public void startApp(){ // hin th form c to ra trong phng thc khi dng //ngay khi ng dng bt u hot ng. di.setCurrent(fr); } public void pauseApp(){

40

} public void destroyApp(boolean b){ } } 2.5.2.2. Cc thnh phn Item Item l mt lp tru tng, do ta khng th to nhng th hin ca lp Item. Thay vo chng ta to ta cc i tng t lp con ca Item. Di y s gii thiu v cc thnh phn Item v cch s dng chng. a) StringItem Thnh phn StringItem c dng hin th mt nhn hay chui vn bn. Ngi dng khng th thay i nhn hay chui vn bn khi chng trnh ang chy. StringItem khng nhn ra s kin, ngha l ngi dng khng th tng tc c vi StringItem. Mt StringItem gm hai phn l phn nhn (lable) v phn vn bn (text), bn c th dng phng thc ring cho lable v text thay i hay ly v ni dung hin thi ca chng. Nhng phng thc hay c s dng ca lp StringItem: Phng thc StringItem(String label, String text) void setText(String text) void setLable(String lable) String getText( ) String getLable( ) V d to ra mt StringItem: import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class vd extends MIDlet { private Display display; private Form fmMain; private StringItem siMsg; public vd() { display = Display.getDisplay(this); M t Phng thc khi dng Thay i ni dung text ca StringItem Thay i lable ca StringItem Ly v gi tr hin thi ca text Ly v gi tr hin thi ca lable

41

//to mt i tng StringItem c tn l siMsg //vi nhn l tn trng v vn bn l khoa cng ngh thng tin siMsg = new StringItem("tn trng: ", "Khoa cng ngh thng tin"); fmMain = new Form("StringItem Test"); //thm i tng siMsg vo Form fmMain.append(siMsg); } public void startApp() { display.setCurrent(fmMain); } public void pauseApp() { } public void destroyApp(boolean unconditional) { } }

Hnh 2.20: Kt qu thc thi chng trnh to ra mt StringItem b) TextField Mt thnh phn TextField l mt nhp liu vi mt dng duy nht, ging nh cc nhp tn ti khon v password bn vn nhn thy khi ng nhp vo cc trang web.

42

TextField c mt thuc tnh rt quan trng l rng buc (constraint), rng buc cho bit ngi dng ch c php nhp loi d liu no vo TextField. C bn loi rng buc h tr c bit cho cc kiu nh dng: a ch email, URLs, s v s in thoi. Bng di y lit k nhng rng buc nhp liu sn c. Ngoi nhng rng buc, khi bn to ra mt TextField, bn c th ch r c bao nhiu k t m bn cn trong nhp liu. Rng buc CONSTRAINT_MASK ANY EMAIL_ADDR NUMERIC PASSWORD PHONENUMBER URL Kiu h tr S dng mt n ny khi bn cn xc nh gi tr hin thi ca rng buc Cho php tt c k t Cho php dng nhp liu hp l l mt a ch email Cho php duy nht s. Bao gm s dng ln s m Nhp d liu di dng password, cc k t nhp vo s b che i bi k t mt n. Dng nhp liu theo nh dng s in thoi Ch cho php nhp cc k t hp l theo dng a ch web URL Phng thc dng ca lp TextField: TextField(String label, String text, int maxSize, int constraints). To ra mt TextField vi nhn l label, vn bn c sn trong TextField l text, s k t ti a l maxSize v dng d liu c php nhp vo l constraints. Sau khi ngi dng tng tc vo TextField, bn s cn ly li cc thng tin c ngi dng nhp vo v x l chng, lm c vic bn hy s dng cc phng thc c gii thiu sau y ca TextField: Phng thc TextField (String label, String text, in maxSize, int constraints) void delete(int offset, int length) M t To ra mt TextField mi Xa cc k t trong TextField: Vi v tr bt u xa l offset, v s k t cn xa void insert(char[] data, in offset, int l length. Chn k t t mng vo TextField ti

43

length, int position) void insert(String src, int position) void setChars(char[] data, int offset, int length, int position) void setString(String text) int getChars(char[] data) String getString( ) int getConstraints( ) void setConstraints(int constraints) int getMaxSize( ) int setMaxSize(int maxSize) Int getCaretPosition( ) int size( ) V d to ra mt TextField: import javax.microedition.lcdui.*; import javax.microedition.midlet.*; public class vd extends MIDlet{ private Display di; private Form fr; private TextField t1,t2; public vd(){

mt v tr xc nh Chn k t vo TextField Thay th k t t mng Thay th ni dung TextField vi chui Ly v ni dung TextField Ly v ni dung cha trong TextField Ly v rng buc nh ngha ca TextField t rng buc cho TextField Tr v s k t ti a ca TextField t s k t ti a Ly v tr con tr nhp liu Ly v s k t hin c ca TextField

di=Display.getDisplay(this); fr=new Form("vdform"); //to textfield vi tn l t1. Nhn ca t1 l "ten :", //vn bn c sn trong TextField l "abc", //s k t ti a l 20, kiu rng buc l ANY t1=new TextField("ten:","abc",20,TextField.ANY); //to textfield vi tn l t2. Nhn ca t2 l "pass :", //vn bn c sn trong TextField l "123", //s k t ti a l 20, kiu rng buc l PASSWORD t2=new TextField("pass:","123",20,TextField.PASSWORD); fr.append(t1); fr.append(t2); }
44

public void startApp(){ di.setCurrent(fr); } public void pauseApp(){ } public void destroyApp(boolean b){ } }

Hnh 2.21: V d to ra cc TextField c) ChoiceGroup Mt ChoiceGroup l mt nhm cc nt chn, c hai kiu chn cc nt chn trong mt nhm (ChoiceGroup) l : a la chn v chn loi tr, a la chn cho php ngi dng chn nhiu nt mt lc, trong khi chn loi tr ch cho php chn duy nht mt nt chn. Phng thc khi dng ca ChoiceGroup: ChoiceGroup (String Label, int choiceType): Trong Label l phn nhn ca ChoiceGroup, choiceType xc nh kiu ca ChoiceGroup l a la chn hay chn loi tr.
45

Di y l bng lit k cc choiceType c th c ca mt i tng ChoiceGroup: Gi tr M t EXCLUSIVE Duy nht mt la chn c php MULTIPLE C th chn cng lc nhiu gi tr IMPLICIT Ch dng cho thnh phn danh sch List Sau khi to ra c ChoiceGroup, bn cn thm cc nt chn vo trong ChoiceGroup bng phng thc:

int append (String stringPart, Image imagePart): Thm mt nt chn c tn l stringPart v icon l imangPart vo trong ChoiceGroup.

Bn thy rng cc nt chn khi c a vo ChoiceGroup khng ch c tn hin th m cn c th c c hnh nh minh ha (bn s hc cch to ra mt i tng nh phn sau). Bn cnh , phng thc append ny s tr v mt ch s bo ni nt chn c nh v, nt chn u tin c a vo ChoiceGroup s c ch s l 0. Bn s cn s dng n ch s ny trong cc phng thc ca ChoiceGroup tr li cc cu hi nh:

Lm th no bit c rng nt chn no c ngi dng chn Kim tra xem mt nt chn no c c ngi dng chn hay khng

tr li nhng cu hi bn cn s dng cc phng thc ca lp ChoiceGroup: Phng thc getSelectedIndex() s cho bn bit nt chn th my c chn, khi ChoiceGroup c kiu l chn loi tr, nu ChoiceGroup c kiu l a la chn phng thc getSelectedFlags (boolean[] selectedArray) s ly v tnh trng chn ca ChoiceGroup v ct vo mng selectedArray, nu phn t th i ca mng selectedArray c gi tr l true th nt chn c ch s l i tng ng ca ChoiceGroup c chn v ngc li vi gi tr false. Phng thc isSelected(int elementNum) s cho bn bit nt chn nm v tr elementNum c c chn hay khng?... Nhng phng thc hay c s dng ca lp ChoiceGroup: Phng thc ChoiceGroup (String Label, int choiceType) ChoiceGroup (String label, int choiceType, String[] stringElements, Image imageElements) M t To ra mt ChoiceGroup khng c phn t no To ra mt ChoiceGroup vi cc phn t trong mng

46

int append (String stringPart, Image imagePart) void delete (int elementNum) void insert (int elementNum, String stringElement, Image imageElement) void set (int elementNum, String stringPart, Image imagePart) String getString (int elementNum) Image getImage (int elementNum) int getSelectedIndex() void setSelectedIndex(int elementNum, boolean selected) int getSelectedFlags (boolean[] selectedArray) void setSelectedFlags(boolean [] selectedArray) boolean isSelected(int elementNum) int size () V d to ra mt ChoiceGroup: import javax.microedition.lcdui.*; import javax.microedition.midlet.*; public class vd extends MIDlet{ Display dis; Form fr; ChoiceGroup ch; int stt; public vd(){

Thm phn t vo Xa phn t Chn phn t Thay th phn t Ly v chui lin quan n phn t Ly v hnh nh lin quan n phn t Ly v ch s t ch s Ly v tnh trng ct vo mng t trng thi chn t mng Kim tra phn t hin hnh c c chn hay khng S phn t hin c

dis=Display.getDisplay(this); fr=new Form("ChoiceGroup"); //to ra mt ChoiceGroup c tn l ch //nhn ca ch l "muc chon", kiu ca ch l chn loi tr ch=new ChoiceGroup("muc chon",ChoiceGroup.EXCLUSIVE); //thm mt nt chn c tn hin th l muc1 vo ch ch.append("muc1",null);
47

//thm mt nt chn c tn hin th l muc2 vo ch ch.append("muc2",null); stt=fr.append(ch); } public void startApp(){ dis.setCurrent(fr); } public void pauseApp(){ } public void destroyApp(boolean b){ } }

Hnh 2.22: V d to ra ChoiceGroup Bng cch thay th gi tr choiceType trong phng thc khi dng ChoiceGroup.EXCLUSIVE thnh ChoiceGroup.MULTIPLE bn s thay i c kiu ChoiceGroup t chn loi tr sang a la chn nh hnh trn. d) Image & ImageItem Hai lp c dng hin th hnh nh l: Image v ImageItem. Image c dng to ra mt i tng hnh nh v gi thng tin nh l chiu cao v chiu rng ca hnh nh. Lp ImageItem m t mt tm nh s c hin th nh th no,

48

v d tm nh s c t trung tm, hay t v pha bn tri, hay bn trn ca mn hnh. MIDP a ra 2 loi hnh nh l loi nh khng bin i v nh bin i. Mt tm nh khng bin i th khng th b thay i k t lc n c to ra. c trng ca loi nh ny l c c t mt tp tin. Mt tm nh bin i v c bn l mt vng nh. iu ny ty thuc vo vic bn to ni dung ca tm nh bng cch ghi n ln vng nh. Mt vi phng thc khi dng hay dng ca lp Image v ImageItem Image createImage(String name): To ra mt i tng hnh nh t mt nh c sn, nh ny nm trong th mc src ca d n, v ngi lp trnh ch cn a ra tn chnh xc ca nh (c phn m rng) chng trnh np nh vo. Image createImage(Image source) Image createImage(byte[] imageDate, int imageOffset, int Length) Image createImage(int width, int height): To ra mt nh vi chiu rng v chiu cao xc nh. Nhng phng thc hay c s dng ca lp Image: Phng thc static Image createImage ( String name) M t To image khng thay i c t

resource. static Image createImage ( Image resource) To nh t mt nh c sn. static Image createImage (byte [] imageData, int To nh d liu mng. imageOffset, intimageLength) static ImagecreateImage ( int width, int height) Int getHeight() Int getWidth() Boolean isMutable To nh theo chiu rng v cao xc nh. Ly v chiu cao. Ly v chiu rng. Xc nh nh c thay i c hay khng. Ch : PNG l loi nh c h tr bi bt k thit b MIDP no. on m di y m t lm th no to mt tm nh t mt tp tin, v gn n vi mt i tng ImageItem v thm mt bc nh vo mt Form:

49

Form fmMain = new Form("Images"); Image img = Image.createImage("/house.png"); fmMain.append(new ImageItem(null, img, ImageItem.LAYOUT_CENTER, null)); on m di y m t vic s dng i tng Image v i tng ImageItem: import javax.microedition.lcdui.*; import javax.microedition.midlet.*; public class vd extends MIDlet implements CommandListener{ Display dis; Form fr; Command c; public vd(){ dis=Display.getDisplay(this); fr=new Form("hi you!"); c=new Command("exit",Command.EXIT,1); try{ //to ra mt i tngImage c tn l i //c np vo t mt nh vi tn l leaf.png Image i=Image.createImage("/leaf.png"); //thm i tng nh ny vo Form //nh c t v tr chnh gia: LAYOUT_CENTER fr.append(new ImageItem(null,i,ImageItem.LAYOUT_CENTER,null)); dis.setCurrent(fr); } catch(java.io.IOException e){ System.out.print("ko nap duoc anh"); } fr.addCommand(c); fr.setCommandListener(this);

50

} public void startApp(){ dis.setCurrent(fr); } public void pauseApp(){ } public void destroyApp(boolean b){ } public void commandAction(Command c,Displayable db){ destroyApp(true); notifyDestroyed(); } }

Hnh 2.23: V d to Image Bn ng quan tm ti nhng i tng m bn cha tng hc qua, hy th bit cch a mt nh ln mn hnh. Bn hy copy file leaf.png vo cng folder vi file vd.java, hoc i tn leaf.png trong m ngun thnh mt tn khc, v copy file nh c tn nh vy vo cng th mc vi file vd.java.

51

e) DATEFIELD S dng thnh phn DateField bn c th thao tc x l i tng ngy thng (nh lp i tng java.util.Date) bng cc phm trn thit b hoc phm chc nng. Thnh phn DateField cung cp mt phng tin trc quan thao tc i tng Date c nh ngha trong java.util.Date. Khi to mt i tng DateField, bn cn ch r l ngi dng ch c th chnh sa ngy, chnh sa gi hay ng thi c hai. Cc phng thc dng ca lp DateField gm: DateField(String label, int mode) : To ra DateField c nhn l label v loi thng tin thi gian c th chnh sa l mode DateField(String label, int mode, TimeZone timeZone) Cc mode tng ng ca lp DateField gm: Gi tr DateField.DATE_TIME DateField.TIME DateField.DATE M t Cho php ngi dng son tho hiu chnh c ngy, thng ln thi gian. Cho php ngi dng son tho hiu chnh thi gian. Cho php ngi dng son tho hiu

chnh ngy, thng. Nhng phng thc hay c s dng ca lp DateField: Phng thc DateField(String label, Int mode) DateField(String label, Int mode, TimeZone TimeZone) Date getDate() void setDate(Date date) void setInputMode(int mode) V d to ra mt DateField: import javax.microedition.lcdui.*; import javax.microedition.midlet.*; import java.util.*; import java.util.Timer; M t To DateField. To ra DateField vi thng tin

TimeZone xc nh. Ly v gi tr ngy hin thi. t ngy hin thi. t kiu mi.

52

import java.util.TimerTask; public class vd extends MIDlet { Display dis; private Form fr; private DateField d1; private Date date; int index; public vd(){ dis=Display.getDisplay(this); fr=new Form("DateField"); //to ra mt i tng DateField c nhn l today: //ngi dng c th hiu chnh c ngy, thng v thi gian d1=new DateField("today:",DateField.DATE_TIME); //to ra mt i tng Date, l i tng kiu ngy thng //vi gi tr l ngy thng nm hin thi date=new Date(); // t ngy hin thi cho DateField d1.setDate(date); fr.append(d1); } public void startApp(){ dis.setCurrent(fr); } public void pauseApp(){ } public void destroyApp(boolean b){ } }

53

Hnh 2.24: V d to ra mt DateField f) GAUGE (THC O) Nu bn c nhiu thi gian lm vic trn my tnh, chc hn bn s quen vi nhng thanh o tin (thanh tin trnh) nhiu dng khc nhau (trong Window thng gi l Progress Bar). V d quen thuc nht l thc o phn trm tin cng vic thc hin c khi bn ang ti d liu t Web xung hoc trong lc ci t phn mm. Nu bn cn mt giao din tng t nh vy trn thit b di ng th Gauge l mt la chn tt. Thnh phn Gauge c hai ch , th nht l ch tng tc v ch khng tng tc. Trong ch tng tc, ngi dng c th thng qua hai nt + v - trn giao din ca Gauge tng hay gim gi tr. Trong ch khng tng tc, ngi dng phi t lp trnh thay i gi tr ny. Chng ta s cng tm hiu v thnh phn khng tng tc mc x l s kin. Cc phng thc thng dng ca Gauge: Phng thc Gauge(String label, Boolean interactive, int maxValue, int M t To Gauge.

54

initialValue) int getValue() void setValue(int value) int get MaxValue() void setMaxValue(int maxValue) Boolean isInteractive() V d to ra mt Gauge: import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class vd extends MIDlet{ private Display display; private Form fmMain; private Gauge gaVolume; public vd() {

Ly v gi tr hin hnh ca gauge. t gi tr hin hnh cho Gauge. Ly v s ln nht ca Gauge. t s ln nht cho Gauge. Kim tra xem Gauge c tng tc hay khng.

display = Display.getDisplay(this); //To ra mt gauge c nhn l Sound Level l loi tng tc //vi gi tr ln nht l 50, gi tr khi to l 4 gaVolume = new Gauge("Sound Level", true, 50, 4); fmMain = new Form("Gauge"); fmMain.append(gaVolume); } public void startApp() { display.setCurrent(fmMain); } public void pauseApp() {} public void destroyApp(boolean unconditional) {} }

55

Hnh 2.25: V d to mt Gauge 2.5.3. Thnh phn List, TextBox, Alert, Ticket Trong phn ny chng ta s xem xt i tng List, TextBox, Alert, Ticket trong cc thnh phn giao din cp cao ca ng dng MIDP, cc lp ny cng cp vi lp Form, hay ni cch khc chng u l m rng ca lp Screen, tng t nh lp Form. S khc nhau quan trng gia cc thnh phn ny vi cc thnh phn mc 2.5.2 l cch hin th trn mn hnh, Form c th gi bt k i tng Item no nhng i tng ny th khng, khi i tng ny c t l thnh phn hin th th n l thnh phn duy nht c hin th. 2.5.3.1. List Mt List cng l mt danh sch chn nh ChoiceGroup, tuy nhin cc List uc dng th hin mt thc n cc chn la. List c ba dng l : a la chn v chn loi tr v danh sch khng tng minh. List a la chn hay List chn loi tr cng ging nh ChoiceGroup, khi List c to ra di dng ny th bn cnh cc nt chn s c hnh nh ca nt radio hay checkbox, hn na khng c s kin no pht sinh khi ngi dng thay i mt phn t trong List.
56

Tuy nhin List khng tng minh li khc, List khng tng minh khng c nt radio hay checkbox bn cnh, khi ngi dng nhn vo cc nt chn trong List th s c s kin pht sinh. Phng thc khi dng c bn ca List:

List (String title, int listType): To ra mt List vi nhn l title v kiu l listType.

Di y l bng lit k cc listType c th c ca mt i tng List: Gi tr M t EXCLUSIVE Duy nht mt la chn c php MULTIPLE C th chn cng lc nhiu gi tr IMPLICIT Danh sch khng tng minh Cc phng thc thng dng trong lp List: Phng thc List (String title, int listType) List (String title, int listType, String[] ) int append (String stringPart, Image imagePart) void delete(int elementNum) void insert(int elementNum, String stringPart, Image imagePart) void set(int elementNum, String stringPart, Image imagePart) String getString(int elementNum) Image getImage(int elementNum) int getSelectedIndex() void setSelectedIndex(int elementNum, boolean selected) int getSelectedFlags(boolean[] selectedArray_return) void setSelectedFlags(boolean[] selectedArray) M t To ra mt danh sch mi khng c phn t no To ra danh sch List t cc mc d

stringElements, Image[] imageElements liu cha trong mng Thm phn t Xa mt phn t ti ch s xc nh Chn phn t ti ch s xc nh Thay th phn t ti mt ch s xc nh Ly v ni dung vn bn ca phn t ti ch s xc nh Ly v hnh nh kt hp vi phn t ti ch s xc nh Ch s hin hnh t ch s hin hnh Ly v tnh trng ca cc phn t t tnh trng chn cho phn t

57

boolean isSelected(int elementNum) int size()

Xc nh xem phn t c chn hay khng Xc nh s phn t bn trong danh

sch List on m di y minh ha vic s dng mt List khng tng minh: import javax.microedition.lcdui.*; import javax.microedition.midlet.*; public class vd extends MIDlet{ Display dis; List li; public vd(){ dis=Display.getDisplay(this); try{ Image i[]={ Image.createImage("/down.png"), Image.createImage("/up.png"), Image.createImage("/help.png") }; String s[]={ "down", "up", "help" }; li=new List("list",List.IMPLICIT,s,i); } catch(java.io.IOException e){ System.out.print("ko load dc anh"); } } public void startApp(){ dis.setCurrent(li); }
58

public void pauseApp(){} public void destroyApp(boolean b){} }

Hnh 2.26: Vd to mt List 2.5.3.2. TextBox TextBox c dng cho php nhp nhiu dng thng tin, khc vi TextField l ch c th nhp mt dng thng tin. Thnh phn TextBox v TextField c nhng rng buc ging nhau trong vic ch nh loi ni dung c php nhp vo V d ANY, EMAIL, URL Phng thc khi dng: TextBox (String title, String text, int maxSize, int constraints) Nhng phng thc thng dng ca TextBox: Phng thc M t TextBox (String title, String text, int To ra mt TextBox mi maxSize, int constraints) void delete(int offset, int length) void insert(String src, int position) void setChars(char[] data, int offset, int length, int position) void setString(String text) Xa k t Chn mt chui Thay th k t t mng Thay th ni dung TextBox vi chui
59

int getChars(char[] data) String getString( ) int getConstraints( )

Ly v ni dung TextBox Ly v ni dung cha trong TextBox Ly v rng buc nh ngha ca

TextBox void setConstraints(int constraints) t rng buc cho TextBox int getMaxSize( ) Tr v s k t ti a ca TextBox int setMaxSize(int maxSize) t s k t ti a Int getCaretPosition( ) Ly v tr con tr nhp liu int size( ) Ly v s k t hin c ca TextBox Di y l on m minh ha cho vic s dng TextBox: import javax.microedition.lcdui.*; import javax.microedition.midlet.*; public class vd extends MIDlet { private Display dis; private TextBox t; public vd(){ dis=Display.getDisplay(this); t=new TextBox("title",null,30,TextField.ANY); } public void startApp(){ dis.setCurrent(t); } public void pauseApp(){ } } public void destroyApp(boolean b){ }

60

Hnh 2.27: V d to ra TextBox 2.5.3.3. Alert v AlertType Mt Alert n gin l mt hp thoi rt nh, thng c dng hin th mt thng bo ln mn hnh. C 2 loi Alert:

Modal: l loi hp thoi thng bo c trnh by cho n khi ngi dng n nt ng . Non-modal: l loi hp thoi thng bo ch c trnh by trong mt s giy nht nh.

Cc phng thc dng ca Alert:


Alert(String title): To Alert c nhn l title Alert(String title, String alertText, Image alertImage, AlertType alertType): To Alert vi nhn l title, phn ni dung hin th nm trong alertText, hnh nh minh ha l alertImage v kiu l AlertType.

Thnh phn AlertType s dng m thanh thng bo cho ngi dng bit c mt s kin xy ra. V d bn c th s dng AlertType m mt on m thanh no bo hiu cho ngi dng bit khi c li xy ra Thnh phn AlertType bao gm 5 loi m thanh nh sn l: thng bo, xc nhn, bo li,

61

thng bo v cnh bo. Ta thy cc phng thc dng ca Alert cho bit l Alert c th bao gm 1 tham chiu n mt i tng AlertType. Cc gi tr AlertType: Gi tr M t ALARM Pht m bo ng CONFIRMATION Pht m xc nhn ERROR Pht m pht hin li INFO Pht m thng bo WARNING Pht m cnh bo boolean playSound(Display display) Pht m thanh trn thit b Nhng phng thc thng dng ca Alert: Phng thc M t Alert (String title) To i tng Alert mi Alert (String title, String alertText, To i tng Alert mi vi hnh nh Image alertImage, AlertType alertType) Image getImage() void setImage(Image img) String getString() void setString(String str) int getDefaultTimeout() int setTimeOut() AlertType getType() void setType(AlertType type) V d to ra Alert: import javax.microedition.lcdui.*; import javax.microedition.midlet.*; public class vd extends MIDlet { private Display dis; private Alert al; private Form f; public vd(){ dis=Display.getDisplay(this); f=new Form("Alert"); //to ra Alert vi nhn l thong bao, noi dung hien thi //l thong bao co loi!, khng c nh hin th v kiu l //ERROR
62

v m thanh kt hp Ly v hnh nh ca Alert t hnh nh cho Alert Ly chui kt hp vi Alert t chui kt hp vi Alert Ly v thi gian ca i tng Alert t s lng thi gian hin th i tng Alert Ly v kiu ca Alert t kiu AlertType

al = new Alert("Thong bao", "Thong bao co loi!", null, AlertType.ERROR); } public void startApp(){ dis.setCurrent(al,f); } public void pauseApp(){ } } public void destroyApp(boolean b){ }

Hnh 2.28: V d to ra Alert 2.5.3.4. Ticker Thnh phn Ticker uc dng th hin mt on dng thng tin chy theo chiu ngang ca thit b. Tham s duy nht ca thnh phn Ticker l on vn bn c trnh by. Tc v chiu cun c xc nh bi vic ci t trn thit b no. Phng thc dng ca Ticker: Ticker(String str) Nhng phng thc thng c s dng ca Ticker:
63

Phng thc Ticker (String str) String getString() void setString(String str)

M t To ra mt b cun vn bn t ng Ticker Ly v ni dung vn bn cun t ni dung vn bn cun

T cy phn cp cc thnh phn th hin trn thit b, ta thy l thnh phn Ticker khng l lp con ca lp Screen m Ticker l mt bin ca lp Screen. iu ny c ngha l mt Ticker c th c gn vo bt c lp con ca lp Screen bao gm c Alert. V d to ra mt Ticker: import javax.microedition.lcdui.*; import javax.microedition.midlet.*; public class vd extends MIDlet { private Display di; private Form fr; private Ticker tk; public vd(){ di=Display.getDisplay(this); fr=new Form("Ticker"); //To ra Ticket c ni dung hin th l ay l dng thng // tin tk=new Ticker("y l dng thng tin"); fr.setTicker(tk); } public void startApp(){ di.setCurrent(fr); } public void pauseApp(){ } } public void destroyApp(boolean b){ }

64

Hnh 2.29: V d Ticker 2.5.4. X l s kin Phn ln cc i tng ha chng ta hc t phn trc u c kh nng n nhn cc tng tc t pha ngi dng, v d nh vic nhp thng tin vo TextField hay vic chn Item t mt ChoiceGroup hay mt List... Mi khi mt tng tc xy ra trn mt thnh phn giao din, chng trnh phi c nhng hnh ng tr li tng ng vi nhng tng tc , v d khi bn nhn nt ng nhp hay ng xut trn mt website, h thng s phi c nhng hnh ng cho php bn tham gia hay thot khi h thng. Nhng tng tc xy ra trn cc thnh phn giao din nh vy chng ta s gi l s kin v vic to ra nhng hnh ng tr li cho cc tng tc chng ta s gi l x l s kin. 2.5.4.1. M hnh x l s kin Vic u tin khi x l s kin l chng ta phi c c ch nhn bit xem s kin xy ra u (trn thnh phn giao din no) v sau l a ra cc hnh ng tr li cho cc s kin . V c bn, chng ta c ba bc chnh qun l thnh cng mt s kin.

Phn cng (thit b vt l) phi on nhn c iu g xut hin: Mt nt c nhn hay mt nt c th ra, dy ni pin ngun adapter ang cm vo hay tho ra.
65

Phn mm trn thit b (b qun l ng dng) cn c thng bo v s kin ny. y l im ni chng ra s ng dng vai tr l mt ngi pht trin MIDlet. Mt thng bo t b qun l ng dng s c gi cho MIDlet. Thng bo ny s cha thng tin v s kin sao cho chng ta c th a ra nhng quyt nh x l (s kin c th l mt yu cu hin th thng bo gip trn mn hnh thit b)

MIDlet c th nhn bit c cc s kin chng ta phi gn vo n mt b lng nghe s kin, cn c gi vi thut ng l Listener. C hai giao din Listener chnh cho mi MID Profile l: CommandListener v ItemListener. Khi MIDlet nhn bit c s kin ri, vic tip theo ngi lp trnh cn phi lm l a ra cc hnh ng tr li, lm c vic bn cn mt lp ci t hoc c hai giao din interface ny. Khi ci t interface, bn s xy dng ni dung cho phng thc commandAction() v itemStateChanged(). y l ni bn t m thc hin nhng cng vic ng vi yu cu ca s kin xut hin. 2.5.4.2. i tng COMMAND Trong phn ny chng ta s cng nhau tm hiu cch to ra v s dng mt thnh phn ha rt n gin, nhng gn nh khng th thiu trong cc giao din phn mm l nt nhn. Nt nhn trong J2me c gi l Command, nt nhn c hai loi:

Nt phm thng l nhng nt nm gc di cng bn tri v bn phi trn mn hnh chng trnh (nm trn thanh Menu cui mn hnh), gi nt ny l nt phm bi v n c kh nng nh x ln cc nt tht trn bn phm in thoi.

Nhng nt khng th tham chiu n cc nt tht trn bn phm gi l nt mm. nhn cc nt ny ngi dng ch cn nhn nt Ok/Menu trn bn phm in thoi (phm tng ng vi phm Enter trn bn phm my vi tnh).

Vic x l s kin cho nhng nt ny gm cc bc:


1. To ra cc i tng Command. 2. a Command vo mt Form, TextBox, List hoc Canvas. 66

3. Thm mt CommandListener vo Form, TextBox, List hoc Canvas

bc trn. Khi bt c mt s kin, Listener s c gi (gi mt thng bo s kin t b qun l ng dng n Listener). Kt qu l phng thc commandAction() m Listener qun l s c gi. Bn trong phng thc ny bn c th xc nh Command no bt u hot ng v x l s kin tng ng. Di y l v d cho php to ra mt nt thot khi MIDlet: import javax.microedition.lcdui.*; import javax.microedition.midlet.*; //ci t giao tip lng nghe s kin CommandListener public class vd extends MIDlet implements CommandListener{ private Display di; private Form fr; private Command c1; public vd(){ di=Display.getDisplay(this); fr=new Form("vdform"); //To ra nt nhn c1=new Command("exit",Command.EXIT,1); //thm nt nhn vo form fr.addCommand(c1); //gn b lng nghe s kin vo form fr.setCommandListener(this); } public void startApp(){ di.setCurrent(fr); } public void pauseApp(){} public void destroyApp(boolean b){ } public void commandAction(Command com,Displayable db){ //xc nh Command gy ra s kin v x l

67

if(com==c1){ destroyApp(true); notifyDestroyed(); } } } 2.5.4.3. Command v CommandListener Khi to mt i tng lnh Command mi chng ta c ba tham s: nhn (label), kiu (type) v quyn u tin (priority). phng thc khi dng:

Command (String label, int commandType, int priority): To mt nt nhn c nhn l label, loi nt nhn l commandType, quyn u tin l priority.

v d:

c1=new Command("exit",Command.EXIT,1);

Trong :
1. Nhn (label): y l phn ch r ni dung vn bn m bn kt hp vi

Command. Nhn c th c hin th trc tip trn mn hnh thit b hoc hin th bn trong mt menu.
2. Kiu (type): Xc nh xem Command l nt mm hay nt phm, nu l

nt phm th l loi nt phm no?. Di y l bng cc gi tr kiu ca Command: Gi tr BACK CANCEL M t Yu cu di chuyn ti mn hnh trc Yu cu hy b mt thao tc. V d, khi hin th mt mn hnh nhc nh nhp vo mt a ch Web, bn c th c c nt OK ln Cancel EXIT HELP ITEM lm nhng nt ty chn trn mn hnh Yu cu thot khi MIDlet Yu cu hin th thng tin gip Yu cu nh x trn Command ln mt Item trn mn hnh. V d, khi s dng thnh phn danh sch List, bn c th m phng hot ng ca mt menu ng cnh bng cch nh x lnh Command cho

68

OK

tng mc trong danh sch List. Xc nhn ra quyt nh t pha ngi dng. V d, sau khi d liu ti xung, bn c th a ra mt mn hnh thng bo Download completed vi mt lnh kiu OK. Dnh cho nhng lnh khng c nh x ln cc phm c bit. V d, bn c th c nhng lnh khi ng qu trnh chuyn tp tin t my di ng sang my tnh ln hay ti xung d liu t Internet hoc t cc my PC. Nhn Upload v Download khng c phm nh x trc tip trn thit b. Yu cu dng mt thao tc. V d, nu ang ti d liu xung t mng Internet, ty chn ny c th hin sn gip ngi dng c th chm dt qu trnh download m khng phi i thao tc hon tt 3. Quyn u tin: Quyn u tin c xc nh bng mt con s, s c gi tr cng cao th quyn u tin cng thp. Nhng gi tr ny c th gip ch cho b qun l ng dng khi sp xp cc Item xut hin trong menu la chn hoc sp th t cc nt mm trn mn hnh. Quyn u tin ny lm mt yu cu do bn ch nh. Phm thc s c nh x v quyn u tin trn phm thc t s c quyt nh v iu bi thit b. Nhng phng thc thng c dng ca Command:

SCREEN

STOP

Phng thc Constructor Command (String

M t label, int To ra i tng Command

commandType, int priority) Phng thc int getCommandType() Ly v kiu gn cho lnh String getLabel() Ly v nhn gn cho lnh int getPriority() Ly v quyn u tin gn cho lnh Phng thc ca CommandListener: Phng thc void commandAction(Command Displayable d) M t c, c gi khi lnh Command c trn mt i tng Displayable d bt u

mt s kin v d di y s m t cch s dng Command v CommandListener: import javax.microedition.lcdui.*; import javax.microedition.midlet.*;

69

public class vd extends MIDlet implements CommandListener{ private Display di; private Form fr; private TextBox tb; private Command c1,c2,c3; public vd(){ di=Display.getDisplay(this); fr=new Form("vd"); tb=new TextBox("help","y l ni dung help...",50,0); //to ra cc nt nhn c1=new Command("exit",Command.EXIT,1); c2=new Command("help",Command.HELP,2); c3=new Command("back",Command.BACK,3); //thm cc nt nhn vo form fr.addCommand(c1); fr.addCommand(c2); tb.addCommand(c3); //gn b lng nghe s kin vo cc thnh phn khung cha fr.setCommandListener(this); tb.setCommandListener(this); } public void startApp(){ di.setCurrent(fr); } public void pauseApp(){ } public void destroyApp(boolean b){ } public void commandAction(Command com,Displayable db){ if(com==c1){ destroyApp(true); notifyDestroyed(); } else if(com==c2){ di.setCurrent(tb); } else
70

if(com==c3){ di.setCurrent(fr); } } }

Hnh 2.30: v d v Command v CommandListener y l mt v d n gin, giao din chnh ca chng trnh c gn vi hai nt exit v help, exit thot khi MIDlet, help bt ln mt ca s tr gip dng TextBox, ca s help ny c gn vi mt nt back quay li giao din chnh ca chng trnh.

to c chng trnh nh trn, u tin ta phi to ra cc nt nhn: c1=new Command("exit",Command.EXIT,1); c2=new Command("help",Command.HELP,2); c3=new Command("back",Command.BACK,3); Ri gn cc nt nhn vo cc i tng khung cha thch hp: fr.addCommand(c1); fr.addCommand(c2); tb.addCommand(c3);

Gn i tng lng nghe s kin vo cc khung cha. V y MIDlet ca chng ta c ci t thc thi giao din CommandListener (implements

71

CommandListener) cho nn i tng lng nghe s kin cng chnh l MIDlet: fr.setCommandListener(this); tb.setCommandListener(this); Bc cui cng l x l s kin: public void commandAction(Command com,Displayable db){ if(com==c1){ destroyApp(true); notifyDestroyed(); } else if(com==c2){ di.setCurrent(tb); } else if(com==c3){ di.setCurrent(fr); } } y nhn bit c i tng Command no l i tng gy ra s kin, chng ta s dng tham s com ca phng thc CommandAction vi cu lnh kim tra n gin nh sau: if (com==tn_Command){ //thc hin cng vic tng ng }

2.5.4.4. Item v ItemStateListener


Mt kiu x l s kin th hai c thc hin thng qua i tng Item. Item ch c th truy xut t b phn ca Form trong khi lnh Command c th truy xut c t Form, TextBox, List, hoc Canvas. Khi bn thm mt Item vo Form, tng t nh vi Command, bn phi thm mt b ItemStateListener vo chung lng nghe s kin. Khi c s thay i tc ng n Item (nh Gauge tng mc m hoc DateField thay i d liu), i tng ItemStateListener s c thng bo bng mt thng ip.

72

Bn c th xem thng bo ny nh mt li gi ti phng thc itemStateChanged(). Phng thc ny c th gii m thng ip xem Item thay i nhng g v x l nhng thay i ny nh th no nu cn thit. Lu :StringItem v ImagItem cng l nhng lp con ca Item. Tuy nhin, khi c cp pht, nhng i tng ny l tnh v do khng nhn c thng bo v s kin pht sinh. V d di y s cho php to ra mt TextField v mt StringItem. Bt c khi no ngi dng thay i ni dung ca TextField th ni dung ca StringItem cng b thay i theo: import javax.microedition.lcdui.*; import javax.microedition.midlet.*; public class vd extends MIDlet implements CommandListener, ItemStateListener{ private Display di; private Form fr; private TextField tf; private StringItem st; private Command c1; public vd(){ di=Display.getDisplay(this); fr=new Form("vd"); c1=new Command("exit",Command.EXIT,1); //TextField v StringItem l cc i tng Item tf=new TextField("h tn:","",50,TextField.ANY); st=new StringItem("Xin cho:",""); fr.append(tf); fr.append(st); fr.addCommand(c1); fr.setCommandListener(this); //gn b lng nghe vo form cha Item
73

fr.setItemStateListener(this); } public void startApp(){ di.setCurrent(fr); } public void pauseApp(){ }

public void destroyApp(boolean b){ } public void commandAction(Command com,Displayable db){ if(com==c1){ destroyApp(true); notifyDestroyed(); } } //x l s kin public void itemStateChanged(Item it){ if(it==tf){ st.setText(tf.getString()); } } } cho mi khi TextField thay i ni dung, ni dung ca StringItem cng b thay i th ta phi gn b lng nghe s kin vo TextField: fr.setItemStateListener(this); B lng nghe hay i tng lng nghe s kin y l MIDlet (this) ca chng ta v MIDlet c ci t thc thi giao din ItemStateListener (implements CommandListener, ItemStateListener). Sau tin hnh x l s kin trong phng thc itemStateChanged: public void itemStateChanged(Item it){ if(it==tf){

74

st.setText(tf.getString()); } } Tng t nh x l vi CommandListener, y chng ta cng s dng tham s Item ca phng thc itemStateChanged xc nh i tng Item gy ra s kin vi cu lnh kim tra n gin: if(it==tn_Item){ //on m x l tng ng }

Hnh 2.31: V d s dng ItemStateListener Tr StringItem v ImageItem, cc Item khc u c th nhn bit tng tc vi ngi dng. Khi thm Item vo Form, bn to mt Listener n bt s kin ngi dng (cho tt c cc Item trn Form). Khi c s thay i pht hin, phng thc itemStateChanged() s c gi. Bn trong phng thc ny bn c th xc nh c thay i din ra trn Item no v quyt nh cch x l chng. Khng

75

cn phi gi itemStateChanged() mi khi c thay i din ra. Tuy nhin, n theo nhng quy tc sau: Nu mt Item thay i th itemStateChanged() phi c gi trn Item thay i trc khi thng bo v thay i ca mnh cho nhng Item k tip

Nu mt MIDlet thc hin thay i cho mt Item (theo cch tng t nh tng tc ngi dng) th itemStateChanged() s khng c gi. v d, nu bn vit m bn trong MIDlet thay i gi tr ca DateField, iu ny s khng lm pht sinh s kin.

Nu thit b chy MIDlet c th nhn bit khi ngi dng i chuyn t Item ny sang Item khc (thay i focus), itemStateChanged() s phi c gi khi bt u ri b Item hin hnh trc khi n Item tip theo. phng thc ca ItemStateListener: Phng thc void itemStateChanged(Item item) M t c gi khi Item thay i

2.5.4.5. X l s kin vi cc i tng giao din Cc phn trn gii thiu ti bn cch to ra cc thnh phn giao din v cch x l s kin, chi tit hn, di y gio trnh s a ra cc v d v cch dng cc phng thc ca cc i tng ha v cch x l s kin i vi cc i tng . a) DateField Nh c gii thiu, DateField l mt thnh phn giao din gip bn lm vic vi cc i tng thi gian c trc quan hn. L mt Item, DateField c th dng b lng nghe s kin ItemStateListener, ngoi ra bn cng c th to ra cc nt nhn v s dng cc hm API ca DateField thay i din mo, gi tr ca DateField trong khi x l s kin ca nt nhn. V d di y s gip bn to ra mt ng h bo thc n gin, chng trnh cho php bn chn mc thi gian bo thc thng qua giao din ca DateField, m thanh cnh bo ca i tng Alert s c dng lm m thanh bo thc. c th hn gi bo thc bn cn dng ti i tng nh thi Timer, bn c th tm hiu thm v i tng ny thng qua cc ti liu Java cn bn, hoc cun Java tp 3 ca Phng Lan:

76

import javax.microedition.lcdui.*; import javax.microedition.midlet.*; import java.util.*; import java.util.Timer; import java.util.TimerTask; public class vd extends MIDlet implements CommandListener, ItemStateListener{ Display dis; Form fr; Command c1,c2; DateField d1; Timer timer; TimerA timerA; Date date; int index; public vd(){ dis=Display.getDisplay(this); fr=new Form("bo thc"); c1=new Command("exit",Command.EXIT,1); c2=new Command("Bo thc",Command.SCREEN,2); d1=new DateField("Today:",DateField.DATE_TIME); date=new Date(); d1.setDate(date); fr.addCommand(c1); fr.addCommand(c2); index=fr.append(d1); fr.setCommandListener(this); fr.setItemStateListener(this); } public void startApp(){ dis.setCurrent(fr);

77

} public void pauseApp(){ } public void destroyApp(boolean b){ } public void itemStateChanged(Item i){ if(i==d1){ d1.setLabel("Ngy bo thc:"); } } public void commandAction(Command c,Displayable db){ if(c==c2){ if(d1.getDate().getTime()-date.getTime()>0){ timer=new Timer(); timerA=new TimerA(this); long l; l=d1.getDate().getTime()-date.getTime(); timer.schedule(timerA, l); fr.setTitle("ang chy"); } } else if(c==c1){ destroyApp(false); notifyDestroyed(); } } } class TimerA extends TimerTask{ vd midlet; public TimerA(vd midlet){ this.midlet=midlet;

78

} public final void run(){ Alert a=new Alert("wakeup..."); a.setTimeout(Alert.FOREVER); a.setType(AlertType.ALARM); AlertType.ERROR.playSound(midlet.dis); midlet.dis.setCurrent(a,midlet.fr); midlet.d1.setLabel("Today:"); cancel(); } }

hnh 2.32: v d x l s kin vi DateField Trong v d ny chng ta dng c hai i tng lng nghe s kin l ItemStateListener v CommandListener. Khi ngi dng chn ngy bo thc DateField s c i nhn t "today" sang "ngy bo thc": if(i==d1){ d1.setLabel("Ngy bo thc:"); }

79

Khi ngi dng chn song thi im bo thc s phi nhn vo nt "bo thc" cui mn hnh. V vy, nhim v x l s kin ca nt nhn ny l "hn gi" i tng Alert " chung": public void commandAction(Command c,Displayable db){ if(c==c2){ if(d1.getDate().getTime()-date.getTime()>0){ timer=new Timer(); timerA=new TimerA(this); long l; l=d1.getDate().getTime()-date.getTime(); timer.schedule(timerA, l); fr.setTitle("ang chy"); } } y, b nh thi Timer c xc thi gian ch i, hay thi gian "ng", khng thc hin cng vic g c l tr gia khong thi gian ngi dng chn v thi gian hin thi: l=d1.getDate().getTime()-date.getTime(); Sau khong thi gian ny, cng vic trong phng thc run( ) ca lp TimerA s c kch hot, l vic cho Alert hin th. Lp TimerA c mt thuc tnh chnh l mt i tng ca MIDlet vd, s d n phi c thnh phn ny l bi v n cn truy xut n cc thuc tnh ca MIDlet vd. Nhng x l khc bn c c th t tm hiu. Bn c th s dng cc thuc tnh, phng thc khc ca DateField t to ra nhng v d l th ring cho mnh. b) Gauge Thanh tin trnh l mt thnh phn cn thit cho ng dng ca bn, khi bn mun gi mt thng ip mt cch sinh ng n ngi dng rng "ngi dng cn ch i chng trnh x l bao lu na?", hay "qu trnh x l din ra c bao nhiu phn ri?"... Tuy nhin lm c vic bn cn phi tnh ton c thi gian x l ca h thng, n khng ch ph thuc vo vic vit code ca bn m cn
80

ph thuc vo nhiu yu t khc, v d nh bng thng ca mng nu l mt qu trnh connect hay download... Do v d di y s ch gii thiu vi cc bn cch s dng Gauge trong mt trng hp n gin: Sau mt khong thi gian nht nh gi tr ca Gauge s c tng thm mt con s c nh. Nhng trc khi i vo v d, bn cn nh rng, Gauge cng l mt Item nn bn c th s dng ItemStateListener vi n, nu khng hy s dng CommandListener v nt nhn x l. import java.util.*; import java.util.Timer; import java.util.TimerTask; import javax.microedition.lcdui.*; import javax.microedition.midlet.*; public class vd extends MIDlet implements CommandListener { Display dis; Form fr; Command c1,c2; Gauge g; Timer timer; TimerA timerA; public vd(){ dis=Display.getDisplay(this); fr=new Form("chuong trinh thu gauge"); c1=new Command("exit",Command.EXIT,1); c2=new Command("chay",Command.SCREEN,2); g=new Gauge("running",false,10,1); fr.addCommand(c1); fr.addCommand(c2); fr.append(g); fr.setCommandListener(this); }

81

public void startApp(){ dis.setCurrent(fr); } public void pauseApp(){ } public void destroyApp(boolean b){ } public void commandAction(Command c,Displayable db){ if (c==c1){ destroyApp(true); notifyDestroyed(); } else if(c==c2){ timer=new Timer(); timerA=new TimerA(g); timer.scheduleAtFixedRate(timerA, 0, 100); fr.removeCommand(c2); fr.setTitle("dang chay tien trinh"); } } } class TimerA extends TimerTask{ Gauge g; public TimerA(Gauge g){ this.g=g; } public final void run(){ if(g.getValue()<g.getMaxValue()){ g.setValue(g.getValue()+1); } } }

82

Hnh 2.33: v d x l s kin vi Gauge u tin Gauge c khi to vi gi tr ban u l 10% (xem hnh trn): g=new Gauge("running",false,10,1); Khi ngi dng nhn nt "chy", mt b nh gi c kch hot: public void commandAction(Command c,Displayable db){ if(c==c2){ timer=new Timer(); timerA=new TimerA(g); timer.scheduleAtFixedRate(timerA, 0, 100); fr.removeCommand(c2); fr.setTitle("dang chay tien trinh"); } } Khc vi b nh gi khi dng trong v d ca DateField, b nh gi trong v d ny s cho php ta thc hin i thc hin li cng vic trong phng thc run( ) ca lp TimerA: timer.scheduleAtFixedRate(timerA, 0, 100);
83

Sau mi ln cc lnh trong run( ) c thc hin song, h thng s c thi gian ch l 100 mili - giy trc khi tin hnh chy li, nh thi gian ch ny chng ta mi c th quan st c qu trnh chy ca Gauge. Ta cng cn mt lnh kim sot s v hn ca qu trnh lp trong phng thc run ( ): if(g.getValue()<g.getMaxValue()){ ...} c) TextField Chng ta s cng nhau quay li v d trong phn ItemStateListener ni v cch x l s kin vi TextField. TextField l mt Item cho nn ta hon ton c th dng ItemStateListener vi n. TextField c rt nhiu phng thc x l trc tip cc thng tin ngi dng nhp vo ngay trn nhp thng tin, bn hy th s dng cc phng thc thy c s linh hot ca TextField, cn by gi, chng ta hy lm mt v d n gin vi vic ly li thng tin trn TextField ngay thi im ngi dng nhp vo bng i tng ItemSateListener: import javax.microedition.lcdui.*; import javax.microedition.midlet.*; public class vd extends MIDlet implements CommandListener, ItemStateListener{ private Display di; private Form fr; private TextField tf; private StringItem st; private Command c1; public vd(){ di=Display.getDisplay(this); fr=new Form("vd"); c1=new Command("exit",Command.EXIT,1); tf=new TextField("h tn:","",50,TextField.ANY); st=new StringItem("Xin cho:",""); fr.append(tf);

84

fr.append(st); fr.addCommand(c1); fr.setCommandListener(this); fr.setItemStateListener(this); } public void startApp(){ di.setCurrent(fr); } public void pauseApp(){ }

public void destroyApp(boolean b){ } public void commandAction(Command com,Displayable db){ if(com==c1){ destroyApp(true); notifyDestroyed(); } } public void itemStateChanged(Item it){ if(it==tf){ st.setText(tf.getString()); } } } TextField l mt Item m ItemStateListener l Listener dnh ring cho cc Item, v vy khi TextField c bt c tng tc g t pha ngi dng, n u c n nhn t ItemStateListener. Kt qu, bn s thy l bt c iu g xy ra vi ni dung trong vn bn ca TextField s u c lp li phn Text ca StringItem. d) ChoiceGroup Cng l mt Item, tuy nhin ChoiceGroup c im c bit hn cc thnh phn trn l n khng phi l mt m l mt nhm cc Item, v vy iu chng ta cn

85

quan tm sau khi ngi dng tng tc vi ChoiceGroup l Item - mc chn no ca ChoiceGroup c chn la. tr li cu hi chng ta s cng xem xt v d di y, y l mt chng trnh n gin, vi giao din gm mt ChoiceGroup v mt StringItem, mi khi ngi dng thay i s la chn trn ChoiceGroup, StringItem s hin th tn ca cc Item c chn. Ngoi ra trn ChoiceGroup cn c mt thnh phn c bit, l mt Item cho php "chn tt c", khi Item ny c chn, tt c cc Item khc s c t v trng thi c tch chn: import javax.microedition.lcdui.*; import javax.microedition.midlet.*; public class vd extends MIDlet implements ItemStateListener{ Display dis; Form fr; ChoiceGroup ch; int so; StringItem st; public vd(){ dis=Display.getDisplay(this); fr=new Form("hi you!"); ch=new ChoiceGroup("lua chon",ChoiceGroup.MULTIPLE); ch.append("muc1",null); ch.append("muc2", null); so=ch.append("select all",null); fr.append(ch); st=new StringItem ("Cc mc c chn:",""); fr.append(st); fr.setItemStateListener(this); } public void startApp(){ dis.setCurrent(fr); } public void pauseApp(){ }
86

public void destroyApp(boolean b){ } public void itemStateChanged(Item it){ int i; String t=""; if(it==ch){ if(ch.isSelected(so)){ for (i=0;i<ch.size()-1;i++){ ch.setSelectedIndex(i,true); } } for(i=0;i<ch.size();i++) if(ch.isSelected(i)){ t=t.concat(ch.getString(i)); } st.setText(t); } } } Trong phng thc itemStateChanged chng ta s dng phng thc isSelected(v_tr_Item) ca i tng ChoiceGroup bit c Item v tr xc nh c c chn hay khng?, nu c chn tn ca Item s c thm vo phn vn bn ca StringItem: //vng for duyt mi Item for(i=0;i<ch.size();i++) //Item no c chn th tn ca n s c gn thm //vo mt chui if(ch.isSelected(i)){ t=t.concat(ch.getString(i)); } //StringItem c thay i phn Text st.setText(t);

87

} x l Item "chn tt c", u tin chng ta cn phi lu v tr ca Item ny li: so=ch.append("select all",null); Sau , dng phng thc isSelected(v_tr_Item) kim tra xem Item ny c c chn khng?, nu c chn, ta dng phng thc setSelectedIndex(v_tr_Item, true) vi tt c cc Item ca ChoiceGroup t trng thi c chn cho mi Item: if(ch.isSelected(so)){ for (i=0;i<ch.size()-1;i++){ ch.setSelectedIndex(i,true); } }

Hnh 2.34: v d x l s kin vi ChoiceGroup e) List List khng ging cc thnh phn gii thiu trn, List khng phi l mt Item, do ta ch c th dng b lng nghe CommandListener vi List. Vy dng CommandListener vi List nh th no?, chng ta s cng xt v d di y vi mt List khng tng minh:

88

import javax.microedition.lcdui.*; import javax.microedition.midlet.*; import java.io.IOException; public class vd extends MIDlet implements CommandListener{ Display dis; List li; Command c1; public vd(){ dis=Display.getDisplay(this); li=new List("list",List.IMPLICIT); li.append("muc1",null); li.append("muc2",null); li.append("muc3",null); li.append("muc4",null); li.append("muc5",null); c1=new Command("exit",Command.EXIT,1); li.addCommand(c1); li.setCommandListener(this); } public void startApp() { dis.setCurrent(li); } public void pauseApp(){ } public void destroyApp(boolean b){ } public void commandAction(Command c,Displayable db){ boolean b[]=new boolean[li.size()]; int i; if(c==c1){ destroyApp(true); notifyDestroyed(); }

89

else if(c==li.SELECT_COMMAND){ switch(li.getSelectedIndex()){ case 0: System.out.println("muc 1");break; case 1: System.out.println("muc 2");break; case 2: System.out.println("muc 3");break; case 3: System.out.println("muc 4");break; case 4: System.out.println("muc 5");break; } } } } V d ny cng khng c g c bit, chng ta ch n gin l a ra mn hnh output ca netbeans tn ca thnh phn trong List c la chn. lm c vic , trong phng thc ci commandAction ta phi kim tra xem c phi List gy ra s kin khng: if(c==li.SELECT_COMMAND) V l Listener ca cc Command nn y ta phi dng thuc tnh tnh SELECT_COMMAND vi kiu tr v l mt Command ca List kim tra thnh phn no ca List c chn. Sau ta ch cn hin th tn ca thnh phn ln l c: switch(li.getSelectedIndex()){ case 0: System.out.println("muc 1");break; case 1: System.out.println("muc 2");break; case 2: System.out.println("muc 3");break; case 3: System.out.println("muc 4");break; case 4: System.out.println("muc 5");break; } Trong hm getSelectedIndex() s tr v ch s ca thnh phn List c ngi dng chn la.

90

Hnh 2.35: V d x l s kin vi List f) Alert Alert, Ticker l cc thnh phn n gin, nhng chng cng ch c th x l s kin thng qua CommandListener. Di y s l v d to ra mt giao din vi mt vi nt nhn, mi nt nhn s cho ta hin th cc Alert vi m thanh khc nhau: import javax.microedition.lcdui.*; import javax.microedition.midlet.*; public class vd extends MIDlet implements CommandListener{ Display dis; Form fr; Command c1,c2,c3,c4; Alert a; ChoiceGroup ch; public vd(){ dis=Display.getDisplay(this); fr=new Form("vd Alert"); c1=new Command("exit",Command.EXIT,1); c2=new Command("Infor",Command.SCREEN,2); c3=new Command("Error",Command.SCREEN,3); c4=new Command("Alarm",Command.SCREEN,4);

91

a=new Alert("vd","ban dang su dung alert",null,AlertType.ALARM); fr.addCommand(c1); fr.addCommand(c2); fr.addCommand(c3); fr.addCommand(c4); fr.setCommandListener(this); } public void startApp(){ dis.setCurrent(fr); } public void pauseApp(){ } public void destroyApp(boolean b){ } public void commandAction(Command com,Displayable db){ StringItem it; int so; String str; if(com==c1){ destroyApp(true); notifyDestroyed(); } else if(com==c2){ dis.setCurrent(a, fr); AlertType.INFO.playSound(dis); } else if(com==c3){ dis.setCurrent(a, fr); AlertType.ERROR.playSound(dis); } else
92

if(com==c4){ dis.setCurrent(a, fr); AlertType.ALARM.playSound(dis); } } }

hnh 2.36: v d x l s kin vi Alert g) Ticker Bn hy nh Ticker khng phi l mt Item, v vy bn hy dng CommandAction x l s kin vi Ticker. Di y l mt v d n gin, to ra mt giao din vi mt Ticker v mt nt nhn, khi bn nhn nt nhn dng thng tin ca Ticker s b thay i: import javax.microedition.lcdui.*; import javax.microedition.midlet.*; public class vd extends MIDlet implements CommandListener{ private Display di; private Form fr; private Command c1,c2; private Ticker tk;

93

public vd(){ di=Display.getDisplay(this); fr=new Form("vd "); c1=new Command("exit",Command.EXIT,1); c2=new Command("change",Command.SCREEN,2); tk=new Ticker("day la dong thong tin"); fr.addCommand(c1); fr.addCommand(c2); fr.setTicker(tk); fr.setCommandListener(this); } public void startApp(){ di.setCurrent(fr); } public void pauseApp(){ } public void destroyApp(boolean b){ } public void commandAction(Command com,Displayable db){ if(com==c1){ destroyApp(true); notifyDestroyed(); } else if(com==c2){ tk.setString("doi thanh dong nay..."); } } }

94

Hnh 2.37: V d x l s kin vi Ticker

2.6. Giao din ngi dng cp thp


2.6.1. Cc hm API mc thp Mc d cc hm API cp cao cung cp mt tp y cc thnh phn xy dng giao din ng dng ngi dng. Tuy nhin cc thnh phn cp cao khng cung cp phng tin v ln mn hnh. V thiu kh nng ny nn cc ng dng c to ra s gp nhiu gii hn. Nu cc hm API cp cao cho php chng ta to ra giao din cho cc ng dng theo chun, th cc hm API cp thp cho php chng ta c th th hin cc tng ca mnh. Canvas v Graphics l 2 lp tri tim ca cc hm API cp thp. Bn s lm tt c cc cng vic bng tay. Canvas l mt khung v cho php ngi pht trin c kh nng v ln mn hnh thit b cng nh l vic x l s kin. Cn lp Graphics cung cp cc cng c tht s v nh drawRoundRect() v drawString().

95

2.6.2. Lp Canvas Lp Canvas cung cp mt khung v cho php to ra giao din ty bin ngi dng. Mt s lng ln cc phng thc trong lp ny c dng x l s kin, v nh v chui ln thit b hin th. Trong phn ny chng ta s lm quen vi cc khi nim: H thng ta To i tng Canvas V ln trn i tng Canvas X l cc s kin hnh ng X l cc s kin phm nhn X l s kin hnh ng ca Game X l s kin con tr a) H thng trc ta Mc tiu u tin ca chng ta l lm quen vi h thng trc ta lm vic vi mn hnh thit b. H thng ta cho lp Canvas c tm ta l im tri trn ca mn hnh thit b. Gi tr x tng dn v pha phi, gi tr y tng dn khi i xung pha di. Khi v dy bt v l mt im nh Cc phng thc sau y s gip xc nh chiu rng v chiu cao ca canvas: int getWidth(): xc nh chiu rng ca canvas int getHeight (): xc nh chiu cao ca canvas Chiu rng v chiu cao ca Canvas cng i din cho ton b din tch khung v c th trn mn hnh thit b. Ni cch khc, bn khng th ch nh kch thc cho canvas, m phn mm trn mt thit b MIDP s tr v din tch ln nht c th c i vi mt thit b cho trc. b) To mt i tng Canvas Bc u tin lm vic vi mt lp Canvas l to ra mt lp tha k t lp Canvas: class TestCanvas extends Canvas{ display = Display.getDisplay(this); protected void paint(Graphics g) {
96

// cc thao tc v } } V Canvas khai bo phng thc paint( ) l mt phng thc tru tng, cho nn, bt c khi no to dn xut con t Canvas, chng ta phi ci t phng thc ny. c) V trn i tng Canvas Phng thc paint ca lp Canvas cho php bn v cc hnh dng, v nh, xut chui. Phng thc ny lun c chuyn mt tham chiu n i tng ha Graphics, chng ta ch yu s s dng i tng ny v trn Canvas. on m sau minh ha vic xa mn hnh th hin bng mt mu trng: protected void paint(Graphics g) { // To mu nn cho khung v l mu trng g.setColor(255, 255, 255); // v trn Canvas g.fillRect(0, 0, getWidth(), getHeight()); } d) S kin hnh ng Vi i tng Canvas, s kin c th xy ra khi ngi dng tng tc vi m phm, con tr v cng nh cc thnh phn Form, List, v TextBox, mt Canvas c th x l cc s Command. Chng ta c th x l cc s kin Command trn thnh phn Canvas cng cch nh cc thnh phn khc. on m sau minh ha vic x l s kin Command trn thnh phn Canvas: class TestCanvas extends Canvas implements CommandListener{ private Command cmdExit; display = Display.getDisplay(this); cmdExit = new Command("Exit", Command.EXIT, 1); addCommand(cmdExit); setCommandListener(this); protected void paint(Graphics g){

97

// V trn canvas } public void commandAction(Command c, Displayable d){ if (c == cmdExit){} } } e) M phm M phm l nhng gi tr s nh x trc tip vo mt phm trn thit b di ng. M phm lun c trn bt k MIDP no c lit k trong bng di y. Nhng m ny tng ng vi ITU-T keypad l tiu chun bn phm cho in thoi. Tn m phm KEY_NUM0 KEY_NUM1 KEY_NUM2 KEY_NUM3 KEY_NUM4 KEY_NUM5 KEY_NUM6 KEY_NUM7 KEY_NUM8 KEY_NUM9 KEY_STAR KEY_POUND Gi tr hng 48 49 50 51 52 53 54 55 56 57 42 35

Nm phng thc x l cc m phm l: void keyPressed(int keyCode): c gi khi mt phm c nhn void keyReleased(int keyCode): c gi khi mt phm c th ra void keyRepeated(int keyCode): c gi khi lp phm boolean hasRepeatEvents(): Kim tra s kin phm c c lp khng String getKeyName(int keyCode): Chui vn bn i din m phm v d v s dng m phm v cc phng thc x l m phm: import javax.microedition.lcdui.*; import javax.microedition.midlet.*;

98

public class vd extends MIDlet{ Display dis; vd1 canvas; public vd(){ super(); dis=Display.getDisplay(this); canvas=new vd1(this); } protected void startApp() throws MIDletStateChangeException { dis.setCurrent(canvas); } protected void pauseApp(){ } protected void destroyApp(boolean b){ } public void exit(){ destroyApp(true); notifyDestroyed(); } public void paint(Graphics g){ g.setColor(128,2,255); g.fillRect(0, 0, canvas.getWidth(), canvas.getHeight()); g.setColor(255,255,255); g.drawString(canvas.str, 5, 5, Graphics.TOP|Graphics.LEFT); } } //lp Canvas class vd1 extends Canvas implements CommandListener{ vd midlet; Command c1; String str=""; public vd1(vd midlet){ this.midlet=midlet;

99

c1=new Command("exit",Command.EXIT,1); addCommand(c1); setCommandListener(this); } void init(){ } void destroy(){ } protected void paint(Graphics g){ midlet.paint(g); } public void commandAction(Command c,Displayable db){ if(c==c1) midlet.exit(); } protected void keyPressed(int code){ str=getKeyName(code); repaint(); } protected void keyRepeated(int key){ str=" repeat "; repaint(); } }

100

Hnh 2.38: V d v x l m phm Bn thy rng vic v trn Canvas khng c g kh khn c, bn ch cn v tt c mi th bn mun trong phng thc paint vi i tng ha Graphics, cn vic v cc i tng nh th no, bn s c hc trong cc phn di y. Vic x l s kin y cng rt d hiu, bn mun x l s kin khi ngi dng nhn phm hay nh phm... hy vit m trong phng thc tng ng vi s kin : protected void keyPressed(int code){ str=getKeyName(code); repaint(); } protected void keyRepeated(int key){ str=" repeat "; repaint(); } Cc phng thc ny l cc phng thc c sn, bn ch vic ci n, ging nh bn ci phng thc commandAction ca CommandListener.

101

f) Cc hnh ng trong x l cc tr chi MIDP thng c s dng to cc tr chi trn nn Java. Cc hng s sau c nh ngha x l cc s kin c lin quan n tr chi trong MIDP: UP: Di chuyn ln DOWN: Di chuyn xung LEFT: Sang tri RIGHT: Sang phi FIRE: Hnh ng GAME_A: Ty bin GAME_B: Ty bin GAME_C: Ty bin GAME_D: Ty bin Ni mt cch n gin th cc gi tr ny c nh x thnh cc phm mi tn ch hng ca thit b, nhng khng phi tt c cc thit b di ng u c nhng gi tr ny. Nu mt thit b di ng thiu cc phm mi tn th cc hnh ng ca tr chi s c nh x vo cc nt bm, v d phm tri c nh x vo phm s 2, phm phi c nh x vo phm s 5, v c tip tc nh th. Cc phng thc lm vic vi nhng hot ng tr chi: int getKeycode(int gameAction): Xc nh m phm cho mt hot ng int getGameAction(int keycode): Ly v hot ng tr chi, nu c, cho m phm String getKeyName(int keycode): Ly v tn m phm g) Xc nh cc hnh ng ca tr chi on m sau y m t mt cch xc nh cc hnh ng ca tr chi t gi cc phng thc thch hp da trn cc hnh ng xy ra: protected void keyPressed(int keyCode) { switch (getGameAction(keyCode)){ case Canvas.FIRE: shoot();
102

break; case Canvas.RIGHT: goRight(); break; ... } } Mt la chn na l c th to mt tham chiu cho mi hnh ng ca tr chi thng qua qu trnh khi to gi tr cho cc bin: // khi to keyFire = getKeyCode(FIRE); keyRight = getKeyCode(RIGHT); keyLeft = getKeyCode(LEFT); protected void keyPressed(int keyCode){ if (keyCode == keyFire) shoot(); else if (keyCode == keyRight) goRight() ... } on m di y minh ha mt s chc nng ca Canvas v cch x l phm: import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class KeyMapping extends MIDlet{ private Display display; private KeyCodeCanvas canvas; public KeyMapping(){ display = Display.getDisplay(this); canvas = new KeyCodeCanvas(this); }

103

protected void startApp(){ display.setCurrent( canvas ); } protected void pauseApp(){ } protected void destroyApp( boolean unconditional ){ } public void exitMIDlet(){ destroyApp(true); notifyDestroyed(); } } class KeyCodeCanvas extends Canvas implements CommandListener{ private Command cmExit; private String keyText = null; private KeyMapping midlet; public KeyCodeCanvas(KeyMapping midlet) { this.midlet = midlet; cmExit = new Command("Exit", Command.EXIT, 1); addCommand(cmExit); setCommandListener(this); } protected void paint(Graphics g) { g.setColor(255, 255, 255); g.fillRect(0, 0, getWidth(), getHeight()); if (keyText != null) { g.setColor(0, 0, 0); g.drawString(keyText, getWidth()/2, getHeight()/2, Graphics.TOP | Graphics.HCENTER); } } public void commandAction(Command c, Displayable d) { if (c == cmExit)

104

midlet.exitMIDlet(); } protected void keyPressed(int keyCode) { keyText = getKeyName(keyCode); repaint(); } }

Hnh 2.39: V d v x l phm h) S kin con tr Trong phn ny chng ta s qun l s kin con tr trong mt Canvas. Nhng s kin ny c thit k lm thun tin cho vic tng tc vi cc thit b c dng con tr. Mt s phng thc c cung cp nhm h tr cho vic x l s kin con tr: boolean hasPointerEvents(): Thit b c h tr con tr hay khng boolean hasPointerMotionEvents(): Con tr h tr s kin hay khng void pointerPressed(int x, int y): c gi khi ko con tr
105

void pointerReleased(int x, int y): c gi khi con tr nhn void pointerDragged(int x, int y): c gi khi con tr th ra Cc phng thc trn c th t gii thch chc nng thng qua tn ca chnh mnh. Phng thc hasPointerMotionEvents() tr v mt gi tr c kiu boolean nhm ch r rng thit b di ng c h tr khi nim nhp chut v r hay khng. on chng trnh di y minh ha vic s dng cc s kin con tr thc hin mt chng trnh v n gin: import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class vd extends MIDlet { private Display display; private ScratchPadCanvas canvas; public vd() { display = Display.getDisplay(this); canvas = new ScratchPadCanvas(this); } protected void startApp() { display.setCurrent( canvas ); } protected void pauseApp( ){ } protected void destroyApp( boolean unconditional ){ } public void exitMIDlet(){ destroyApp(true); notifyDestroyed(); } } class ScratchPadCanvas extends Canvas implements CommandListener { private Command cmExit; private Command cmClear; private int startx = 0, starty = 0, currentx = 0, currenty = 0;
106

private vd midlet; private boolean clearDisplay = true; public ScratchPadCanvas(vd midlet) { this.midlet = midlet; cmExit = new Command("Exit", Command.EXIT, 1); cmClear = new Command("Clear", Command.SCREEN, 1); addCommand(cmExit); addCommand(cmClear); setCommandListener(this); } protected void paint(Graphics g) { // Xa mn hnh if (clearDisplay) { g.setColor(255, 255, 255); g.fillRect(0, 0, getWidth(), getHeight()); clearDisplay = false; startx = currentx = starty = currenty = 0; return; } g.setColor(0, 0, 0); g.drawLine(startx, starty, currentx, currenty); startx = currentx; starty = currenty; } public void commandAction(Command c, Displayable d) { if (c == cmExit) midlet.exitMIDlet(); else if (c == cmClear) { clearDisplay = true; repaint(); } }

107

protected void pointerPressed(int x, int y) { startx = x; starty = y; } protected void pointerDragged(int x, int y) { currentx = x; currenty = y; repaint(); } }

Hnh 2.40: V d v chng trnh v trn in thoi 2.6.3. Lp Graphics Chng ta s dng i tng Graphics v ln mt Canvas. a) H tr mu Mt ng dng MIDP ch c mt i tng Display. i tng ny uc dng ly thng tin ca mn hnh hin th hin ti, v d nh s mu h tr v
108

cc phng thc yu cu cc i tng c hin th. i tng Display n gin l mt b qun l s hin th ca thit b v iu khin nhng g s c hin th ra trn thit b. boolean isColor() int numColors() Phng thc u tin cho bit thit b c h tr hin th mu hay khng. Nu c th phng thc th 2 s c gi xc nh s mu c h tr. Cc phng thc tip theo di y ly v mu v thit lp mu a thch ca bn. void setColor(int RGB): t mu bng cch kt hp cc thnh phn mu c bn vo trong gi tr s nguyn void setColor(int red, int green, int blue): t mu ch nh bi tng thnh phn mu int getColor(): Ly v mu hin thi int getBlueComponent(): Ly v thnh phn gi tr xanh dng ca mu int getGreenComponent():Ly v thnh phn gi tr xanh l cy ca mu int getRedComponent():Ly v thnh phn gi tr ca mu void setGrayScale(int value): Ly v thnh phn gi tr xm ca mu int getGrayScale():Ly v thnh phn gi tr xm ca mu Ch bn c th xc nh mu bng 2 cch. Cch 1: bn c th xc nh mt s nguyn i din cho 3 gi tr ca mu l , xanh l cy v xanh dng vi 8 bit cho mi mu. Hay cch 2 l bn c th dng tng tham s ring bit xc nh mi mu. Khi s dng mt gi tr lu gi mu, th mu s chim 8 bit u k t bn tri, tip theo l 8 bit dnh cho mu xanh l cy, sau cng l mu xanh dng. Di y s hng dn bn cch thit lp mu ch s dng mt s nguyn: int red = 0, green = 128, blue = 255; ... g.setColor((red << 16) | (green << 8) | blue);

109

V bn c th xc nh mu bng cch thit lp gi tr cho 3 tham s: g.setColor(red, green, blue); b) Loi nt v Bn c th chn nt khi v ng thng, cung v hnh ch nht trn thit b hin th. Di y l cc phng thc dng thit lp loi nt v: int getStrokeStyle(): Ly v kiu nt v void setStrokeStyle(int style): t kiu nt v Hai kiu nt v c nh ngha trong lp Graphics l nt chm, v nt lin: g.setStrokeStyle(Graphics.DOTTED); g.setStrokeStyle(Graphics.SOLID); c) V cung Khi v mt cung, bn c th v n ch c ng bao xung quanh hay yu cu n c t bn trong. Bn c th bt u bng cch ch nh chiu bao quanh bn ngoi ca mt hnh hp ch nht tng tng. Gc bt u xc nh v tr bt u v khung, vi gi tr 0 c xc nh ti thi im 3 gi. Gi tr dng tnh theo ngc chiu kim ng h. Gc ca cung ch ra rng c bao nhiu c v tnh t gc ban u, i theo ngc chiu kim ng h. hiu r nhng phn ny chng ta hy cng xem1 v d sau: g.drawArc(10, 10, 100, 100, 0, 150); on m trn yu cu v mt cung, cung ny c bao bi mt hnh ch nht c ta im tri trn l (10, 10), chiu rng v chiu di l 100, gc bt u l 0, gc kt thc l 150. Mt s cc phng thc dng v cung: void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle): V vng cung vin ngoi void fillArc(int x, int y, int width, int height, int startAngle, int arcAngle): V vng cung t y Di y l on m minh ha vic s dng cc hm trn v mt cung: import javax.microedition.midlet.*;
110

import javax.microedition.lcdui.*; public class DrawShapes extends MIDlet { private Display display; private ShapesCanvas canvas; public DrawShapes() { display = Display.getDisplay(this); canvas = new ShapesCanvas(this); } protected void startApp() { display.setCurrent( canvas ); } protected void pauseApp() {} protected void destroyApp( boolean unconditional ) {} public void exitMIDlet() { destroyApp(true); notifyDestroyed(); } } class ShapesCanvas extends Canvas implements CommandListener { private Command cmExit; private DrawShapes midlet; public ShapesCanvas(DrawShapes midlet) { this.midlet = midlet;

111

cmExit = new Command("Exit", Command.EXIT, 1); addCommand(cmExit); setCommandListener(this); } protected void paint(Graphics g) { g.setColor(255, 255, 255); g.fillRect(0, 0, getWidth(), getHeight()); g.setColor(0, 0, 0); g.drawArc(10, 10, 100, 100, 0, 150); // g.fillArc(10, 10, 100, 100, 0, 150); // Start at 12 o'clock and rotate 150 degrees // g.drawArc(10, 10, 100, 100, 90, 150); // Change the size of the bounding box // Start at 12 o'clock and rotate 150 degrees // g.drawArc(15, 45, 30, 70, 90, 150); } public void commandAction(Command c, Displayable d) { if (c == cmExit) midlet.exitMIDlet(); } }

112

Hnh 2.41: V d v cung d) V hnh ch nht Cng ging nh cung th hnh ch nht c th ch c v vin bao quanh hoc t bn trong. Bn cnh bn c th v hnh ch nht c 4 gc l trn hoc l vung. Di y l mt s phng thc v hnh ch nht: void drawRect(int x, int y, int width, int height): V mt hnh ch nht void drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight): V mt hnh ch nht c gc bu void fillRect(int x, int y, int width, int height): T y mt hnh ch nht void fillRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight): T y mt hnh ch nht bu Khi v hnh ch nht c 4 gc l trn th bn phi xc nh ng knh theo chiu ngang(arcWidth) v ng knh theo chiu dc(arcHeight). Nhng tham s ny c nh ngha sc nt ca cung theo mi chiu. Gi tr cng ln th hin mt cung tng dn, ngc li l mt ng cong hp.

113

e) Font ch Phn sau y cng quan trng khng km l cch s dng font ch c h tr bi giao din cp thp ca ng dng MIDP. Sau y l mt s cc phng thc dng ca lp Font: Font getFont(int face, int style, int size): To Font Font getFont(int fontSpecifier) Font getDefaultFont(): Ly v Font h thng Mt s thuc tnh ca lp Font : FACE_SYSTEM: K t h thng FACE_MONOSPACE: K t mn FACE_PROPORTIONAL: K t co gin STYLE_PLAIN: Kiu ch thng STYLE_BOLD: Kiu ch in m STYLE_ITALIC: Kiu ch in nghing STYLE_UNDERLINED: Kiu ch gch chn SIZE_SMALL: Kch thc ch nh SIZE_MEDIUM: Kch thc ch trung bnh SIZE_LARGE: Kch thc ch ln Cc tham s kiu dng c th c kt hp thng qua ton t hay. V d: Font font = Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_BOLD | Font.STYLE_ITALIC, Font.SIZE_MEDIUM); Sau khi bn c mt tham chiu n mt i tng Font, bn c th truy vn n xc nh thng tin ca cc thuc tnh ca n : int getFace(): Ly v tn Font int getStyle(): Ly v kiu Font int getSize(): Ly v c Font boolean isPlain(): Xc nh kiu ch thng boolean isBold(): Xc nh kiu ch m boolean isItalic(): Xc nh kiu ch nghing boolean isUnderlined(): Xc nh kiu ch gch chn
114

Kch thc ca cc font ch c xc nh bi chiu cao ca font ch, b di tnh bng im nh ca mt chui k t trong mt font xc nh. Mt s cc phng thc sau h tr khi tng tc vi mt i tng font: int getHeight() int getBaselinePosition() int charWidth(char ch) int charsWidth(char[] ch, int offset, int length) int stringWidth(String str) int substringWidth(String str, int offset, int length)

f) im neo
xc nh ta x, y ca chui k t c hin th, th im neo cho php bn ch ra v tr mun t ta x, y trn hnh ch nht bao quanh chui k t. C 6 im neo c nh ngha trc, 3 theo chiu dc v 3 theo chiu thng ng, khi xc nh im neo v chui (cc im neo thng c s dng thnh tng cp), bn phi chn mt im honh v mt im tung . Cc im neo c nh ngha nh di y: Chiu ngang LEFT (Bn tri) HCENTER (Chnh gia ca chiu ngang) RIGHT (Bn phi) Chiu dc TOP ( trn) BASELINE (ng thng c s) BOTTOM ( di) Khi s dng im neo th bn cn phi ch ra ta x, y ca hnh ch nht bao quanh. V d: g.drawString("developerWorks", 0, 0 , Graphics.TOP | Graphics.LEFT); Bng cch thay i im neo, chng ta c th thay i v tr hin th ca chui k t trn thit b di ng. V d tip theo chng ta s minh ha tip khi thay i im neo th v tr ca chui k t cng thay i theo:
115

g.drawString("developerWorks", 0, 0 , Graphics.TOP | Graphics.HCENTER); g) V cc chui k t Sau khi tm hiu v font v cc im neo, bn c th v chui k t ra mn hnh thng qua mt s cc phng thc sau: void drawChar(char character, int x, int y, int anchor): V mt k t void drawChars(char[] data, int offset, int length, int x, int y, int anchor): V mt mng ca k t void drawString(String str, int x, int y, int anchor): V chui void drawSubstring(String str, int offset, int len, int x, int y, int anchor): V chui con V d: protected void paint(Graphics g) { int xcenter = getWidth() / 2, ycenter = getHeight() / 2; g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_ITALICS, Font.SIZE_MEDIUM)); g.drawString("developerWorks", xcenter, ycenter, Graphics.BASELINE | Graphics.HCENTER); } Tip theo l v d minh ha vic s dung font v xut chui ra thit b hin th: import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class FontViewer extends MIDlet { protected Display display; protected PrefsForm fmPrefs; protected FontCanvas cvFont; public FontViewer() { display = Display.getDisplay(this); cvFont = new FontCanvas(this); fmPrefs = new PrefsForm("Preferences", this); } protected void startApp(){
116

showCanvas(); } protected void showCanvas() { display.setCurrent(cvFont); } protected void pauseApp() { } protected void destroyApp( boolean unconditional ){ } public void exitMIDlet() { destroyApp(true); notifyDestroyed(); } } //lp FontCanvas import javax.microedition.lcdui.*; class FontCanvas extends Canvas implements CommandListener { private int face, style, size; private String text = "developerWorks"; private Command cmExit; private Command cmPrefs; private FontViewer midlet; public FontCanvas(FontViewer midlet) { this.midlet = midlet; cmExit = new Command("Exit", Command.EXIT, 1); cmPrefs = new Command("Prefs", Command.SCREEN, 2); addCommand(cmExit); addCommand(cmPrefs); setCommandListener(this); } protected void paint(Graphics g){ g.setColor(255, 255, 255);

117

g.fillRect(0, 0, getWidth(), getHeight()); g.setColor(0, 0, 0); g.setFont(Font.getFont(face, style, size)); g.drawString(text, getWidth() / 2, getHeight() / 2, Graphics.BASELINE | Graphics.HCENTER); } protected void setFace(int face) { this.face = face; } protected void setStyle(int style) { this.style = style; } protected void setSize(int size) { this.size = size; } public void setText(String text) { this.text = text; } public int getFace() { return face; } public int getStyle() { return style; } public int getSize() { return size; } public void commandAction(Command c, Displayable d) { if (c == cmExit) midlet.exitMIDlet(); else if (c == cmPrefs) midlet.display.setCurrent(midlet.fmPrefs);

118

} } //lp PrefsForm import javax.microedition.lcdui.*; public class PrefsForm extends Form implements CommandListener, ItemStateListener { private FontViewer midlet; private Command cmBack, cmSave; protected ChoiceGroup cgFace, cgStyle, cgSize; protected TextField tfText; private int face = 0, style = 0, size = 0; private String text = null; public PrefsForm(String title, FontViewer midlet) { super(title); this.midlet = midlet; cmSave = new Command("Save", Command.SCREEN, 1); cmBack = new Command("Back", Command.BACK, 2); cgFace = new ChoiceGroup("Face Options", Choice.EXCLUSIVE); cgFace.append("System", null); cgFace.append("Monospace", null); cgFace.append("Proportional", null); cgStyle = new ChoiceGroup("Style Options", Choice.MULTIPLE); cgStyle.append("Plain", null); cgStyle.append("Bold", null); cgStyle.append("Italic", null); cgStyle.append("Underlined", null); cgSize = new ChoiceGroup("Size Options", Choice.EXCLUSIVE); cgSize.append("Small", null); cgSize.append("Medium", null); cgSize.append("Large", null);

119

tfText = new TextField("", "developerWorks", 20, TextField.ANY); append(cgFace); append(cgStyle); append(cgSize); append(tfText); addCommand(cmSave); addCommand(cmBack); setCommandListener(this); setItemStateListener(this); } public void commandAction(Command c, Displayable s) { if (c == cmSave) { midlet.cvFont.setFace(face); midlet.cvFont.setStyle(style); midlet.cvFont.setSize(size); midlet.cvFont.setText(tfText.getString() != null ? tfText.getString() : "developerWorks"); } midlet.showCanvas(); } public void itemStateChanged(Item item) { if (item == cgFace) { switch (cgFace.getSelectedIndex()) { case 0: face = Font.FACE_SYSTEM; break; case 1: face = Font.FACE_MONOSPACE; break; case 2: face = Font.FACE_PROPORTIONAL;

120

break; } } else if (item == cgStyle) { boolean[] b = new boolean[4]; cgStyle.getSelectedFlags(b); style = 0; if (b[1]) style = Font.STYLE_BOLD; if (b[2]) style |= Font.STYLE_ITALIC; if (b[3]) style |= Font.STYLE_UNDERLINED; } else if (item == cgSize) { switch (cgSize.getSelectedIndex()) { case 0: size = Font.SIZE_SMALL; break; case 1: size = Font.SIZE_MEDIUM; break; case 2:size = Font.SIZE_LARGE; break; } } else if (item == tfText) { text = tfText.getString(); } } }

121

Hnh 2.42: V d v Font h) V nh Lp Graphics cung cp 1 phng thc dng v nh: drawImage(Image img, int x, int y, int anchor) Chng ta cng p dng tng bc khi v nh cng ging nh khi xut chui ra mn hnh. i vi c 2 th chng ta u phi bt u bng vic thit lp ta x, y cng nh im neo. Danh sch cc im neo cho vic hin th nh cng khng khc my so vi vic xut chui, tuy nhin khng ging vi vic xut chui th mt bc nh c mt im trung tm. V th VCENTER c thay th cho gi tr BASELINE khi lm vic vi nh : Chiu ngang LEFT (Bn tri) HCENTER (im chnh gia theo chiu ngang) RIGHT (Bn phi) Chiu dc TOP (im trn)

122

VCENTER (im chnh gia theo chiu dc) BOTTOM (Bn di) Trong cc phn trc, chng ta to ra cc ng dng MIDP cho vic trnh by mt tm nh c t mt ngun ti nguyn l mt tp tin. Loi nh ny khng cho php thay i, v v vy cn c bit vi tn l nh khng th thay i. i vi v d sau y, chng ta s to ra mt tm nh t nhng ng tp nham, chng ta s cp pht b nh cho tm nh, ly tham chiu n mt i tng Graphics, v chng ta s t v ni dung tm nh. Loi nh ny cn c bit vi mt ci tn l nh c th bin thay i c : import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class DrawImage extends MIDlet { private Display display; private ImageCanvas canvas; public DrawImage(){ display = Display.getDisplay(this); canvas = new ImageCanvas(this); } protected void startApp() { display.setCurrent( canvas ); } protected void pauseApp() { } protected void destroyApp( boolean unconditional ){ } public void exitMIDlet() { destroyApp(true); notifyDestroyed(); } } //lp ImageCanvas class ImageCanvas extends Canvas implements CommandListener { private Command cmExit;
123

private DrawImage midlet; private Image im = null; private String message = "developerWorks"; public ImageCanvas(DrawImage midlet) { this.midlet = midlet; cmExit = new Command("Exit", Command.EXIT, 1); addCommand(cmExit); setCommandListener(this); try { im = Image.createImage(100, 20); Graphics graphics = im.getGraphics(); Font font = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_MEDIUM); graphics.setFont(font); graphics.setColor(0, 0, 255); graphics.fillRoundRect(0,0, im.getWidth()-1, im.getHeight()-1, 20, 20); graphics.setColor(255, 255, 255); graphics.drawString(message, (im.getWidth() / 2) - (font.stringWidth(message) / 2), (im.getHeight() / 2) - (font.getHeight() / 2), Graphics.TOP | Graphics.LEFT); } catch (Exception e) { System.err.println("Error during image creation"); } } protected void paint(Graphics g) { g.setColor(255, 255, 255); g.fillRect(0, 0, getWidth(), getHeight()); if (im != null) g.drawImage(im, getWidth() / 2, getHeight() / 2, Graphics.VCENTER | Graphics.HCENTER);

124

} public void commandAction(Command c, Displayable d) { if (c == cmExit) midlet.exitMIDlet(); } }

Hnh 2.43: V d v v nh i) Mt s cc phng thc khc ca lp Graphics clip() v translate() l 2 phng thc ca lp Graphics. Mt vng hin th c ct xn c nh ngha l khu vc hin th ca thit b di ng, vng ny s c cp nht trong sut thao tc v li. Di y l mt s phng thc h tr cho vic xn mt vng hin th : void setClip(int x, int y, int width, int height) void clipRect(int x, int y, int width, int height) int getClipX() int getClipY()

125

int getClipWidth() int getClipHeight() translate() l mt phng thc c s dng c lin quan n h thng trc ta . Chng ta c th tnh tin h trc ta n mt im x, y khc. Mt s phng thc h tr cho vic tnh tin h trc ta : void translate(int x, int y) int getTranslateX() int getTranslateY() k ) Cc hm API dng lp trnh Game Cc hm API dnh lp trnh Game c gii thiu trong bn MIDP 2.0, nhng hm ny l phng tin pht trin game vi nhiu phn ha. Cc hm API dnh cho Game l mt phn ca gi javax.microedition.lcdui.game. Lp GameCanvas gn nh ging lp Canvas, GameCanvas cung cp nn tng to giao din ngi dng, nhng trong trng hp ny ch cho vic to games. GameCanvas cha mt vng nh tch ri vi vng nh mn hnh cho mi th hin v cung cp cc phng tin tch hp xc nh tnh trng cc phm tr chi. Di y l lp GameCanvas: public abstract class GameCanvas extends Canvas Layer l mt lp tru tng c s dng th hin mt i tng trc quan trong mt tr chi. Sprite l mt lp con ca lp Layer, lp ny c cung cp th hin cho mt bc nh. Ngoi ra Sprite cn c th bao gm mt dy cc khung nh. thc hin kh nng chuyn ng, cc khung nh c th hin theo mt th t to hiu ng di chuyn nh. Cc php bin i nh l php quay v php lt nh c th c p dng i vi mt i tng Sprite. Di y l m t cho 2 lp Layer v Sprite: public abstract class Layer extends Object public class Sprite extends Layer TiledLayer l mt lp tng t nh mt bng tnh, vi mi i din cho mt tm nh. Mt TiledLayer n gin c dng th hin cc phn t trc quan c kch thc ln, nh l nn ca mt tr chi.

126

public class TiledLayer extends Layer n gin x l cho vic v nhiu lp trong mt tr chi, cc hm API dnh cho vic lp trnh tr chi li c th lp LayoutManager. Lp LayoutManager ny cha mt danh sch c th t cc i tng Layers v xc nh khu vc no cn c v li v th hin theo ng trt t. Lp LayoutManager c th hin nh di y: public class LayerManager extends Object

2.7. Record Manager System h thng qun l vng bn ghi


MIDP khng s dng h thng file lu tr d liu. Thay vo MIDP lu ton b thng tin vo non-volatile memory bng h thng lu tr gi l Record Management System (RMS). 2.7.1. RecordStore - vng bn ghi RMS l h thng c t chc v qun l di dng cc record (bn ghi). Record l mt chui (mng) cc byte, mi record c th cha bt k loi d liu no. Nu m ho d liu di dng nh phn (binary), ngi dng c th lu tr d liu bng Record sau c d liu t Record v khi phc li d liu ban u. Tt nhin kch thc d liu khng c vut qu gii hn qui nh ca thit b di ng. RMS lu d liu gn nh mt c s d liu, bao gm nhiu dng, mi dng li c mt s nh danh duy nht: Record ID 1 2 3 ... data Array of bytes Array of bytes Array of bytes Hnh 5: Cch t chc d liu ca RecordStore Mt tp cc bn ghi (sau ny gi l RecordStore) l tp hp cc Record c sp xp c th t. Mi Record khng th ng c lp m n phi thuc vo mt RecordStore no , cc thao tc trn Record phi thng qua Record Store cha n.

127

Khi to ra mt Record trong RecordStore, Record c gn mt s nh danh kiu s nguyn gi l Record ID. Record u tin c to ra s c gn Record ID l 1 v s tng thm 1 cho cc Record tip theo. Cn ch rng Record ID khng phi l ch mc (index), cc thao tc xa Record trong RecordStore s khng gy nn vic tnh ton li cc Record ID ca cc Record hin c cng nh khng lm thay i Record ID ca cc Record c to mi, v d: khi ta xa record id 3 khi thm mt record mi s c id l 4. Data l mt dy cc byte i din cho d liu cn lu. Tn c dng phn bit cc RecordStore trong b cc MIDlet (MIDlet suite). Cn ch khi nim MIDlet suite l tp cc MIDlet c chung khng gian tn (name space), c th chia s cng ti nguyn (nh RecordStore), cc bin tnh (static variable) trong cc lp v cc MIDlet ny s c ng gi trong cng mt file .jar khi trin khai. Nu ng dng ca bn ch c mt MIDlet th cc RecordStore c s dng cng phn bit ln nhau bng cc tn. Tn ca RecordStore c th di n 32 k t Unicode v l duy nht trong mt MIDlet suite.

Hnh 2.44:

128

MIDlet Suite ng lin th hin vic truy xut Record store do MIDlet to ra, ng nt t l Record store do MIDlet khc to ra. Trong MIDLET Suite One, MIDlet #1 v MIDlet #2 cng c th truy xut 4 Record store. MIDLET Suite One khng th truy xut Record store trong Suite Two. Trong MIDlet Suite One tn ca cc Record store l duy nht, tuy nhin Record store trong cc MIDlet Suite khc nhau c th dng chung mt tn. Record Store cn c 2 thuc tnh l Version Number v Date/time Stamp, cc gi tr ny thay i khi thc hin thm, thay th hay xa mt record, ngoi ra cn c th dng c ch event handler (Listener) pht hin mi khi Record store b thay i. Version number l mt s integer, bit gi tr khi u cn gi hm getVersion() sau khi to mt Record store. Date/time Stamp l s long integer, l s miliseconds k t ngy 1 thng 1 nm 1970, chng ta c th bit c gi tr ny thng qua hm getLastModified(). 2.7.2. Cc vn lin quan n RMS 2.7.2.1. Hn ch v kh nng lu tr ca thit b di ng Dung lng vng nh (non-volatile memory) dnh ring cho vic lu tr d liu trong RMS thay i ty theo thit b di ng. c t MIDP yu cu rng cc nh sn xut thit b di ng phi dnh ra vng nh c kch thc t nht 8K cho vic lu tr d liu trong RMS. c t khng nu gii hn trn cho mi Record. RMS cung cp cc API xc nh kch thc ca mi Record, tng dung lng ca RecordStore v kch thc cn li ca vng nh ny. Do trong qu trnh pht trin cc ng dng J2ME lp trnh vin phi cn nhc trong vic s dng vng nh ny. 2.7.2.2. Tc truy xut d liu Cc thao tc trn vng nh ny (non-volatile memory) tt nhin s chm hn nhiu khi truy xut d liu trn b nh RAM (volatile memory). N s ging nh tc c cng v tc c t RAM ca my tnh. V vy trong k thut lp trnh phi thng xuyn cache d liu v cc thao tc lin quan n RMS ch thc hin tp trung mt ln (lc khi ng hay ng ng dng).

129

2.7.2.3. C ch lung an ton Nu RecordStore ca ch c s dng bi mt MIDlet th khng phi lo lng v vn ny v RMS s dnh ring mt Thread thc hin cc thao tc trn RecordStore. Tuy nhin nu c nhiu MIDlet v Thread cng chia s mt RecordStore th phi ch n k thut lp trnh Thread m bo khng c s xung t d liu. 2.7.3. Cc hm API trong RMS RecordStore khng c hm khi to. Phng thc static RecordStore openRecordStore(String recordStoreName, boolean createIfNecessary) void closeRecordStore() static void deleteRecordStore(String recordStoreName) static String[] listRecordStores() int addRecord(byte[] data, int offset, int numBytes) void setRecord(int recordId, byte[] newData, int offset, int numBytes) void deleteRecord(int recordId) byte[] getRecord(int recordId) int getRecord(int recordId, byte[] buffer, int offset) int getRecordSize(int recordId) int getNextRecordID() int getNumRecords() long getLastModified() int getVersion() String getName() int getSize() int getSizeAvailable() RecordEnumeration enumerateRecords( RecordFilter filter, RecordComparator comparator, boolean keepUpdated) void addRecordListener (RecordListener M t M mt Recordstore, c tham s to Record store nu n cha tn ti. ng RecordStore. Xa RecordStore. Danh sch cc RecordStore trong MIDlet suite. Thm mt record vo RecordStore. t hoc thay th mt record trong RecordStore. Xa mt record trong RecordStore. Ly dy byte cha record. Ly ni dung ca record vo dy byte. Kch thc record. Ly record id ca record mi . S lng cc record. Thi gian thay i gn nht. Version ca RecordStore. Tn ca RecordStore. Kch thc ca RecordStore. S byte trng cho RecordStore. Xy dng enumeration dng duyt recordstore Add a listener to detect record store
130

listener) void removeRecordListener Remove Listener (RecordListener listener) Vi cc kin thc c t cc phn trn v RecordStore, di y chng ta s cng nhau xt hai v d v cch c, ghi vi RecordStore. V d u tin s ghi chui String vo vng bn ghi, d qun l ta s dng cc phng thc ring bit m, ghi, c v ng RecordStore : import java.io.*; import javax.microedition.midlet.*; import javax.microedition.rms.*; public class vd extends MIDlet { private RecordStore rs = null; static final String REC_STORE = "db_1"; public vd() { openRecStore(); writeRecord("J2ME and MIDP"); writeRecord("Wireless Technology"); readRecords(); closeRecStore(); deleteRecStore(); } public void destroyApp( boolean unconditional ) { } public void startApp() { destroyApp(false); notifyDestroyed(); } public void pauseApp() { } public void openRecStore() { try { rs = RecordStore.openRecordStore(REC_STORE, true ); } catch (Exception e) { db(e.toString());
131

} } public void closeRecStore() { try { rs.closeRecordStore(); } catch (Exception e) { db(e.toString()); } } public void deleteRecStore() { if (RecordStore.listRecordStores() != null) { try { RecordStore.deleteRecordStore(REC_STORE); } catch (Exception e) { db(e.toString()); } } } public void writeRecord(String str) { byte[] rec = str.getBytes(); try { rs.addRecord(rec, 0, rec.length); } catch (Exception e) { db(e.toString());} } public void readRecords() { try { byte[] recData = new byte[50]; int len;

132

for (int i = 1; i <= rs.getNumRecords(); i++) { len = rs.getRecord( i, recData, 0 ); System.out.println("Record #" + i + ": " + new String(recData, 0, len)); } } catch (Exception e) { db(e.toString()); } } private void db(String str) { System.err.println("Msg: " + str); } } V d trn l mt v d n gin, d hiu v hot ng kh hiu qu vi vic ghi xu vo vng bn ghi. Tuy nhin, c th vit c nhiu kiu d liu khc nhau (s, chui,... ) vo RecordStore v t hiu qu c ghi nhanh hn th ta ln dng Stream thao tc vi RecordStore, nh v d di y: import javax.microedition.midlet.*; import javax.microedition.rms.*; import java.io.*; public class vd extends MIDlet { RecordStore rs; public vd(){ open(); write(); read(); close(); } public void startApp(){ } public void pauseApp(){ } public void destroyApp(boolean b){ }

133

public void open(){ try{ rs=RecordStore.openRecordStore("phuong", true); } catch(Exception e){ } } public void close(){ try{ rs.closeRecordStore(); } catch(Exception e){ } } public void write(){ String t[]={ "Java","J2me" }; boolean bl[]={ true,false }; int it[]={ 1,2 }; try{ ByteArrayOutputStream bstr=new ByteArrayOutputStream(); byte ch[]; DataOutputStream dstr=new DataOutputStream(bstr); int i; for(i=0;i<t.length;i++){

134

dstr.writeUTF(t[i]); dstr.writeBoolean(bl[i]); dstr.writeInt(it[i]); dstr.flush(); ch=bstr.toByteArray(); rs.addRecord(ch, 0, ch.length); bstr.reset(); } bstr.close(); dstr.close(); } catch(Exception e){ } } public void read(){ try{ byte ch[]=new byte[50]; ByteArrayInputStream bstr=new ByteArrayInputStream(ch); DataInputStream dstr=new DataInputStream(bstr); int i; for(i=1;i<=rs.getNumRecords();i++){ rs.getRecord(i, ch, 0); System.out.println(i+":"); System.out.println(dstr.readUTF()); System.out.println(dstr.readBoolean()); System.out.println(dstr.readInt()); bstr.reset(); } bstr.close(); dstr.close();

135

} catch(Exception e){ } } } Vi vic s dng lung nh v d trn, bn c th ghi xu, s, kiu boolean vo trong vng bn ghi. c, ghi c d liu vi lung, trc tin chng ta to ra cc mng cho d liu chng ra mun ghi: String t[]={ "Java","J2me"}; boolean bl[]={true,false}; int it[]={1,2}; Khi chun b tt c d liu, chng ta gi writeStream( ) ghi d liu vo vng bn ghi: ByteArrayOutputStream bstr=new ByteArrayOutputStream(); byte ch[]; DataOutputStream dstr=new DataOutputStream(bstr); int i; for(i=0;i<t.length;i++){ dstr.writeUTF(t[i]); dstr.writeBoolean(bl[i]); dstr.writeInt(it[i]); dstr.flush(); ch=bstr.toByteArray(); rs.addRecord(ch, 0, ch.length); bstr.reset(); } bstr.close(); dstr.close(); Chng ta to ra hai lung stream: bstr v dstr, bstr l mng byte s gi d liu m chng ta mun ghi vo vng bn ghi. Vi stream ny chng ta thm b lc dstr, lp ny cha cc phng thc cho php ghi nhng kiu d liu c bn

136

ca Java. Kt qu mng byte bn trong s cha d liu nh phn c kh nng ghi vo lung. Khi Stream sn sng, ta gi cc phng thc thch hp da vo kiu d liu chng ta chn ghi xung. Tip theo, ta y tt c d liu trong vng m xung stream sau khi ghi. Tt c nhng g cn lm tip l c li d liu t stream vo trong mt mng byte v thm bn ghi. Vic c d liu tr li vng bn ghi kh n gin, ta ch cn thay i stream xut thnh stream nhp: byte ch[]=new byte[50]; ByteArrayInputStream bstr=new ByteArrayInputStream(ch); DataInputStream dstr=new DataInputStream(bstr); int i; for(i=1;i<=rs.getNumRecords();i++){ rs.getRecord(i, ch, 0); System.out.println(i+":"); System.out.println(dstr.readUTF()); System.out.println(dstr.readBoolean()); System.out.println(dstr.readInt()); bstr.reset(); } bstr.close(); dstr.close(); Bng li gi : rs.getRecord(i, ch, 0); ch l mng byte gi d liu s cha nhng g m chng ta tng ghi vo RecordStore. Tuy nhin, thao tc c , ghi trn RecordStore cha phi l tt c nhng g chng ta cn, nu chng ta mun tm kim, sp xp cc bn ghi trn RecordStore th chng ta cn phi dng n b m bn ghi RecordEnumeration s c gii thiu di y. 2.7.4. Duyt Record vi RecordEnumeration duyt record ta c th s dng RecordEnumeration. Lp ny cung cp cc phng thc duyt cc record trong RecordStore mt cch nhanh chng. Di y l on code duyt ton b RecordStore:
137

RecordEnumeration re = rs.enumerateRecords(null,null,false); while (re.hasNextElement()) { String str = new String(re.nextRecord()); ... do something } Mun duyt RecordStore no chng ta to ra i tng Enumeration t i tng RecordStore bng phng thc enumerateRecords, phng thc ny c hai tham s l hai i tng dng sp xp v tm kim cc bn ghi trn mt vng bn ghi m chng ta s c hc ngay di y. Enumeration c phng thc nextRecord() duyt n record ng sau, ngoi ra cn c previousRecord() gip duyt v record ng trc. Nu mun bt u ti v tr cui cng ca recordstore ta ch cn gi hm previousRecord() ngay khi m recordstore, n s tr v dng cui cng. RecordEnumeration c duy tr mt index ca cc record. Khi recordstore c s thay i th RecordEnumeration c th hot dng khng chnh xc, do chng ta cn phi gi hm reindex() mi khi recordstore c s thay i. Di y l cc phng thc thng dng ca RecordEnumertion. Bn s c tip xc chi tit vi i tng ny trong cc v d phn sau: Phng thc int numRecords() byte[] nextRecord() int nextRecordId() byte[] previousRecord() int previousRecordId() boolean hasNextElement() boolean hasPreviousElement() void keepUpdated(boolean keepUpdated) boolean isKeptUpdated() void rebuild() void reset() void destroy() M t S lng record trong enumeration Record tip theo Record ID ca record tip theo Record trc Record ID ca record trc Kim tra enumeration c record k tip Kim tra enumeration c record trc t enumeration reindex sau khi co s thay i Kim tra enumeration c t ng reindex() To li index a enumeration v record u tin Gii phng ti nguyn c s dng bi enumeration

138

2.7.5. Sp xp cc record vi interface RecordComparator Interface ny gip ngi lp trnh so snh hai Record theo mt tiu ch no . Interface ny nh ngha phng thc compare vi tr u vo l hai mng cc byte th hin hai Record cn so snh. Phng thc ny tr v cc tr sau c nh ngha trong interface: EQUIVALENT: Nu hai Record bng nhau FOLLOWS: Nu Record th 1 ng sau Record th 2 PRECEDES: Nu Record th 1 ng trc Record th 2 Do RecordComparator l mt interface nn khi s dng cn phi implements n. Sau ta s dng lp Comparator bng cch gn kt n vi Record Enumeration, Enumeration s s dng hm compare trong class Comparator sp xp cc record trong RecordStore. Hm duy nht m chng ta phi ci trong lp ny: int compare(byte[] rec1, byte[] rec2) So snh quyt nh th t sp xp v d: import javax.microedition.lcdui.*; import javax.microedition.midlet.*; import javax.microedition.rms.*; import java.io.*; public class vd extends MIDlet{ RecordStore rs; public vd(){ open(); write(); read(); close(); } public void startApp(){ } public void pauseApp(){ } public void destroyApp(boolean b){ } public void open(){

139

try{ rs=RecordStore.openRecordStore("f2",true); } catch(Exception e){ } } public void close(){ try{ rs.closeRecordStore(); } catch(Exception e){ } } public void write(){ String str[]={ "tiger","cat", "bird","fish" }; int i; byte ch[]; try{ for(i=0;i<str.length;i++){ ch=str[i].getBytes(); rs.addRecord(ch, 0, ch.length); } } catch(Exception e){ } } public void read(){ int i,len; byte b[]=new byte[50]; try{ ss s=new ss();

140

RecordEnumeration re=rs.enumerateRecords(null, s, false); i=0; while(re.hasNextElement()){ System.out.println("ban ghi:"+i); System.out.println(new String(re.nextRecord())); i++; } rs.deleteRecordStore("f2"); } catch(Exception e){ } } } //Lp dn xut ca RecordComparation class ss implements RecordComparator{ public int compare(byte b1[],byte b2[]){ if(b1[0]==b2[0]) return RecordComparator.EQUIVALENT; else if(b1[0]<b2[0]) return RecordComparator.PRECEDES; else return RecordComparator.FOLLOWS; } } sp xp bn ghi, bn ch cn to ra i tng sp xp bn ghi Comparator v gn n vi i tng duyt bn ghi Enumeration trc khi tin hnh c bn ghi: ss s=new ss(); RecordEnumeration re=rs.enumerateRecords(null, s,

141

false); Vic c bn ghi sau vn tin hnh bnh thng v dng nh khng c lin quan g ti i tng Comparator: while(re.hasNextElement()){ System.out.println("ban ghi:"+i); System.out.println(new String(re.nextRecord())); i++; } Bi v vic sp xp s tin hnh t ng sau khi bn gn kt i tng Comparator vo i tng Enumeration. Cn c th tiu ch sp xp ra sao bn phi t mnh ci t trong phng thc compare ca i tng RecordComparator: public int compare(byte b1[],byte b2[]){ if(b1[0]==b2[0]) return RecordComparator.EQUIVALENT; else if(b1[0]<b2[0]) return RecordComparator.PRECEDES; else return RecordComparator.FOLLOWS; } Bn hy coi hai tham s u vo ca phng thc ny l hai bn ghi bt k trong RecordStore, vic ca bn l phi quyt nh xem cn phi t hai record ny theo th t nh th no?: Vi iu kin no th bn ghi th nht (tham s th nht ca phng thc compare) ng trc: return RecordComparator.PRECEDES; Vi iu kin no th bn ghi th nht ng sau (tham s th nht ca phng thc compare): return RecordComparator.FOLLOWS;

142

Nh v d trn, cc record s c sp xp theo th t trong bng ch ci (A B C...). Bi v cc on m trong phng thc compare trn quy nh, nu ch ci u tin ca record no ng trc trong bng ch ci s c ng trc trong RecordStore v ngc li: if(b1[0]<b2[0]) return RecordComparator.PRECEDES; else return RecordComparator.FOLLOWS; Qua cch xy dng hm compare bn hiu ngm rng, khi qu trnh sp xp din ra, cc record s c so snh tng i mt, v da vo gi tr tr v ca hm compare l PRECEDES hay FOLLOWS m record s c sp xp trc hay sau. 2.7.6. Tm kim vi RecordFilter Ngoi vic sp xp cc record (s dng RecordComparator), enumerator cn cung cp c ch lc (tm kim cc record tha mn mt iu kin no ). Khi s dng RecordComparator tt c cc record trong RecordStore u c lu trong mt result set (mt bng kt qu). Nhng khi dng RecordFilter, ch c nhng tha mn iu kin mi c trong enumerator result set. Hm duy nht chng ta cn ci t l: boolean matches(byte[ ] b): tm kim record tha mn mt iu kin no . V d: import java.io.*; import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import javax.microedition.rms.*; public class vd extends MIDlet implements CommandListener{ Display dis; Form fr; TextField tf; StringItem it; String name="r3";
143

RecordStore rs; Command c; public vd(){ dis=Display.getDisplay(this); fr=new Form("vd"); tf=new TextField("search","",15,TextField.ANY); it=new StringItem("Tm thy:",""); c=new Command("go",Command.SCREEN,1); fr.addCommand(c); fr.append(tf); fr.append(it); fr.setCommandListener(this); open(); write(); } public void startApp(){ dis.setCurrent(fr); } public void pauseApp(){ close(); destroy(); } public void destroy(){ try{ RecordStore.deleteRecordStore(name); } catch(Exception e){ } } public void open(){ } public void destroyApp(boolean b){

144

try{ rs=RecordStore.openRecordStore(name, true); } catch(Exception e){ } } public void close(){ try{ rs.closeRecordStore(); } catch(Exception e){ } } public void write(){ String str[]={ "ba","mot","hai","bon","nam" }; int it[]={ 3,1,2,4,5 }; try{ byte b[]; ByteArrayOutputStream bstr=new ByteArrayOutputStream(); DataOutputStream dstr=new DataOutputStream(bstr); int i; for(i=0;i<str.length;i++){ dstr.writeUTF(str[i]); dstr.writeInt(it[i]); dstr.flush(); b=bstr.toByteArray();

145

rs.addRecord(b, 0, b.length); bstr.reset(); } dstr.close(); bstr.close(); } catch(Exception e){ } } public void read(){ try{ filter ft=new filter(tf.getString()); RecordEnumeration re=rs.enumerateRecords(ft,null,false); if(re.numRecords()>0){ ByteArrayInputStream bstr=new ByteArrayInputStream(re.nextRecord()); DataInputStream dstr=new DataInputStream(bstr); it.setText(dstr.readUTF()); bstr.close(); dstr.close(); } ft.close(); re.destroy(); } catch(Exception e){ } } public void commandAction(Command com,Displayable db){ if(com==c){ read();

146

} } } class filter implements RecordFilter{ String tim; ByteArrayInputStream bstr; DataInputStream dstr; public filter(String tim){ this.tim=tim.toLowerCase(); } public void close(){ try{ dstr.close(); bstr.close(); } catch(Exception e){ } } public boolean matches(byte b[]){ boolean ds=true; try{ ByteArrayInputStream bstr=new ByteArrayInputStream(b); DataInputStream dstr=new DataInputStream(bstr); String t=dstr.readUTF(); if(tim!=null&&t.indexOf(tim)!=-1) ds= true; else ds= false; } catch(Exception e){ ds=false; }

147

return ds; } } Mt cch tng t nh vi RecordComparator, c th ci t c ch tm kim cho RecordStore bn cng cn to ta i tng RecordFilter v gn n vo RecordEnumeration trc khi duyt RecordStore: filter ft=new filter(tf.getString()); RecordEnumeration re=rs.enumerateRecords(ft,null,false); Vic c bn ghi sau vn tin hnh bnh thng v dng nh khng c lin quan g ti i tng Comparator: while(re.hasNextElement()){ System.out.println("ban ghi:"+i); System.out.println(new String(re.nextRecord())); i++; } Bi v vic tm kim s tin hnh t ng sau khi bn gn kt i tng Filter vo i tng Enumeration. Cn c th tiu ch tm kim ra sao bn phi t mnh ci t trong phng thc matches ca i tng RecordFilter: public boolean matches(byte b[]){ boolean ds=true; try{ ByteArrayInputStream bstr=new ByteArrayInputStream(b); DataInputStream dstr=new DataInputStream(bstr); String t=dstr.readUTF(); if(tim!=null&&t.indexOf(tim)!=-1) ds= true; else ds= false; } catch(Exception e){ ds=false; }

148

return ds; } Bn hy coi tham s duy nht ca phng thc ny l mt record bt k ca RecordStore, bn hy so snh n vi mt tiu ch, mt gi tr mc c th no , nu tha mn bn hy tr li gi tr cho hm l true v ngc li l false. Nh v d trn, record tng qut (tham s ca matches) c chuyn v kiu String v so snh vi mt xu ch l xu tim, nu record ging hon ton xu ny th gi tr tr v ca hm l true v ngc li l false. Khi qu trnh tm kim c din ra, nhng record trong RecordStore c gi tr hm matches l true s c a vo result set cn ngc li th khng.

149

Chng 3: Kt ni Internet vi J2me


3.1. Khung kt ni chung GCF
CLDC cung cp cho chng ta mt khung tng qut thit lp kt ni mng, l GCF. tng ca n l: nh ngha mt cch tru tng cc hot ng mng v nhp xut file dng chung cho mt s lng ln cc thit b, ging nh mt b khung nn vy. mc CLDC, J2me ch nh ngha v to kt ni, giao thc thc s v cc phng thc trao i d liu ca giao thc c trao cho tng Profiles. Vi GCF, kt ni chng ta s dng mt lp c kh nng m mi loi kt ni bao gm: file, http, datagram, Tn ca lp ny l Connector. Nh vy nu s dng Connector m kt ni, chng ta ch cn gi mt phng thc open c nh dng nh sau: Connector.Open(protocol:address; parameter) C ch m GCF dng m nhiu loi giao tip ch bng mt phng thc chung duy nht ny chng minh tnh uyn chuyn ca GCF. C ch ny hot ng nh sau:
1. Trong thi gian thc thi, mi khi c yu cu m mt giao thc, Connector

s tm n lp tng ng ci t giao thc y. Qu trnh tm kim ny c thc hin thng qua phng thc Class.forName(). V d nh yu cu m kt ni HTTP trong J2ME, yu cu s c vit nh sau: Class.forName(com.sun.midp.io.j2me.http.Protocol);
2. Khi tm thy lp tng ng, Class.forName() s tr v mt i tng c

ci t giao din Connection (trong lp Connector v giao din Connection c nh ngha sn trong CLDC). Sau khi kt ni thnh cng, mi cng vic giao tip, trao i d liu s u c thc hin vi i tng ci t giao din Connection ny. Bn cn nh rng: ci t tht s ca cc giao thc u nm mc profiles. Trong MIDP 1.0, HttpConnection h tr mt tp con HTTP phin bn 1.0. Do khi lp ny m rng ContentConnection, n c cung cp sn hn 20 phng thc chuyn bit giao tip thng qua giao thc HTTP.

150

V d, to mt kt ni HTTP ta s lm nh sau: //To chui kt ni String url = "http://www.corej2me.com"; // HttpConnection l mt i tng thuc MIDP // lp ci t thc s giao thc HTTP HttpConnection http=null; //Dng i tng Connector m kt ni, phng thc open ca i //tng ny tr v mt i tng Connection. //p kiu i tng Connection thnh HttpConnection HttpConnection http = (HttpConnection) Connector.open(url);

3.2. Cc giao thc c h tr trong GCF


Nh bn bit, cc thit b di ng ni chung v in thoi di ng ni ring c kh nng kt ni rt ln, bi v n c ngi s dng dng trao i vi th gii bn ngoi ti bt c ni u v bt c lc no. Nhng kh nng kt ni y khng ch l kh nng thoi hay SMS m cn l kt ni khng dy. Do , J2me c th h tr mt s lng ln cc thit b di ng khc nhau vi nhiu kh nng kt ni v yu cu nhp xut khc nhau GCF c thit k. GCF nh ngha k thut kt ni chung nht c th cho mi loi thit b, c dng chung bi c hai loi cu hnh l CDC v CLDC, v vy GCF h tr rt nhiu loi giao thc, nhiu kiu kt ni khc nhau, v d: Giao thc HTTP, FTP, UDP, Datagram, Socket... Nhng i vi in thoi di ng, i vi hin trng MIDP, giao thc lun lun c h tr l giao thc HTTP, v vy trong gio trnh ny chng ta s hc cch to kt ni HTTP vi J2me. bt u, chng ta s cng xem GCF cung cp cho ta nhng cng c g tin hnh kt ni v trao i d liu thng qua i tng Connection, i tng m chng ta c lm quen mc trn.

151

Hnh 3.1: Phn cp lp Connection Sau y l m t cc giao din kt ni c nh ngha trong CLDC: Giao dinStreamConnectionNotifier: c dng khi i mt kt ni pha server c thit lp. Phng thc acceptAndOpen() b chn cho n khi client thit lp kt ni. Giao din InputConnection dng thc hin mt lung nhp tun t d liu ch c. Giao din OutputConnection dng thc hin mt lung xut d liu ch vit. Giao din StreamConnection l kt hp ca c hai giao din InputConnection v OutputConnection. N dng cho cc thit b di ng c truyn thng hai chiu. Giao din ContentConnection k tha giao din StreamConnection v thm vo cc phng thc getType(), getEncoding(), v getLength(). N cung cp c s cho giao din HttpConnection ca MIDP. Giao din HttpConnection c nh ngha trong MIDP v k tha giao din ContentConnection ca CLDC. Giao din ny cung cp cc phng thc thit lp mt kt ni HTTP. Vic s dng nhng i tng ny nh th no, trong trng hp no tin hnh giao tip v trao i d liu chng ta s c hc trong cc v d c th di y.

152

3.3. H tr giao thc HTTP trong MIDP


i vi cng ngh J2ME, cn phi quan tm n s hn ch ca c kt ni mng v ti nguyn ca thit b, khng ging nh mi trng thng thng ca my tnh c nhn vi kt ni mng c nh. iu ny c ngha l nh pht trin nn lng trc c cc khong thi gian tr di trn bng thng hn ch. Hn na, bt k trong tnh hung no cng khng nn cho rng thit b di ng lun lun c kt ni. V ti nguyn, ta phi i mt vi vn kh nng tnh ton hn ch cng vi kh nng lu tr tng i ca thit b. Do , trc khi pht trin mt ng dng phn tn cho client di ng, ta cn phi xem xt k cc yu t trc khi chn giao thc, bi v quyt nh ny c th c nh hng ln n hiu sut ca ng dng. HTTP l mt giao thc lin lc client/server l tng cho ng dng Java di ng. i vi mi c t, thit b tng thch MIDP 1.0 phi h tr HTTP. Cc giao thc khc nh TCP hay UDP l ty chn. Bi v khng phi tt c thit b MIDP u h tr truyn thng socket hay datagram, do trin khai HTTP trn thit b di ng cho php ti u kh nng chuyn i gia cc thit b t cc nh sn xut khc nhau. Mt li im khc na l giao thc HTTP c hng truy xut khng li (trouble-free access) thng qua tng la. Bi v server v client di ng hu nh c tch bit bng firewall, HTTP khng cn phi cu hnh thm. Mc d vy, ta cng nn quan tm n cc ri ro bo mt c th c khi m kt ni HTTP ra th gii bn ngoi. Java cung cp API lp trnh mng, h tr giao thc HTTP 1.1. Ta d dng to ra cc request GET, POST, v HEAD trong ng dng Java. 3.3.1. S lc v giao thc HTTP HTTP l giao thc truyn siu vn bn v l giao thc tng ng dng cho web. N hot ng theo m hnh Client/Server.

153

Web Server

Request

Response

Hnh 3.2: M hnh Client - Server


Client: Yu cu, nhn, hin th cc i tng Web. Server: Web server gi cc i tng tr li cho cc yu cu t pha Client.

HTTP l giao thc phi trng thi, trong Server khng lu li cc yu cu ca client. iu ny c ngha l: sau mi ln yu cu c gi ln Server v Server kt xut kt qu tr v cho Client th kt ni s hon ton b ngt, tip tc yu cu Server tr li cho cc yu cu khc, Client li phi tin hnh kt ni li t u. HTTP s dng giao thc TCP ca tng giao vn. Cc bc tin hnh t khi Client kt ni ti Server sau gi v nhn kt qu t Server gi v nh sau:

Client khi to kt ni TCP vi Server Server chp nhn kt ni TCP t Client cc thng ip HTTP c trao i gia browser v web server.

ng kt ni TCP C hai kiu thng ip HTTP l yu cu (Request) v tr li (Response). Cc thng ip c nh dng kiu m ASCII. C HTTP v HTTPS u gi request v response. My Client gi request, cn Server s tr v response. 3.3.1.1. Client Request Client request bao gm 3 phn sau:

154

Request method Header Body Request method nh ngha cch m d liu s c gi n Server. C 3 phng thc c cung cp sn l GET, POST, HEADER. Khi s dng Get, d liu cn request s nm trong URL. Vi Post d liu gi t client s c phn thnh cc stream ring bit. Trong khi , Header s khng gi d liu yu cu ln server, thay vo header ch request nhng meta information v server. GET v POST l hai phng thc request kh ging nhau, tuy nhin do GET gi d liu thng qua URL nn s b gii hn, cn POST s dng nhng stream ring bit nn s khc phc c hn ch ny. V d v vic m HTTP Connection thng qua GET String url = "http://www.corej2me.com?size=large"; HttpConnection http = null; http = (HttpConnection) Connector.open(url); http.setRequestMethod(HttpConnection.GET); Nhng Header field s cho php ta truyn cc tham s t Client n Server. Cc header field thng dng l If-Modified-Since, Accept, and User Agent. Bn c th t cc field ny thng qua phng thc setRequestProperty(). Di y l v d dng setRequestProperty(), ch c nhng d liu thay i sau ngy 1 thng 1 nm 2005 mi c gi v t server: String url = "http://www.corej2me.com\somefile.txt"; HttpConnection http = null; http = (HttpConnection) Connector.open(url); http.setRequestMethod(HttpConnection.GET); // t header field http.setRequestProperty("If-Modified-Since", "Sat, 1 Jan 2005 12:00:00 GMT");

155

Body cha ni dung m bn mun gi ln server. V d v s dng POST v gi d liu t client thng qua stream: String url = http://www.corej2me.com; tmp = "test data here"; OutputStream ostrm = null; HttpConnection http = null; http = (HttpConnection) Connector.open(url); http.setRequestMethod(HttpConnection.POST); // Gi d liu ostrm = http.openOutputStream(); byte bytes[] = tmp.getBytes(); for(int i = 0; i < bytes.length; i++) { os.write(bytes[i]); } os.flush(); Sau khi nhn c v x l yu cu t pha client, server s ng gi v gi v pha client. 3.1.1.2. Server Response Cng nh client request, server cng gm 3 phn sau: Status line Header Body Status line s thng bo cho client kt qu ca request m client gi cho server. HTTP phn loi status line thnh cc nhm sau y:

1. xx Thng tin 2. xx Thnh cng 3. xx Chuyn hng 4. xx My khch Client li 5. xx My ch Server li


156

Status line bao gm version ca HTTP trn server, status code, v on text i din cho status code. V d: "HTTP/1.1 200 OK" "HTTP/1.1 400 Bad Request" "HTTP/1.1 500 Internal Server Error" 102 Khng ging nh header ca client, server c th gi data thng qua header. Sau y l nhng phng thc dng ly thng tin Header m server gi v:

String getHeaderField(int n), ly gi tr header field thng qua ch s String getHeaderField(String name), ly gi tr header field thng qua tn

String getHeaderFieldKey(int n), ly header field key thng qua ch s

Server c th tr v nhiu Header field. Trong trng hp ny, phng thc u tin s cho ly header field thng qua index ca n. Cn phng thc th hai ly ni dung header field da vo tn ca header field. Cn nu mun bit tn (key) ca header field, c th dng phng thc th 3 trn. Sau y l v d v 3 phng thc trn, trong trng hp server gi v chui "content-type=text/plain": Phng thc http.getHeaderField(0) http.getHeaderField("content-type") Gi tr "text-plain" "text-plain"

http.getHeaderFieldKey(0) "content-type" Body: Cng ging nh Client, Server gi hu ht nhng thng tin trong phn body cho Client. Client dng input stream c kt qu tr v t Server: //con l mt i tng HttpConnection InputStream in=con.openInputStream(); int length=(int)con.getLength(); byte data[]; if(length!=-1){ data=new byte[length]; in.read(data);

157

} else { ByteArrayOutputStream br=new ByteArrayOutputStream(); int ch; while((ch=in.read())!=-1) br.write(ch); data=br.toByteArray(); br.close(); } 3.3.2. Cc hm API HttpConnection 3.3.2.1. Mt vi hm thng dng trong HttpConnection Phng thc M t long getDate() Ly v ngy thng t Header long getExpiration() Ly v thi gian ht hn String getFile() Ly tn file t a ch URL int getHeaderField(int n) Ly v gi tr trng header bng String getHeaderField(String name) long getHeaderFieldDate(String name, long def) int getHeaderFieldInt(String name, int def) String getHeaderFieldKey(int n) String getHost() long getLastModified() String getPort() String getProtocol() String getQuery() String getRef() String getRequestMethod() ch s Ly v gi tr trng header bng tn Ly v trng ngy thng theo tn Ly v trng int theo tn Ly v kha ca trng s dng ch s Ly v tn host t a ch URL Ly v gi tr trng lastmodified Ly v cng t a ch URL Ly v giao thc t a ch URL Ly v chui truy vn (ch dng vi GET) Ly v phn tham chiu ca a ch URL Ly v phng thc hin thi
158

ang s dng (GET, POST hay String getRequestProperty(String key) int getResponseCode() String getResponseMessage() String getURL() void setRequestMethod(String method) void value) setRequestProperty(String key, HEAD) Ly v cu hnh hin thi ca request property Ly v m phn hi (numeric value) Ly v thng ip phn hi (text value) Ly v ton b a ch URL t phng thc truyn thng (GET, POST or HEAD) String t thuc tnh yu cu (header information)

3.3.2.2. V d v kt ni Internet vi J2me Bn bit rng khi bn kt ni n cc a ch website nh "http://google.com.vn" th trn trnh duyt bn s nhn c kt qu tr v l cc i tng web, nh hnh nh, nt nhn, links... Tuy nhin, mt chng trnh J2me khng phi l trnh duyt, n khng hiu c cc m HTML, i vi n mi th m Server ca website gi v u l cc byte d liu nh phn, bn c th chuyn i n v cc i tng nh chui k t, s, hnh nh... s dng, iu ny cn ph thuc vo vic server gi v nhng d liu g, c chuyn i v cc kiu d liu bn mong mun hay khng?. lm r hn vn ny, chng ta s cng nhau i xy dng mt chng trnh J2me n gin, trong chng trnh s cung cp cho ngi dng mt TextField ngi dng nhp a ch kt ni. Sau khi ngi dng nhp song a ch v nhn nt "connect" trn mn hnh, chng trnh s tin hnh kt ni v nhn kt qu tr v t pha server, chuyn kt qu nhn c thnh dng chui v hin th ln mn hnh: import java.io.*; import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import javax.microedition.io.Connector; import javax.microedition.io.HttpConnection;
159

public class vd extends MIDlet implements Runnable, CommandListener{ HttpConnection con; InputStream in; OutputStream out; Thread th; Form fr; Display dis; TextField t1; StringItem it; Command c1; String url; public vd(){ th=new Thread(this); dis=Display.getDisplay(this); fr=new Form("vdform"); t1=new TextField("a ch URL:","",50,TextField.URL); it=new StringItem("kt qu kt ni:",""); fr.append(t1); fr.append(it); c1=new Command("connect",Command.OK,1); fr.addCommand(c1); fr.setCommandListener(this); } public void startApp() { dis.setCurrent(fr); } public void pauseApp() { } public void destroyApp(boolean unconditional) { }

160

public void connect(){ try{ con=(HttpConnection)Connector.open(url); con.setRequestMethod(HttpConnection.GET); con.setRequestProperty("User-Agent","Profile/MIDP-2.0 Configuration/CLDC-1.1"); con.setRequestProperty("Content-Language", "en-US"); con.setRequestProperty("Content-Type", "application/x-wwwform-urlencoded"); } catch(Exception e){ System.out.println("kt ni li:"+e.getMessage()); } } public void in(){ String str="nothing"; try{ in=con.openInputStream(); int length=(int)con.getLength(); byte server[]; if(length!=-1){ server=new byte[length]; in.read(server); str=new String(server); } else { ByteArrayOutputStream br=new ByteArrayOutputStream(); int ch; while((ch=in.read())!=-1)

161

br.write(ch); str=new String(br.toByteArray()); br.close(); } it.setText(str); } catch(Exception e){ } } public synchronized void run(){ this.connect(); this.in(); } public void commandAction(Command c, Displayable d){ url=t1.getString(); th=new Thread(this); th.start(); } }

162

Hnh 3.3: V d kt ni Internet vi J2me Gi s nh chng ta kt ni n a ch "http://google.com.vn", bn s ngc nhin khi thy rng kt qu tr v khng phi l biu tng google v cc thnh phn quen thuc khc ca trang web ny, m l mt chui cc k t kh rm r, chnh l m HTML m my ch ca trang web google.com.vn tr v cho chng trnh ca bn. Qua v d ny chng ta s hc c cch vit mt chng trnh kt ni Internet vi J2me vi ba thao tc c bn: To kt ni n server Gi thng tin ln server Nhn v x l thng tin tr li t server M to ra mt kt ni n my ch Server t xa cn ch r a ch URL v mt vi thng tin header quan trng cho yu cu request t my khch, nh s dng kiu kt ni no, dng ngn ng g...: con=(HttpConnection)Connector.open(url); con.setRequestMethod(HttpConnection.GET); con.setRequestProperty("User-Agent","Profile/MIDP-2.0 Configuration/CLDC-1.1"); con.setRequestProperty("Content-Language", "en-US"); con.setRequestProperty("Content-Type", "application/x-wwwform-urlencoded"); Sau , nhn thng tin tr v t my ch ta cn phi m mt lung InputStream v c d liu t my ch Server tr v vo trong mt mng byte. Trong v d ny, chng ta cha c nhu cu gi hoc nhn lnh HTTP: //To InputStream connection in=con.openInputStream(); int length=(int)con.getLength(); byte server[]; if(length!=-1){ server=new byte[length];
163

in.read(server); str=new String(server); } else { ByteArrayOutputStream br=new ByteArrayOutputStream(); int ch; while((ch=in.read())!=-1) br.write(ch); str=new String(br.toByteArray()); br.close(); } Khi ContentConnection v InputStream c thit lp, chng ta th tham chiu n chiu di length ca d liu c gi v t Server. Nu length c th xc nh, chng ta c kt qu vo trong mng server ch bng mt lnh: in.read(server); Nu length khng c sn, chng ta cn phi c tng k t mt. Java cung cp mt cng c tin li v hiu qu gip bn iu khin cng vic ny. S dng ByteArrayOutputStream, cc byte c c vo trong mt mng byte ni, Java s iu khin v t thay i kch thc ca mng cho ph hp. Khi Java c xong, chng ta n gin chuyn ni dung stream vo trong mng byte ca chng trnh: ByteArrayOutputStream br=new ByteArrayOutputStream(); int ch; while((ch=in.read())!=-1) br.write(ch); str=new String(br.toByteArray()); br.close(); Cui cng chng ta chuyn i kt qu tr v thnh dng chui v in ra mn hnh in thoi nh i tng ImageItem: str=new String(server);//nu tham chiu c length

164

str=new String(br.toByteArray());//nu khng tham chiu c length it.setText(str);//hin th kt qu ln mn hnh in thoi Di y l mt v d tng t, tuy nhin, thay v kt ni n mt a ch trang web no v nhn v m HTML, chng ta s dng chng trnh J2me kt ni n mt a ch cho php download mt nh nh dng PNG c nh (nh hn 48*48 pixel, ln hn c th vt qu kh nng hin th ca thit b). Sau khi download c nh v ta s hin th nh ln mn hnh in thoi, di y l m ngun:

Hnh 3.4: V d kt ni Intenet vi J2me import java.io.*; import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import javax.microedition.io.Connector; import javax.microedition.io.HttpConnection; public class vd extends MIDlet implements Runnable, CommandListener{ HttpConnection con;

165

InputStream in; OutputStream out; Thread th; Form fr; Display dis; TextField t1; StringItem it; Command c1; String url; Image im; public vd(){ th=new Thread(this); dis=Display.getDisplay(this); fr=new Form("vdform"); t1=new TextField("a ch URL:","",50,TextField.URL); t1.setString("http://www.iconspedia.com/dload.php?up_id=3574"); it=new StringItem("kt qu kt ni:",""); fr.append(t1); fr.append(it); c1=new Command("connect",Command.OK,1); fr.addCommand(c1); fr.setCommandListener(this); } public void startApp() { dis.setCurrent(fr); } public void pauseApp() { } public void destroyApp(boolean unconditional) { } public void connect(){

166

try{ con=(HttpConnection)Connector.open(url); con.setRequestMethod(HttpConnection.GET); con.setRequestProperty("User-Agent","Profile/MIDP-2.0 Configuration/CLDC-1.1"); con.setRequestProperty("Content-Language", "en-US"); con.setRequestProperty("Content-Type", "application/xwwwform-urlencoded"); } catch(Exception e){ System.out.println("kt ni li:"+e.getMessage()); } } public void in(){ String str="nothing"; im=null; try{ in=con.openInputStream(); int length=(int)con.getLength(); byte server[]; if(length!=-1){ server=new byte[length]; in.read(server); } else { ByteArrayOutputStream br=new ByteArrayOutputStream(); int ch; while((ch=in.read())!=-1)

167

br.write(ch); server=br.toByteArray(); br.close(); } im=Image.createImage(server,0,server.length); ImageItem ii=new ImageItem(null,im,ImageItem.LAYOUT_DEFAULT,null); if(fr.size()!=0) fr.set(0, ii); else fr.append(ii); } catch(Exception e){ } } public synchronized void run(){ this.connect(); this.in(); } public void commandAction(Command c, Displayable d){ url=t1.getString(); th=new Thread(this); th.start(); } } on m ny khng c nhiu khc bit vi on m trn, Thay v chuyn i kt xut t server tr v thnh dng chui, ta li chuyn i kt qu tr v t server thnh dng nh v hin th ln mn hnh: im=Image.createImage(server,0,server.length); ImageItem ii=new ImageItem(null,im,ImageItem.LAYOUT_DEFAULT,null);

168

if(fr.size()!=0) fr.set(0, ii); else fr.append(ii); Trong on m trn i tng "server" l i tng mng byte dng cha kt qu tr v t server. Bn ch , c th links download nh ny s khng cn tn ti sau mt khong thi gian nht nh no , bn nn thay link ny bng mt link khc, ch , kiu nh c J2me h tr l PNG.

Chng 4: To Server bng cng ngh Servlet ca Java


4.1. Chng trnh Servlet
Servlets l tp m lnh java c chy trn ng dng web (do tn Servlets, tng t nh Applets pha client) tr li nhng yu cu t pha client. Servlets s dng cc chun m rng ca java nh class trong gi javax.servlet v javax.servlet.http. T khi Servlets c vit vi cc ngn ng cp cao v ko theo nhng framework chun, Chng cung cp cch thc khi to nhng yu cu phc tp tinh vi pha server v ph thuc vo h iu hnh. HTTP Servlets bao gm nhng ni dung chnh sau: X l v lu tr d liu c submit bi HTML form. Cung cp cc ng cnh ng, chng hn. tr v kt qu ca cu query t pha server cho client. Mt servlet l mt lp con thng thng ca javax.servlet.http.HttpServlet , mt servlet phi thc hin 4 phng thc: public void init (ServletConfig config) - c servlet container gi khi th hin ca servlet c to ra ln u tin, v sau khi yu cu c x l. Public void doGet (HttpServletRequest req, HttpServletResponse res) c gi x l cc yu cu s dng phng thc HTML GET v tr v cc tr li tng ng.

169

public void doPost (HttpServletRequest req. HttpServletResponse res) c gi x l cc yu cu s dng phng thc HTML POST v tr v cc tr li tng ng. public void destroy () - c Webserver gi khi n kt thc servlet.

4.2. Trnh ch Tomcat


Tomcat, Jrun v Weblogic l nhng trnh ch Webserver h tr Java rt ni ting, nhng vi Jrun v Weblogic th chng l nhng chng trnh thng mi. Ngha l mun s dng chng bn phi tr tin bn quyn. Chng ta c th s dng nhng Web server min ph vi kh nng h tr Java khng thua km, chng hn nh TomCat Webserver. Trnh ch TomCat l ng dng Web server c m ngun m (open source) rt thch hp cho mc ch nghin cu ca sinh vin hc sinh. C th download min ph ti m ngun v b ci TomCat ti a ch http://jakarta.apache.org. Ton b chng trnh ci t l mt file zip duy nht jakarta-tomcat-3.2.3.tar.gz.

4.3. Cu hnh ng k Servlet vi Tomcat


4.3.1. Ci t tnh ch Tomcat c th chy c cc chng trnh Servlet bn cn phi ci t c mt trnh ch Web server hiu v din dch c JSP/Servlet, c rt nhiu trnh ch dng ny, tuy nhin trong gio trnh chng ta s s dng trnh ch m ngun m Tomcat, vi Tomcat, c nhiu thao tc chng ta phi cu hnh bng tay v giao din khng c p mt, tuy nhin Tomcat l mt trnh ch c cu hnh n gin, c th chy trn hu ht cc h iu hnh v tc thng dch JSP/Servvlet ca Tomcat kh nhanh v hiu qu.

Hnh 4.1: Icon ca chng trnh Tomcat

170

Tomcat l mt chng trnh rt d ci t, ging nh cc chng trnh phn mm khc. Nhng ch ng dn t th mc Tomcat s dng sau ny. Mt ch khc na l trc khi ci t Tomcat cn phi ci t Java c mi trng bin dch, c th s dng cc phin bn Java t 1.5 tr ln, Tomcat 6.0 tr ln.

Hnh 4.2: La chn th mc ci t Tomcat Chng ta s gi th mc ci t Tomcat l $CATALINA_HOME. Bc tip theo, Tomcat yu cu chng ta chn cng kt ni, v trnh ch IIS ca windows khi ng sn trn cng 80, nn bn nn chn mt cng c gi tr khc hoc mc nh l cng 8080 nh trong hnh di y:

171

Hnh 4.3: La chn cng kt ni v to ti khon cho ngi qun tr bo mt, bn cng nn t Password cho ti khon qun tr, ti khon ny cho php bn s dng phn Tomcat Web Application Manager qun l cc ng dng web nh: deploy, dng, hot ng, load li hay hy b ng dng web. Sau khi ci t, bn cn phi bt Tomcat nn bng cch kch chut phi vo biu tng Tomcat khay h thng v chn Start Service, tt chn Stop Service. kim tra Tomcat hot ng hay cha, bn m trnh duyt v g vo a ch url: http://localhost:8080/, nu ci t thnh cng, kt qu s nh sau:

Hnh 4.4:
172

Trang ch Tomcat 4.3.2. Cu hnh ng k Servlet vi Tomcat 4.3.2.1. Cu hnh ng k Servlet bng tay vi Tomcat u tin bn hy to ra mt chng trnh Servlet hello world c ni dung nh sau: import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class helloworld extends HttpServlet{ protected void doGet(HttpServletRequest req,HttpServletResponse res) throws IOException{ res.setContentType("text/html"); PrintWriter out=res.getWriter(); out.println("Hello world"); } } Bin dch chng trnh trn thnh file helloworld.class. Ch , bin dch c chng trnh trn bng Netbeans trong mt d n Java thng thng, bn hy download th vin Servlet.jar v v add n vo phn libraries ca d n:

173

Hnh 4.5: Thm th vin vo mt d n netbeans Bc tip theo, Bn cn to mt th mc mi trong th mc $CATALINA_HOME\webapps. Tomcat quy nh t mi ng dng web trong mt th mc ring bit bn di th mc webapps. Gi s th mc mi c tn l helloServlet. Trong th mc helloServlet bn to mt th mc con c tn l WEB-INF. Th mc WEB-INF l mt th mc c bit trong cc ng dng web vit bng JSP v Servlet. Theo c t chun ca Java th WEB-INF l th mc cha cc thng tin v th vin dng truy xut ng dng web. Trong th mc WEB-INF bn to ra mt th mc c tn gi l classes, bn copy file helloworld.class vo th mc ny. Cng trong th mc WEB-INF bn hy to ra mt file c tn l web.xml c ni dung nh sau: <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <display-name>chuong trinh helloworld</display-name> <servlet> <servlet-name>hello</servlet-name> <servlet-class>helloworld</servlet-class> </servlet> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/helloworldservlet</url-pattern> </servlet-mapping> </web-app>

174

Nh bn thy th <display-name> dng t tn cho trang web. Bn hy ch n th servlet v servlet-mapping, chng ta s ch nh v nh x tn cho Servlet n c th triu gi c t a ch URL ca trnh duyt trong cc cp th ny. Th <servlet> cho php ta nh ngha vt l v Servlet: <servlet> <servlet-name>hello</servlet-name> <servlet-class>helloworld</servlet-class> </servlet> Trong th <servlet>, th <servlet-name> dng t tn cho Servlet, y l tn chng ta s dng nh x ng dn sau ny. Th <servlet-class> s ch ra tn lp cha Servlet, tn lp chng ta a vo y l helloworld (file class ca chng ta c tn l helloworld.class). Bn lu , chng ta khng cn ch r phn tn m rng ng sau. <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/helloworldservlet</url-pattern> </servlet-mapping> Th <servlet-mapping> cho php ta nh x tn cho Servlet, trong <servlet-name> phi trng vi phn <servlet-name> nh ngha trong th <servlet>, cn th <url-pattern> l phn nh ngha tn nh x cho Servlet, phn ny rt quan trng bi web server s s dng tn nh x nhn bit Servlet khi bn triu gi t ng dn url. Sau tt c cc bc, bn cn restart li Tomcat, v g vo trnh duyt a ch sau: http://localhost:8080/helloServlet/helloworldservlet Bn thy rng, trong a ch url c tn ca th mc cha ng dng Servlet (helloServlet) v tn nh x ca Servlet c nh ngha trong th <url-pattern> (helloworldservlet). Kt qu thc thi Servlet nh hnh di y:

175

Hnh 4.6: kt qu thc thi Servlet 4.3.2.2. Cu hnh ng k Servlet vi Tomcat bng NetBeans Netbean bn y cho php bn to mi loi ng dng Java. to mt ng dng Servlet bn hy to mt Project mi v chn loi d n l Java Web nh hnh di y:

Hnh 4.7 : To d n Java Web vi NetBeans Sau l t tn cho d n:

176

Hnh 4.8: t tn cho d n Java Web Bc tip theo l bc rt quan trng , l, xc nh loi Server h tr chy chng trnh Java Web ca bn, v Tomcat khng c sn nn bn cn n ng k n vi NetBeans:

Hnh 4.9: Thm loi Server mi vi Netbeans Bn nhn vo nt add v chn Tomcat:

177

Hnh 4.10: Thm Server Tomcat vi netBeans Bn cn ch ra th mc ci t Tomcat (CATALINA_HOME):

Hnh 4.11: Ch ra ng dn ci t Tomcat

178

Hnh 4.12: Ch ra ng dn ci t Tomcat Sau , bn cn nhp tn ti khon qun tr ca Tomcat, b phn tch chn "create user if it does not exist":

Hnh 4.13:

179

Sau khi cu hnh Tomcat vi NetBeans thnh cng, bn hy to mt Servlet trong d n Java Web mi (ly servlet helloworld phn trn lm v d). Bn hy kch chut phi vo servlet v chn run. Kt qu s nh hnh di y:

Hnh 4.14: Kt qu chy chng trnh servlet helloworld vi NetBeans

4.4. Vng i ca mt Servlet


Mt servlet l mt lp Java b sung giao tip servlet. Giao tip ny b sung ba phng thc nh ngha vng i ca servlet: public void init(ServletConfig config) throws ServletException: phng thc ny c gi mt ln khi servlet c ti vo trong servlet engine, trc khi servlet c yu cu x l yu cu u tin ca n. public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException: phng thc ny c gi x l mt yu cu. N c th khng gi, gi mt ln hay nhiu ln cho n khi servlet c ngng ti. Nhiu thread (mi yu cu) c th thc thi phng thc ny song song, v th n tr nn an ton. public void detroy(): phng thc ny ch c gi mt ln trc khi servlet c ngng ti v g b dch v.

180

Hnh 4.15: Vng i ca mt Servlet Phng thc init c mt thuc tnh ServletConfig, servlet c th c cc i s khi to ca n thng qua i tng ServletConfig. Chng thng c nh ngha trong mt file cu hnh. Mt v d thng thng ca mt i s khi to l nh danh database. private String databaseURL; public void init(ServletConfig config) throws ServletException { super.init(config); databaseURL = config.getInitParameter("database"); } Servlet API c cu trc servlet c th cho php b sung mt giao thc khc HTTP. Gi javax.servlet cha cc lp v cc giao tip c k tha giao tip mt cch c lp. Gi javax.servlet.http cha cc lp v giao tip HTTP c th. y ch l mt s gii thiu v servlet, b qua s phn bit ny y v ch tp trung vo HTTP servlet. Servlet u tin ca chng ta tn l ReqInfoServlet k tha mt lp tn HTTPServlet. HTTPServlet l mt phn ca JSDK v c b sung giao tip Servlet cng vi mt s cc phng thc hu dng khc. Chng ta nh ngha lp ca chng ta nh sau: import javax.servlet.*;
181

import javax.servlet.http.*; public class ReqInfoServlet extends HttpServlet { ... } Mt tp cc phng thc trong HTTPServlet l nhng phng thc xc nh dch v trong giao tip servlet. Vic b sung dch v trong HTTPServlet ging nh mt kiu ca cc yu cu c x l (GET, POST, HEAD) v gi mt phng thc c th cho mi kiu. Bng vic lm ny, cc nh pht trin servlet an tm khi x l chi tit nhng yu cu nh HEAD, TRACE, OPTIONS v c th tp trung vo nhng yu cu thng dng hn nh GET v POST. V d v phng thc doGet: protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}

4.5. Cc hm API trong Servlet


Nh c gii thiu t cc phn trc, Servlet gm cc phng thc c bn sau: Phng thc M t public void init (ServletConfig config) Phng thc khi to public void service(ServletRequest X l mt yu cu t my khch request, ServletResponse response) c Webserver gi khi n kt thc servlet. javax.servlet.http.HttpServlet Public void doGet (HttpServletRequest X l cc yu cu s dng phng thc req, HttpServletResponse res) public void doPost (HttpServletRequest req, HttpServletResponse res) Bn hy ch n theo xy dng cc Servlet. HTML GET X l cc yu cu s dng phng thc v throws ServletException, IOException public void detroy()

HTML POST cc i tng HttpServletRequest

HttpServletResponse, chng ta s s dng n chng rt nhiu trong phn tip

182

4.6. S dng HttpServlet

Hnh 4.16: C ch hot ng ca Servlet Trc khi i tm hiu cch xy dng mt Servlet hon thin, bn hy nh li cc c ch hot ng ca Servlet. i vi Servlet, mi mt yu cu t client u c coi l mt tin trnh ring v c phc v trong phng thc doGet hoc doPost. V vy, nhng thng tin no dnh ring cho mi yu cu bn hy ci t cc b trong cc phng thc doGet, doPost, cc thng tin dng chung cho cc yu cu bn hy ci t ton cc v nh khi to n trong phng thc init( ). Trong hai phng thc doGet v doPost c hai tham s quan trng l HttpServletRequest v HttpServletResponse. HttpServletRequest s c dng bn tip nhn d liu t trnh khch chuyn ln v HttpServletResponse bn kt xut kt qu phn hi tr li trnh khch. kt xut kt qu phn hi tr li trnh khch, trc tin chng ta cn gi phng thc setContentType() ca i tng Response nh dng kiu ni dung d liu cn kt xut trnh khch bit cch hin th: public class helloworld extends HttpServlet{ protected void doPost(HttpServletRequest req,HttpServletResponse res) throws IOException{ ... res.setContentType("text/html"); ... } }
183

ch : Bn ch rng chng trnh MIDlet khng phi l mt trnh duyt, khng th hiu c m HTML, v vy, nu bn dng Servlet vit Server cho ng dng trn in thoi di ng, bn ch nn kt xut kt qu phn hi tr li trnh khch l dng d liu th, khng nn km th HTML. Tip theo, Servlet cn ly v lung xut PrintWriter ghi kt xut tr li trnh khch: public class helloworld extends HttpServlet{ protected void doPost(HttpServletRequest req,HttpServletResponse res) throws IOException{ ... res.setContentType("text/html"); PrintWriter out=res.getWriter(); ... } } Bn c th dng hm print, println ca i tng ny in kt xut khng khc g dng lnh System.out.println() ca Java: import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class helloworld extends HttpServlet{ protected void doGet(HttpServletRequest req,HttpServletResponse res) throws IOException{ res.setContentType("text/html"); PrintWriter out=res.getWriter(); out.println("Hello world"); } } tip nhn d liu t trnh khch, bn dng phng thc getParameter(String tn_tham_s) ca HttpServletRequest. Trc khi i vo v
184

d, chng ta s cng nhc li v vic truyn tham s trong giao thc HTTP: Mt tham s c truyn ln trnh ch s c hai phn l tn tham s v gi tr ca tham s. Trong phng thc doGet, bn s thy cc tham s c truyn ngay trn chui url vi cu trc nh sau: a_ch_url? tn_tham_s1=gi_tr_tham_s_1&tn_tham_s2=gi_tr_tham_s2&.... V d: http://abcmail.com?username=nguyen van a&password=123456 vi phng thc doPost, tham s khng c truyn trc tip trn a ch url m c truyn theo lung. By gi, chng ta hy lm v d sau, trnh khch truyn ln tham s l tn v qu qun, trnh ch kt xut li li cho nh hnh sau:

Hnh 4.17: v d truyn tham s ln Servlet Bn hy t Servlet ca bn trong Folder c tn l vd v t tn cho Servlet l vd: import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class helloworld extends HttpServlet{ protected void doGet(HttpServletRequest req,HttpServletResponse res) throws IOException{
185

String ten=req.getParameter("name"); String que=req.getParameter("add"); res.setContentType("text/html"); PrintWriter out=res.getWriter(); out.println("Hello "+ten+" "+que); } } Bn bit cch kt ni Internet vi J2me, cng bit cch to Server bng k thut Servlet, vy hy xy dng mt ng dng truyn thng n gin bng hai k thut ny: To mt MIDlet cho php ngi dng nhp tn v qu qun vo hai TextField, sau ngi dng nhn nt kt ni MIDlet tin hnh kt ni v gi tn v qu qun ca ngi dng n Servlet trn, khi Servlet kt xut kt qu tr v l mt li cho hy hin th li cho ln mn hnh in thoi: import java.io.*; import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import javax.microedition.io.Connector; import javax.microedition.io.HttpConnection; public class VDTH extends MIDlet implements Runnable, CommandListener{ HttpConnection con; InputStream in; OutputStream out; Thread th; Form fr; Display dis; TextField t1,t2; StringItem it; Command c1; String url; public VDTH(){

186

th=new Thread(this); dis=Display.getDisplay(this); fr=new Form("vdform"); t1=new TextField("tn:","",20,TextField.ANY); t2=new TextField("qu qun:","",20,TextField.ANY); it=new StringItem("kt qu kt ni:",""); fr.append(t1); fr.append(t2); fr.append(it); c1=new Command("connect",Command.OK,1); fr.addCommand(c1); fr.setCommandListener(this); } public void startApp() { dis.setCurrent(fr); } public void pauseApp() { } public void destroyApp(boolean unconditional) { } public void connect(){ try{ con=(HttpConnection)Connector.open(url); con.setRequestMethod(HttpConnection.GET); con.setRequestProperty("User-Agent","Profile/MIDP-2.0 Configuration/CLDC-1.1"); con.setRequestProperty("Content-Language", "en-US"); con.setRequestProperty("Content-Type", "application/xwww-form-urlencoded"); }

187

catch(Exception e){ System.out.println("ket noi li"+e.getMessage()); } } public void in(){ String str="nothing"; try{ in=con.openInputStream(); int length=(int)con.getLength(); byte server[]; if(length!=-1){ server=new byte[length]; in.read(server); str=new String(server); } else { ByteArrayOutputStream br=new ByteArrayOutputStream(); int ch; while((ch=in.read())!=-1) br.write(ch); str=new String(br.toByteArray()); br.close(); } it.setText(str); } catch(Exception e){ } }

188

public synchronized void run(){ this.connect(); this.in(); } public void commandAction(Command c, Displayable d){ url="http://localhost:8080/vd/vd? name="+t1.getString()+"&add="+t2.getString()+""; th=new Thread(this); th.start(); } } Kt qu nh sau:

Hnh 4.18: V d to mt ng dng truyn thng gia MIDlet v Servlet

189

190

Chng 5: Kt ni c s d liu vi Java


5.1. C ch ODBC v JDBC
5.1.1. C ch ODBC 5.1.1.1. Khi nim ODBC (Open Database Connectivity) l mt giao tip CSDL ph bin nht trong th gii cc my tnh c nhn theo chun IBM (PC world) v dn dn i vo cc mi trng khc. ODBC l mt ci t ca Microsoft cho cc c t X/Open v SQL Access Group Call Level Interface (giao din mc gi nhm truy xut SQL). ODBC cung cp cc hm cho php cc ngn ng lp trnh truy cp vo mt CSDL, bao gm cc thao tc thm, sa, xa d liu v nhn cc chi tit v CSDL nh bng, ch mc (index), khung nhn (view) ODBC c cu trc bao gm 5 lp: Lp ng dng: cung cp giao din GUI v logic cng vic, c vit bng cc ngn ng nh Java, Visual Basic,Cc ng dng dng cc hm ODBC giao tip vi CSDL. Lp trnh qun l cc b iu khin: l mt phn ca Microsoft ODBC, n qun l cc b iu khin khc nhau tn ti trong h thng, bao gm vic np, gi trc tip n b iu khin tng ng v cung cp cc thng tin ca b iu khin cho cc ng dng khi cn. V mt ng dng c th kt ni vi hn mt CSDL nn Trnh qun l ny phi m bo rng cc h qun tr CSDL s nhn c tt c cc lnh gi tng ng trc tip t ng dng v rng tt c cc d liu s tr v ng ng dng ang gi. Cc b iu khin l thnh phn thc s lm vic vi CSDL. Cc b iu khin thng dng l Access. SQL Server, ORACLE. Cc giao tip ODBC cha tp cc lnh gi nh cc lnh SQL, cc qun l kt ni, thng tin v CSDL,Cn nhim v ca cc b iu khin l ci t cc

191

chc nng y. B iu khin truyn cc truy vn n cc CSDL, nhn kt qu tr v v hng dng d liu y n ng dng. Khi CSDL nm trong h thng mng cc b hay trn Internet, b iu khin cn kim lun vic thc hin kt ni mng. Trong phm vi ca ODBC, ngun d liu c th l mt h qun tr CSDL hay mt kho d liu (data store), thng l cha tp cc tp tin trn a cng. Ngun d liu c th ch n gin l mt CSDL Access cha cc d liu v chi ph ca mt cng ty nh b hay cng c th l mt kho d liu khng l hng ngn Gigabytes, cha trn nhiu my ch khc nhau ca d liu chi tit ca cc ha n ca mt cng ty in thoi 5.1.1.2. Tp hp hm v lnh ca ODBC Cc ODBC c mt lng rt ln cc hm, t vic thc hin mt kt ni n gin n vic thc hin nhng th tc ci sn c kt qu l v s cc tp d liu. Tt c cc hm ODBC u c mt tin t l SQL v c th c mt hay nhiu tham s. C th l cc tham s nhp vo b iu khin (input type) hay xut (output type). Ta c s v cc bc ca mt qu trnh ODBC nh sau: Khi to v nh v: bc u tin l nh v mi trng, vng nh cho kt ni v cu lnh Thc hin: c th ta s gi SQLExcuteDirect nu tc ng trc tip ln Database, hay thc hin vic chun b khi cn s dng cc tham s. Kt qu: cc kt qu nhn c s gn vo vng d liu (data Column) to thnh cc tp kt qu (cursor). Vic gn d liu ny xem cc ct/vng d liu l cc bin chng trnh c th truy xut c bng cch gi tn. Gi tr ca cc bin ny c quy nh t vic dng SQLFetch to ra cc records tng ng. Khi khng cn record, gi tr c tr v l SQL_NO_DATA_FOUND. Dn dp: cc lnh Free,Disconnectc gi gii phng cc vng nh c cp.
192

Vi Java, lp trnh vin khng cn bit n cc bc 1 v 4. l v Java l mt ngn ng hng i tng, vic gi mt i tng kt ni t n nh v cho phng thc, cho cc cu lnh. Mt khc vic thu dn rc trn vng nh s do cc my o Java t ng thc hin.

5.1.1.3. Cc chuyn tc (transactions)


Nguyn l v s chuyn tc l mt phn c tch hp vo bt c h CSDL khch/ch no. Mt transaction l mt nhm cc lnh SQL thc hin vic cp nht, thm, xa cc record hay cc field trong CSDL. Cc transaction c thuc tnh c ht hay l khng c g. Nu tt c cc cu lnh SQL c thc hin hon ton, transaction c xem l hon tt (c tt c), cn nu ch mt lnh khng thc hin c, th transaction s hon chuyn (roll-back) li nh c (khng c g). Cc transaction bo m cho CSDL tnh ton vn v nht qun ca d liu. a) Cc thuc tnh ACID Cc thuc tnh ACID ca mt transaction l: Atomicity (nguyn t), Consistency (nht qun), Isolation (tch bit), Durability (bn vng). Mt transaction l mt thc th nguyn t, khng th phn chia. Tnh nguyn t c thc hin bi cc phng thc commit() v rollback(). Mt transaction l nht qun v n khng th thc hin bt k cc hnh vi no i lp vi logic cng vic hay quan h gia cc phn t d liu (data element). Tnh nht qun v cng quan trng khi ta pht trin h thng khch/ch v s c rt nhiu transaction trn d liu lu trong cc h thng v i tng khc nhau. Mt transaction l tch bit v kt qu ca n khng ph thuc bt k cc transaction no c hon thnh trc n. Tnh tun t ca transaction c ngha c lp. V mt transaction l bn vng v hiu qu ca n s tn ti c khi h thng b li.

193

b) iu phi cc transaction phn tn Ta cn c mt h qun l cc transactions, nht l khi lm vic vi cc ngun d liu, cc h thng, i tng khng ng b. B iu phi cc transactions phn tn (Distributed Transaction Coordinator - DTC) s bo v cc ngun ti nguyn ca cc h qun tr CSDL bng cch ghi nhn li tt c cc transaction c thc hin. Cc ng dng s xc lp vic thc hin bng cch gi b DTC commit hay rollback cc transactions. 5.1.2. C ch JDBC 5.1.2.1. Khi nim JDBC + Java Database Connectivity API Nh tn gi, JDBC l mt phn ca cc hm Java API cho mi trng x nghip do Sun Microsystems, Inc. pht trin. Theo quan im ca mt nh pht trin JDBC, JDBC l mt c gng chun ha u tin tch hp CSDL quan h vi cc chng trnh Java. JDBC cha mt tp hp cc i tng v phng thc ca CSDL quan h giao tip vi cc ngun d liu SQL (SQL Data sources). Cc JDBC API c tch hp trong Java SDK 1.2 v l mt trong cc phn t c bn trong cc ci t my Java o. JDBC c thit k da vo X/Open SQL Call Level Interface (CLI-giao tip mc gi SQL theo chun X/Open). Tuy ODBC cng c xy dng trn CLI, nhng JDBC khng trng khp vi ODBC. l do ODBC l mt giao din C cho h Qun tr CSDL v khng th chuyn bin theo kiu Java, mc d cc k s ca Sun mun s dng chng cc hng phn mm d dng hn khi tip cn vi Java. Do , JDBC c thit k sao cho n l mt mt giao tip Java nht qun vi tt c cc phn cn li ca h thng Java 5.1.2.2. C ch hot ng ca JDBC JDBC hot ng tng t ODBC nhng thng qua cc i tng : Chng trnh Java to mt i tng kt ni (connection object) thc hin kt ni vi CSDL
194

To mt i tng Statement (cu lnh) v chuyn cc cu lnh SQL n CSDL thng qua i tng ny v nhn v cc kt qu (c th l cc thng tin hay tp cc record). gim thi gian tr, cc tp tin JDBC class thng c np sn trn my khch. Cc lp JDBC nm trong khi java.sql v mi chng trnh Java u dng cc i tng v phng thc trong khi java.sql c v vit ln ngun d liu. Mt chng trnh Java dng JDBC cn mt trnh iu khin cho ngun d liu m n cn giao tip. Trnh iu khin ny c th l mt mun gc (native module) nh JDBCODBC.dll (th vin cu ni JDBC-ODBC), hay cng c th l mt chng trnh Java khc trao i vi my ch thng qua cc giao thc HTTP, hay RPC... Trong trng hp mt ng dng lm vic vi nhiu CSDL, JDBC c mt trnh qun l cc b iu khin v cung cp danh sch cc b iu khin c ng dng s dng. 5.1.2.3. Cc loi JDBC

Hnh 5.1: Cc loi JDBC C 4 loi JDBC driver. Thng dng nht v cng l hiu qu nht l loi 4. Sau y l m t: Cu ni JDBC-ODBC : cung cp cc truy cp JDBC thng qua cc truy cp ODBC. V rng trong nhiu CSDL my khch, cc lnh ODBC v
195

lnh CSDL phi c np trc trong my khch , nn kiu iu khin ny rt thch hp cho mng cng tc (corporate network) hay cho cc ng dng chy trn my ch trong kin trc 3 lp.java. Trnh API gc c mt phn Java (Native-API partly-Java technologybased driver) chuyn cc lnh gi JDBC thnh cc lnh gi API trn my khch ca CSDL (nh ORACLE, Sybase, Informix, DB2...). Nh th n i hi trn my khch cng cn np trc mt s lnh nh phn ca cc trnh chy trn my khch ca CSDL.
Database Server (vendor A) Database Server (vendor B) Database Server (vendor C)

My khch (Java Database)

Trnh JDBC kiu 2 Java & m nh phn

Trnh giao thc mng hon ton Java (net-protocol all-Java technologybased driver): chuyn cc lnh gi JDBC thnh cc giao thc mng c lp vi H qun tr CSDL (DBMS-independent net protocol), sau my ch s chuyn thnh cc giao thc DBMS. Chnh phn mm mng trn my ch trung gian ny c th kt ni cc my khch c nn Java vi nhiu loi CSDL khc nhau. Giao thc s dng s ph thuc vo cc nh cung cp phn mm. C th coi y l mt JDBC linh hot v rt c cc nh cung cp sn phm thch th v n cho php h cung ng trn gi cc sn phm tng thch cho h Intranet ca ngi dng hay cc dch v cn thit cho hot ng ca h mng cc b nh bo mt, truy cp qua bc tng la,...
Database Server (Vendor A) My khch (Java Database) My ch cho truy cp d liu Database Server (Vendor B) Database Server (Vendor C) 196

Trnh giao thc gc hon ton Java (native-protocol Java technologybased driver): bin cc lnh gi JDBC thnh cc giao thc mng gi trc tip t h qun tr CSDL. Trnh ny cho php gi trc tip t my khch n my ch cha DBMS v l gii php thc t cho vic truy cp Intranet. T khi cc giao thc ny l thuc tnh ca CSDL, cc nh cung ng CSDL, cng mun tr thnh ngun ti nguyn chnh cho cc trnh theo phong cch ny. Ta c th thy mt v d c th nh sau :
giao thc c bit ca ngi bn My khch (Java Database) Trnh JDBC thun Java Database Server

SUN khuyn co s dng v pht trin cc trnh iu khin loi 4 trong cc ng dng.

5.2. Kt ni c s d liu vi JDBC


5.2.1. Ci t Trnh iu khin kt ni vi c s d liu, JDBC i hi hai yu t l trnh iu khin driver (tng ng vi cc kiu kt ni) v thng tin kt ni (nh a ch my ch, tn ti khon ng nhp v mt khu...). Bn lu rng mi trnh qun l c s d liu li c h tr bi cc driver khc nhau, y chng ta s ch tm hiu n cch kt ni vi c s d liu SQL Server 2000, do cng ch tm hiu v cc driver h tr h qun tr d liu SQL Server 2000. C rt nhiu driver khc nhau c th lm vic vi SQL Server nhng y chng ta s cp n jTDS driver. jTDS l mt d n m ngun
197

m c cung cp bi sourceforge.net, jTDS l JDBC driver loi 4, c vit thun ty bng Java, l loi driver c khuyn co l nn dng nht v hiu qu lm vic ca n. jTDS h tr Microsoft SQL Server 6.5, 7, 2000, 2005 v 2008. Ngoi jTDS bn cn c th s dng cc driver khc, nh Microsoft SQL Server 2000 JDBC Driver, mt driver c cung cp bi Microsoft. Bn c th tm n Microsoft Download Site download v. Cc bc tin hnh ci t cng ging nh vi jTDS. ci t driver, trc tin bn hy ci t SQL Server 2000 v sau l bn nng cp SP4 ca n (nu l SQL Server 2005 bn khng cn ci t bn nng cp ny). Bn hy download bn nng cp ny t trang Download ca Microsoft, sau khi download bn s nhn v mt file .EXE, nhim v ca file .EXE ny l bung ra mt folder cha cc file cn thit ci t phin bn SP4 (mc nh l nm trong C), bn hy tm file setup trong folder ny v tin hnh ci t n. Tip theo, bn hy download driver jTDS v t a ch

http://jtds.sourceforge.net/index.html. Bn s download c v mt file nn, bn gii nn ra ly file jtds.jar. Bn copy file .jar ny vo th mc $CATALINA_HOME\lib cc Servlet c th s dng c driver ny hoc bn hy add n phn libraries ca d n:

Hnh 5.2:
198

Thm th vin vo mt d n netbeans cc chng trnh Java trong d n ca bn c th s dng Driver ny kt ni n c s d liu. 5.2.2. To c s d liu Trc tin, c th thao tc c vi d liu, chng ta cn c mt c s d liu v cc bng. tin cho cc v d chng ny, bn hy to ra mt c s d liu vi tn l db vi ti khon admin c username l sa v password l sa. V to ra mt bng sinhvien c cu trc nh sau:

Hnh 5.3: Bng sinh vin trong c s d liu db 5.2.3. Kt ni ti c s d liu vi JDBC c th lm vic vi d liu ca mt CSDL, mt chng trnh Java (v c cc chng trnh vit ngn ng khc) phi tun theo cc bc sau:

Thc hin mt kt ni vi CSDL: Chng trnh Java s gi phng thc getConnection() nhn v i tng Connection.

Sau thc hin cc lnh: Cc chng trnh Java ch thc hin c cc lnh trn CSDL thng qua i tng Statement. Cc cu lnh SQL c th c thc hin tc th thng qua i tng Statement, c th l mt cu lnh bin dch trc (i tng PreparedStatement) hay c th l mt lnh gi cc th tc ci sn (stored Produced) trong CSDL (i tng CallableStatement). Cc cu lnh SQL c th thc hin thng qua phng thc excuteQuery() kt qu l mt i tng ResultSet, hay phng thc excuteUpdate() kt qu l mt s nguyn cho bit tng cc dng (records) d liu chu tc dng ca cu lnh va thc hin (thng l cc cu lnh sa cha s liu (update hay delete)).
199

Trong trng hp c s dng trnh qun l transaction, cc phng thc rollback() c dng phc hi trng thi trc hay v commit() xc nhn vic thc hin lnh. chm dt cn xa kt ni, xa cc i tng gii phng ti nguyn ca h thng. 5.2.3.1. Thit lp kt ni a) Np trnh iu khin Bc u tin to ra mt kt ni gia ng dng Java v mt c s d liu l ng k mt JDBC driver vi my o Java (JVM) m ng dng Java chy trn . c t JDBC ch ra rng cc JDBC driver c xem l s t ng k vi i tng DriverManager mt cch t ng khi chng c np vo mt JVM. V d : static { java.sql.DriverManager.registerDriver(new com.persistentjava.JdbcDriver()) ; } Vic ng k mt driver n gin ch l vic np lp driver vo JVM. Chng ta c th lm iu bng mt s cch khc nhau. Mt trong nhng cch l thng qua: ClassLoader Class.forName(com.persistentjava.JdbcDriver) ;. V d ng k trnh iu khin jTDS ta lm nh sau: try{ Class.forName(net.sourceforge.jtds.jdbc.Driver).newInstance (); } catch (Exception e){ } b) To kt ni Bc tip theo sau khi ng k JDBC Driver l thc hin kt ni. Ton b cng on ny c minh ha qua dng m sau: Connection conn;
200

conn = DriverManager.getConnection(url, myLogin, myPassword); on m trn rt tng minh, url l a ch my ch ni cha c s d liu, myLogin v myPassword l tn ti khon v password ng nhp vo h qun tr c s d liu. Phng thc getConnection() c gi thc hin mt kt ni thc s n phn mm my ch c s d liu. Lp DriverManager to ra mt i tng Connection khi bn gi phng thc getConnection(). kt ni ti c s d liu db ca SQL Server 2000 vi jTDS driver ta cn thit lp chui url nh sau: jdbc:jtds:sqlserver://localhost:1433/db V d sau y s gip bn to ra mt kt ni hon chnh: import java.sql.*; import java.util.*; public class Connect{ Connection getConnect(String driver,String url,String user,String pass){ Connection conn=null; try{ Class.forName(driver).newInstance(); conn=DriverManager.getConnection(url,user,pass); System.out.println("thanh cong"); } catch(Exception e){ System.out.println("ket noi khong thanh cong"); System.out.println(e.getMessage()+e.toString()); } return conn; } }

201

5.2.4. Truy vn d liu Tip theo, bc quan trng l trch rt c d liu ca mt bng trong c s d liu. Chng ta nh ngha cu truy vn SQL nh sau: String sqlQuery="SELECT * FROM tn_bng"; Cu truy vn ny s chn tt c cc d liu ca cc ct c trong bng. Nu ch mun truyn ra mt s ct no bn c th ch nh tng minh lnh SELECT nh sau: String sqlQuery="SELECT tn_ct1,tn_ct2,tn_ct3 FROM tn_bng"; yu cu JDBC truy vn d liu bn da vo i tng Statement. i tng ny c dng thc thi mi cu lnh SQL. Ring i vi lnh SQL SELECT nu truy vn thnh cng, Statement s tr v kt qu l tp d liu truy vn c c kiu ResultSet. Di y l on m thc thi cu truy vn: Statement stmt = null; ResultSet rs = null; String sqlQuery="cu_lnh_truy_vn"; stmt = con.createStatement(); rs = stmt.excuteQuery(sqlQuery); 5.2.5. Trch xut d liu i vi lnh SELECT sau khi nhn c kt qu tr v l tp ResultSet, bn gi phng thc next() i n tng mu tin v in ra kt qu ca cc ct. Phng thc next() s tr v false nu n cui tp d liu. on m thng dng ly tt c mu tin trong ResultSet bng vng lp while c dng sau: while (rs.next()) { //In d liu ca ct th nht trong mu tin System.out.println(rs.getString(1)); //In d liu ca ct th hai trong mu tin System.out.println(rs.getString(2)); ... }

202

Cc ct trong tp d liu ResultSet c nh s th t t 1. V d nu cu lnh SELECT ca bn c ni dung: String sqlQuery="SELECT tn_ct1,tn_ct2,tn_ct3 FROM tn_bng"; Kt qu rs.getString(1) s tr v d liu ca ct 1, rs.getString(2) s tr v d liu ca ct 2, rs.getString(3) s tr v d liu ca ct 3 dng chui v c th tip din. Nu khng bit trc c bao nhiu ct kt qu s tr v trong tp d liu ResultSet (v d trng hp cu lnh SELECT * FROM tn_bng) bn c th c c nhng thng tin v s ct cng nh kiu d liu ca mi ct bng cch gi phng thc getMetaData(). Phng thc ny ca i tng ResultSet s tr v nhng thng tin c t kiu ca cc trng. V d in ra tiu cho tt c cc ct d liu, mt cch tng qut bn c th s dng on m sau: //Ly v i tng ResultSetMetaData ResultSetMetaData srmd = rs.getMetaData(); //m s ct d liu hin c int columnCount = rsmd.getColumnCount(); //In ra tiu ca cc ct for (int i = 0; i < column; i++) { System.out.println(rsmd.getColumnLabel(i + 1)); } V duyt in ra tt c d liu ca cc ct trong ResultSet, bn c th thc hin tng qut hn nh sau: //Duyt tng mu tin while (rs.next()) { //In ra d liu ca tt c cc ct trong mu tin for (int i = 0; i < columnCount; i++) { System.out.println(rs.getString(i + 1)) } }

203

5.2.6. X l cc lnh SQL INSERT/UPDATE/DELETE Ngoi lnh SQL SELECT thng s dng ra, cc lnh thay i d liu nh INSERT (to mi mu tin), UPDATE (cp nht mu tin) v DELETE (xa b mu tin) bn cng s gp trong qu trnh pht trin ng dng. Thc thi nhng lnh ny cng tng t nh thc thi lnh SELECT. Chng ta da vo i tng Statement. Tuy nhin khc vi SELECT, nhng lnh SQL nh INSERT/ UPDATE/ DELETE sau khi thc thi khng tr v kt qu ResultSet. Thc t bn cng khng cn nhn kt qu tr v t nhng lnh ny, v chng ta phn nh s thay i trong bng d liu m cc lnh ny tc ng. Chng ta c th s dng on m sau thc hin cc lnh INSERT/UPDATE/DELETE: int i; Statement st=con.createStatement(); i=Stmt.exexuteUpdate(cu lnh SQL); Phng thc exexuteUpdate c gi tr tr v l mt s nguyn, con s ny m t s record trong c s d liu b tc ng bi cu lnh SQL trong phng thc exexuteUpdate(cu lnh SQL). 5.2.7. V d v kt ni ti c s d liu Trong phn ny chng ta s cng nhau to ra mt chng trnh Java cho php truy xut v cp nhp thng tin vo mt c s d liu, cc thao tc khc nhau s c ci t trong cc phng thc khc nhau d qun l. Vic kt ni ti c s d liu s c trao cho lp Connect c thit k mc 5.2.3.1b: import java.sql.*; import java.util.Date; import java.text.SimpleDateFormat; class AcessDB{ protected Connection con; private Statement st; private ResultSet rs; private ResultSetMetaData data;

204

private int num,count; //phng thc khi dng protected AcessDB(Connection conn){ this.con=conn; } //phng thc thc hin truy vn select private void getInfor(String sql){ try{ st=con.createStatement(); rs=st.executeQuery(sql); data=rs.getMetaData(); num=data.getColumnCount(); } catch(Exception e){ System.out.println("can't get infor"); } } //Phng thc kim tra cu lnh truy vn c kt qu hay khng protected boolean check(String sql){ if(select0(sql).length()>0) return true; else return false; } //ly d liu t cu lnh select, bao gm c tn bng protected String select(String sql){ getInfor(sql); String str=""; try{ for(int i=0;i<num;i++){

205

str=str.concat(data.getColumnLabel(i+1)); if(i==num-1) str=str.concat(";"); else str=str.concat(":"); } while(rs.next()){ for(int i=0;i<num;i++){ str=str.concat(rs.getString(i+1)); if(i==num-1) str=str.concat(";"); else str=str.concat(":"); } } } catch(Exception e){ } return str; } //ly d liu t cu lnh select (khng bao gm tn bng) protected String select0(String sql){ getInfor(sql); String str=""; try{ while(rs.next()){ for(int i=0;i<num;i++){ str=str.concat(rs.getString(i+1));

206

if(i==num-1) str=str.concat(";"); else str=str.concat(":"); } } } catch(Exception e){ } return str; } //phng thc thc hin cc cu lnh update, delete, insert public int insert(String sql){ int i=0; try{ st=con.createStatement(); i=st.executeUpdate(sql); } catch(Exception e){ } return i; } //hm main public static void main(String arg[]){ //to kt ni n c s d liu String driver,url,user,pass; driver="net.sourceforge.jtds.jdbc.Driver"; url="jdbc:jtds:sqlserver://localhost:1433/db"; user="sa";

207

pass="sa"; Connect c=new Connect(); AcessDB db= new AcessDB(c.getConnect(driver,url,user,pass)); //s dng cc hm thit k trn String sql; sql="select * from sinhvien"; String result=db.select(sql); System.out.println(result); /*s dng hm check sql="select * from sinhvien where masinhvien='sv01'"; boolean b=db.check(sql); if(b) System.out.println("Ton tai sinh vien voi ma l sv01"); */ /* s dng hm update sql="insert into sinhvien values('sv03','nguyen van c','01/01/1990',0123456789,'hai phong')"; db.insert(sql); */ } } 5.2.8. S dng i tng PreparedStatement Ta c th s dng i tng PreparedStatement thay cho vic s dng i tng Statement nu nh phi s dng cu lnh SQL trn c s d liu nhiu ln. Li ch t vic xy dng i tng PreparedStatement l cu lnh SQL s c bin dch trc thay v phi bin dch i bin dch li nh mi khi ta s dng i tng Statement.

208

Bn ch , cc v d trong phn ny s s dng cc i tng ca hai lp Connect v AcessDB c xy dng mc 5.2.7. Bn hy copy cc v d vo hm main trong lp AcessDB (sau phn to kt ni) kim tra. 5.2.8.1. To ra i tng PreparedStatement Chng ta to ra i tng PreparedStatement bng cch s dng phng thc prepareStatement ca i tng Connection: Connection con; //to kt ni PreparedStatement updateInfo=con.prepareStatement("UPDATE tn_bng SET tn_ct1= ? , tn_ct2= ? WHERE tn_ct_iu_kin=?"); Bn ch n tham s ca phng thc prepareStatement on m trn, cc cu lnh SQL truyn cho phng thc ny c th l cc cu lnh SELECT, UPDATE, DELETE..., v c bit, cc tham s ca cc cu lnh ny c th hin bng du "?" ch khng phi mt gi tr c th. V d, to i tng prepareStatement thm mt trng vo bng sinhvien: // Connect c=new Connect(); // AcessDB db= new AcessDB(c.getConnect(driver,url,user,pass)); String sql=("INSERT INTO sinhvien values(?,?,?,?,?)"); PreparedStatement pre=db.con.prepareStatement(sql); V d, to i tng prepareStatement update thng tin ca mt sinh vin c xc nh theo m: String sql=("UPDATE sinhvien set tensinhvien=?,sodienthoai=? where masinhvien=?"); PreparedStatement pre=db.con.prepareStatement(sql); 5.2.8.2. Gn gi tr cho cc tham s phn trn, cc gi tr tham s ca cu lnh SQL l du "?", thay du "?" ny bng cc gi tr c th ta dng cc phng thc: setXXX(<s th t>,<gi tr>)
209

Ca i tng PreparedStatement vi XXX l kiu d liu ca tham s cn gn, <s th t> l th t ca tham s trong cu lnh SQL, <gi tr> l gi tr c th s gn cho tham s. Trc khi thc hin cu lnh SQL bng phng thc executeUpdate hay executeQuery... Ta phi thc hin cc lnh setXXX ny, nh v d update thng tin ca sinh vin di y: // Connect c=new Connect(); // AcessDB db= new AcessDB(c.getConnect(driver,url,user,pass)); String sql=("UPDATE sinhvien set tensinhvien=?,sodienthoai=? where masinhvien=?"); PreparedStatement pre=db.con.prepareStatement(sql); pre.setString(1, "nguyen van an"); pre.setInt(2, 1234567890); pre.setString(3, "sv01"); pre.executeUpdate(); V d thm trng d liu vo bng sinh vin: // Connect c=new Connect(); // AcessDB db= new AcessDB(c.getConnect(driver,url,user,pass)); String sql=("INSERT INTO sinhvien values(?,?,?,?,?)"); PreparedStatement pre=db.con.prepareStatement(sql); pre.setString(1, "sv04"); pre.setString(2, "nguyen van d"); pre.setString(3, "12/10/1990"); pre.setInt(4, 1234567890); pre.setString(5, "thai binh"); pre.executeUpdate(); Nu nh cu lnh SQL ca bn ch c thc hin mt ln th cch dng i tng PreparedStatement s rm r hn, tuy nhin, nu cu lnh SQL c s dng nhiu ln, bn c th dng cc vng lp gn gi tr cho cc tham s v

210

chng trnh ca bn s hot ng nhanh hn (do cu lnh c thc hin nhanh hn) v chng trnh s gn gng hn. 5.2.9. S dng chuyn tc Trong rt nhiu trng hp, vic cp nhp mt s liu ch c ngha nu ng thi cp nhp cc s liu khc, v d, khi bn hng, nu mt mt hng c bn ra th tng s lng ca loi mt hng b gim i v ng thi s tin thu c ca ca hng cng tng ln. Nu ch c mt trong hai hnh ng xy ra th hot ng bn hng khng c hon tt. Vy m bo cho mt khi cc thao tc cng c xy ra hoc khng hnh ng no c xy ra c ta s dng khi nim transaction. Mt transaction l mt khi cc thao tc cn c thc hin tng ng vi nhau v transaction ch hon thnh thc s khi cc thao tc c thc hin hon chnh. Trc khi hc cch s dng transaction chng ta cng nhc li khi nim v commit v rollback: phng thc comit s xc nh vic thc hin mt hnh ng v phng thc rollback s yu cu h qun tr c s d liu phc hi li trng thi trc . bt u mt transaction, chng ta dng phng thc: Connection con;//to kt ni con.setAutoCommit(false); V phng thc AutoCommit l mc nh, khi ch AutoCommit mi lnh SQL s c xc lp tc thi v ring l. Tt ch ny i, mi lnh SQL s khng t xc lp v s c lu trong vng rollback, ch khi ta gi lnh commit th cc lnh mi c thc hin ng lot. Vy mt transaction s c bt u bng lnh setAutoCommit(false) v kt thc bng lnh setAutoCommit(true), gia hai lnh ny l khi lnh SQL m chng ta cn thc hin ng thi. V d, bn hy thay hm main v d trong mc 5.2.7 bng on m sau: public static void main(String arg[]){ //to kt ni n c s d liu
211

String driver,url,user,pass; driver="net.sourceforge.jtds.jdbc.Driver"; url="jdbc:jtds:sqlserver://localhost:1433/db"; user="sa"; pass="sa"; Connect c=new Connect(); AcessDB db= new AcessDB(c.getConnect(driver,url,user,pass)); // s dng transaction try{ //tt ch commit db.con.setAutoCommit(false); String sql=("INSERT INTO sinhvien values(?,?,?,?,?)"); PreparedStatement pre=db.con.prepareStatement(sql); pre.setString(1, "sv04"); pre.setString(2, "nguyen van d"); pre.setString(3, "12/10/1990"); pre.setInt(4, 1234567890); pre.setString(5, "thai binh"); pre.executeUpdate(); sql=("UPDATE sinhvien set tensinhvien=?,sodienthoai=? where masinhvien=?"); PreparedStatement pre1=db.con.prepareStatement(sql); pre1.setString(1, "nguyen van an"); pre1.setInt(2, 1234567890); pre1.setString(3, "sv01"); pre1.executeUpdate(); //bt li ch commit db.con.setAutoCommit(true); }catch(Exception e){

212

} }

213

You might also like