Professional Documents
Culture Documents
SSDSD
SSDSD
STT 1 2 T vit tt/thut ng EL EIS M t Expresstion Language Enterprise Information System: h thng qun l v lu tr d liu h tr cho cc ng dng Mt interface mc cao dng iu khin cc transaction (Java Transaction API) Thnh phn gip to ra mi trng bo mt hn Remote Proceduced Call RPC trong lp trnh hng i tng c gi l RMI (Remote Method Invocation) Java Naming and Directory Interface Object Query Language Java Message Service Distributed Transaction Processing
JTA
4 5 6 7 8 9 10 11 12 13 14
PHN 1 TOMCAT
1.1Thit lp bin mi trng cho Java
C th chn system variable (p dng trn ton my tnh cho mi user) hay user variable (ch p dng cho mt user hin hnh) Chng ta click nt New v in gi tr Variable name l JAVA_HOME, Variable value l th mc ci t Java (v d nh hnh bn di) Click Ok
To ng dn n cc tp tin th vin khi bin dch my o c th tham chiu ti Chn New, v in gi tr Variable name l CLASSPATH Variable Value in gi tr du chm . (tham chiu ti th mc hin hnh bin dch trc); C:\Program Files\Java\jdk1.6.0_22\lib (th vin ca JDK); C:\Program Files\Java\jdk1.6.0_22\jre\lib (th vin runtime); Nhn OK
Thit lp ng dn Path n tp tin bin dch ca Java chng ta c th chy mi ni m khng cn phi vo trong th mc bin ni JDK ci t Tm bin mi trng tn Path, nhn nt Edit
Lu tuyt i khng c xa gi tr trong Variable Value, nu xa h iu hnh chng ta s chy sai lch, mt s chng trnh s chy khng chnh xc Di chuyn cui cng ca Variable Value (dng phm End), g ; C:\Program Files\Java\jdk1.6.0_22\bin (tham chiu n th mc bin ca JDK) Nhn Ok Chng ta hon thnh bc ci t bin mi trng cho Java. Chng ta kim tra bng cch vo command prompt (cmd) g cc lnh java, javac, keytool nhn enter m tt c cc
2 Nguyn Qung i
lnh ny chy m khng bo li khng tm thy lnh l chng ta hon tt. Nu khng c, vui lng khi ng li my (nht l vi WinXP), nu khng c vui lng coi li cc gi tr ci t
Gii nn gi zip n th mc bt k trong cng hay chy tp tin exe ci t. y chng ti ci t v gii nn vo th mc nh hnh bn di
3 Nguyn Qung i
Ci t bin mi trng cho Tomcat Tomcat c tn nick name l Catalina Di chuyn n ch environment nh ci t thng s Java, click nt new nhp Variable Name l CATALINA_HOME v variable value l ni ci t Tomcat Nhn OK
Chng ta ci t bin mi trng cho Tomcat. Thng tin bin mi trng trong h thng s nh sau
4 Nguyn Qung i
5 Nguyn Qung i
Lu : khung mu l a ch port ca server ( y l 8081) Chng ta kim tra ln na bng cch m Browser, g url: http://localhost:port, y s l http://localhost:8081
6 Nguyn Qung i
chnh sa port deploy cho server chng ta lm nh sau Th mc conf ca th mc ci t Tomcat ( y chng ti v d l C:\Programming\Tomcat 6.0\conf\) Chng ta m tp tin server.xml, tm HTTP/1.1 v thay i gi tr port nh mong mun
Lu file li, stop server nu ang chy v start server li th port mi s cp nht
8 Nguyn Qung i
M t cc thnh phn ca cu trc trn o Th mc c tn Assembly Root l th mc chng ta cha cc component bn trong v thng thng tn th mc ny chnh l tn ca project chng ta ang thc hin o Trong th mc chnh ny chia thnh 02 phn: WEB-INF v cc thnh phn ngoi WEB-INF Cc thnh phn ngoi WEB-INF Cha cc th mc cha ti nguyn hay cc trang web cho php ngi dng truy cp Cc tp tin trnh by giao din nh html, jsp, applet, Ton b thnh phn ny cho php cc thnh phn t xa hay clien truy cp ti (tm vc truy cp l public), ngoi tr cc thnh phn c thit lp phn quyn cho mt s user truy cp Cc thnh phn trong WEB-INF C tm vc truy cp l private ngha l cc i tng t xa khng th truy cp vo. Ch c nhng i tng truy cp trc
9
Nguyn Qung i
tip vo cu trc th mc project ti server mi c th truy cp c Tp tin cu hnh ng dng thng tin cho server bit cc thnh phn lin quan n server c tn l web deployment descriptor, chng c tn l web.xml, trong server Sun chng c tn sun-web.xml Ngoi ra, mt s tp tin tld nh ngha cc interface cho php ngi dng truy cp cc tag library do ngi dng a vo project hay t to v ni dung c th c t trong th mc tag hay gi jar trong th mc lib hay cc class trong th mc classes Th mc classes dng ch cha cc tp tin java class nh servlet, java object Th mc lib dng cha cc gi jar, th vin h tr cho ng dng Trong th mc Assembly Root, i lc s c thm th mc META-INF. Th mc ny cha cc tp tin cu hnh giao tip vi thnh phn ngoi server nh kt ni ng DBMS hay xc nh context path ca ng dng (tp tin context.xml). Mt s server s yu cu tp tin ny, mt s server khc th khng Ngoi ra th mc ny ch tp tin MANIFEST.MF cha cc ng dn hay thng s n cc gi jar t bn ngoi h tr cho ng dng (thng qua tham s classpath) Ton b gi ng dng trn s c ng thnh gi war Web Archieve chng ta c th deploy trn bt k server no
Tm thi bn hy Stop server Tomcat bng cch chy file shutdown.bat cng trong th mc bin, Sau khi trin khai xong th hy start n li n cp nht ng dng va trin khai. No, by gi ti c 3 cch trin khai, cch 1 v 2 th bnh thng, cch m ti mun gii thiu vi cc bn l cch 3 v n kh hay
Yu cu: server bt buc phi start thnh cng v mn hnh lnh khi ng khng pht sinh bt k li no Th mc deploy ng dng l th mc CATALINA_HOME\webapp Th mc nu trn l ni chng ta s chp gi war vo trong th mc ny C ch thc hin o Khi chp gi war vo server t ng gii nn to thnh th mc l c tn l tp tin war (nhng khng c phn war) o Th mc deploy mi pht sinh s cha ton b thnh phn trong gi war v th mc lm vic hay context chnh ca ng dng chng ta deploy V d: chng ti deploy gi nh sau o Th mc webapp nh sau
10
Nguyn Qung i
11 Nguyn Qung i
12 Nguyn Qung i
Tn context path phi chnh xc nh tn th mc to ra v c phn bit hoa thng undeploy ng dng, n gin chng ta xa gi war v th mc tng ng trong webapp (lu nh ng tt c trnh duyt li) o V d
Nguyn Qung i
14 Nguyn Qung i
Vo th mc conf\Catalina\localhost m file manager.xml ri copy ton b ni dung, m notepad ln hay mt trnh son tho bt k paste vo v lu li vi tn m bn mun lm alias, v d bn lu li l test.xml. By gi ta chnh sa file test.xml ny, dng <Context docBase sa li ng dn n th mc mun trin khai. V d sa li l docBase=D:\Test. Vy l xong, by gi hy startup Tomcat v g http://localhost:8080/test/ l c th chy c th mc D:\Test.
Cache ca server c lu tr ti v tr
15 Nguyn Qung i
PHN 2 MY SQL
2.1 Ci t
MySQL l h qun tr c s d liu m ngun m ph bin nht th gii v c cc nh pht trin rt a chung trong qu trnh pht trin ng dng. MySQL min ph hon ton nn bn c th ti v MySQL t trang ch www.mysql.com. MySQL c nhiu phin bn cho cc h iu hnh khc nhau: phin bn Win32 cho cc h iu hnh dng Windows, Linux, Mac OSX... Ci t Connector/J - JDBC Driver ca MySQL JDBC Driver ca MySQL c th ly v a ch http://www.mysql.com/downloads/api-jdbc.html. Xem ti liu [7] hng dn ci t v cu hnh mysql server. File bn ti v s l mt file .zip hoc .gz. Sau khi gii nn bn s c 1 file c tn tng t nh sau: mysql-connectorjava- 3.0.9-stable-bin.jar. Hy chp file ny vo th mc %JAVA_HOME%/jre/lib/ext trn h thng ca bn. V d C:\j2sdk1.4.2\jre\lib\ext. Bn cng cn a ng dn n file JAR ny vo bin mi trng MYSQL_DRIVER ca bn.
Sau khi bn t ng dn n Connector/J vo bin mi trng MYSQL_DRIVER th bn c th yn tm l JDBC driver ca MySQL c ci t xong.
jdbc:odbc:dsn_name;UID=your_uid;PWD=your_pwd - JDBC-ODBC Bridge Driver URL. jdbc:oracle:thin:@machine_name:port_number:instance_name - Orace Type 4 JDBC Driver.
16
Nguyn Qung i
Vn th hai cn quan tm y l tn lp y ca JDBC driver. V d com.mysql.jdbc.Driver trong trng hp s dng Connector/J JDBC Driver. Tn ca driver c yu cu v khng phi l tuy chn. Ta c th ni vi JVM v cc driver no c s dng bng cch dng mt trong cc cch sau:
np driver ti lc khi ng JVM, ch nh driver trong thuc tnh h thng (system property) jdbc.driver nh lnh sau:
java -Djdbc.drivers=com.mysql.jdbc.Driver YourJavaProgram
Kim tra Connector/J hot ng cha Chng ta to ra mt chng trnh Java nh kim tra xem chng ta ci t ng JDBC driver ca MySQL cha. Nu chng trnh chy thnh cng th ngha l trnh iu khin JDBC sn sng cho cc tc v phc tp hn. Bn hy to ra mt file Connect.java vi on m sau:
import java.sql.*; public class Connect{ public static void main (String[] args){ Connection conn = null; try{ String userName = root; String password = localhost; String url = jdbc:mysql://127.0.0.1:3306/mysql; Class.forName (com.mysql.jdbc.Driver).newInstance (); conn = DriverManager.getConnection (url,userName, password); System.out.println (Da ket noi CSDL); } catch (Exception e){ System.err.println (KHONG KET NOI DUOC); } finally{ if (conn != null){ try{ conn.close (); System.out.println (Dong ket noi); } catch (Exception e) { /* bo qua loi luc dong csdl */ } } } } }
Trc ht bn hy bin dch file ny ra m bytecode nhng chy n, bn cn ch m bo MySQL ang chy trn my tnh c nhn ca bn. Nu bn ci t MySQL n
17 Nguyn Qung i
ch chy khi bn gi th bn hy bt MySQL vi cu lnh mysqld-nt --console hay nu bn ci chng trnh qun tr c s d liu ny di hnh thc mt dch v th bn c th g net start mysql trong shell Run trong Windows. on m trn s dng cp tn ngi s dng v mt khu l root/localhost vi c s d liu l mysql. Nu kt ni thnh cng, bn s thy mt mn hnh nh di y xut hin.
Hm ny mnh thc hin vic ci t MySQL server nhng khng hiu v sao ci hoi n u khng chu start service, trc mnh ci mnh thng sau mnh g ra , by gi mnh ci li th b gp li nh vy. Tham kho trn mng c kh nhiu bi vit nhng khng thnh cng, cui cng th mnh cng t m ra, sng qu ! Sau y mnh s ch cc bn cch khc phc li ny trn windows 7 Li ny thng gp khi bn g ra v ci li MySQL Server, tt nhin cn mt nguyn nhn khc na l do my tnh b nhim virus Kido, Conficker lm Windows khng th start c cc services. Khi b li mn hnh cu hnh MySQL b dng li ti mc yu cu nhp password nh hnh di:
Sau y mnh s trnh by cch khc phc (Mnh thc hin trn win 7) 1. u tin bn vo Control Panel v g b MySQL Server i. 2. Bc tip theo bn cho hin cc file v th mc n ra: (Vo Forder Options chn View tick du chn vo Show hidden files, folders and drives -> V nhn OK) 3. By gi bn vo C -> Vo tip th mc ProgramData v xa th mc c tn l MySQL i. Trong trng hp bn mun gi li database c th bn ch cn vo th mc /MySQL/MySQ Server 5.1/ v xa mi th mc data thi (Cch ny cng p dng trong trng hp bn qun mt khu root) 4. Bc ny phng trng hp my tnh ca bn b nhim virus Kido: - Bn vo mt trong 2 a ch sau ti v cng c tm v dit loi virus ny: hthttp://www.4shared.com/file/-op8pFqV/KK_online.html Hoc http://www.mediafire.com/?zlh3jlofzym - Sau khi ti v bn chy file KK.exe v chng trnh s t tm v dit virus Kido trn my bn:
5. Sau khi chng trnh qut virus xong bn khi ng li my tnh v tin hnh ci t li MySQL bnh thng, (Ln ny chc chn thnh cng ^_^) - Nu bn cha bit ci th no th c th tham kho y n ! Bn lu c mt s trng hp , khi execute n s bo li bc 4 : Apply Security Setting, ci ny khng quan trng lm. MySQL Server vn hot ng bnh thng.
phpmyadmin ko th co c . y t chi hng dn cach tao database , backup va restore database bng cach s dung Navicat , cac chc nng khac cac ban co th t tim hiu thm . Man hinh chinh cua Navicat nh sau :
u tin ta tao 1 connection vi MySQL bng cach click vao nut Connection :
Ca s Connection hin ra , ban in cac thng tin vao , ri nhn Test Connection , nu bao Connection Successful thi ban a thanh cng kt ni vi MySQL . Bm OK hoan tt .(ch in ng password nu c)
20 Nguyn Qung i
Danh sach cac database ma user root co th quan ly se c hin thi ct phia bn trai :
21 Nguyn Qung i
By gi chung ta se tao 1 database mi . Right Click vao tn Connection ( co th bt c ch nao trong ct Connection ) chon New Database , mt ca s mi hin ra , ban in tn Database mun tao vao ri click OK .
22 Nguyn Qung i
By gi ban a co 1 database mi , no cung c lit k ct Connection . backup 1 database ( y ta se th backup database mysql ) , ban chon database cn backup ct Connection , click vao nut Backup , sau o click vao New Backup , ca s mi hin ra ban click Start bt u , sau khi hoan tt , click Close . Thng tin v cac file backup se c hin thi . Restore cac file backup ta chi vic click vao file backup o ri click vao nut Restore Backup la c . xut file backup ra inh dang file *.sql ta right click vao file backup trn danh sach ri chon Extract SQL , lu lai file ni ma ban mun .
23 Nguyn Qung i
Gia s ban mun restore 1 file sql nao o ko nm trong bang backup thi ban chon database , sau o click vao nut Query . Chon New Query . Mt ca s mi hin ra , ban chon Load open file sql cn restore , sau o click Run va ch cho n khi no bao thanh cng .
24 Nguyn Qung i
25 Nguyn Qung i
26 Nguyn Qung i
PHN 3 JAVA
B Jdk l dnh cho J2SE, cn nhng th nh servlet, jsp, l thuc J2EE javax.servlet n thuc J2EE thng th cc nh pht trin J2EE (kiu nh Apache Tomcat) s gn km cc th vin ca J2EE lun trong Java server ca h,v bn thn J2EE ch cung cp cc interface thi,tt c b J2EE c gn trong tomcat u lm th mc lib ca n ,n l ci file servlet_api.jar , hnh nh l thm my file na cho annotation, jsp... khi bin dch cc file .java bng lnh javac trong cmd th phi lu n classpath, tc l phi tr n ni cha cc file .jar (thng trong cc th mc lib) s khc bit gia path v classpath: path l ng dn gip my tm n nhng b bin dch nh javac hay java, cn classpath l ng dn gip my tm n nhng gi th vin dung import vo trong chng trnh nh servlet-api (import javax.servlet.*;import javax.servlet.http.*)
27 Nguyn Qung i
Ngi cha v a con u c hai hot ng l n v Hc, a con k tha ngi cha hot ng n ging ht cha, nhng n li Hc khc bit thi m cha Hc. Vy c th coi Hc l 1 abstract method ca Class Cha. s dng Abstract class ta dng t kha Extends dch ra l M rng, nhng mi lp con ch c th extends t 1 class cha, tuy nhin c th implements t rt rt nhiu interfaces.
Khi s dng :
class Animal extends shout implements handMoving ,legMoving { void ShoutLoud() { System.out.println("An animal shout loudly"); } }
Ch : Trong Java Mt lp ch c k tha (extends) mt lp. Mt lp c trin khai (implements) nhiu interface. Mt interface c k tha (extends) nhiu interface. V mt interface khng c trin khai (implements) mt interface khc.
Sau ta li xy dng mt lp StudentDAOPB. Lp ny implements interface trn v pht trin cc phng thc m interface khai bo. Kiu d liu m lp StudentDAOPB h tr l kiu PointBase.
package day10; 28 Nguyn Qung i
public class StudentDAOPB implements StudentDAO { private Connection con; public StudentDAOPB() {} public void create(String id, String firstName, String lastName, String address) throws StudentDAOSysException { PreparedStatement stmt = null; try { getDBConnection(); stmt = con.prepareStatement ("insert into students(student_id, first_name, last_name, "+ " address) values (?, ?, ?, ?)"); stmt.setString(1, id); stmt.setString(2, firstName); stmt.setString(3, lastName); stmt.setString(4, address); stmt.executeUpdate(); } catch(SQLException ex) { throw new StudentDAOSysException("SQLException:"+ ex.getMessage()); } finally { closeStatement(stmt); closeDBConnection(); } } public void remove(String studentId) throws StudentDAOSysException { ... } ... }
Khi ta lm nh vy, ng dng s s dng interface StudentDAO thao tc vi d liu.Trn mt phng din khc dao c th c coi nh i tng ca StudentDAOPB. L do khi lm nh vy l khi ta mun thay th mt lp khc cng implement interface StudentDAO, gi s l lp StudentDAOHS, tng ng vi kiu d liu HyperSonic.
StudentDAO dao = new StudentDAOHS();
Lc ny vic s dng i tng dao vn c gi nguyn m khng cn thay i g trong code pha bn client. Vic ny s c ch hn na trong vic cu hnh c h tr t cc file xml. DAO design pattern va ni trn dng tch bit business logic v data acess logic. Interface DAO c s cung cp cc API truy cp v thao tc d liu. V d nh trong EJB, cc enterprise bean s c code s dng cc interface DAO ny. c bit, ta c th vit mt lp DAO cho mi c s d liu m ta mun h tr. Trong lc trin khai, ngi i trin khai s chn DAO tng ng vi c s d liu. iu ny chc chn rng s khng phi thay i ni dung code ca lp enterprise bean.
29 Nguyn Qung i
Gi s ta li c mt lp nh sau :
public class Test { String method_1(){ } String method_2(){ } String method_3(){ } String method_4(){ }
By gi ta c khai bo
A object1 = new Test(); B object2 = new Test();
Vi cc khai bo nh trn, i tng object1 ch c th s dng cc phng thc c khai bo trong interface A, cn i tng object2 ch c th s dng cc phng thc c khai bo trong interface B.
- Bi vit ny hi vng c th gip cc bn phn no iu . Vn : - Vi cc kiu d liu c sn, mnh khng bn ti, nu n l int, char th c th dng du == so snh. Cn vi cc i tng khc, nh String hay Date th gi hm equals(), hai cch em li cng mt kt qu. - Nhng vi cc i tng bn t to ra th sao? Xt on chng trnh sau: //vd1
import java.util.Comparator; import java.util.HashSet; public class HelloWorld { public static void main(String[] agrs) { Person a = new Person(); Person b = new Person(); a.name=new String(hiepnq); b.name=hiepnq; a.age=22; b.age=22; HashSet set = new HashSet(); set.add(a); set.add(b); System.out.println(set.size()); } } class Person { public String name; public int age; }
-> mc d 2 instance a v b c cc cp thuc tnh tng ng bng nhau (a.name.equals(b.name) ==true v a.age==b.age), nhng khi in ra mn hnh, HashSet set li coi a v b l 2 i tng khc nhau, nn set.size() in ra li l 2. - Vn ny thot nhn th tng nh chng c g, nhng nu s dng trong k thut lp trnh hin i, th li l mt iu v cng tai hi: bn s kh c th kim sot c vic so snh 2 i tng, iu ny khin cho mt s chc nng khc c lin quan ti so snh s khng thc hin c (vd: sp xp tm kim). Vn : Ti sao li c hin tng nh trn? C ch no khin cho 2 i tng c gi l bng nhau? - Tr li cho vn ny, chng ta tm hiu k mt cht v java ni ring v cc ngn ng lp trnh hin i ni chung (C# cng tun theo nguyn tc ny). Trong b nh, khc vi C/C++, Java qun l i tng theo m bm (hashCode), c ngha l: a ch b nh cc i tng s c bm (hash) theo mt cng thc no , tr thnh mt s int duy nht, khng trng lp khi trn cng 1 my tnh.
31 Nguyn Qung i
- Tt c cc i tng trong Java u c 1 gc i tng cha duy nht l Object, bn thn i tng Object c 2 phng thc: equals() v hashCode(). equals() s dng so snh cc i tng, cc lp dn xut t Object c th nh ngha th no l bng nhau nh Override hm ny (vd: String, Date ) v nu chng ta s dng thng thng, chng ta cng vn c th s dng hm ny so snh, tham kho on code sau: //vd2
import java.util.Comparator; import java.util.HashSet; public class HelloWorld { public static void main(String[] agrs) { Person a = new Person(); Person b = new Person(); a.name=new String(hiepnq); b.name=hiepnq; a.age=22; b.age=22; System.out.println(a.equals(b)); } } class Person { public String name; public int age; @Override public boolean equals(Object obj){ if(obj instanceof Person){ if(((Person)obj).name.equals(this.name)){ return true; } } return false; } }
-> kt qu tr v l true, tt ri - Vn k tip c t ra: trong vd1 th sao? nu ta override hm equals()? Lp Person s c dng:
class Person { public String name; public int age; @Override public boolean equals(Object obj){ if(obj instanceof Person){ if(((Person)obj).name.equals(this.name)){ return true; } } 32 Nguyn Qung i
return false; } }
-> nhng nu thay vo vd1, th set.size() vn l 2 c ngha l: khi ta s dng, th ta c th coi l bng nhau khi Perso.name bng nhau, nhng vi cc collection Set v Map (c HashTable) th chng khng cho rng 2 i tng trn bng nhau? ti sao vy? - Nh ni trn, Object cn c hm hashCode() tr v m bm ca i tng, mc nh, hai i tng c coi l bng nhau, nu chng c hashCode() bng nhau, c ngha l, chng tr ti cng 1 i tng trn vng nh HEAP Vy, khc phc iu ny, ta cn phi override c hm hashCode() na
import java.util.Comparator; import java.util.HashSet; public class HelloWorld { public static void main(String[] agrs) { Person a = new Person(); Person b = new Person(); a.name=new String(hiepnq); b.name=hiepnq; a.age=22; b.age=22; HashSet set = new HashSet(); set.add(a); set.add(b); System.out.println(set.size()); } } class Person { public String name; public int age; @Override public boolean equals(Object obj){ if(obj instanceof Person){ if(((Person)obj).name.equals(this.name)){ return true; } } return false; } @Override public int hashCode(){ return age; } }
-> gi th kt qu l 1 ri - Vy, mun i tng bng nhau trn vn khi v ch khi: hm equals() tr v true, v hm
33 Nguyn Qung i
hashCode() tr v cng mt gi tr. Kt lun: - nh ngha 2 i tng bng nhau c coi l 1 trong nhng vn ct li v then cht nht trong Core Java v c C# cn bn na, nm bt c yu t ny, cc bn c th t nh ngha cc i tng bng nhau mt cc rt mm do
3.4
Component
Mt component l mt mu (piece) code dng trin khai (implement) cho cc interface xc nh. c bit l n sng trong cc mi trng chy (runtime environment) v tn dng c nhng dch v (service) m mi trng a ra. Cc component sng trong mi trng chy no phi tun theo cc quy lut ca mi trng . iu ny bo m cc chc nng ca mi trng c th chy mt cch ng n v kh nng portability, scalability ca component. Mt component khng phi l mt ng dng (application) hon thin. Mt ng dng bao gm nhiu component lm vic cng nhau.
3.6
JAAS
The Java Authentication and Authorization Service, nh ng tn ca n, gm c hai component: Authentication (xc thc) v Authorization (cp quyn). Authentication c thc hin theo kiu c th plug, bi v n trin khai (implement) theo framework Pluggable Authentication Module (PAM) chun rt ph bin trn cc nn tng Unix. iu ny gip code ca ng dng khng b ph thc vo security realm nm bn di trong mi trng vt l. Do k thut xc thc mi no c th c cm vo (plug in) trong framework JAAS nh mt m un (ging nh mt driver). Cc k thut xc nhn tn ti ngy nay phc v cho JNDI, Unix, v Window NT. Sau khi user c xc thc, thnh phn cp quyn (JAAS Authorization component) s dng nhng m hnh iu khin truy cp (access control model) chn cc truy cp n cc ti nguyn nhy cm. JAAS authorization is a user-based authorization with fine-grain permissions ..
3.7
Trong lp trnh ng b, c 2 n v thc thi c bn: tin trnh(process) v lung(thread). Trong ngn ng lp trnh Java, lp trnh ng b ch yu lin quan n thread. Tuy nhin, cc tin trnh cng rt quan trng. Cc h thng my tnh thng thng c nhiu tin trnh v thread hot ng. Thm ch iu ny ng trong c cc h thng ch c mt li(core) thc thi duy nht, v v th ch c mt thread thc s thc hin ti bt k thi im no. Thi gian x l mt li duy nht
34 Nguyn Qung i
c chia s gia cc tin trnh v thread thng qua mt tnh nng ca h iu hnh gi l thi gian slicing. N ngy cng ph bin cho cc h thng my tnh c nhiu b x l hay b vi x l vi nhiu li thc hin. iu ny gip tng cng kh nng thc hin ng thi cc tin trnh v thread ca h thng thm ch c th thc hin ng thi trn cc h thng n gin, khng c nhiu b x l li hoc thc hin. Cc tin trnh(Processes) Mt tin trnh c mt mi trng thc thi khp kn. Thng thng, mt tin trnh thng c mt tp cc ti nguyn run-time c bn c quyn, v mi tin trnh c b nh khng gian ring ca mnh. Cc tin trnh thng c xem nh cc chng trnh hay cc ng dng. Tuy nhin, nhng g m ngi dng thy nh l mt ng dng n gm nhiu tin trnh cng hot ng. to thun li trong vic giao tip gia cc tin trnh, hu ht cc h iu hnh u h tr cc ti nguyn Inter Process Communication(IPC), nh pipe hay socket. IPC khng ch c s dng giao tip gia cc tin trnh trong cng mt h thng, m cn gia cc tin trnh trn cc h thng khc nhau. Hu ht vic thc thi ca my o Java chy nh l mt tin trnh n. Mt ng dng Java c th to ra cc tin trnh b xung bng cch s dng i tng ProcessBuilder. Thread i khi cc thread cn c gi l cc tin trnh lightweight. C tin trnh v thread u cung cp mt mi trng thc thi, nhng to ra mt thread mi yu cu ti nguyn t hn l to ra mt tin trnh mi. Cc thread tn ti trong mt tin trnh- mi tin trnh c ti thiu mt thread. Cc thread chia s cng mt ti nguyn ca tin trnh, bao gm b nh v cc file m. iu ny lm cho giao tip hiu qu nhng li tim n bn trong n cc vn v x l tranh chp ti nguyn gia cc thread. MultiThread Cc ngn ng lp trnh thng thng khng cho php ngi lp trnh thc hin nhiu cng vic cng mt lc. Thay vo , cung cp cc iu khin m ch cho php ngi lp trnh thc hin mt cng vic ti mt thi im, tc l ch cho php thc hin cng vic tip theo sau khi hon tt cng vic trc . Java cho php ngi lp trnh thc hin nhiu cng vic thng qua API ca n. Ngi lp trnh c th to Thread thc thi, trong mi thread c phn chia nh l mt phn ca chng trnh v c th thc thi ng thi vi cc Thread khc, iu ny c gi l Multiple Thread. Hu ht cc h iu hnh ngy nay u c nhiu hn mt thread chy ng thi ti cng mt thi im bn trong mt tin trnh. Khi my o Java(JavaVM) chy trn cc h iu hnh , mt tin trnh mi cng c to ra. Bn trong tin trnh , c nhiu thread c th c to ra. Thng thng, bn ngh cc on m Java bt u thc thi trong phng thc main() v tin hnh ti mt ng dn thng qua chng trnh. y ch l mt v d v thread n. Thread chnh c sinh ra bi JavaVM, m bt u thc thi vi phng thc main, n thc thi tt c statement trong phng thc main(), v n cht khi phng thc main() c hon tt. Mt thread th hai lun lun chy trong JavaVM, l b dn rc(garbage collection), n dn dp cc i tng v khi phc li b nh. V vy, khi bn vit mt on m java n gin l System.out.println(Xin cho) th n cng c chy trn mi trng multithread, l main thread v garbage collention thread. Khi mt chng trnh Java bao gm mt giao din ngi dng ha(GUI), th JavaVM to ra nhiu thread. Mt trong cc thread ny ph trch cung cp cc s kin GUI cho cc phng thc trong chng trnh, cn thread khc chu trch nhim v v ca s GUI.
35 Nguyn Qung i
V d: ta c mt chng trnh da trn GUI, vi mt thread tnh ton ang thc thi cc cng vic tnh ton phc tp v di hn, v trong khi iu ny ang din ra, ngi dng nhn nt Stop. GUI event thread ngay sau s gi cc s kin x l code tng ng cho nt nhn Stop, cho php thread tnh ton kt thc. Nu chng trnh ny ch c mt thread, th c hai khng th thc thi cng lc, v s gy ra tnh trng gin on. Thc thi multithread cng l mt c im thit yu ca Java platform. Mt ng dng u c ti thiu mt thread-hay nhiu nu bn m cc thread h thng lm nhng vic nh qun l b nh v x l tn hiu. Tuy nhin, nu ng trn quan im ca ngi pht trin ng dng, bn ch bt u vi mt thread, v c gi l main thread. V thread ny c kh nng to ra cc thread b xung, v s c cp trong nhng phn tip theo. Thread Objects Mi thread c lin kt vi mt th hin ca lp Thread. C hai chin lc c bn cho vic s dng cc i tng Thread to ra mt ng dng ng thi. iu khin trc tip khi to ra thread v qun l n, n gin l khi to thread mi lc ng dng cn bt u mt nhim v khng ng b. Qun l thread tru tng t ti nguyn ca ng dng, a cc nhim v ca ng dng vo mt b thc thi(executor).
Cung cp mt i tng Runnable: Giao din Runnable nh ngha mt phng thc n, phng thc run(). Khi bn trin khai (implement) giao din Runnable, bn phi ci t code trong phng thc run(). i tng Runnable c gn cho Contructor ca Thread, v d HelloRunnable:
public class HelloRunnable implements Runnable { public void run() { System.out.println(Hello from a thread!); } public static void main(String args[]) { (new Thread(new HelloRunnable())).start(); }
To mt class extend t Thread: Bn thn lp Thread implement giao din Runnable, phng thc run() ca n khng lm g c. Mt ng dng to ra 1 lp extend t thread, phi cung cp phn thc thi ca phng thc run(), v d:
public class HelloThread extends Thread { public void run() { System.out.println(Hello from a thread!); } public static void main(String args[]) { (new HelloThread()).start(); } }
36 Nguyn Qung i
Ch c 2 v d u gi phng thc start() bt u thread mi. Vy bn nn s dng 2 trng hp trn trong iu kin no. trng hp u tin, s dng i tng Runnable, lp implement giao din ny c th k tha t mt lp khc. trng hp th hai, lp extend t thread th khng th k tha thm lp no ngoi thread, bi Java ch cho php n tha k. Lp thread nh ngha mt s phng thc hu ch cho vic qun l Thread. Chng bao gm cc phng thc tnh cung cp thng tin hay tc ng n trng thi ca thread gi cc phng thc ny. Cc phng thc khc c gi t cc thread khc lin quan n vic qun l thread v i tng ca lp Thread.
Trng thi New: Khi to mt Thread vi ton t new, th Thread vn cha c chy. iu ny c ngha l n trong trng thi New. Khi mt Thread trong trng thi New, Thread vn cha bt u thc thi code bn trong n. Trng thi Runnable: Khi gi phng thc start(), th Thread ri vo trng thi Runnable. Khi trong trng thi ny, mt Thread hoc c th ang chy hoc khng, nhng khng c iu g c th ngn cn n thc thi nu sheduler c th sp xp n. N ph thuc vo h iu hnh gn thi gian thc thi cho n. V n khng phi l dead hay blocked. Sheduler gip h iu hnh qun l v phn cha thi gian cho cc thread thc hin cng vic ca mnh. Trng thi Running: y l trng thi thead ang xt thc s thc hin cc hnh ng trong n. Scheduler s chn cc thread trng khu vc runnale pool thc thi.
37 Nguyn Qung i
Trng thi Blocked/Waiting/Sleeping: Thread ri vo trng thi Blocked nu mt trong cc action sau y xy ra:
Gi phng thc sleep(). Thread gi mt operation m n ang b blocking trn Input/Output. Thread c gng ginh ly kha(lock) trong khi kha ny ang c nm gi bi mt Thread khc. Thread ang i mt iu kin no thc thi. Mt ai gi phng thc suppend() ca Thread. Tuy nhin, phng thc ny b phn i v khng nn gi n trong code. Tm li, khi mt Thread trong trng thi blocked, scheduler s b qua n v khng cho n thi gian CPU x l, v n khng th thc thi bt k hot ng no.
Thc thi xong phng thc run(). Mt ngoi l cha c bt(uncaught) c pht sinh v kt thc phng thc run().
Ngoi ra, c mt cch khc c th kill mt Thread bng cch gi phng thc stop(). Tuy nhin, phng thc ny b ngn cm v khng nn s dng phng thc ny trong code.
Mi Thread trong Java u c mt quyn u tin(priority) gip cho h iu hnh xc nh c th t thc hin ca cc Thread c thc thi. Gii hn ca n: MIN_PRIORITY(c gi tr 1) v MAX_PRIORITY(c gi tr 10). Thng thng, Thread c quyn u tin cao hn s c u tin x l. Theo mc nh, mi mt Thread c cho mt quyn u tin NORM_PRIORITY(c gi tr 5). Hu ht Java Platforms u h tr bng biu lm vic(timeslicing). Nu khng c timeslicing, th mi Thread trong tp hp cc Thread c quyn u tin ngang nhau u thc thi (tr khi n t trng thi runnable ri vo trng thi waiting hay timed waiting, hay b ngt bi Thread c quyn thc thi cao hn) trc khi cc Thread khc c quyn u tin ngang nhau nhn c c hi thc thi. Vi Timeslicing, thm ch nu Thread cha thc thi xong khi thi gian thc thi vt qu gii hn cho php, th processor s y Thread ra v a mt Thread tip theo(c u tin bng Thread trc ) vo thc thi. Lu :Nhng constants(MAX_PRIORITY, MIN_PRIORITY) c khai bo trong lp Thread. V ta khng to v s dng cc i tng Thread thc thi ng thi m phi thc thi giao din Runnable. Khi ta xy dng cc ng dng, ta khng nn da nhiu vo priority v n khng c m bo l s hot ng chnh xc.
Phng thc ny lm cho thread hin thi tm dng hot ng cho n khi thread c gi trong thread hin thi ny hon thnh cng vic ca mnh. Khi , thead hin thi s tip tc thc hin cc cng vic ca n.
3.8
Nu ta ang trong qu trnh pht trin phn mm, ta cn ch r nhng file JAR ny trong CLASSPATH.Cn khi trin khai phn mm, ta cn t cc file JAR no cn dng n vo trong th mc WEB-INF/lib ca ng dng web. Nu cc file JAR c s dng bi nhiu ng dng web, th nhiu nh pht trin s dng nhng im c bit ca server h tr vic chia s cc file JAR cho nhiu ng dng web. V d Tomcat cho php nhng file JAR chung c t trong th mc tomcat_install_dir/common/lib. Mt cch ngn gn khc l t chng ln lun my pht trin (development machines),bng cch t nhng file JAR ny vo th mc sdk_install_dir/jre/lib/ext.
3.9
Transaction(giao dch) l mt nhm cc cu lnh SQL i din cho mt n v cng vic. Transaction c dng m bo tnh ton vn d liu khi xy ra cp nht (cp nht xin c hiu theo ngha rng l cc hnh ng sa i d liu, nh INSERT, UPDATE,
39 Nguyn Qung i
DELETE). Khi mt transaction bao gm nhiu lnh cp nht, n m bo tt c cc cp nht u c thc hin thnh cng, hoc trong trng hp mt lnh gp s c ton b transaction b hy b. Khi d liu tr v trng thi nh trc khi xy ra transaction. Ni cch khc transaction ngn chn tnh hung d liu c cp nht na chng, trong mt phn c cp nht cn mt phn b b qua. Mt v d kinh in v transaction l khi bn cn thc hin mt giao dch chuyn tin gia hai ti khon ngn hng. Gi s bn c hai ti khon A v B vi s tin tng ng l 8 t v 1 t; nay bn cn chuyn bt 2 t t ti khon A sang ti khon B. S c hai php cp nht nh sau: - tr s tin hin c ca ti khon A i 2 t - cng thm s tin hin c ca ti khon B ln 2 t Nu hai lnh cp nht trn din ra c lp (khng nm trong mt transaction), v v mt l do no lnh th hai b li, ti khon A s cn 6 t v ti khon B vn gi nguyn 1 t. iu ny khng th chp nhn c v 2 t bng dng bin mt! Khi thc hin hai lnh trn trong mt transaction, n s m bo: - hoc c hai lnh update u c thc hin thnh cng. C hai ti khon c cp nht vi s tin tng ng. - hoc trong trng hp giao dch b li c hai lnh u khng c thc hin. Hai ti khon gi nguyn s tin nh trc khi thc hin transaction. Trong SQL Server mt transaction c on code dng n gin nh sau
BEGIN TRAN -- lnh 1 -- lnh 2 -- ... COMMIT
Bn m transaction bng lnh BEGIN TRAN v kt thc bng lnh COMMIT sau lnh ny nhng cp nht d liu s c xc nhn vo trong database, transaction c ng li v cc kha (lock) trn cc bng c cp nht c th ra. Transaction c th l local transaction hoc l distributed transaction. Local transaction l nhng giao dch m thc hin ti ch mt ti nguyn (resource). Cn cc distributed transaction l nhng giao dch m c th truy cp v cp nht d liu nhiu ti nguyn khc nhau. Cc ti nguyn ny c th l mt vi h qun tr c s d liu khc nhau c t trn cng mt server, v d nh Oracle, SQL Server, Sybase. Hoc c th l mt vi th hin ca mt loi c s d liu nm trn cc server khc nhau. Trong bt k trng hp no th n cng l mt s kt hp gia cc trnh qun l ti nguyn khc nhau (resource manager). S kt hp (coordination) ny l chc nng ca trnh qun l giao dch (transaction manager).
3.9.2 X / Open XA
XA l mt kiu iu phi giao dch, thng l gia cc c s d liu (database).XA coordination chp nhn nhiu ti nguyn (thng l cc database) kt hp trong mt thao tc duy nht. XA l k thut c xut bi open group trong vic x l giao dch phn tn (DTP). N miu t giao din (interface) gia chng trnh qun l giao dch ton cc (global transaction manager) v chng trnh qun l ti nguyn a phng (local resource manager). Mc ch ca XA l gip cho nhiu ti nguyn (v d nh database, application server, message queue, transactional cache,) c truy cp vo trong cng mt giao dch. Do m gi gn c cc thuc tnh ACID qua cc ng dng. XA s dng xc nhn hai pha (two phrase commit) chc chn rng tt c cc thnh phn tham gia u cng commit hoc rollback.
40 Nguyn Qung i
XA specification m t mt chng trnh qun l ti nguyn phi lm g h tr vic truy cp giao dch. Cc chng trnh qun l ti nguyn phi tun theo k thut ny m c ni trong XA-compliant. X/Open DTP Model C ba thnh phn trong m hnh: Mt chng trnh ng dng ch nh cc hnh ng to ln mt giao dch Cc trnh qun l ti nguyn (resource manager) cung cp cc truy cp ti cc ti nguyn. Mt trnh qun l giao dch (Transaction Manager hay Transaction Processing Monitor) chu trch nhim quyt nh xem comit hay rollback cc distributed transaction. N gn cc thc th(identifier) ti cc giao dch, qun l cc qu trnh x l ca chng, chu trch nhim hon thnh giao dch v khi phc khi li .
Application giao tip vi trnh qun l giao dch l nh ranh gii cc giao dch (begin, comment, abort). Trnh qun l giao dch cung cp cho ng dng cc li gi API bo cho n bit im bt u, kt thc, v cch b tr ca cc giao dch. ng dng X/Open khng thit lp v duy tr cc kt ni ti c s d liu. Thay v th, TP Monitor v giao din XA c cung cp bi nh cung cp (vendor) chng trnh qun l ti nguyn s iu khin cc kt ni c s d liu, cng nh hy b cc kt ni mt cch trong sut. V vy m thng thng mt ng dng tun theo chun X/Open (X/Open compliant) s khng thc thi cu lnh RM CONNECT.(ch ny khng hiu lm, bnh thng to kt ni vi i tng connection ) ng dng giao tip trc tip vi RM thc hin nhng cng vic c ch. RM cung cp nhng phng tin giao tip gia n vi ng dng. Phng thc ph bin nht l Embedded SQL. RM v TM giao tip vi nhau bng cch s dng giao din XA.Giao din XA l mt k thut m t s iu phi giao dch, commitment, v recoverry.Giao thc Xc nhn hai pha l mt phn ca k thut XA (XA specification).
Cc thnh phn hnh trn gm c : 1 UserTransaction javax.transaction.UserTransaction interface cung cp cho ng dng kh nng iu khin cc ranh gii ca giao dch (transaction boundaries) theo cch lp trnh. Phng thc javax.transaction.UserTransaction bt u mt giao dch ton cc (global transaction) v kt hp giao dch ny vi lung ang gi (calling thread). 2 TransactionManager javax.transaction.TransactionManager interface chp nhn cho application server iu khin cc ranh gii ca giao dch thay mt cho ng dng ang c qun l. 3 XAResource javax.transaction.xa.XAResource interface l mt bn nh x (mapping) Java ca giao din XA chun da trn c im k thut X/Open CEA C nhiu trng hp m JTA c th truy cp nhiu ti nguyn trong cng mt bi cnh giao dch phn tn (single distributed transaction context). Sau y l mt s trng hp hay gp.
42 Nguyn Qung i
Trng hp 1 : Mt giao dch phn tn ni kt hai EJB : A v B. Mi EJB c mt kt ni JDBC ca ring mnh n Datasource. Bi cnh giao dch JTA lan truyn t A ti B. Trng hp ny c ch khi cp nht c hai c s d liu ng thi, nh mt n v cng vic m thi Trng hp 2 : Mt giao dch phn tn ni kt hai EJB : A v B. EJB u tin c kt ni JDBC ti Datasource, cn ci cn li c kt ni ti JMS provider. Bi cnh giao dch JTA lan truyn t A ti B. Cch ny c ch trong trng hp cp nht mt c s d liu, trong khi phi chc chn c s phn pht ca mt JMS messeage. Trng hp 3 : Ging nh trng hp 2 ch khc EJB A c 2 datasource, mi datasource c connection pool ca ring n. Bi cnh giao dch JTA truyn t A ti B Trng hp 4 : Trnh qun l giao dch JTA lan truyn bi cnh giao dch qua ranh gii EJB container ti mt EJB container khc. Cc container ny c th c cng hoc khc nh phn phi. Ch : Khi trnh qun l ti nguyn JMS ( JMS resource manager) tham gia vo mt giao dch phn tn, JTA driver s b qua ci t JMS transacted Session ( t Session thnh kiu transactional). Sau cc ci t ny s c khi phc sau khi giao dch phn tn trn hon thnh. Kt qu tng t xy ra vi trng hp ca JDBC resource manager vi giao dch a phng (local transaction). Cc ngoi l ca JTA
43 Nguyn Qung i
RollbackException
- Thrown to indicate that the transaction has been rolled back rather
than committed. - Thrown to indicate that a heuristic decision was made and that some relevant updates have been committed, whereas others have been rolled back.
HeuristicMixedException
- Thrown to indicate that a heuristic decision was made and that some relevant updates have been rolled back.
HeuristicRollbackException SystemException
condition. Giao dch JTA ( JTA transaction) t ng rollback nu li h thng (SystemException) c tm thy t mt phng thc ca bean. Tuy nhin cc giao dch khng t ng nu l li ca ng dng.
Nh vy trong transaction trn, lnh insert th hai gy ra li nhng lnh th ba vn tip tc c thc hin, v transaction vn kt thc thnh cng. Kt qu l bng vn c hai bn ghi t lnh insert th nht v th ba. Nay hy t XACT_ABORT thnh ON:
-- to bng vi rng buc ct i khng c cha gi tr 2 CREATE TABLE #t2(i INT, CONSTRAINT ck2 CHECK (i<>2) ) SET XACT_ABORT ON BEGIN TRAN 44 Nguyn Qung i
INSERT #t2 SELECT 1 INSERT #t2 SELECT 2 -- vi phm rng buc INSERT #t2 SELECT 3 COMMIT SELECT * FROM #t2 i --(0 ROW(s) affected)
V by gi bng khng c bn ghi no v ton b transaction b hy b. Chnh xc ra l cc lnh pha sau lnh gy ra li khng c thc hin tip, cn cc lnh thc hin trc b quay lui (ROLLBACK) tr li. Ni chung SET XACT_ABORT ON trnh c rt nhiu rc ri khi dng transaction, n x l gn gh cc ngoi l k c cc li nh connection timeout hay khi user hy b thc hin. Bn thn ti khng l gii c ti sao Microsoft khng t gi tr mc nh cho XACT_ABORT l ON. Thm ch khng l gii c vic a ra ty chn ny lm g. Tm li bn lun nn t SET XACT_ABORT ON vo u th tc nu cn dng transaction. (Hnh nh ty chn XACT_ABORT ny l ty chn ring ca SQL Server th phi, khng bit cc h qun tr c s d liu khc c khng? )
3.9.5 ACID
ACID l t vit tt cc ch ci u ca bn t ting Anh atomicity, consistency, isolation, v durability. Chng c coi l bn thuc tnh quan trng ca mt h qun tr c s d liu khi x l bt k giao dch no. Nu thiu mt trong nhng thuc tnh ny th tnh ton vn ca c s d liu kh c th c m bo. Trong mt h qun tr c s d liu, mt giao dch l mt n v l gch thao tc trn d liu, c th bao gm nhiu thao tc. Chng hn vic chuyn tin t ti khon ny sang ti khon khc l mt giao dch, bao gm thao tc tr tin mt ti khon v cng tin vo ti khon kia. Cc tnh cht ACID trong trng hp ny s m bo cc giao dch c thc hin mt cch ng tin cy: - Tnh nguyn t (Atomicity). Mt giao dch c nhiu thao tc khc bit th hoc l ton b cc thao tc hoc l khng mt thao tc no c hon thnh. Chng hn vic chuyn tin c th thnh cng hay trc trc v nhiu l do nhng tnh nguyn t bo m rng mt ti khon s khng b tr tin nu nh ti khon kia cha c cng s tin tng ng. - Tnh nht qun (Consistency). Mt giao dch hoc l s to ra mt trng thi mi v hp l cho d liu, hoc trong trng hp c li s chuyn ton b d liu v trng thi trc khi thc thi giao dch. Tc l sau khi giao dch kt thc, d thnh cng hay tht bi th d liu phi trng thi nht qun.( m bo s ton vn d liu) - Tnh c lp (Isolation). Tnh c lp ca mt giao dch c ngha l tc dng ca mt giao dch phi ging nh khi ch mnh n c thc hin trn chnh h thng . Ni cch khc, mt giao dch khi c thc thi ng thi vi nhng giao dch khc trn cng h thng khng chu bt k s nh hng no ca giao dch . - Tnh bn vng (Durability). D liu c xc nhn s c h thng lu li sao cho ngay c trong trng hp hng hc hoc c li h thng, d liu vn m bo trong trng thi chun xc. Khi nim ACID c miu t trong tiu chun ISO/IEC 10026-1:1992 Phn 4. Mi thuc tnh ny u c cc phng php o lng. Thng thng, mt chng trnh qun l giao dch c thit k m bo nhng tnh cht ACID ny. Trong mt h thng phn tn, mt cch t c tnh cht ACID l dng phng php xc nhn hai pha (2PC),
45 Nguyn Qung i
phng php ny m bo tt c mi thnh phn tham gia phi xc nhn hon tt giao i vi giao dch, nu khng giao dch phi b hy (quay v trng thi trc ).
3.9.7 Lock
Kha l c ch m HQTCSDL dng kim sot v hn ch vic nhiu ngi dng cng mt lc cp nht vo d liu. Kha c th tc dng ln nhiu i tng khc nhau trong CSDL nh dng, kha, trang, ch mc, bng, ... hay ton b CSDL vi nhiu mc khc nhau. Th d : mt bng nh c th c kha ton b bng, trong khi mt bng ln c th ch kha mt s dng. Mt s kiu kha C mt s kiu kha nh : shared, exclusive, update, ... - Kha dng chung (Shared locks) : dng cho cc thao tc ch c d liu (lnh SELECT). Khng c giao tc no khc c th hiu chnh d liu trong thi gian kha c tc dng. Kha dng chung s kt thc ngay khi d liu c c xong. - Kha c quyn (Exclusive locks) : khng cho php giao tc khc c th c hoc cp nht d liu b kha. - Kha cp nht (Update locks) : dng cp nht d liu v cho php cc giao tc khc c th c d liu. - Kha cht (dead lock) Kha cht (deadlock) l tnh hung c hai hay nhiu tc v kha ln nhau. Th d : giao tc A m c quyn (exclusive) bng T1 v ang ch m c quyn bng T2, cng lc giao tc B cng m c quyn bng T2 v ang ch m c quyn bng T1. Kt qu l hai giao tc trn ch v tn. SQL Server c thut ton pht hin cc kha cht v rollback cc giao tc.
Tnh trng ny xy ra khi c nhiu hn mt giao tc cng thc hin cp nht trn 1 n v d liu. Khi , tc dng ca giao tc cp nht thc hin sau s ln tc dng ca thao tc cp nht trc. c d liu cha commit (Uncommitted data, Dirty read) Xy ra khi mt giao tc thc hin c trn mt n v d liu m n v d liu ny ang b cp nht bi mt giao tc khc nhng vic cp nht cha c xc nhn. Giao tc c khng th lp li (Unrepeatable data) Tnh trng ny xy ra khi mt giao tc T1 va thc hin xong thao tc c trn mt n v d liu (nhng cha commit) th giao tc khc (T2) li thay i (ghi) trn n v d liu ny. iu ny lm cho ln c sau ca T1 khng cn nhn thy d liu ban u na. Giao tc c ln u thy d liu l A, nhng sau c li th thy l B (do giao tc khc thay i) Bng ma (Phantom) L tnh trng m mt giao tc ang thao tc trn mt tp d liu nhng giao tc khc li chn thm cc dng d liu vo tp d liu m giao tc kia quan tm. Khi giao tc 1 c d liu, bn ngoi hay giao tc khc thm dng mi vo hay xa i, lm cho cc dng ang c tr thnh dng o (phantom).
liu. To Exclusive Lock trn n v d liu c ghi, Exclusive Lock c gi cho n ht giao tc. u im: - Gii quyt vn Dirty Reads - Shared Lock c gii phng ngay, khng cn phi gi cho n ht giao tc nn khng cn tr nhiu n thao tc cp nht ca cc giao tc khc. Khuyt im: - Cha gii quyt c vn Unrepeatable Reads, Phantoms,Lost Updates - Phi ch nu n v d liu cn c ang c gi kho ghi (xlock) REPEATABLE READ :To Shared Lock trn n v d liu c c v gi shared lock ny n ht giao tc => Cc giao tc khc phi ch n khi giao tc ny kt thc nu mun cp nht, thay i gi tr trn n v d liu ny. (Repeatable Read = Read Committed + Gii quyt Unrepeatable Reads). To Exclusive Lock trn n v d liu c ghi, Exclusive Lock c gi cho n ht giao tc. C ch kha xy ra trn ton b d liu c dng trong truy vn, ngn cn ngi s dng khc cp nht d liu nhng cho php ngi s dng khc thm cc record mi vo d liu (phantom rows) v cc ln c sau s c cc d liu u im: - Gii quyt vn Dirty Reads v Unrepeatable Reads Khuyt im: - Cha gii quyt c vn Phantoms, do vn cho php insert nhng dng d liu tha iu kin thit lp shared lock. - Phi ch nu n v d liu cn c ang c gi kho ghi (xlock) - Shared lock c gi n ht giao tc ==> cn tr vic cp nht d liu ca cc giao tc khc SERIALIZABLE : l mc c lp cao nht, c ch kha trn tp d liu, ngn cn ngi s dng khc cp nht hay thm dng vo d liu cho ti khi giao tc kt thc. To Shared Lock trn n v d liu c c v gi shared lock ny n ht giao tc => Cc giao tc khc phi ch n khi giao tc ny kt thc nu mun cp nht, thay i gi tr trn n v d liu ny. Khng cho php Insert nhng dng d liu tha mn iu kin thit lp Shared Lock (s dng Key Range Lock) ==> Serializable = Repeatable Read + Gii quyt Phantoms. To Exclusive Lock trn n v d liu c ghi, Exclusive Lock c gi cho n ht giao tc. u im: - Gii quyt thm c vn Phantoms Khuyt im: Phi ch nu n v d liu cn c ang c gi kho ghi (xlock) Cn tr nhiu n vic cp nht d liu ca cc giao tc khc CC LI DO MC C LP GY RA ( Ci ny vn ang xem xt chnh sa)
PHANTOM
LOST UPDATE
48
Nguyn Qung i
Read committed Repeatable read Serializable Isolation level Read Uncommitted Read Committed Repeatable Read Serializable
CCH CI T MC C LP
SET TRANSACTION ISOLATION LEVEL { READ COMMITTED | READ UNCOMMITTED | REPEATABLE READ | SERIALIZABLE } Th d : SET TRANSACTION ISOLATION LEVEL REPEATABLE READ GO BEGIN TRANSACTION SELECT * FROM publishers SELECT * FROM authors ... COMMIT TRANSACTION
3.10
ng dng cn ch nh mt i tng DataSource trc khi to ra mt Connection. ng dng ch nh mt DataSource thng qua dch v JNDI. V d nh sau:
// Connect to the default JNDI service and establish a context Context ctx = new InitialContext(); // Lookup the DataSource for the configured database javax.sql.DataSource ds = (javax.sql.DataSource) ctx.lookup ("java:comp/env/jdbc/styejbDB"); // Make a connection to the database java.sql.Connection conn = ds.getConnection(); // do some work // Release the connection after you are done conn.close();
Ch : Phi gii phng connection ngay sau khi lm xong cng vic vi n bng cch ng connection li. Khi client ng connection li bng phng thc close(), th
49 Nguyn Qung i
ng sau container a connection tr li pool, v khi n sn sng c s dng cho cc client khc C mt li khuyn, l cc tham chiu JDBC DataSource lun lun c khai bo trong java:comp/env/jdbc subcontext. Ci ny s c thit lp bi qun tr vin h thng khi DataSource ang c to ra. Thit lp mt context ti mt dch v JNDI l mt vic lm rt c gi tr, c bit l khi s dng RMI call. Ta s thu c mt i tng DataSource trong code khi ng ca ng dng. Ta ch cn lm vic ny mt ln v DataSource s c gn ti cc thnh phn ca ng dng trng sut thi gian sng ca n. Cc ng dng da vo container qun l connection pool, nhng khi xy dng cc ng dng c th ci tin (scalable applications), th vic gii phng cc connection ngay khi c th li l trch nhim ca ngi lp trnh.
Phng thc trn khng c tham s truyn vo, container sau s s dng cc ci t trong cc file cu hnh to connection. Nu s dng code trc tip trong application th ta phi truyn tham s vo cho phng thc
Connection conn = dataSource.getConnection (String username, String password);
Cch ny lm mt i kh nng portability ca ng dng. Ch : Mt cch khc to ra mt connection l s dng DriverManager. Nhng cch ny khng c hoan nghnh. Bi v DriverManager l mt i tng c chia s vi nhng phng thc ng b v do vy n l mt lung n. Cch ny s to ra s tc nghn khi cc ng dng truy cp n c s d liu. cc cch ni trn, i tng DataSourse l i tng a lung nn c th iu kin truy cp ng thi ti nhiu hn mt user
static final String PASS = "password"; public static void main(String[] args) { Connection conn = null; Statement stmt = null; try{ //STEP 2: Register JDBC driver Class.forName("com.mysql.jdbc.Driver"); //STEP 3: Open a connection System.out.println("Connecting to database..."); conn = DriverManager.getConnection(DB_URL,USER,PASS); //STEP 4: Set auto commit as false. conn.setAutoCommit(false); //STEP 5: Execute a query to create statment with // required arguments for RS example. System.out.println("Creating statement..."); stmt = conn.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); //STEP 6: INSERT a row into Employees table System.out.println("Inserting one row...."); String SQL = "INSERT INTO Employees " + "VALUES (106, 20, 'Rita', 'Tez')"; stmt.executeUpdate(SQL); //STEP 7: INSERT one more row into Employees table SQL = "INSERT INTO Employees " + "VALUES (107, 22, 'Sita', 'Singh')"; stmt.executeUpdate(SQL); //STEP 8: Commit data here. System.out.println("Commiting data here...."); conn.commit(); //STEP 9: Now list all the available records. String sql = "SELECT id, first, last, age FROM Employees"; ResultSet rs = stmt.executeQuery(sql); System.out.println("List result set for reference...."); printRs(rs); //STEP 10: Clean-up environment rs.close(); stmt.close(); conn.close(); }catch(SQLException se){ //Handle errors for JDBC se.printStackTrace(); // If there is an error then rollback the changes. System.out.println("Rolling back data here...."); try{ if(conn!=null) conn.rollback(); }catch(SQLException se2){ se2.printStackTrace(); }//end try }catch(Exception e){ //Handle errors for Class.forName 51 Nguyn Qung i
e.printStackTrace(); }finally{ //finally block used to close resources try{ if(stmt!=null) stmt.close(); }catch(SQLException se2){ }// nothing we can do try{ if(conn!=null) conn.close(); }catch(SQLException se){ se.printStackTrace(); }//end finally try }//end try System.out.println("Goodbye!"); }//end main public static void printRs(ResultSet rs) throws SQLException{ //Ensure we start with first row rs.beforeFirst(); while(rs.next()){ //Retrieve by column name int id = rs.getInt("id"); int age = rs.getInt("age"); String first = rs.getString("first"); String last = rs.getString("last"); //Display values System.out.print("ID: " + id); System.out.print(", Age: " + age); System.out.print(", First: " + first); System.out.println(", Last: " + last);
Class.forName("com.mysql.jdbc.Driver"); //STEP 3: Open a connection System.out.println("Connecting to database..."); conn = DriverManager.getConnection(DB_URL,USER,PASS); //STEP 4: Set auto commit as false. conn.setAutoCommit(false); //STEP 5: Execute a query to delete statment with // required arguments for RS example. System.out.println("Creating statement..."); stmt = conn.createStatement(); //STEP 6: Now list all the available records. String sql = "SELECT id, first, last, age FROM Employees"; ResultSet rs = stmt.executeQuery(sql); System.out.println("List result set for reference...."); printRs(rs); // STEP 7: delete rows having ID grater than 104 // But save point before doing so. Savepoint savepoint1 = conn.setSavepoint("ROWS_DELETED_1"); System.out.println("Deleting row...."); String SQL = "DELETE FROM Employees " + "WHERE ID = 110"; stmt.executeUpdate(SQL); // oops... we deleted too wrong employees! //STEP 8: Rollback the changes afetr save point 2. conn.rollback(savepoint1); // STEP 9: delete rows having ID grater than 104 // But save point before doing so. Savepoint savepoint2 = conn.setSavepoint("ROWS_DELETED_2"); System.out.println("Deleting row...."); SQL = "DELETE FROM Employees " + "WHERE ID = 95"; stmt.executeUpdate(SQL); //STEP 10: Now list all the available records. sql = "SELECT id, first, last, age FROM Employees"; rs = stmt.executeQuery(sql); System.out.println("List result set for reference...."); printRs(rs); //STEP 10: Clean-up environment rs.close(); stmt.close(); conn.close(); }catch(SQLException se){ //Handle errors for JDBC se.printStackTrace(); // If there is an error then rollback the changes. System.out.println("Rolling back data here...."); try{ if(conn!=null) conn.rollback(); }catch(SQLException se2){ se2.printStackTrace(); }//end try }catch(Exception e){ 53 Nguyn Qung i
//Handle errors for Class.forName e.printStackTrace(); }finally{ //finally block used to close resources try{ if(stmt!=null) stmt.close(); }catch(SQLException se2){ }// nothing we can do try{ if(conn!=null) conn.close(); }catch(SQLException se){ se.printStackTrace(); }//end finally try }//end try System.out.println("Goodbye!"); }//end main public static void printRs(ResultSet rs) throws SQLException{ //Ensure we start with first row rs.beforeFirst(); while(rs.next()){ //Retrieve by column name int id = rs.getInt("id"); int age = rs.getInt("age"); String first = rs.getString("first"); String last = rs.getString("last"); //Display values System.out.print("ID: " + id); System.out.print(", Age: " + age); System.out.print(", First: " + first); System.out.println(", Last: " + last); } System.out.println(); }//end printRs() }//end JDBCExample
DB. Khi hi iu kin th tin hnh chn chc nng lnh ph hp, lc ny Connection mi thc s to ra v chuyn thng tin n DB. _Trong bi vit ny ti mun m t k thut Batch Update ln lt cho c 3 loi i tng ca interface Statement, PreparedStatement v CallableStatement. Demo k thut Batch Update s dng Batch Update lm theo cc bc sau: _Step 1: Tt ch Auto-Commit ca Connection to. Mc nh khi to 1 Connection to ra s c thuc tnh Auto-Commit bng true. C ngha l ng vi 1 cu lnh SQL thit lp cho object ti thi im th Connection object s t ng thc thi tc ng n Database m khng cn phi gi lnh commit ca Connection . y, khi dng k thut Batch Update th lp trnh vin mun khi no yu cu, cc lnh gn cho Connection object mi c thc thi, v th Auto-Commit phi c thit lp l false. lm iu ny, bn s gi phng thc setAutoCommit() ca Connection to v truyn tham s l false. _Step 2:To 1 th hin ca Statement, PreparedStatement hoc CallableStatement thng qua cc phng thc createStatement(), preparedStatement() hoc callableStatement() ca Connection to _Step 3:To cc query SQL v gn vo cc i tng Statement, PreparedStatement hoc CallableStatement bng phng thc addBatch() ca i tng ny. _Step 4:Gi phng thc executeBatch() ca cc interface Statement thi hnh. _Step 5:Gi lnh commit ca Connection tc ng trc tip ln DB, thc hin cc lnh SQL gn sn cho cc i tng Statement. _Step 6:Bc cui cng kh n gin, ch n thun l xa b cc lnh gn cho Batch Trong hng dn ny ti s dng 1 database c sn vi 1 bng tn l Logon c cc ct UserName(primary key), Password, FullName, Role c pht sinh on coad nh sau:
CREATE TABLE [dbo].[Logon]( [UserName] [varchar](50) [Password] [varchar](50) [FullName] [varchar](50) [Role] [varchar](50) NOT ) NOT NULL PRIMARY KEY, NOT NULL, NOT NULL, NULL,
S dng PreparedStatement
public void insertAccounts() throws Exception{ Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); Connection con = DriverManager.getConnection("jdbc:sqlserver://" + "localhost:1433;database=Sinhvien", "sa", ""); con.setAutoCommit(false); String strSQL = "insert into Logon values(?,?,?,?)"; PreparedStatement ps = con.prepareStatement(strSQL); //1 batch ps.setString(1, "admin"); ps.setString(2, "admin"); ps.setString(3, "admin"); ps.setString(4, "admin"); ps.addBatch(); // 2 batch ps.setString(1, "user"); ps.setString(2, "user"); ps.setString(3, "user"); ps.setString(4, "user"); ps.addBatch(); ps.executeBatch(); con.commit(); ps.clearBatch(); con.close(); }
Gi SP:
public void insertAccounts() throws Exception{ Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); Connection con = DriverManager.getConnection("jdbc:sqlserver://" + "localhost:1433;database=Sinhvien", "sa", ""); con.setAutoCommit(false); String strSQL = "{call insertAccount(?,?,?,?)}"; CallableStatement cs = con.prepareCall(strSQL); //1 batch cs.setString(1, "admin"); cs.setString(2, "admin"); cs.setString(3, "admin"); cs.setString(4, "admin"); cs.addBatch(); 56 Nguyn Qung i
//2 batch cs.setString(1, "user"); cs.setString(2, "user"); cs.setString(3, "user"); cs.setString(4, "user"); cs.addBatch(); cs.executeBatch(); con.commit(); cs.clearBatch(); con.close(); }
Ta c th thay i s dng c thu v (c fetch) trong mt ln thc hin t c s d liu. Mc nh th bn c th bit c s cc dng c cung cp bi JDBC Driver bng cch s dng phng thc getFetchSize() trn i tng Statement. Ta c th iu chnh kch thc bng phng thc setFetchSize( int rows) ca i tng Statement.
3.10.6 Metadata
Ta c th s dng phng thc getMetaData() ca i tng Connection nhn ly mt i tng DatabaseMetaData. S dng metadata l sc mnh to ra cc cng c cho vic thao tc c s d liu v cc ng dng c s d liu phc tp. Tham kho thm v d ti liu [ 9]
57 Nguyn Qung i
PHN 4 ECLIPSE
Khi khi ng eclipse ln u tin, n s t sinh ra cc thnh phn qun l project trong khu vc workspace ( thng tin cha trong th mc .metadata). y chnh l l do ti sao khi xa eclipse i ri, nhng khi ci li eclipse vn c th lu tr thng tin ca cc project c to trc . Mun xa ht thng tin ny phi xa i th mc .metadata ang tn ti.
58 Nguyn Qung i
WebContent. Regular Web files (HTML, JavaScript, CSS, JSP, images, etc.) WebContent/some-subdirectory Web files in subdirectory. WebContent/WEB-INF web.xml. This deployment descriptor be used for servlet mappings and many other tasks. However, this file can be completely omitted in servlet 3.0 apps, since servlet mappings can be done via the @WebServlet annotation in the Java source code. WebContent/WEB-INF/lib JAR files specific to application. src/testPackage Java code in testPackage package. Make a package by R-clicking on "Java Resources: src" and doing New, package. Always make packages: use of the default package is strongly discouraged in Web apps. Note: You can cut/paste or drag/drop existing files into the appropriate locations.
59 Nguyn Qung i
Ch : Eclipse s t add vo file web.xml nhng ni dung tng ng vi servlet c to ra nu trong qu trnh to project ta tch vo mc Generate web.xml deployment descriptor. Th nhng nu ta khng code trc tip trn ca s ca eclipse m copy file servlet vo th mc tng ng ca web app th ta vn phi cu hnh cho servlet trong file web.xml nh bnh thng.
60 Nguyn Qung i
Kiu th hai c s dng khi cn c cc cu hnh ci t ca server c th trc khi chnh thc hon thnh vic khi to. V d servlet ang xt cn bit v cc ci t c s d liu, cc file mt khu, cc tham s thc thi ca server c th, hoc d liu cookie c lu tr th cc yu cu trc . Kiu ny c dng nh sau:
// Initialization code...
ServletConfig c phng thc getInitParameter ny ta c th tm kim cc tham s , vi phng thc khi to c kt hp vi servlet. C tn ca tham s v gi tr ca tham s u l kiu String. Ch rng, ta c th ly cc gi tr ny theo mt cch chung l s dng phng thc geI ,t nhng cch ci t cc gi tr y th li ph thuc vo tng server c th. V d vi Tomcat, th ta khai bo cc thuc tnh servlet trong file web.xml, vi WebLogic ta li khai bo chng trong file weblogic.properties. Mt ch quan trng khc na khi s dng phng thc init kiu hai l lun phi gi super.init u tin trong thn ca phng thc init . i tng ServletConfig c th c s dng bt c u trong servlet ang xt. V phng thc init ca lp cha s ng k n u servlet c th tm c n sau ny. V vy nu b qua super.init, th t ta s gy ra mt rc ri ln sau ny. Nu nh ta cn s dng n kiu th hai, v trong trng hp c mt lng ln cc tham s khi to (init pragramers) cn c s dng, khi s rt vt v nu ta di chuyn cc servlet ny t mt server n mt server khc. Bi v ta phi ci t li, khai bo li cc tham s khi to ny, do mi mt server c th li c mt cch khai bo khc nhau. Chnh v vy, gim thiu ti a cng vic phi lm khi ta mun chuyn sang mt server mi, tt nht ta nn lu tr d liu ny vo mt file ring bit, sau s dng nhng tham s khi to ch ly ra v tr ca cc file . Sau y l v d ShowMessage.java, kiu init th hai, trong trng hp khng s dng mt file lu tr d liu ring bit.
61 Nguyn Qung i
ShowMessage.java
package coreservlets; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; /** * Example using servlet initialization. Here, the message to print and the * number of times the message should be repeated is taken from the init * parameters. */ public class ShowMessage extends HttpServlet { private String message; private String defaultMessage = "No message."; private int repeats = 1; public void init(ServletConfig config) throws ServletException { // Always call super.init super.init(config); message = config.getInitParameter("message"); if (message == null) { message = defaultMessage; } try { String repeatString = config.getInitParameter("repeats"); repeats = Integer.parseInt(repeatString); } catch (NumberFormatException nfe) { // NumberFormatException handles case where repeatString // is null *and* case where it is something in an // illegal format. Either way, do nothing in catch, // as the previous value (1) for the repeats field will // remain valid because the Integer.parseInt throws // the exception *before* the value gets assigned // to repeats. } } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); String title = "The ShowMessage Servlet"; out.println(ServletUtilities.headWithTitle(title) + "<BODY BGCOLOR=\"#FDF5E6\">\n" + "<H1 ALIGN=CENTER>" + title + "</H1>"); for (int i = 0; i < repeats; i++) { out.println(message + "<BR>"); } out.println("</BODY></HTML>"); } }
ci t cc tham s khi to cho servlet trn s dng ta cn khai bo nh sau trong file web.xml (i vi server Tomcat)
62 Nguyn Qung i
Tn ca cc header khng phn bit ch hoa ch thng ( not case sensitive ). V d request.getHeader("Connection") c th thay th c bng request.getHeader("connection"). Mc d getHeader l phng thc chung c cc header c gi n, nhng c mt s Header thng c s dng c phng thc ring trong HttpServletRequset lm cng vic ny. getCookies: tr li cc ni dung ca header Cookie, lu tr trong mt mng cc i tng Cookie. getAuthType v getRemoteUser The getAuthType v getRemoteUser methods break the Authorization header into its component pieces. getContentLength Tr li gi tr ca header Content-Length (nh mt int) getContentType The getContentType method returns the value of the Content-Type header (as a String). getDateHeader and getIntHeader The getDateHeader and getIntHeader methods read the specified headers and then convert them to Date and int values, respectively. getHeaderNames Rather than looking up one particular header, you can use the getHeaderNames method to get an Enumeration of all header names received on this particular request. This capability is illustrated in Section 5.2 (Making a Table of All Request Headers). getHeaders In most cases, each header name appears only once in the request. Occasionally, however, a header can appear multiple times, with each occurrence listing a separate value. Accept-Language is one such example. You can use getHeaders to obtain an Enumeration of the values of all occurrences of the header. Cui cng, tm kim nhng request header, cn c mt s phng thc sau: getMethod The getMethod method returns the main request method (normally, GET or POST, but methods like HEAD, PUT, and DELETE are possible). getRequestURI The getRequestURI method returns the part of the URL that comes after the host and port but before the form data. For example, for a URL of http://randomhost.com/servlet/search.BookSearch?subject=jsp, getRequestURI would return "/servlet/search.BookSearch". getQueryString The getQueryString method returns the form data. For example, with http://randomhost.com/servlet/search.BookSearch?subject=jsp, getQueryString would return "subject=jsp". getProtocol The getProtocol method returns the third part of the request line, which is generally HTTP/1.0 or HTTP/1.1. Servlets should usually check getProtocol before specifying response headers (Chapter 7) that are specific to HTTP 1.1.
64 Nguyn Qung i
5.11
Bean
S dng bean c cc li ch sau: C th tng tc vi cc i tng Java vi c php ca XML m khng cn n nhng c php ca Java. iu ny lm tng s chia ct gia ni dung v trnh din, to thun li cho nhng i pht trin ln c th chia ra gia nhng ngi pht trin Web v nhng ngi pht trin Java. Chia s i tng gia cc trang hoc gia cc yu cu n gin hn so vi vic s dng code java tng ng. Thun li cho s tng ng gia cc tham s ca request v cc thuc tnh ca i tng: Jsp bean n gin ha qu trnh x l vic c tham s request, chuyn i t dng string v a kt qu vo bn trong i tng. Bean c ba c im chnh sau: phi c phng thc khi to mc nh (default constructor). Cc thuc tnh khng public C cc phng thc get/set: cc thuc tnh c kiu d liu l Boolean th phng thc gi chng s c dng l isXxx thay v getXxx C mt s cnh bo khi s dng bean: S khng c bt k mt hnh ng g nu nh tham s truyn vo b b qua. S chuyn i kiu d liu t ng ca bean khng phng nhng gi tr khng hp l nh l chuyn i d liu bng tay thng thng. Nn cn cnh gic vi cc gi tr khng hp l khi s dng n. V d: khi nhp d liu vo form, ng l phi nhp s nhng ta li nhp ch vo, khi s gy ra li. V vy nhiu ngi nh ngha ht tt c cc thuc tnh c phng thc set trong bean ca h thnh kiu String, ri h s dng try/catch iu kin cc d liu d hnh. Tn thuc tnh ca bean v tham s ca request l phn bit ch hoa ch thng (case sensitive). chia s cc bean ta s dng thuc tnh scope (c gi tr mc nh l page). C bn loi scope c th p dng: Un-shared beans ( page-scoped): bean ch c phm vi hot ng trong trang cha n ti ln request m thi. Sharing request-scoped beans: ging vi kiu trn. Ch khc l n c th p dng vi nhng trang c include vo trang m trong ta khi to bean.( include trang khc vi lnh <jsp:include page=JspFilePath> ) Sharing session-scoped beans: bean s c gi li nu nh truy cp t cng mt client v cha thot khi session.
65 Nguyn Qung i
Sharing application-scoped (ServletContext-scoped) beans: bean c tc dng ngay c khi truy cp n t cc client khc nhau. Phm vi ca bean ny l trn ton ng dng.
5.12
MVC
Cc bc vi m hnh MVC 6. nh ngha cc bean biu din d liu 7. S dng mt servlet iu khin request 8. a kt qu n cc bean 9. Lu tr cc bean trong request, session, hoc servlet context 10. Forward request ti mt trang jsp 11. Ly d liu t bean ra hin th Cch lu tr vo i tng bean trong m hnh MVC theo ba trng hp sau: Chia s d liu trn request Servlet ValueObject value = new ValueObject(...); request.setAttribute("key", value); RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/SomePage.jsp"); dispatcher.forward(request, response); JSP Page <jsp:useBean id="key" type="somePackage.ValueObject" scope="request" /> <jsp:getProperty name="key" property="someProperty" /> Chia s d liu trn session Servlet ValueObject value = new ValueObject(...); HttpSession session = request.getSession(); session.setAttribute("key", value); RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/SomePage.jsp"); dispatcher.forward(request, response); JSP Page <jsp:useBean id="key" type="somePackage.ValueObject" scope="session" /> <jsp:getProperty name="key" property="someProperty" /> Chia s d liu trn ton ng dng Servlet synchronized(this) { ValueObject value = new ValueObject(...); getServletContext().setAttribute("key", value); RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/SomePage.jsp"); dispatcher.forward(request, response); } JSP Page <jsp:useBean id="key" type="somePackage.ValueObject" scope="application" />
66 Nguyn Qung i
<jsp:getProperty name="key" property="someProperty" /> Ch : Trang Jsp khng nn thay i i tng bean. V vy ta ch nn s dng jsp:getProperty nhng khng nn s dng jsp:setProperty.
<scripting-invalid>true</scripting-invalid> </jsp-property-group> </web-app> Khi c on code trn, nu ta s dng classic scripting element trong bt k trang jsp no u s gy ra li. Ch : Khi ang s dng phin bn jsp 1.2 hoc cc phin bn khc khng h tr EL.Nu ta mun s dng nhng page ny trn c nhng phin bn h tr EL th cnh gic nu mun hin th k t ${ ra output, trnh sinh ra li th thay $ bng k t HTML character entry $ (nhng HTML character entry ch c tc dng pha trnh duyt). Cn trong phin bn h tr EL ta, nu trong trang web c c EL ln k t $. Th khi mun hin th k t $ ta s vit l \$ Cch gi i tng v thuc tnh ${name} ${name.property} ${name[property]}
5.14
Ch
Cch lu tr d liu gia cc request : Vi nhng d liu khng phi ca ring ca bt k client no th lu tr n vo mt trng ca servlet Vi nhng d liu ca mt user ring bit th lu tr i tng HttpSession Vi nhng d liu cn dng cho cc servlet hoc cc trang Jsp khc th lu tr n trong mt ServletContext (see the section on sharing data in Chapter 14, Using JavaBeans Components in JSP Documents) Cch gi cho cc cng vic tnh ton vn chy sau khi response c gi ti user: y l mt vic n gin, ch cn bt u mt Thread. Thread c bt u bi h thng tr li nhng yu cu s t ng kt thc khi response trn kt thc, nhng nhng Thread khc vn hot ng Cch a kt qu c update ti trnh duyt khi chng sn sang: bi v trnh duyt khng gi mt kt ni m n server, nn s khng c mt cch no server c th ch ng gi kt qu mi c update ti trnh duyt. Thay v th trnh duyt cn c bo hi server v nhng s update. cng chnh l mc ch ca Refresh response header. S khc bit gia jsp:include v <%@ include %> Khi s dng <jsp:include page = path /> cn ch n du / ca ng dn n file cn include. Gi s ta c file http://host/headlines/sports/table-tennis.jsp. S c s khc bit trong hai cu lnh sau y <jsp:include page="bios/cheng-yinghua.jsp" /> <jsp:include page="/templates/footer.jsp" /> Trong cu lnh u tin, h thng s tm file cheng-yinghua.jsp trong th mc bios, th mc ny l th mc con ca th mc sports. Cn trong trng hp th hai, h thng s tm kim file footer.jsp trong th mc templates, th mc ny l th mc con ca ng dng (th mc) headlines Cu lnh <jsp :include page > tng ng vi phng thc include ca RequestDispatcher.
68 Nguyn Qung i
S khc bit c bn ca jsp : include v <%@ include %> l thi im m chng c gi. jsp:include c gi khi c request, cn <%@include...%> (include directive) c gi khi dch trang jsp sang servlet. (xem mc 13.2 trong chapter 13) C th hiu theo mt kha cnh khc l jsp:include ghp cc file vo trong trang chnh ,nhng bn thn chng vn l cc servlet khc nhau. Cn sau khi s dng < %@include...%> cc servlet c s dng s c gp vo to ln mt servlet duy nht. S khc bit gia phng thc sendRedirect ca HttpServletResponse vi phng thc forward ca RequestDispacher Vi fordward, s khng c mt cp request/response m rng no nh l sendRedirect. V vy Url hin ln pha client s khng thay i khi s dng forward. Ngoi ra, vi phng thc forward ,ton b thc hin bn pha server, khng dng g n ng mng tr gip c.Cn sendRedirect th khc, bn cht l gi li thng tin cho client (302 status code), l mt phng thc ca reponse bo cho client thc hin tip mt yu cu vi tham s truyn vo hm sendRedirect. Nh vy phng thc forward c th gip ngn cn user truy cp trc tip vo nhng file jsp c forward ti m khng thng qua servlet ci t d liu ( khi cc file ny c t trong th mc WEB-INF, khu vc ny ch c pha server mi c th truy cp vo) S dng du / trong ng dn path Nn s dng ng dn y tr n file cn thit khng gy ra s nhm ln V d nn s dng <LINK REL=STYLESHEET HREF="/path/my-styles.css" TYPE="text/css"> Thay v : <LINK REL=STYLESHEET HREF="my-styles.css" TYPE="text/css"> Lm tng t vi <IMG SRC=...> v <A HREF=...>. cch th hai, nu c vit trong mt trang jsp c forward t mt servlet trc th h thng s hiu l file my-styles.css nm trong cng mt th mc vi servlet , v rt d gy ra li. Cn ch ti ng dn ca cc tag <LINK> <IMG> <A HREF> khi s dng thng qua eclipse( khng hiu sao phi dng ./ )
69 Nguyn Qung i
6.1
Appication Server
Application server l mt chng trnh chy trn server nhm phc v cho cc nhim v ca cc ng dng pha server. Application Server l mt phn ca m hnh kin trc ba tng. Ba tng bao gm : tng client, tng middle, tng EIS ( Enterprise Information System). N bao gm: tng trnh din (GUI interface), tng middle l tp hp cc business logic application, v EIS. Tng trnh din th khng c g c nhng n l giao din tng tc vi client. Tng middle l s kt hp gia web container v EJB container. Cn EIS cha h thng qun l d liu h tr cho cc ng dng.
Common Vertical Services y l cc service c hu c cung cp bi EJB container v khng c ch nh r rng bi J2EE architecture APIs. Chng ng gp vo vic thc hin v vo cc kha cnh trong thi gian chy (runtime aspects) ca cc EJB v cc dch v c cung cp cho chng. EJB developers need not include any logic to manage these services. Sau y l danh sch ca cc dch v : Qun l vng i (life cycle management): container to v hy cc th hin ca EJB da trn yu cu ca client. Vic ny lm tng ti a vic thc thi
70 Nguyn Qung i
v gim ti thiu vic s dng ti nguyn nh b nh. Ngoi ra, container c th to ra mt pool cc th hin mt cch trong sut, dng chia s vi cc client. Security: dch v ny c thit k m bo ch cc user c thm quyn mi c truy cp vo cc ti nguyn. J2EE specifies a simple role-based security model for enterprise beans and Web components. In addition, vendors typically provide integration with third-party security providers such as LDAP. Gi phng thc t xa (Remote method invocation): container qun l mt cch trong sut kt ni gia cc enterprise bean v cc component khc. Lp trnh vin ch cn vit cc phng thc business nh chng s c gi trn mt nn a phng (local platform). Qun l giao dch: gip cc lp trnh vin lm vic vi cc giao dich phn tn Persistence: Persistence services lm n gin ha kt ni gia ng dng v tng c s d liu. CMP ca entity bean lm gim bt n lc phi code ca cc lp trnh vin. Passivation/activation: k thut ny c s dng bi container lu tr enterprise bean khng hot ng ln a, v hon tr li trng thi ca n khi bean c gi n. Container s dng k thut ny trong c entity bean v stateful session bean. iu ny gip phc v c nhiu client hn bng cch gii phng ng cc ti nguyn quan trng nh b nh. Clustering: h tr s ti to (replication) ca cc EJB v cc service thng qua nhiu application server instance c ci t trn mt my server hoc nhiu my server khc nhau. Clustering gm c load-balancing cc service yu cu v cc EJB gia cc th hin bn sao (replicated instances). (phn ny cha hiu lm) Concurrency: H tr vic qun l a lung. Tt c cc component c pht trin nh n lung; container qun l cc truy cp ng thi v tun t ti cc ti nguyn c chia s. Resource pooling: h tr s cp pht mt pool ca cc th hin (pool of instance), v gn chng ti nhng client yu cu. Khi mt instance lm xong cng vic ca mnh (free) n s tr v pool. Ci ny ng dng cho cc kt ni JDBC, stateless session beans, v entity beans.
Common Horizontal Services y l nhng dch v c ch nh trong kin trc J2EE. Chng thng c bit n nh l cc J2EE APIs, EJB server cung cp chng cho tt c cc container ang chy trn server. Sau y l danh sch cc J2EE API: JNDI JDBC JavaServer Pages (JSP) Java Servlet Java Transaction API (JTA) Java Message Service(JMS) J2EE Connector Architecture (JCA) Java API for XML Processing (JAXP) RMI over IIOP (RMI/IIOP) Java Authentication and Authorization Security (JAAS) JavaMail JavaBean Activation Framework (JAF)
71 Nguyn Qung i
Common Deployment Tools EJB server cung cp cc dch v trin khai (deployment service) v cc cng c (tools); chng cng c th dng cho container. y l danh sch cc dch v: deployment tools: dng bin dch v trin khai cc ng dng J2EE. Chng tho g cc file package ca ng dng v phin dch tt c cc thuc tnh khi thc hin (runtime properties) ci t EJB v cc thnh phn khc ca cc ng dng. Object-relational mapping tools: A new generation of tools, such as TopLink, that map relational data in a database to its object counterpart properties in memory. Monitoring Tools: s dng gim st (monitor) cc ng dng trong khi chng ang chy. Nhng cng c nh th ny rt cn cho vic kim tra tnh trng ca ng dng, v cho php chng ta cung cp cc gii php thch hp khi vn ny sinh.
chm v cc loi va chm(collision). Ta khng mun xy ra cc s va chm ,nhng sau y ta li khng cp n chng th chng s gy ra cc li. V vy phi tm kim v x l chng. lm c iu ny, EJB h tr nhiu loi iu khin concurrency. Trc tin ta s tp trung vo cc collision v cc k thut x l chng. Collision: Mt va cham c th xy ra nu nh c hai hoc nhiu hn cc transaction c gng thay i cc entry trong mt h thng record. C ba loi Dirty read Non Repeatable read Phantom read Control mechanism: Hai k thut chnh iu khin Concurrence Optimistic Locking (lc quan) Pessimistic Locking (bi quan) Clustering and load-balancing: Clustering l qu trnh gn kt nhiu thit b ngoi vi, my tnh v cc ti nguyn khc vo trong ch mt b. Ri h thng cluster lm vic nh h thng load balanced(np v lm cn bng). trong cc h thng phn tn, khi mt yu cu c gi n mt server, mt thut ton chy trn server s quyt nh th no server np v gi cc yu cu t nht ti server . EJB container gi gn nhng thnh phn ny cung cp dch v trn tru v hiu qu.
multiple client requests by load balancing and instantiating multiple instances of the single-threaded components.
Nhng vai tr ny gm c: Application development Roles: y l vai tr pht trin ng dng. Vic xy dng cc ng dng ln c chia thnh vic pht trin cc compoment mi v lp rp cc component ny vi cc component c th s dng li c. Kin trc EJB phn cha r rng gia lp trnh vin EJB (EJB developer hoc EJB provider) v ngi lp rp ng dng (application assembler). Mc d trong nhiu trng hp , hai vai tr ny c l c chu trch nhim bi mt ngi hoc mt i. o Lp trnh vin c nhim v vit code cho cc bean, nh ngha cc interface v deployment descriptor. Lp trnh vin cng phi nh ngha client s dng EJB. H phi chc chn rng EJB v client khng b thay i code cho d c trin khai bt k mi trng no. o Ngi lp rp ng dng (assembler) th phi lp rp mt ng dng t nhiu khi c xy dng (nh l EJBs, servlets, JSP, applet, v Java clients). Ngi lp rp phi lm vic lin quan n cc interface (home v remote interface) v deployment descriptor ca EJB. H chu trch nhim c vic cu hnh cc giao dch(transaction) v security ca cc EJB trong deployment descriptor.
74 Nguyn Qung i
Infrastructure Roles: y l vic to ra cc container, application server, v cc cng c trin khai (deployment tools). y l nhim v ca cc nh cung cp, nhng ngi thnh tho cc dch v v cc c s h tng phn tn. H thi hnh (implement) mt nn (platform) trong cc dch v v c s h tng phn tn to iu kin thun li cho vic pht trin cc ng dng phn tn v cung cp mi trng chy (runtime environment) cho cc ng dng ny. Cc nh cung cp server v EJB container l nhng chuyn gia trong cc h thng, giao dch phn tn, v bo mt;l nhng ngi cung cp cng c trin khai cho cc EJB v cc h tr trong lc chy cho cc th hin c trin khai ny (deployed instances). Deployment Roles: y l vai tr trin khai ng dng. EJB specification tch bit r rng gia cc vai tr trin khai. Bi v gi trin khai mt ng dng cao hn nhiu so vi gi pht trin ng dng. Ngi i trin khai (deployer) l ngi s phi iu chnh cho thch hp mt ng dng c lm t mt s EJB vo trong mt mi trng hot ng xc nh bng cch ci t cc thuc tnh v hnh vi (behavior) ca EJB. V d nh ngi phi ci t cc thuc tnh trong delpoment descriptor quyt nh cc chnh sch(policy) security v giao dch. Ngi trin khai cng phi hp nht cc ng dng vi nhng phn mm qun l v gim st enterprise tn ti. Ngi i trin khai phi quen thuc c cc yu cu thao tc ng dng, v mi trng application server. System Administrator: Ngi qun tr h thng chu trch nhim cu hnh v qun tr cc ng dng enterprise v c s h tng, bao gm application server, networking, c s d liu, v web server. Ngi qun tr gim st cc ng dng ang chy v a ra cc hnh ng hp l khi ng dng c biu hin khng bnh thng. c bit, ngi qun tr s dng cc cng c gim st v qun l enterprise m c kt ni ti ng dng bi nhng ngi trin khai thng qua cc hook c cung cp bi container.
Ch : A traditional application programmer now becomes an EJB developer and, possibly, an application assembler. These tasks enable the programmer to focus on the business problem and business logic. The deployer defines and sets the deployment policies when installing the EJB. The complexity of implementing mechanisms for executing the deployment policies is delegated to the container provider. Although distributed applications remain complex, the application programmers job becomes easier because much of the complexity is addressed by EJB server and container providers.
6.6
EJB Architecture
Kin trc EJB l mt kin trc da vo component bn pha server, dng m hnh ha business logic ca kin trc enterprise. EJB API l tri tim ca kin trc J2EE, cn cc API khc ca J2EE c s dng nh cc dch v cho EJB API.
75 Nguyn Qung i
6.7
Home interface ln danh sch cc phng thc to, tm kim v hy b cc EJB trong container. Home object l mt i tng i trin khai cc phng thc ca home interface, i tng ny s c container t ng sinh ra trong thi im trin khai. Trong lc chy (at runtime), home object s c s dng bi client cng vi mt dch v naming tm kim component v thit lp mt kt ni ti component interface ca n. Component interface nh ngha cc phng thc business c trong bean class. Ch rng cc lp bean khng trc tip trin khai (implement) interface ny, nhng s dng mt lp EJBObject lm trung gian cho li gi ca client ti mt i tng bean. Container cung cp implementation ca interface ny, client (cng vi mt naming service tm kim component v thit lp mt kt ni ti component interface ca n) s s dng n. Tm li, li gi t pha client s c a n bean class nh sau: sau khi thit lp n component interface ca component, client s gi mt phng thc business, lc ny li gi ca client s tc ng trc tip ln EJB object, sau li gi ca EJB object mi tip tc nh hng trc tip ln n Bean Class, lc ny thc s cc phng thc trong bean class mi c triu gi. Client khng bao gi trc tip to v truy cp ti cc th hin ca EJB. Ch c container mi to ra cc th hin ca bean v ng k home interface ca n vo trong JNDI service. Component interface c th l remote hoc local ty thuc vo v tr ca client khi gi EJB. Local s dng trong trng hp client nm cng mt JVM vi EJB c gi. Bean class l implementation ca cc phng thc business c lp ra trong component interface. Ch : nhng iu ni trn y c cp trong trng hp ca session bean v entity bean. Cn i vi message-driven bean th c khc. Message-driven bean khng c nhng interface nh ni trn, n ch c mt bean class, nn client khng th truy cp ti n thng qua cc interface. Client khi mun truy cp ti message-driven bean thng qua JMS provider bng cch s dng mt JMS destination (queue hoc topic)
76 Nguyn Qung i
6.8
Cc loi EJB
Instance pooling ch p dng cho cc stateless session bean, ch khng p dng cho cc stateful session bean. Bi v kiu stateful biu din mt tng tc ring vi mt client c th. V n ch tn ti phc v cho giai on lm vic (session) ca client . Cc client khng th chia s ng thi mt th hin stateless session bean. Tuy nhin, chng c th s dng li cng mt th hin (instance) t instance pool nh ni trn.
Passivation and Activation Vi mi mt client kt ni ti server, EJB container li to mt th hin statefule session bean khc nhau phc v client . Trong nhng ng dng thng mi ln, s lng cc client ng thi kt ni ti website l rt ln. Vic ny c th c nh hng xu n vic thc thi cng vic khi cc ti nguyn c s dng tng ln. Passivation v Activation l cc k thut EJB container s dng qun l cc ti nguyn c gi tr ny, nh b nh, gim s lng cc th hin stateful session bean c yu cu phc v ng thi tt c cc client. Passivation l k thut m EJB container lu tr trng thi ca bean vo trong mt ni lu tr nh h thng cc file hoc mt c s d liu. Container bt u passivation ngay khi s lng cc stateful session bean c ch nh t n mt ngng nht nh. Qu trnh x l Passivation tun t ha (serialize) tt c cc bin thnh vin khng phi l tm thi vo trong mt ni lu tr lu di. Sau khi tun t ha trng thi ca enterprise bean, EJB container gi phng thc ejbPassivate() trn th hin (instance) . Trong phng thc ny, ta s ng tt c c ti nguyn nh cc socket, cc kt ni JDBC m ta ang gi. Ngc li, Activation l qu trnh hon tr li trng thi ca bean t ni c lu tr. EJB container kch hot mt th hin ang b passivation khi m client ca bean quyt nh tip tc tng tc vi th hin bean. Sau khi hon tr li trng thi ca bean, EJB container gi phng thc ejbActive() trn th hin . Trong phng thc ny, ta s m tt c cc ti nguyn m ta cn phc v client nh cc socket, cc kt ni JDBC, Ta c th ch nh mt ngng (s lng ti a cc bean trong cache) trong file vendor deployment descriptor v d nh ca server WebLogic nh sau: <stateful-session-cache> <max-beans-in-cache>1000</max-beans-in-cache> </stateful-session-cache> Trong v d trn, cc client ng thi yu cu cc dch v ca bean, WebLogic s to nhng th hin mi ca bean phc v cc client . Nhng khi client th 1001 c yu cu n bean, th server s phi passivate mt s bean ly ch cn to cc bean mi. Ch : Passivation v Activation ch p dng cho cc stateful session bean ch khng p dng cho cc stateless session bean. Cc phng thc ca session bean Phng thc setSessionContext (SessionContext) Mc ch EJB container gi phng thc ny ci t session context thch hp Nhng vic ta cn lm Ta lu tr mt tham chiu ti session context trong mt bin th hin (instance variable), nu nh ta cn truy vn n n sau. Bin ny dng truy cp n session
78 Nguyn Qung i
context ang chy nh l vic xc nh ngi gi (caller), truy cp hoc thay i trng thi transaction hin thi, ... ejbCreate<method>(...) Container s gi phng thc ny ta c th khi to th hin session bean. Ta khi to session bean y. Mi lp stateful sessionbean phi c t nht mt phng thc ejbCreate<method>() v nu nh c nhiu phng thc ny, th mi phng thc phi c cc tham s khc nhau. Mt stateless session bean c th ch c mt phng thc ejbCreate v khng c tham s truyn vo. Ta vit cc business logic trong cc phng thc ny
Business
Cc component interface ca session bean nh ngha cc phng thc m client c th gi. Container s y nhim ti phng thc tng ng c trin khai (implement) trong lp session bean. Phng thc ny c gi khi th hin (instance) c kch hot t trng thi th ng ca n
ejbActive()
i vi stateful session bean, m cc ti nguyn cn dng n nh cc socket, cc kt ni JDBC, i vi staless session bean, cc phng thc ny l rng bi v container khng bao gi kch hot mt th hin stateless session bean i vi stateful session bean, ng cc ti nguyn vo, nh cc socket, cc kt ni JDBC, i vi staless session bean, cc phng thc ny l rng bi v container khng bao gi passivate mt th hin stateless session bean ng cc ti nguyn v gn cc trng l null. V d ng li cc socket, cc kt ni JDBC,
79
ejbPassivate()
ejbRemove()
Container gi phng thc ny trc khi n hy mt i tng session. Vic ny xy ra khi client gi
Nguyn Qung i
phng thc remove(), hoc l khi container quyt nh kt thc i tng session sau mt thi gian timeout Vng i ca cc session bean Vng i ca stateful v stateless l khc nhau, sau y ta s tm hiu ln lt vng i ca tng loi session bean. Stateless session bean
Sau y l cc bc miu t vng i ca mt th hin stateful session bean: Vng i ca n bt u t lc container quyt nh khi to mt th hin (instance). Quyt nh ny ph thuc vo chnh sch lu tr (caching policy) v yu cu ca client. V d nh client yu cu cng nhiu th container s khi to cng nhiu bean. Container cho php ta ch nh caching policy trong file vendor deployment descriptor c th. Container khi to bean bng cch s dng phng thc newInstance() , sau n s gi phng thc setSessionContext() v phng thc ejbCreate(). Container cng ci t transaction context v cc thuc tnh security (nh c ci t trong deployment descriptor). By gi bean sn sng phc v client no . Container gi mt phng thc trn th hin ny, da vo li gi ca client. Ch rng container c th s dng cng mt th hin phc v nhiu client. Container quyt nh hy b th hin bean ny. L do l bi container mun gim s lng cc th hin trong khu vc method-use pool. Ci ny ph thuc vo chnh sch lu tr (caching policy) v yu cu c gim. Container gi phng thc ejbRemove() ca th hin ny Stateful session bean
80 Nguyn Qung i
Sau y l cc bc miu t vng i ca mt th hin (instance) stateful session bean: Vng i ca th hin bt u t khi mt client gi phng thc create<method>() trn home interface ca session bean. Container khi to mt bean mi bng cch s dng newInstance(), sau n s gi phng thc setSessionContext(), ri n phng thc ejbCreate<method>() Th hin ny by gi sn sng phc v cc phng thc business ca client trn. Container quyt nh ui th hin ca ta khi b nh. Quyt nh ny ph thuc vo caching policy v yu cu gim. Container gi phng thc ejbPassivate() trn th hin ny v chuyn i n ra ngoi ni lu tr th hai. Nu client yu cu mt i tng m th hin ca n ang b passivate th container s kch hot n, hon tr li trng thi ca th hin t ni lu tr th hai. Khi client gi phng thc remove trn cc home hoc component interface hy i tng session, th container s gi ejbRemove() trn th hin bean ny. N s kt thc cuc sng ca th hin bean. Ch rng container c th gi phng thc ejbRemove() m khng cn phi client yu cu hy i tng session sau mt thi gian sng m i tng EJB t c. Ch : Ta khng th da vo container gi phng thc ejbRemove(). Container c th s khng gi ejbRemove() trong nhng trng hp sau: Client khng hot ng trong mt thi gian timout ri (lc ny ng l ra container s t ng gi phng thc ejbRemove hy b th hin ang phc v client ny) nhng th hin (instance) ang trong trng thi b pasviate. Container b shutdown hoc crash. Mt ngoi l h thng (system exception) xy ra trong khi gi phng thc ca th hin. Nu th hin (instance) gii phng cc ti nguyn trong phng thc ejbRemove(), th cc ti nguyn ny khng c gii phng trong nhng trong nhng trng hp trn.
81 Nguyn Qung i
Ta nn s dng mt s k thut dn dp mt cch nh k nhng ti nguyn khng c gii phng. V d nu cc thnh phn ca mt shopping cart c trin khai nh mt session bean, v session bean lu tr tm thi ni dung ca shopping cart vo trong mt database, ng dng ny nn s dng mt chng trnh chy mt cch nh k v hy b cc shopping cart tm thi t database . Ngoi ra, ta cng cn ch mt iu, kiu stateless n gin v nh hn so vi kiu stateful, c ngha l n d pht trin v cng yu cu t ti nguyn hn so vi kiu stateful. Hiu qu thc thi ca stateless cng cao hn, do vy ta nn chn kiu stateless nu nh c th thay v chn kiu stateful. Client cng nn thc hin phng thc remove() mt cch r rng. Nu khng container s gi th hin stateful cho n khi cho n lc timeout. iu ny gy ra vic lng ph ti nguyn nh b nh, secondary storage, ... Client nn sn sng to li (re-create) mt i tng session mi nu nh n lm mt i tng ny trong khi n ang s dng. Client c th lm mt session bean bi v container c th s kt thc vng i ca th hin session bean sau khi timeout, hoc l EJB container b shutdown hoc crash. Cc stateless session bean l cc component l tng cho vic clustering bi v chng khng bo qun trng thi. iu ny cung cp tnh sn dng cao cho cc ng dng c thit k vi cc stateless session bean. Cc stateful session bean cng c th c hp li (cluster) nhng phi vt v hn v thit k cn thn hn.
82 Nguyn Qung i
Thi gian sng ca n ging nh d liu trong c s d liu. D liu ca cc entity bean sng qua c mt crash ca EJB container. Chp nhn cha s truy cp bi nhiu user. N c primary key, primary key xc nh mt entity bean. V d, mt student entity bean c l s c c xc nh bi mt student ID. Cng nh cc bng trong quan h c s d liu, mt entity bean c th c quan h vi mt entity bean khc.
Ta s i su vo tng loi sau. Khi no s dng BMP hay CMP S dng BMP khi: Khi ta mun hon ton iu khin vic qun l persistence, nh l vit cc cu truy vn ti u. Khi ta vit mt persistence logic n mt h thng c s d liu k tha c ch quyn (proprietary legacy database system) cho nhng cng c container khng tn ti Khi ni lu tr lu di ca ta khng phi l database, ta c l s chuyn i mt ng dng tn ti bng cch s dng mt entity bean. S dng CMP: Vi CMP, container s chu trch nhim vic sinh code truy cp d liu. N lm n gin ha nhim v vit cc entity bean. Code ca CMP khng b dnh cht vo mt ni lu tr c th no. Bi tnh linh ng ny, ta c th trin khai li cng mt entity bean ging nhau trn cc server J2EE khc nhau m s dng c s d liu khc nhau, ta s khng cn thay i hay bin dch li code ca bean. CMP c th mang theo (portable) hn BMP. Ch : Ta nn s dng CMP thay v BMP ngay khi c th v CMP d pht trin hn v c tnh portable hn so vi BMP.
83 Nguyn Qung i
Instance Pool v Instance Cache Ging nh cc stateless session bean, EJB container cng duy tr mt instance pool ca mi loi entity bean. iu ny tit kim c thi gian to v hy cc i tng. Lc u, container s to cc th hin nh c ch nh trong file deployment descriptor ca entity bean. Khi mt th hin (instance) ang trong available pool, th hin s khng c kt hp vi mt i tng entity bean c th no c. Tt c cc th hin trong pool u c xem l nh nhau. Container c th gn mt th hin ti mt i tng entity no . Ta c th iu khin kch thc ca instance pool trong file vendor deployment descriptor c th no . V d nh i vi server WebLogic, ta s ch nh kch c trong file weblogic-ejbjar.xml nh sau: <pool> <max-beans-in-free-pool>100</max-beans-in-free-pool> <initial-beans-in-free-pool>50</initial-beans-in-free-pool> </pool> Tng t nh vy, i vi server Jboss ta s ch nh n trong file jboss.xml nh sau: <instance-pool>org.jboss.ejb.plugins.EntityInstancePool</instance-pool> <container-pool-conf> <MaximumSize>100</MaximumSize> <MinimumSize>10</MinimumSize> </container-pool-conf> Ging nh cc stateful session bean, EJB container c th c mt instance cache qun l qun l tt c cc th hin entity bean kt hp vi mt thc th xc nh (identity) no ri. Trong nhng ng dng ln, s lng client kt ni ti website ng thi c th l rt ln. Vic ny lm nh hng khng tt n qu trnh thc thi cng vic khi cc ti nguyn b s dng tng ln. Passvation v Activation l cc k thut EJB container c th qun l cc ti nguyn c gi tr nh b nh, lm gim s lng cc th hin (instance) cn thit cho vic phc v tt c cc client. Passivation l k thut EJB container lu tr trng thi ca bean vo database. Container s bt u passivation ngay khi s lng cc entity bean c ch nh t n mt ngng no y. EJB container cung cp cho ngi lp trnh phng thc callback ejbPassivate() gii phng cc ti nguyn c ch nh. Activation th ngc li, n hon tr li trng thi ca bean t database. EJB container kch hot mt th hin b th ng ha khi client ca bean cn s dng n n. EJB container cung cp cho ngi lp trnh phng thc callback ejbActivate() hon tr li tt c cc kt ni v cc ti nguyn khc. V d ch nh kch thc ca instance cache trong file weblogic-ejb-jar.xml ta lm nh sau: <entity-cache> <max-beans-in-cache>1000</max-beans-in-cache> </entity-cache> Tng t ch nh trong file jboss.xml ta lm nh sau: <instance-cache>
84 Nguyn Qung i
<container-cache-conf> <cache-policy> <cache-policy-conf> <min-capacity>5</min-capacity> <max-capacity>10</max-capacity> </cache-policy-conf> </cache-policy> </container-cache-conf> </instance-cache> Ch : Instance pooling c s dng qun l cc th hin EJB cha kt hp vi mt thc th i tng xc nh no. Instance caching s dng qun l cc th hin EJB c kt hp vi mt thc th i tng xc nh no . Instance pooling p dng cho cc stateless session, entity, v message-driven bean. Cn instance caching p dng cho cc stateful v entity bean. Cc file ca Entity bean Ging nh cc enterprise bean khc, mt entity bean gm cc home interface, component interface, enterprise bean class, v file deployment descriptor. Ngoi ra, entity bean c thm mt lp kha chnh (primary key class). Trong hu ht cc trng hp th lp primary key ca chng ta l String hay Interger, thuc th vin chun ca J2SE. V d lp kha chnh ca StudentEJJB l studentId, l kiu String. Nhng trong mt s cc entity bean, ta phi nh ngha mt lp kha chnh ring. V d, nu lp kha chnh ca ta kt hp nhiu trng vo vi nhau, ta phi nh ngha mt lp kha chnh (primary key class) ring. Cc phng thc ca Entity bean Phng thc setEntityContext (EntityContext) Mc ch EJB container gi phng thc ny ci t entity context c lin kt Nhng g ta cn lm Lu tr tham chiu ti i tng entity context vo trong mt bin th hin (instance variable), nu nh ta cn s dng n sau. Ta cng ch nh nhng ti nguyn cn thit cho vng i ca th hin Gii phng nhng ti nguyn c gi bi th hin Mi lp entity c th khng c hoc c nhiu phng thc ejbCreate<method>(). V ng nhin trong trng hp c nhiu phng thc ny th mi phng thc phi c cc tham s u vo
85 Nguyn Qung i
unsetEntityContext( )
Container gi phng thc ny trc khi kt thc vng i ca th hin EJB container gi n phng thc ejbCreate<method>() khi client gi mt phng thc create<method> trn home interface
ejbCreate<method>()
khc nhau. i vi BMP, xc nhn cc tham s c client cung cp v chn (insert) mt record vo trong database. Phng thc ny cng khi to cc bin ca th hin. i vi CMP, xc nhn tham s c client cung cp vo v khi to trng thi ca bean. ejbPostCreate<method>() Container s gi phng thc ny ngay sau phng thc ejbCreate<method>() vi cng cc tham s truyn vo ging nhau. Mi phng thc ejbCreate<method>(), ta phi c mt phng thc ejbPostCreate<method>() khp vi n. Phng thc ny cho php ta hon thnh nt nhng khi to cn li ca cc th hin entity bean. Ginh ly nhng ti nguyn cn thit phc v mt client c bit. V d m cc kt ni socket.
ejbActivate( )
EJB container gi phng thc ny khi n chn mt th hin entity bean t instance pool v kt hp n vo mt thc th i tng entity c th no EJB container gi phng thc ny khi n quyt nh hy kt hp gia th hin v thc th i tng entity bean v a n v khu vc instance pool Phng thc ny gm nhng business logic m ta mun gi gn trong entity bean EJB container gi phng thc ny ng b ha trng thi ca n vi c s d liu nm bn di. N cp nht trng thi ca bean vi c s d liu nm bn di
ejbPassivate( )
Business
ejbLoad( )
Trong trng hp BMP, ta phi refresh cc bin th hin (instance variables) bng cch c t c s d liu. V cng phi tnh ton li cc gi tr ph thuc. Trong trng hp ca CMP, ta phi tnh ton li gi tr ca cc bin th hin ph thuc vo cc trng persistent, v d nh cc
86
Nguyn Qung i
trng transient ejbStore( ) EJB container gi phng thc ny khi mun ng b ha th hin vi c s d liu bn di. N s np trng thi ca bean vo trong c s d liu nm bn di. Gip client xc nh cc entity bean Trong trng hp ca BMP, ghi nhng cp nht no lu tr trong bin th hin vo c s d liu Trong trng hp ca CMP chun b cc trng c container qun l c ghi vo c s d liu
ejbFind<method>()
ejbHome<method>()
Trong BMP, mi mt phng thc tm kim c nh ngha trong home interface, ta phi trin khai mt phng thc tng ng bt u vi tin t ejbFind Vi CMP, ta khng vit cc phng thc ejbFind trong lp entity bean Cc phng thc home cha Trin khai business logic cc business logic m khng bng cch s dng cc ch nh ti mt th hin phng thc khc hoc code bean no. JDBC. Container gi phng thc ny khi client gi phng thc phng thc remove Trong BMP, ta phi hy b trng thi entity t c s d liu, tr li cc ti nguyn ta ly phc v cho client tng ng. Trong CMP, tr li ti nguyn m ta ly phc v client.
ejbRemove( )
87 Nguyn Qung i
Ban u th hin bean cha tn ti. Vng i ca mt th hin ca lp entity bean bt u khi container to ra mt th hin bng cch s dng phng thc Class.newInstance( ), ri sau gi phng thc setEntityContext. By gi th hin va c to ra c a vo trong khu vc pool. Mt th hin vn ang trong trng thi pool th cha c kt hp vi mt thc th i tng entity bean c th no c. Tt c cc th hin trong trng thi pool c coi l nh nhau. Container s s dng cc th hin ny thc thi phng thc tm kim hoc to no y, khi n s c gn ti mt thc th i tng entity bean no y. Lc ny th hin ang xt s chuyn t trng thi pool sang trng thi sn phc v cho mt client c th. C hai con ng chuyn t trng thi pool sang trng thi sn sng. Th nht l container gi phng thc ejbCreate, hoc tm kim. Th hai l container gi phng thc ejbActivate( ). Khi th hin trng thi sn sng, container c th gi cc phng thc business trn cc th hin. EJB container cng ng b ha trng thi ca th hin vi c s d liu bng cch s dng phng thc ejbLoad v ejbStore. Thc t, EJB container cng s chuyn th hin ny t trng thi sn sng sang trang thi pool. iu ny xy ra khi client gi phng thc remove, dn n vic container gi phng thc ejbRemove. Hoc trong mt trng hp khc l container gi phng thc ejbPassivate. kt thc vng i ca mt th hin, container hy th hin t khu vc instance pool bng cch gi phng thc unsetEntityContext. Ch : Trong BMP, khi container chuyn mt th hin t trng thi pool sang trng thi sn sng, n khng t ng t kha chnh. Do vy cc phng thc ejbCreate v ejbActivate phi t kha chnh (primary key). Trc khi gii thiu bn EJB 2.0, cc lp trnh vin thng s dng BMP hn CMP bi v EJB trc khng h tr cc thnh phn quan trng nh cc quan h (relationships), EJB Query Language. Nhng EJB 2.0 c CMP c h tr tt hn cng nh ci tin vic thc thi.
88 Nguyn Qung i
Mt trong nhng k thut ci tin vic thc thi ca CMP trong EJB 2.0 l container c th gim st d liu ca mt bean ( trong b nh m) thay i. Nu c thay i no xy ra trong d liu , th container s cp nht c s d liu. Bi v kh nng quan st ny m CMP thc thi tt hn BMP. Mt k thut m s thc thi c gii hn khc (performance-limiting technique) l khi ta gi mt phng thc finder trong BMP. Ban u n nhn kha chnh (primary key) vi li gi u tin ti c s d liu, v ri sau nhn d liu ca th hin (instance data) bng cch t mt li gi th hai ti c s d liu n to ra hai li gi n c s d liu. Nhng i vi cc phng thc finder, CMP ly d liu vi ch mt li gi ti c s d liu. Do CMP a ra cc k thut thi hnh tt hn BMP. (on ny khng hiu lm)
89 Nguyn Qung i
Khi MDB trong trng thi khng tn ti, th th hin (instance) ca n khng c trong b nh ca h thng. Hay ni cch khc n vn cha c khi to. Th hin MDB c khi to khi container cn n chng. Khi ln u EJB c bt ln, container s to ra mt s th hin MDB v a chng vo khu vc method-ready pool. Khi s lng cc th hin MDB iu khin cc tin nhn (message) n khng , n c th to thm v a cc th hin vo khu vc pool. Cc th hin ri b khu vc pool tr v trng thi khng tn ti khi server khng cn cn chng na. iu ny xy ra khi server mun gim s lng cc th hin c trong khu vc pool.
6.9Deployment descriptors
Tt c cc file ny u c t trong th mc META-INF
EJBs for ... application. </description> <enterprise-beans> <--C mt hoc nhiu tag session,entity,hoc message-driven <session> <!-- No relation to the EJB's JNDI name --> <ejb-name>EmployeeService</ejb-name> <home>com.wombat.empl.EmployeeServiceHome</home> <remote>com.wombat.empl.EmployeeService</remote> <ejb-class>com.wombat.empl.EmployeeServiceBean</ejb-class> <!-- Stateful|Stateless --> <session-type>Stateful</session-type> <!Ai qun l cc transaction? Container|Bean --> <transaction-type>Bean</transaction-type> -->
<!Cc tag ty chn : env-entry*, ejb-ref*, security-role-ref*, resource-ref* --> <description> Session between client and server </description> <-- Truy cp trong code bng JNDI lookup("java:/comp/env/envvar1") --> <env-entry> <env-entry-name>envvar1</env-entry-name> <!-java.lang.Boolean|String|Integer|Double|Byte|Short|Long|Float --> <env-entry-type>String</env-entry-type> <env-entry-value>some value</env-entry-value> <description>This env entry is for ... </description> </env-entry> <!-- OPTIONAL, nh x ti home ca mt EJB khc --> <ejb-ref> <!-- Tn gi mo tham chiu n n trong ti liu ny Nn t tin t ejb --> <ejb-ref-name>ejb/EmplRecords</ejb-ref-name> <!-- Entity|Session --> <ejb-ref-type>Entity</ejb-ref-type> <home>com.wombat.empl.EmployeeRecordHome</home> <remote>com.wombat.empl.EmployeeRecord</remote> <!-- OPTIONAL, link to an EJB name in a JAR file --> <ejb-link>EmployeeRecord</ejb-link> </ejb-ref> <ejb-ref> <ejb-ref-name>ejb/PensionPlan</ejb-ref-name> <ejb-ref-type>Session</ejb-ref-type> <home>com.wombat.empl.PensionPlanHome</home> <remote>com.wombat.empl.PensionPlan</remote> </ejb-ref> <!-- OPTIONAL, Refer to an EXTERNAL resource --> <resource-ref> <!-- JNDI name --> <res-ref-name>jdbc/EmployeeAppDB</res-ref-name> <!-- Object type expected back from JNDI lookup --> <res-type>javax.sql.DataSource</res-type> <!-- Application|Container authorized, (whether you code sign-on in EJB, or 91 Nguyn Qung i
the deployer describes the sign-on in XML --> <res-auth>Container</res-auth> <!-- OPTIONAL --> <description> Reference to a JDBC database EmployeeService </description> </resource-ref> </session> <entity> <!-- cmp-field*, primkey-field?, env-entry*, ejb-ref*, security-role-ref*, resource-ref* --> <description> Blah blah blah ... </description> <ejb-name>EmployeeRecord</ejb-name> <home>com.wombat.empl.EmployeeRecordHome</home> <remote>com.wombat.empl.EmployeeRecord</remote> <ejb-class>com.wombat.empl.EmployeeRecordBean</ejb-class> <!-- Bean|Container --> <persistence-type>Container</persistence-type> <!-- use java.lang.Object as a catch-all type, but usually java.lang.String --> <prim-key-class>com.wombat.empl.EmployeeID</prim-key-class> <!-- OPTIONAL. For CMP and single-field primary keys only. ONE of the cmp-fields. --> <primkey-field>lastName</primkey-field> <!-- True|False --> <reentrant>True</reentrant> <!-- Only if CMP! --> <cmp-field> <!-- can be a superclass of the actual field --> <field-name>employeeID</field-name> </cmp-field> <cmp-field><field-name>firstName</field-name></cmp-field> <cmp-field><field-name>lastName</field-name></cmp-field> </entity> <entity> <description> CMP to pauroll database </description> <ejb-name>AardvarkPayroll</ejb-name> <home>com.aardvark.payroll.PayrollHome</home> <remote>com.aardvark.payroll.Payroll</remote> <ejb-class>com.aardvark.payroll.PayrollBean</ejb-class> <persistence-type>Bean</persistence-type> <prim-key-class>com.aardvark.payroll.Accoun-tID</prim-key-class> <reentrant>False</reentrant> <security-role-ref> <role-name>payroll-org</role-name> <role-link>payroll-department</role-link> </security-role-ref> </entity> </enterprise-beans> 92 Nguyn Qung i
<!-- OPTIONAL --> <assembly-descriptor> <-- Khu vc khai bo qun l security --> <!-- OPTIONAL, nh ngha cc vai tr, c th c nhiu --> <security-role> <description> Employee is allowed to ... </description> <role-name>employee</role-name> </security-role> <security-role> <description> HR is allowed to ... </description> <role-name>hr-department</role-name> </security-role> <security-role> <description> IT is allowed to ... </description> <role-name>admin</role-name> </security-role> <!-- OPTIONAL. Can be many --> <method-permission> <!-- Define role name in "security-role" --> <!-- Must be one or more --> <role-name>employee</role-name> <!-- Must be one or more --> <method> <ejb-name>EmployeeService</ejb-name> <!-- * = all methods --> <method-name>*</method-name> </method> </method-permission> <method-permission> <role-name>employee</role-name> <method> <ejb-name>EmployeeRecord</ejb-name> <!-- Optional, to pick the correct method if in both "Home" and "Remote" --> <method-intf>Remote</method-intf> <!-- If no method-params, refers to all overloadeded methods --> <method-name>getDetail</method-name> <!-- Optional, used to pick among overloaded methods --> <method-params> <method-param>java.lang.String</method-param> <method-param>int[]</method-param> <method-param>yourPkg.YourClass</method-param> <method-params> </method> <method> <ejb-name>EmployeeRecord</ejb-name> <method-name>updateDetail</method-name> <!-- To specify no-argument method --> 93 Nguyn Qung i
<method-param></method-param> </method> <method> <ejb-name>EmployeeRecord</ejb-name> <method-name>findByPrimaryKey</method-name> </method> </method-permission> <!-- OPTIONAL, can be many. How the container is to manage transactions when calling an EJB's business methods --> <container-transaction> <!-- Can specify many methods at once here --> <method> <ejb-name>EmployeeRecord</ejb-name> <method-name>*</method-name> </method> <!-- NotSupported|Supports|Required|RequiresNew|Mandatory|Never --> <trans-attribute>Required</trans-attribute> </container-transaction> <container-transaction> <method> <ejb-name>AardvarkPayroll</ejb-name> <method-name>*</method-name> </method> <trans-attribute>Required</trans-attribute> </container-transaction> </assembly-descriptor> <!-- OPTIONAL, this file contains classes needed by clients. Deployer to make it accessible to the client class-loader --> <!-<ejb-client-jar> this_ejb_client.jar </ejb-client-jar> --> </ejb-jar>
Ni dung ca file bt u vi tag <ejb-jar> C 3 thnh phn con chnh nm trong <ejb-jar> l: <enterprise-bean>: cha thng tin miu t v cc thnh phn EJB trong mt ng dng EJB. Khi mt entity bean cn tham chiu n cc ti nguyn ngoi (external resource), cc ti nguyn h thng (system resource), v cc entity bean khc, th nhng ti nguyn ny s c miu t trong khu vc (section) ny. <relationships>: tag ny miu t cc quan h gia cc entity bean s dng CMR c h tr t phin bn EJB 2.0. <assembly-descriptor>: tag ny miu t mt s thng tin lp rp (assembly information) cho ng dng EJB. Hai nhim v chnh l m t cc giao dch v security. By gi ta xem xt ln lt tng thnh phn trong 3 thnh phn ni trn. enterprise-bean
94 Nguyn Qung i
Ngoi tr trng hp ca message-driven bean th mt EJB component phi c t nht mt trong hai giao din l remote hoc local (i vi c Component interface v Home interface). Hoc l c c hai loi giao din . Cc interface ny phi c khai bo vi tn y (c c tn ca pakage) trong nhng tag tng ng l: <remote>, <local>, <home>, <local-home>. <transaction-type>: tag ny quyt nh xem dch v transaction ca bean c qun l bi Bean (BMT) hay bi Container (CMT). <description>: tag ny l khng bt buc, n miu t mc ch ca thnh phn EJB Mt bean c th truy cp vo cc bin mi trng (environment entities) vi on code nh sau:
InitialContext ictx = new InitialContext(); Context myenv = ictx.lookup("java:comp/env"); Integer min = (Integer) myenv.lookup("minvalue"); Integer max = (Integer) myenv.lookup("maxvalue");
c th s dng on code trn tham chiu n bin mi trng th ta cn khai bo on sau trng tag <env-entry>.
<env-entry> <env-entry-name>minvalue</env-entry-name> <env-entry-type>java.lang.Integer</env-entry-type> <env-entry-value>12</env-entry-value> </env-entry> <env-entry> <env-entry-name>maxvalue</env-entry-name> <env-entry-type>java.lang.Integer</env-entry-type> <env-entry-value>120</env-entry-value> </env-entry>
Ngoi ra, vic tham chiu n ti nguyn l mt v d khc ca bin mi trng. Vi nhng bin nh th ny, ta s s dng: java:comp/env/jdbc tham chiu n cc i tng Datasource java:comp/env/jms tham chiu n cc JMS connection factory Cn khai bo trong tag <resource-ref> nh sau:
<resource-ref> <res-ref-name>jdbc/AccountExplDs</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref>
relationships Thnh phn ny khai bo cc quan h c container qun l (CMR), nu s dng BMP th s khng phi khai bo thnh phn ny. Gi s ta c quan h nh hnh v bn di.
95 Nguyn Qung i
C th tham kho thm mc Container-Managed Relationship ca CMP bn di. assembly-descriptor Thnh phn ny dng nh ngha nhng hnh vi ca container trong vic qun l cc transaction v security. Vi transaction ta c cc tag ph bin nh sau:
<!Tag ny l ty , c th c nhiu tag ny, container s da vo y quyt nh qun l cc transaction th no --> <container-transaction> <!-- C th ch nh nhiu phng thc y --> <method> <ejb-name>EmployeeRecord</ejb-name> <method-name>*</method-name> </method> <!-- NotSupported|Supports|Required|RequiresNew|Mandatory|Never --> <trans-attribute>Required</trans-attribute> 96 Nguyn Qung i
</container-transaction>
Tham kho thm cc mc v transaction bn di. Ngoi ra cn c cc thnh phn cu hnh vic qun l security, tham kho cc mc lin quan v security bn di.
<!--Khai bao Message-driven bean --> <message-driven> <ejb-name>OrderVerifierMDB</ejb-name> <!-- Khai bo tn JNDI ca topic hoc queue m MDB s dng,tn ny phi c JMS service ng k vi JDNI service t trc ri --> <destination-jndi-name>topic/OrderVerifierTopic</destination-jndi-name> </message-driven> </enterprise-beans> </jboss>
97 Nguyn Qung i
</ejb-relationship-role-name> <!-- Khai bo cc trng ca entity ny c trong entity cn li ca quan h ang xt, nh trong trng hp ny OrderEJB c trng ordeId l mt trng ca LineItemEJB --> <key-fields> <key-field> <field-name>orderId</field-name> <column-name>order_id</column-name> </key-field> </key-fields> </ejb-relationship-role> <ejb-relationship-role> <ejb-relationship-role-name> lineItem-belongsto-Order </ejb-relationship-role-name> <!-- LineItemEJB khng c trng no cng nm trong OrderEJB --> <key-fields/> </ejb-relationship-role> </ejb-relation> </relationships> </jbosscmp-jdbc>
6.10
RMI/IIOP
Java Remote Method Invocation (JRMI) over CORBAs Internet Inter-Orb Protocol (IIOP) kt hp nhng thnh phn tt nht ca cng ngh Java RMI vi nhng thnh phn tt nht ca cng ngh CORBA. Kin trc EJB ly (adopt) RMI/IIOP lm giao thc giao tip chun ca n. Ta s bn lun qua v RMI v CORBAs IIOP v cc li ch ca chng. iu ny gip hiu hn v cc remote v local interface. Trong m hnh i tng phn tn Java, mt i tng iu kin t xa (remote object) l mt i tng m cc phng thc ca n c th gi t mt my o JVM khc, c kh nng trn cc host khc. Mt i tng kiu ny c miu t bng mt hoc nhiu remote interface, chng chnh l cc java interface khai bo cc phng thc ca remote object. Mt remote interface phi t nht k tha (extend) trc tip hoc gin tip interface java.rmi.Remote. Remote method invocation l hnh ng ca vic gi mt phng thc ca remote interface trn remote object. RMI s dng mt k thut chun giao tip vi cc i tng remote: l stubs v skeletons. Stub hot ng nh mt proxy hoc mt i din a phng (local representative or proxy) bn pha client cho remote object. Ngi gi gi n mt phng thc trn local stub, n s chu trch nhim tin hnh li gi phng thc trn remote object. Khi phng thc ca stub c gi, n s lm nh sau: Khi to mt kt ni (connection) vi remote JVM cha remote object. Marshal (vit v truyn) cc tham s ti my o t xa (remote JVM). i kt qu ca li gi phng thc. Unmarshal (c) kt qu tr v hoc ngoi l c tr v. Tr li kt qu cho ngi gi Stub n i vic tun t ha cc tham s v truyn ti mc mng (network-level communication) a ra cho ngi dng mt li triu gi n gin (simple invocation). Trong my o t xa (remote JVM), mi remote object phi c mt skeleton tng ng. Skeleton chu trch nhim gi li gi t pha client ti i tng t xa (remote object) thc s thc thi. Khi mt skeleton nhn mt li gi n, n s lm nh sau: Unmarshal (c) cc tham s cho phng thc t xa (remote method). Gi phng thc ny trn i tng (remote object) thc s
99 Nguyn Qung i
Marshal (vit vo truyn) kt qu (gi tr hoc ngoi l) ti ngi gi phng thc. RMI cung cp s trong sut v v tr (localtion). Client khng cn quan tm n v tr ca i tng t xa (remote object). T bi cnh ca client, s khng c s khc bit khi i tng t xa nm trn cng mt JVM vi client, hoc nm trn mt JVM khc vi client nhng hai JVM ny vn nm trn cng mt my, hoc nm trn hai JVM khc nhau v hai JVM ny nm trn hai my khc nhau. CORBA (Common Object Request Broker Architecture) l mt chun (industrydeveloped standard) cho giao tip gia cc i tng. N c mt giao thc giao tip lin i tng, c gi l Internet inter-orb protocol. u im chnh ca CORBA l n c th hot ng thng qua cc platform, cc ngn ng, v cc nh cung cp. EJB ly JRMI over RMI/IIOP lm giao thc giao tip chun. iu ny tng ti a tnh linh ng nh l trong sut v v tr (location transparency) v tnh tng tc (interoperability kh nng phn mm v phn cng c t trn nhiu my khc nhau, t nhiu nh cung cp khc nhau c th giao tip vi nhau). Cc giao thc khc cng c chp nhn, nhng IIOP l giao thc c yu cu s thc thi EJB tng tc c vi cc thnh phn khc.
- Remote interface nh ngha tt c cc business method ca EJB, khng cha cc tc v cp h thng (persistence, security, transaction, ). Cc business method ny s c ci t trong lp implements.
2.To home interface - Home interface hot ng nh mt factory, nh ngha cc phng thc cho php client to v tm cc i tng EJB.
import cc giao din: java.io.Serializable, java.rmi.RemoteException, javax.ejb.CreateException v javax.ejb.EJBHome. Phi tha k interface javax.ejb.EJBHome. C phng thc create() throws cc exception: RemoteException v CreateException (C th c cc exception khc ca lp trnh vin) v tr v mt i tng c kiu remote interface.
package calc; import java.rmi.RemoteException; import javax.ejb.CreateException; import javax.ejb.EJBHome; public interface CalcHome extends EJBHome{ CalcRemote create()throws RemoteException,CreateException; }
Tt c cc business method khai bo trong remote interface. Cc phng thc dng cho container (phng thc callback).
- Lp EJB cn phi:
public class CalcBean implements SessionBean { private SessionContext context; public void setSessionContext(SessionContext aContext) { context = aContext; } public void ejbActivate() {} public void ejbPassivate() {} public void ejbRemove() {} public void ejbCreate() {} public double DoCalculate(double a, double b, char operator){ double x = 0; switch (operator) { case '+': x = a + b; break; case '-': x = a - b; break; case '*': x = a * b; break; case '/': if (b == 0) { System.out.println("L?i chia cho zero"); b=1000000000; } x = a / b; break; } return x; } }
4. To client truy xut Stateless Session Bean M hnh lm vic tng qut:
a) nh v home interface - Client phi dng JNDI thng qua Naming Service nh v mt i tng home c th. - Thit lp thuc tnh mi trng (Initial Context Factory to initial context vi cu trc th mc JNDI dng, v tr server cung cp dch v Naming, ).
java.uitl.Properties props = System.getProperties(); props.put( Context.INITIAL_CONTEXT_FACTORY, org.jnp.interfaces.NamingContextFactory ); props.put( Context.PROVIDER_URL, 127.0.0.1:1099 ); props.put( Context.URL_PKG_PREFIXES, org.jboss.naming );
b) Tm i tng thng qua JNDI - Sau khi to JNDI context, phng thc lookup() ca i tng lp InitialContext c s dng nh v i tng c tn JNDI ch nh trong tp tin jboss.xml.
Object obj = ctx.lookup( calc/Calculator );
c) Thu hp (narrow) tham chiu thnh mt i tng - i tng tr v bi phng thc lookup() phi c p thnh kiu home interface. i tng ny gi mt tham chiu n home interface. iu ny c thc hin bi phng thc PortableRemoteObject.narrow(), c hai tham s: i tng do lookup() tr v v tn file class ca
104 Nguyn Qung i
home interface. Lp PortableRemoteObject c dng thay cho lp UnicastRemoteObject trong RMI bo m tnh tng thch vi cc giao thc khc JRMP, v d RMI/IIOP.
CalcHome home = (CalcHome)PortableRemoteObject.narrow(obj,CalcHome.class);
d) Sinh ra mt thc th EJB - EJB s triu gi phng thc create() ca i tng home tr v i tng EJB (i tng remote interface).
CalcRemote calc = home.create();
e) Triu gi cc business method (phng thc nghip v) - Remote interface nh ngha cc phng thc nghip v thc hin trong lp EJB, client s triu gi cc phng thc ny thng qua i tng EJB va c phng thc create() tr v.
double r=calc.DoCalculate(6,7,+');
public class client{ public static void main(String[]agrs){ try { Properties props = System.getProperties();
props.put( Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFact ory" ); props.put( Context.PROVIDER_URL, "127.0.0.1:1099" ); props.put( Context.URL_PKG_PREFIXES, "org.jboss.naming" ); Context ctx = new InitialContext(); CalcHome obj = (CalcHome) ctx.lookup( "calc/Calculator" ); CalcHome home = (CalcHome) PortableRemoteObject.narrow(obj,CalcHome.class); CalcRemote calc = home.create(); double r = calc.DoCalculate(20,7,'+'); System.out.println("====================="); System.out.println(r); System.out.println("====================="); }catch(Exception ex){ ex.printStackTrace(); } } }
- Cn c gi sau trong trong CLASSPATH, hoc tham chiu n gi ny trong IDE c th.(cc gi ny u nm trong th mc client ca th mc ci t Jboss)
1. Bin dch cc file java: Trong command-line, g: javac *.java Ch : m bo vic bin dch khng xy ra li no. 2. To th mc calc, copy cc file class mi bin c vo y:
c. To File MANIFEST.MF Manifest-Version: 1.0 Created-By: 1.6.0 (Sun Microsystems Inc.) 4. ng gi ng dng EJB Dng tool jar c cung cp sn ca jdk ng gi ng dng jar cvf calculator.jar calc/*.class META-INF/*.xml E:\__EJB>jar cvf calculator.jar calc/*.class META-INF/*.xml added manifest adding: calc/CalcBean.class(in = 989) (out= 570)(deflated 42%) adding: calc/CalcHome.class(in = 252) (out= 184)(deflated 26%) adding: calc/CalcRemote.class(in = 217) (out= 169)(deflated 22 adding: META-INF/ejb-jar.xml(in = 580) (out= 293)(deflated 49% adding: META-INF/jboss.xml(in = 223) (out= 135)(deflated 39%) Ta c th dng winrar xem ni dung gi calculator.jar c cu trc nh sau: calc CalcBean.class CalcHome.class CalcRemote.class META-INF ejb-jar.xml jboss.xml MANIFEST.MF 5. Chy JBoss server - Chy %JBOSS_HOME%\bin\run.bat trong mt console.
107 Nguyn Qung i
22:10:16,897 INFO [Http11Protocol] Starting Coyote HTTP/1.1 on http-127.0.0.1-8080 22:10:16,928 INFO [AjpProtocol] Starting Coyote AJP/1.3 on ajp-127.0.0.1-8009 22:10:16,990 INFO [Server] JBoss (MX date=200710221139)] Started in 22s:869ms MicroKernel) [4.2.2.GA (build: SVNTag=JBoss_4_2_2_GA
6. Trin khai gi calculator.jar - Sao chp gi calculator.jar vo th mc %JBOSS_HOME%\ server\default\deploy\ , lp tc thy chi tit trin khai gi ny trong console chy JBoss server, y l kh nng hot deployment ca JBoss.
22:14:00,492 INFO [AjpProtocol] Starting Coyote AJP/1.3 on ajp-127.0.0.1-8009 22:14:00,523 INFO [Server] JBoss (MX MicroKernel) SVNTag=JBoss_4_2_2_GA date=200710221139)] Started in 21s:637ms 22:15:00,988 INFO [EjbModule] Deploying Calculator 22:15:01,066 INFO [ProxyFactory] Bound EJB Home Calculator to jndi calc/Calculator 22:15:01,066 INFO [EJBDeployer] Deployed: file:/C:/javaSoft/jboss4.2.2.GA/server/default/deploy/calculator.jar 7. S dng client truy xut EJB To th mc client, copy tp tin client.class vo y To th mc calc trong th mc client, copy 2 tp tin CalcHome.class, CalcRemote.class vo y M ca s command-line, a th mc hin hnh v th mc client trn, chy lnh: java client Kt qu nh sau:
Microsoft Windows [Version 6.0.6000] Copyright (c) 2006 Microsoft Corporation. All rights reserved. E:\__EJB\client>java client ============================================ 13.0 ============================================ E:\__EJB\client>
[4.2.2.GA
(build:
1. u tin, EJB container ng k tt c cc enterprise beans trin khai, bao gm stateless session beans, vi dch v JNDI da trn tn ng k JNDI c ch nh bi tp tin c t trin khai (deployment descriptor). 2. EJB Container quyt nh to 1 th hin ca stateless session bean theo chnh sch caching ca h thng. Trong v d ny, EJB container khi to SignOn bean bng cch s dng Class.newInstance("SignOnEJB.class") ri gi phng thc setSessionContext() v ejbCreate()trn th hin ny. By gi bean sn sng phc v cho bt k client no. 1. Client tm kim home interface ca enterprise bean c trin khai thng qua JNDI. V d, remote home interface ca SignOn stateless bean c th c xc nh bng on code sau:
Context initialContext = new InitialContext(); Object obj = initialContext.lookup("hamy/SignOn"); SignOnHome signOnHome = (SignOnHome) javax.rmi.PortableRemoteObject.narrow(obj, SignOnHome.class);
5. Client gi business method trn remote object. V d, client s xc nhn tn ng nhp v mt khu trong v d ca chng ta:
signOn.validateUser("student1", "password1");
Ejb container s gn 1 stateless session bean t th hin dng chung(pool) cho vic phc v yu cu ca client. EJB container gi phng thc c implements
109 Nguyn Qung i
cho dch v trn th hin ca i tng stateless session. V d EJB container s gi phng thc validateUser(). Sau khi bean phc v cho yu cu t client, EJB container s a session bean tr li vo cc th hin dng chung. 1. EJB container quyt nh kt thc th hin ca session bean bng cch gi phng thc ca th hin bean. II. Thit k:
import java.rmi.RemoteException; import javax.ejb.*; public interface SignOnHome extends EJBHome { SignOn create() throws CreateException, RemoteException;
public void ejbRemove() { print("This instance is in the process of being removed "); print("by the container.\n"); } /* * Here you implement all business methods * * as defined in the component interface */ public boolean validateUser(String userName, String password) throws InvalidLoginException { String storedPassword = (String) environment.lookup(userName); if ( storedPassword.equals(password) ) { return true; } else { throw new InvalidLoginException("Invalidlogin/password"); } } catch(NamingException ne) { throw new InvalidLoginException("Invalid login/password"); } } void print(String s) { System.out.println(s); } try {
<?xml version="1.0" encoding="UTF-8" ?> <ejb-jar version="2.1" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd"> <enterprise-beans> <session> <ejb-name>SignOnEJB</ejb-name> <home>hamy.SignOnHome</home> <remote>hamy.SignOn</remote> <ejb-class>hamy.SignOnEJB</ejb-class> <session-type>Stateless</session-type> <transaction-type>Container</transaction-type> <env-entry> <env-entry-name>student</env-entry-name> <env-entry-type>java.lang.String</env-entry-type> <env-entry-value>password</env-entry-value> </env-entry> <env-entry> <env-entry-name>student1</env-entry-name> <env-entry-type>java.lang.String</env-entry-type> <env-entry-value>password1</env-entry-value> </env-entry> </session> </enterprise-beans> </ejb-jar>
IV. Trin khai To file compile.bat c ni dung sau bin dch cc file java: javac *.java pause Thc thi file ny. Sau ta c th mc hamy gm c ngoi cc file .java cn c thm cc file .class. To file CreateJarFile.bat c ni dung: jar cvf SignOn.jar hamy/*.class META-INF/*.xml
113 Nguyn Qung i
pause Chy file ny ta s c c file SignOn.jar. M file ny vi winrar ta c cu trc nh sau hamy InvalidLoginException.class SignOn.class SignOnEJB.class SignOnHome.class META-INF ejb-jar.xml jboss.xml MANIFEST.MF Copy tp tin SignOn.jar vo th mc JBOSS-HOME\server\default\deploy\ Nu Jboss ang chy n s t ng trin khai. Nu cha chy Jboss th vo th mc JBOSS-HOME\bin, chy file run.bat. Kt qu trong console jboss: 14:31:42,149 INFO [EjbModule] Deploying SignOnEJB 14:31:42,180 INFO [ProxyFactory] Bound EJB Home SignOnEJB to jndi hamy/SignOn 14:31:42,196 INFO [EJBDeployer] Deployed: file:/C:/javaSoft/jboss4.2.2.GA/server/default/deploy/SignOn.jar To client To th mc client To file Client.java vi ni dung
114 Nguyn Qung i
public class Client2 extends JFrame implements ActionListener { private JButton btLogon, btExit; private JTextField tfUserName; private JPasswordField pfPassword; public Client2(){ super("Logon with EJB"); this.setDefaultCloseOperation(EXIT_ON_CLOSE); this.setSize(350,150); this.setResizable(false); this.setLocation(300,200); JLabel l1,l2,l3; Box b=Box.createVerticalBox(); Box b1=Box.createHorizontalBox(); Box b2=Box.createHorizontalBox(); Box b3=Box.createHorizontalBox(); b.add(Box.createHorizontalStrut(27)); b.add(b1);b.add(Box.createVerticalStrut(7)); b.add(b2);b.add(Box.createVerticalStrut(10)); b.add(b3);b.add(Box.createVerticalStrut(7)); b1.add(l1=new JLabel("User Name:",JLabel.RIGHT));b1.add(tfUserName=new JTextField(15)); b2.add(l2=new JLabel("Password:",JLabel.RIGHT));b2.add(pfPassword=new JPasswordField(15)); b3.add(btLogon=new JButton("Logon"));b3.add(Box.createHorizontalStrut(7)); b3.add(btExit=new JButton("Exit")); btExit.addActionListener(this); btLogon.addActionListener(this); l2.setPreferredSize(l1.getPreferredSize()); this.add(l3=new JLabel("LOGON",JLabel.CENTER),BorderLayout.NORTH); l3.setFont(new Font("Arial",Font.BOLD,18)); l3.setForeground(java.awt.Color.red); this.add(b,BorderLayout.CENTER); } public void actionPerformed(ActionEvent e){ Object o=e.getSource(); if(o.equals(btExit)) System.exit(1); else{ try { Properties props = System.getProperties();
"org.jboss.naming" );
Context initialContext = new InitialContext(); Object obj = initialContext.lookup("hamy/SignOn"); SignOnHome signOnHome = (SignOnHome)javax.rmi.PortableRemoteObject.narrow(obj, SignOnHome.class); SignOn signOn = (SignOn)signOnHome.create(); boolean isOK=signOn.validateUser(tfUserName.getText(),pfPassword.getText()); if(isOK){ JOptionPane.showMessageDialog(null,"Logon OK"); System.exit(1); } }catch(InvalidLoginException ile){ JOptionPane.showMessageDialog(null,"Invalid username or password"); } catch(Exception ex){ ex.printStackTrace(); } } } public static void main(String[] agrs) { new Client2().setVisible(true); }
To th mc client\hamy, copy cc file .class sau vo : InvalidLoginException.class SignOn.class SignOnHome.class To file client/compile.bat vi ni dung sau bin dch cc tp tin java javac *.java pause To file clinet/client2.bat thc thi ng dng vi ni dung sau : java Client2 pause Chy file compile.bat. Chy file client2.bat chy client. Kt qu nh hnh sau
116 Nguyn Qung i
Does Not Exits: khng tn ti trong b nh. Method-Ready: sn sng phc v cc yu cu t client c y nhim (delegate) bi EJB Object. Passivated: th ng, lu tr trng thi ca conversation, s c kch hot (activate) khi cn.
Cn khi gn khi to bean. Client triu gi phng thc nhiu ln. Cn lu tr thng tin client xuyn qua nhiu ln gi.
- Trng thi ca conversation, lu trong bin thnh vin ca lp EJB, c th l cc i tng: kiu c bn, kiu serializable (java.rmi.Serializable, tun t ha c), javax.ejb.EJBHome (kiu home interface), javax.ejb.EJBObject (kiu remote interface), javax.ejb.SessionContext, Khng c khai bo cc bin ny l transient. 2. Vng i ca Stateful Session Bean - Stateful Session Bean khng dng instance pooling. trng thi khng hot ng, thc th bean b y khi b nh mt cch n gin trong lc EJB Object vn cn gi lin h vi client.
- Khi phng thc create() ca EJB Home c gi, container triu gi phng thc newInstance() ca lp bean to mt thc th bean mi. Sau container triu gi phng thc setSessionContext() lin kt bean vi mt SessionContext dng sut vng i ca n, lc ny bean s c gn cho mt EJB Object. Cui cng, container triu gi phng thc ejbCreate() tng ng vi create() ca EJB Home. Thc th bean by gi trng thi Method-Ready. - tit kim ti nguyn, khi khng phc v client, bean c th chuyn sang trng thi Passivated bng phng thc ejbPassivate(). Bean s tr li tt c cc ti nguyn ang m v t cc field thnh null. Trng thi ca conversation s c lu, cch lu tr ty i tng.
- Khi c yu cu ca client i vi mt bean ang trng thi Passivated, container s kch hot thc th bean, khi phc bean v tham chiu SessionContext, trng thi conversation lu tr, ri gi ejbActivate().
- Khi phng thc ca bean nhn mt exception h thng, container khng dng EJB Object v loi b thc th bean. Bean s chuyn trc tip sang trng thi Does Not Exits, khng gi phng thc ejbRemove().
118 Nguyn Qung i
3. Cc phng thc callback - Phng thc ejbCreate() khi gn d liu thnh vin, cng l ni lu tr trng thi conversation, cho thc th bean. Sau khi c to, bean c th :
Trng thi Method-Ready, thc hin cc business method phc v cho client. Khng cn thit, s c container chuyn thnh trng thi Passivated. Chuyn sang trng thi Does Not Exist do li server hoc do ngi dng chm dt session.
Phng thc ejbCreate() c np chng cho php khi to thc th bean bng nhiu cch. - Phng thc ejbPassivate() s c container gi trc khi chuyn bean vo trng thi Passivated, lu tr trng thi ca conversation. Phng thc ny gi thc th bean gii phng cc ti nguyn lin kt vi n. Container chuyn trng thi ca bean thnh Passivated theo nguyn tc LRU (Least Recently Used bean tn ti lu nht s c chn th ng ha). Bean trng thi Passivated c thi gian timeout, qu thi gian ny hoc do li server, bean s b loi. - Phng thc ejbActivate() chuyn bean t trng thi Passivated ngc tr li trng thi MethodReady. Trng thi ca conversation ang lu tr s c c li v bean c khi phc trc khi container gi ejbActivate(). Khi kch hot bean, container dng nguyn tc JIT (Just-In-Time tc thi). - Phng thc ejbRemove() c container gi khi client triu gi phng thc remove() trn home interface hoc remote interface. Phng thc ny gii phng ti nguyn, loi b thc th bean. - Phng thc setSessionContext() c container gi lin kt mt session context vi mt bean ch nh ngay t u vng i ca bean . II. Thit k A. To Stateful Session Bean - Cn t CLASSPATH n cc file jar trong th mc client ca JBOSS_HOME.
119 Nguyn Qung i
1. To remote interface
package cart; import import import import helper.BookException; java.util.Vector; javax.ejb.EJBObject; java.rmi.RemoteException;
public interface Cart extends EJBObject { public void addBook( String title ) throws RemoteException; public void removeBook( String title ) throws BookException, RemoteException; public Vector getContents() throws RemoteException; }
2. To home interface
package cart; import java.rmi.RemoteException; import javax.ejb.CreateException; import javax.ejb.EJBHome; public interface CartHome extends EJBHome { Cart create( String person ) throws RemoteException, CreateException; Cart create( String person, String id ) throws RemoteException, CreateException; }
3. To lp EJB
package cart; import import import import import import helper.BookException; helper.IdVerifier; java.util.Vector; javax.ejb.SessionBean; javax.ejb.SessionContext; javax.ejb.CreateException;
public class CartEJB implements SessionBean { String customerName; String customerId; Vector contents; public void addBook(String title) { 120 Nguyn Qung i
contents.addElement(title); } public void removeBook( String title ) throws BookException { boolean result = contents.removeElement( title ); if ( result == false ) { throw new BookException( title + " not in cart." ); } } public Vector getContents() { return contents; } public void ejbCreate( String person ) throws CreateException { if ( person == null ) { throw new CreateException( "Null person not allowed." ); } else { customerName = person; } customerId = "0"; contents = new Vector(); } public void ejbCreate(String person,String id ) throws CreateException { if ( person == null ) { throw new CreateException( "Null person not allowed." ); } else { customerName = person; } IdVerifier idChecker = new IdVerifier(); if ( idChecker.validate( id ) ) { customerId = id; } else { throw new CreateException( "Invalid id: " + id ); } contents = new Vector(); } public void ejbRemove() { } public void ejbActivate() { } public void ejbPassivate() { } public void setSessionContext(SessionContext sc) { }
4. To cc lp h tr (helper) - Cc lp trn c phng thc nm ra cc exception do ngi dng vit. Cn b sung cc lp exception ny vo gi EJB.
121 Nguyn Qung i
package helper; public class BookException extends Exception { public BookException() { } public BookException( String msg ) { super( msg ); } }
v
package helper; public class IdVerifier { public IdVerifier() { } public boolean validate(String id) { boolean result = true; for (int i = 0; i < id.length(); ++i) { if (Character.isDigit(id.charAt(i)) == false) result = false; } return result; } }
public class CartClient extends JFrame { CartHome home; static Cart shoppingCart; Container c; String[] items = { "JSP in 21 Days", "Mastering EJB", "J2EE Tutorial" }; JLabel book = new JLabel( "Aptech J2EE Books list" ); JLabel cart = new JLabel( "Your shopping cart" ); JButton bAdd = new JButton( "Add" ); JButton bRemove = new JButton( "Remove" ); JComboBox bookCB = new JComboBox( items ); static JComboBox cartCB = new JComboBox(); public CartClient( String s ) { super( s ); c = getContentPane(); c.setLayout( new GridLayout( 2, 3, 2, 2 ) ); c.add( book ); c.add( bookCB ); c.add( bAdd ); bAdd.addActionListener( new ButtonListener() ); c.add( cart ); c.add( cartCB ); c.add( bRemove ); bRemove.addActionListener( new ButtonListener() ); try { System.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory"); System.setProperty( "java.naming.provider.url", "localhost:1099" ); System.setProperty( "java.naming.factory.url.pkgs", "org.jboss.naming" ); Context initial = new InitialContext(); Object objref = initial.lookup( "cart/CartJNDI" ); CartHome home = ( CartHome ) PortableRemoteObject.narrow( objref, CartHome.class ); shoppingCart = home.create( "Bill Gates", "123" ); } catch ( Exception ex ) { ex.printStackTrace(); } setSize( 500, 95 ); setVisible( true ); setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); 123 Nguyn Qung i
} static void refreshCart() { cartCB.removeAllItems(); try { Vector bookList = new Vector(); bookList = shoppingCart.getContents(); Enumeration enumer = bookList.elements(); while ( enumer.hasMoreElements() ) cartCB.addItem( ( String ) enumer.nextElement() ); } catch ( Exception ex ) { } } class ButtonListener implements ActionListener { public void actionPerformed( ActionEvent ev ) { if ( ev.getSource() == bAdd ) { try { shoppingCart.addBook( ( String ) bookCB.getSelectedItem() ); CartClient.refreshCart(); } catch ( Exception ex ) { } } if ( ev.getSource() == bRemove && cartCB.getItemCount() > 0 ) { try { shoppingCart.removeBook( ( String ) cartCB.getSelectedItem() ); CartClient.refreshCart(); } catch ( Exception ex ) { } } } } public static void main( String[] args ) { new CartClient( "Aptech Book Store" ); }
- Ch ta ch dng cc business method ca EJB, khng s dng cc phng thc thm v xa item trc tip ca JComboBox. Mi ln gi phng thc l mt request trong ton b session chn mua hng cho shopping cart. III. Trin khai 1. Chun b cc deployment descriptor - Chun b ejb-jar.xml trong th mc META-INF. Ch <session-type> l Stateful.
<?xml version="1.0" encoding="UTF-8" ?> <ejb-jar version="2.1" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd"> <enterprise-beans> 124 Nguyn Qung i
<session> <ejb-name>Cart</ejb-name> <home>cart.CartHome</home> <remote>cart.Cart</remote> <ejb-class>cart.CartEJB</ejb-class> <session-type>Stateful</session-type> <transaction-type>Container</transaction-type> </session> </enterprise-beans> </ejb-jar>
cart Cart.class CartEJB.class CartHome.class helper BookException.class IdVerifier.class META-INF ejb-jar.xml jboss.xml MANIFEST.MF
4. Trin khai gi cart.jar - Sao chp gi cart.jar vo th mc %JBOSS_HOME%\deploy\ , quan st chi tit trin khai gi ny trong console chy JBoss server.
[INFO,AutoDeployer] Auto deploy of file:/C:/JBoss/deploy/cart.jar [INFO,J2eeDeployer] Deploy J2EE application: file:/C:/JBoss/deploy/cart.jar [INFO,J2eeDeployer] Create application cart.jar [INFO,J2eeDeployer] install EJB module cart.jar [INFO,ContainerFactory] Deploying:file:/C:/JBoss/tmp/deploy/Default/cart.jar [INFO,ContainerFactory] Deploying Cart [INFO,ContainerFactory] Deployed application: file:/C:/JBoss/tmp/deploy/Default/cart.jar 126 Nguyn Qung i
5. S dng client truy xut bean - Chy client t dng lnhtrong mt console khc:
C:\EJB\StatefulSession>java -classpath %CLASSPATH%;C:\JBoss\client\jboss-client.jar;. CartClient
6.16
Persistence
C ba cch lu tr d liu hay to ra i tng persistence, l: Java object serialization: tun t ha i tng java l mt phng php m nh i tng java c chp ly ti trng thi hin ti, v c lu vnh vin. Ta c th s dng nhng API c sn ca Java lu tr i tng ra mt file N l mt phng php n gin a (marshal) mt th i tng (object graph ) vo mt i din nh gn (compact representation). S tun t ha ca mt th chuyn i n thnh mt dng byte (byte stream), v iu ny cho php cc nh pht trin y d liu qua mng, hoc lu n cc kho l tr. Tuy nhin, tun t ha cng c nhng nhc im ca n. i vi cc enterprise data, phng php ny l khng p ng cc yu cu x l d liu nh l tm kim, truy cp ng b c bao bc bi cc transaction.
127 Nguyn Qung i
Cc truy vn tin tin cn mt x l hiu qu hn v tun t ha i tng khng cung cp iu ny. Mc d vic x l truy vn cc i tng c lu tr bng tun t ha i tng t hn v cng knh hn, nhng n vn c s dng trong nhng business function ln. Object-relational mapping hay object to relation persistence: S dng cc h qun tr c s d liu truyn thng nh Oracle, Microsoft SQL Server, DB2, hoc cc bn min ph nh MySQL, lu tr cc i tng Java. Mi i tng Java c phn tch thnh nhng thnh phn cu to nn n, v nhng thnh phn ny s c lu tr mt cch ring r. Khi save cc i tng Java, ta s s dng JDBC hoc SQL/J nh x (mapping) d liu ca i tng vo trong mt c s d liu quan h. Khi ta mun np i tng t c s d liu, ta s khi to mt i tng ca lp , c d liu t c s d liu, v a d liu c c vo cc trng ca i tng. Phng php ny tinh t hn nhiu so vi phng php th nht. Ngi dng ch cn tm kim c s d liu cho nhng truy vn yu cu v np nhng i tng cn thit. N cng h tr nhiu truy vn tin tin hn. Vic nh x (mapping) cc i tng d liu quan h c th lm c bng hai cch. Cch th nht l ta nh x mt cch th cng bn trong code ca ta, hoc ta s s dng cc sn phm tr gip nh x i tng - quan h (object relational mapping product) nh l Oracle TopLink, hoc cc cng c m ngun m nh Hibernate, lm t ng v thun tin hn trong vic nh x ny. Nhng cng c ny tr ln rt ph bin. Nhng ngi lm cng vic nh x s to ra cc nh ngha d liu trong ngn ng nh ngha d liu (DDL Data Definition Language) ca nn tng ch (target platform) t cc lp Java hoc t cc c t nh x ring bit (hnh nh l cc file cu hnh). nh x theo cch th cng bng cc hm API nh ca JDBC t c s dng hn bi v chi ph cng nh cng sc pht trin v duy tr l rt cao. Object database management system hoc object database persistence: mt h thng qun tr c s d liu i tng c nh ngha nh mt ni lu tr lu di,c thit k gi cc i tng (entire objects),v cc loi i tng. Trong h thng ny, cc i tng java c lu tr nh nhng i tng khng suy suyn (whole object), c ngha l khng cn phi lp trnh vi c c s d liu quan h. Ngn ng truy vn i tng ( Object Query Language) cung cp nhng thun li truy vn i tng persisted. Ngn ng ny thm mt tng tru tng t c s d liu quan h. Mt iu quan trng khc cn ch y l quan h gia cc i tng c h tr bi cc truy vn da trn OQL. Mc thc thi tt hn so vi cc kt ni da vo SQL. Tnh ton vn v bo mt cng l nhng thnh phn quan trng ca c s d liu i tng. C s d liu hng i tng cng lm tt hn vic mapping cc entity v c s d liu so vi c s d liu quan h. Mc d c rt nhiu u im nhng c s d liu i tng li thiu cc tool qun l, reporting, tuning. S thiu ht cc tool c kt hp lm cho chng t c s dng trong cng nghip. Do vy m EJB 2.0 gii thiu nhng thnh phn mi c gi l Container-Managed Relationships trong Container-Managed Persistence v EJB Query Language EJB QL.
128
Nguyn Qung i
EJB QL gip trong vic loi b s mu thun b gy ra bi s khc nhau ca i din vt l ca cc truy vn ca cc application server khc nhau. (on ny dch theo sch, khng hiu my!!!)
6.17 6.18
Trong CMP c phng thc select m BMP khng c. Phng thc ny khng hin th pha client qua interface home v interface thnh phn ca Bean (khng c khai bo trong home interface v remote interface). Phng thc ny c th tr v bt k kiu gi tr no ca trng persistence hoc trng relationship. c bit select method c s dng nh cc phng thc h tr (helper method) trong cc business method. Mi mt phng thc select c mt truy vn EJB QL bn trong EJB deployment descriptor.
<cmp-field> <field-name>orderDate</field-name> </cmp-field> <cmp-field> <field-name>status</field-name> </cmp-field> <cmp-field> <field-name>amount</field-name> </cmp-field> . . . </entity>
Thnh phn <cmp-version> phi c nu mun c c nhng u im ca EJB 2.0 Container-managed persistence. Thnh phn <abstract-name-schema> khai bo tn ca abstract schema l Order. Sau ny ta s s dng tn ca abstract schema ny ch nh cc truy vn EJB QL. Nh trong v d ny th OrderEJB c nm trng persistence: ordered, studentId, orderDate, status v amount.Tn ca cc trng ny phi khp vi cc phng thc tru tng get / set trong lp entity bean. V d nh trong trng hp ny phi l setOrderId, getOrderId, setStatus, getStatus,
Ch : vi phng thc findByPrimaryKey() th ejb-jar.xml s khng cn ch nh EJB Query Language. Khi khai bo EJB Query Language trong file ejb-jar.xml i vi trng hp ca phng thc findByStatus (String status) trn th s nh sau:
<query> <query-method> <method-name>findByStatus</method-name> <method-params> <method-param>java.lang.String</method-param> </method-params> </query-method> <ejb-ql> <![CDATA[SELECT OBJECT(o) FROM Order AS o WHERE o.status = ?1]]> </ejb-ql> </query>
Container tools s dch nhng cu truy vn ny sang ngn ng ch nh ca c s d liu tng bn di.
Quan h trong v d ang xt c kiu undirectional Student-Address l tn ca quan h trn. Student-has-address l tn vai tr ca StudentEJB. Cn Address-belongs-to-student l tn vai tr ca AddressEJB. Ta cn thc hin on code tng ng nh sau
public abstract class StudentEJB implements EntityBean{ public abstract AddressLocal getAddress(); public abstract void setAddress(AddressLocal address); }
StudentEJB phi khai bo cc phng thc tru tng get / set cho trng quan h address. Cc phng thc ny s dng local interface l AdressLocal. Cn lp AddressEJB th khng c cha cc trng quan h.
public abstract class AddressEJB implements EntityBean{ /* no cmr-fields */ }
Bi v AddressEJB khng bit g v StudentEJB, nn khng c cc phng thc tru tng bn trong AddressEJB truy cp StudentEJB. Ch : cc phng thc truy cp (accessor mehod) cho cc trng quan h phi public v abstract. Phng thc get phi tr li cc local interface ca entitybean. Cn phng thc set th cc tham s phi l cc local interface. Ngoi ra chng khng c hin th ra cc remote interface ca entity bean. Cc trng quan h phi c khai bo trong EJB deployment description. Deployment description tng ng vi quan h student address trn s c khai bo nh sau:
131 Nguyn Qung i
<ejb-jar> <enterprise-beans> </enterprise-beans> <relationships> <ejb-relation> <!ONE-TO-ONE uni-directional : Student Address > <ejb-relation-name>Student-Address</ejb-relation-name> <ejb-relationship-role> <ejb-relationship-role-name> Student-has-address </ejb-relationship-role-name> <multiplicity>One</multiplicity> <relationship-role-source> <ejb-name>StudentEJB</ejb-name> </relationship-role-source> <cmr-field> <cmr-field-name>address</cmr-field-name> </cmr-field> </ejb-relationship-role> <ejb-relationship-role> <ejb-relationship-role-name> Address-belongs-to-student </ejb-relationship-role-name> <multiplicity>One</multiplicity> <relationship-role-source> <ejb-name>AddressEJB</ejb-name> </relationship-role-source> </ejb-relationship-role> </ejb-relation> </relationships> </ejb-jar>
Trong unidirectioncal relationship, thnh phn cmr-field tng ng vi trng quan h ch khai bo trong bean m t n c th tm n ci cn li (trong trng hp ny l StudentEJB), ch khng khai bo trong bean ch cn li. Quan h One - Many Xt mt quan h nh hnh bn di. y l mt quan h kiu Bidirectional.
Order-LineItems l tn ca quan h trn. Order-has-lineItems, LineItems-belongs-toorder l tn ca cc vai tr tng ng vi hai bean. on code sau c vit trong lp OrderEJB
public abstract class OrderEJB implements EntityBean{ public abstract Collection getLineItems(); public abstract void setLineItems(Collection lineItems); }
OrderEJB khai bo cc phng thc tru tng get / set cho trng quan h. Bi v mt OrderEJB c nhiu LineItemEJB nn gi tr tr v v tham s truyn vo cc phng thc ny phi l mt Collection (java.util.Collection hoc java.util.Set) ca cc local interface LineItemLocal. on code sau tng ng vi lp LineItemEJB
public abstract class LineItemEJB implements EntityBean{ public abstract OrderLocal getOrder(); public abstract void setOrder(OrderLocal order); }
Quan h Student-Course trn l quan h bidirectional many-many. Trong lp StudentEJB s phi khai bo nh sau:
public abstract class StudentEJB implements EntityBean{ ... public abstract Collection getCourses(); public abstract void setCourses(Collection courses); ... }
Cui cng, khi mun thc s hon thnh vic cu hnh cho cc CMR entity bean, ta cn xy dng cc thnh phn trong file jbosscmp-jdbc.xml Ch : Ta c th m hnh ha quan h nhiu nhiu thnh hai quan h mt nhiu bng cch s dng mt entity bean mi. y l mt cch c a thch hn bi v n lm gim i s ph thuc gia cc entity bean.
Mt iu cn lu na l nhiu lc bn thn mt entity bean s dng entity bean cn li ca quan h ang xt thc hin cc nhim v cn thit. Chnh v th ta s to ra c cc remote v local componet interface. Ngoi ra khi mun s dng cc local interface, ta cng cn ch n khai bo thnh phn <local-jndi-name> trong file jboss.xml khi s dng c th tm kim bng phng thc lookup() thng qua jndi service. hiu r hn, ta lm theo v d trong ti liu [6] ( hoc 10) Day 12 V d ny s dng hai bng c s d liu l orders v orderlineitems nh sau:
Ch : cc BMP entity bean khng c container-managed Relationships. V entity bean no l entity bean ch (tc l entity bean c bit n bi mt entity bean khc ) phi c cc local interface.
C hai loi m hnh messaging. Mt ng dng JMS c th s dng c hai m hnh ny, nhng thong thng mt ng dng ch tp trung vao mt m hnh c th. Hai m hnh l: Point to Point messaging model Publish-and-subscribe (Pub/Sub) messaging model
136 Nguyn Qung i
6.19.2 MDB
Khi mun lm vic vi MDB, trc tin ta cn ng k cc Topic/ Queue vi server, y l ni m cc message c gi ln, sau bn nhn s ly cc message ny t y x l.
Trong jboss ta c th lm vic nh sau: to hoc edit file jbossmb-destinationsservice.xml(c th ly file ny trong {install_dir}\docs\examples\jms. Sau to code on m sau <?xml version="1.0" encoding="UTF-8"?> <server> <mbean code="org.jboss.mq.server.jmx.Topic" name="jboss.mq.destination:service=Topic,name=OrderVerifierTopic"> <depends optional-attribute-name="DestinationManager"> jboss.mq:service=DestinationManager </depends> </mbean> ... </server> on m trn ng k vi JNDI service mt Topic c tn l topic/OrderVerifierTopic.
6.20
RequiresNew EJB container lun bt u mt giao dch mi trc khi gi phng thc ca bean, commit trong lc tr v phng thc. Nu client c c gn vi mt giao dch th container s treo li giao dch . Sau khi giao dch mi ca phng thc bean c hon thnh, giao dch b treo s c khi phc li Mandatory Client ang gi bt buc phi c gn ti mt giao dch. Tri li, khi gi phng thc ca bean s b li, v nm (throw) ra mt TransactionRequiredException. Never Client ang gi bt buc khng c gn ti mt giao dch. Tri li, khi gi phng thc ca bean s b li, v nm ra mt RemoteException. Transaction Attribute NotSupport Client None T1 Support None T1 Required None T1 RequiresNew None T1 Mandatory None T1 Never None T1 Bean s method None None None T1 New transaction: T2 T1 New transaction: T2 New transaction: T2 TransactionRequiredException T1 None TransactionRequiredException
Entity Bean C ejbLoad() v ejbStore() u l hai phng thc callback, v ch c th c gi bi container t bn trong mt transaction. Bi v mt bean khng th gi c ejbLoad() v ejbStore() ng b ha trng thi ca n, nn entity bean khng th l mt BMT c.
Trng hp 1 : Mt giao dch phn tn ni kt hai EJB : A v B. Mi EJB c mt kt ni JDBC ca ring mnh n Datasource. Bi cnh giao dch JTA lan truyn t A ti B. Trng hp ny c ch khi cp nht c hai c s d liu ng thi, nh mt n v cng vic m thi Trng hp 2 : Mt giao dch phn tn ni kt hai EJB : A v B. EJB u tin c kt ni JDBC ti Datasource, cn ci cn li c kt ni ti JMS provider. Bi cnh giao dch JTA lan truyn t A ti B. Cch ny c ch trong trng hp cp nht mt c s d liu, trong khi phi chc chn c s phn pht ca mt JMS messeage.
140 Nguyn Qung i
Trng hp 3 : Ging nh trng hp 2 ch khc EJB A c 2 datasource, mi datasource c connection pool ca ring n. Bi cnh giao dch JTA truyn t A ti B Trng hp 4 : Trnh qun l giao dch JTA lan truyn bi cnh giao dch qua ranh gii EJB container ti mt EJB container khc. Cc container ny c th c cng hoc khc nh phn phi. Ch : Khi trnh qun l ti nguyn JMS ( JMS resource manager) tham gia vo mt giao dch phn tn, JTA driver s b qua ci t JMS transacted Session ( t Session thnh kiu transactional). Sau cc ci t ny s c khi phc sau khi giao dch phn tn trn hon thnh. Kt qu tng t xy ra vi trng hp ca JDBC resource manager vi giao dch a phng (local transaction).
6.21
BMT
Ch c session bean v message bean mi c BMT. Entity bean khng c BMT, n phi s dng CMT.
6.22
La chn <method-intf> dng phn bit cc phng thc c tn ging nhau c nh ngha thng qua thng qua cc home v component interface.
<ejb-jar> ... <assembly-descriptor> ... <container-transaction> <method> <ejb-name>MyEJB</ejb-name> <method-intf>Remote</method-intf> <method-name>methodA</method-name> <method-params> <method-param>java.lang.String</methodparam> </method-params> </method> <trans-attribute>Required</trans-attribute> </container-transaction> ... </assembly-descriptor> ... </ejb-jar>
Mt s EJB c th s truy cp vo cc chng trnh qun l ti nguyn (resource mangagers) m khng c h tr chng trnh qun l giao dch ngoi (external transaction manager). Container s khng th qun l cc giao dch cho cc EJB nh vy vi CMT. Do cc lp trnh vin EJB nn gn thuc tnh transaction Notsupported ti tt c cc phng thc ca EJB.
Khi c ngoi l ca h thng, container s t ng roll back transaction, c ngha l n s c gng th gi li phng thc thch hp Khi c ngoi l ca ng dng n khng t ng to ra mt rollback. EJB s phi gi phng thc setRollBackOnly() ca giao din EJBContext bo cho container rollback
public class RegistrarEJB implements SessionBean{ SessionContext ctx; ... public void registerForCourse(String courseID) throws InsufficientRoomException { try { rs = updateCourse(courseID); if (rs < 0) { // Application-level exception ctx.setRollbackOnly(); throw new InsufficientRoomException(); } } catch (SQLException ex) { // This is a system-level exception throw new EJBException (Transaction rollback due to SQLException: + ex.getMessage()); } } ... }
Ch CMT mi b nh hng bi on khai bo ny, nu l BMT ta s s dng phng thc setTransactionTimeout() ca UserTransaction interface ( trong JTA transactions)
4. Khi cn rollback, phng thc business s gi phng thc settRollbackOnly() ca EJBContext. N s bo cho EJB container bit giao dch c rollback. Ch phng thc setRollbackOnly() ch dng trong trng hp CMT. 5. Khi kt thc phng thc business ( trc khi phng thc tr v), EJB hon thnh giao dch bng cch xc nhn (commit) giao dch hoc l rollback n (nu phng thc setRollbackOnly() c gi bc 4) 6. Ta c th iu khin thi gian thot ra (time-out) ca transaction, nu qu thi gian m transaction vn cha hon thnh th transaction s b hy. Ta ci t thi gian ny trong vendor-specific deployment descriptor (file jboss.xml nu s dng Jboss, file weblogic-ejb-jar.xml nu s dng WebLogic).
6.22.6 V d
Tham kho v d day17 trong ti liu [10]. Ch l phi t khai bo cc thnh phn trong file jboss.xml nu s dng Jboss lm application server, v trong ti liu khng c.
<session> <ejb-name>EnrollmentCart</ejb-name> <jndi-name>day17/EnrollmentCartHome</jndi-name> <resource-env-ref> <resource-env-ref-name>jdbc/styejbDB</resource-env-ref-name> <jndi-name>java:/version_2.0</jndi-name> </resource-env-ref> </session>
6.23
Security
Cc k thut bo mt c thit lp m bo rng cc enterprise v cc ti nguyn ca n c bo v t cc tn cng bt ng v him c. Enterprise security nhm vo cc ti nguyn d liu, cc ng dng, v cc component. Nhng n cng gii quyt c vn giao tip an ton gia chng. Security chc chn rng thng tin khng b thay i hoc b l ra, ngoi tr c enterprise cho php, vi mt chnh sch bo mt (security policy).
user c bit, ngi c kh nng qun l cc ti nguyn enterprise. Khi mt user mun truy cp vo mt ti nguyn, n a ra mt username v mt credentical (mt password hoc mt chng nhn s) ti application server. Nu application server c th chng minh danh tnh ca user Laura, n s to ra mt security context (hoc mt thread) v kt hp Laura vi context . Trong trng hp truy cp thm ti cc ti nguyn, server thc hin kim tra security xem Laura c c php x l hay khng. Mt Group l mt tp hp cc user. S hiu qu hn khi qun l nhm thay v qun l mt lng ln cc user ring bit. Cc thnh vin trong nhm thng c ci g chung, v d nh c quyn truy cp (permisssion) cc ti nguyn h thng ging nhau. C th cu hnh h thng gn cc user vo trong nhm. Mt ngi c th c nh ngha nh l mt user hay l mt thnh vin trong nhm (group member). Quyn ca user c th ghi ln quyn ca group member. Cc nhm c nh ngha mc h iu hnh, khng phi mc ng dng. thc thi vic phn quyn hiu qu v c th duy tr c th tt nht l t chc cc user theo nhm (group). Ngc li, cc ti nguyn cng cn c mt danh sch cc user c th truy cp n. Trong mt h thng phc tp, khng tm thng (non-trivial), vic ny s rt d tr thnh mt cn c mng cho ngi qun tr h thng. trnh iu ny, cc user c t chc theo nhm v ton b nhm s c gn quyn truy cp n cc ti nguyn, iu s gip danh sch truy cp ca mt ti nguyn s d qun l hn nhiu. Khi nim vai tr (role) c lin quan mt thit vi khi nim nhm (group). i vi mt ng dng EJB, role quan trng hn nhiu so vi user hay group. phn bit c cc kha nim ny, xem xt vic chng ta khng xy dng mt gii php c pht trin trong mt t chc (in-house solution), m l xy dng mt ng dng J2EE c ng gi. Do chng ta khng bit c mi trng hot ng chnh xc m ng dng ca chng ta s c trin khai trong , mi trng ny c ngi tiu th (customer) t mua. Dn n vic ta khng th code bng cc tn nhm c th m ngi qun tr h thng ca mt customer s chn. Chng ta khng quan tm n group. Nhng g chng ta quan tm l mt user c th s c vai tr (role) g trong ng dng ca chng ta. Trong h thng ca customer, user Joe c l thuc group ca h thng (system group) c gi l peons. Gi s mt ng dng ca chng ta c tn l ActionBazaar kt hp vi mt h thng t hng doanh nghip B2B c vi t trn site ca customer. Kiu ci t ny ng nhp trong sut tt c cc user c t h thng ca customer vo trong site ActionBazaar thng qua mt shortcut desktop ty . Khi ng nhp vo ri, t quan im ca ActionBazaar, Joe c th l mt ngi mua hng, ngi mua cc mn hng online thay cho B2B customer company. i vi mt ng dng khc trong mi trng hot ng, user Joe c l l mt ngi qun tr, ngi c th thay i cc ci t h thng. i vi mi ng dng c trin khai trong mi trng hot ng ny, trch nhim ca ngi qun tr h thng l quyt nh xem system group no c nh x (map) ti application role no. Trong th gii ca Java EE, vic ny c lm thng qua cc giao din qun tr ca nh cung cp c th. L mt lp trnh vin, chng ta cn nh ngha cc user ca ng dng ca chng ta c cc role g, v b qua phn cn li cho nhng ngi i lp rp (assembler) v nhng ngi i trn khai (deployer). i vi Actionbazaar, cc role c th l ngi mua, ngi bn, ngi qun tr, Permissions, Access Control Lists, v Realms Permission l quyn ca user c truy cp ti cc ti nguyn xc nh no . V d: quyn c c, ghi , thc thi file. Hay l kh nng c gi, nhn cc tin nhn, np cc servlet, hoc kt ni ti mt hostname v cng ca mt data source. Ngi qun tr h thng (system administrator) gn nhng quyn ny ti c cc user v cc group. Nhim v qun tr ny kh phc tp v rt d gy ra li.
145 Nguyn Qung i
gim s phc tp ca vic qun tr security trong mt enterprise, ngi qun tr bo v cc ti nguyn dng chung bng cch to ra danh sch cc user v cc group c quyn truy cp vo cc ti nguyn ny. Cc danh sch nh th ny c gi l cc danh sch iu khin truy cp (Access Control Lists ACLs). ACLs ln u tin c gii thiu qun l security ca nn tng Unix. ACLs c cu hnh trong cc thuc tnh iu khin truy cp (access control properties) ca chnh sch bo mt (security policy). Mt security realm l mt vng (logical domain) gm cc user, group, permission, v ACLs c nh ngha bo v cc ti nguyn. Mt user phi thuc mt realm truy cp vo cc ti nguyn c nh ngha trong realm . Mt s application server s dng local disk storage hoc database lu tr cc security realm, nhng cc security realm khc c th s dng Windows NT, Unix, v Lightweight Directory Access Protocol (LDAP) cho vic lu tr. Principals v Roles Mt principal l mt identity (user, group, program, organization) c xc nhn ng (authentication). Mt identity c th c nh x (map) ti mt principal khc da vo security context c nh ngha cho ng dng. Do vy mt role c th c nhiu principal khc nhau khi truy cp n cc ti nguyn enterprise. Mt Role l vic nhm cc user c quyn ging nhau li vi nhau mc ng dng truy cp vo cc ti nguyn. Role tng t nh group, nhng group c nh ngha mc h iu hnh, role c nh ngha mc ng dng. Cc Role c nh x (map) ti cc group v user thc (c nh ngha tng h iu hnh) khi bean c trin khai. J2EE security authorization c role iu khin. v mi princical c map ti mt role duy nht phc v cho mc ch iu khin truy cp. Mt client trc tin cn c h thng xc nh v c xc nhn trc khi n c php truy cp vo cc ti nguyn.
Authority: Sau khi user c nh ngha, iu khin truy cp no c chp nhn. Integrity: D liu b mt nh th no? Cc mt khu v cc s credit card c c bo v khi s nh cp hay khng? Validity: Chng ta xc nhn mt identity ng nh th no? Audit: Ta c th pht hin ra l hng bo mt nh th no ? Cc mc tip theo s a ra cac cu tr li cho cc vn ni trn. Authentication (s xc nhn ng, chng minh xc thc) Authentication l k thut xc nhn mt identify trc khi kt ni ti mt ti nguyn. Sau khi mt user c xc nhn ng, mt cotext khi to s c container thit lp v duy tr, v n c kt hp vi user . gia cc chnh sch v k thut bo mt l giao thc Secure Sockets Layer (SSL) (hoc l HTTP over SSL [HTTPS]), c s dng m ha mt khu. iu ny gip bo mt hn. Qu trnh x l authentication c th c khi to cho cc web client tng Web, v cng c th bt u EJB container cho cc ng dng khch (J2EE client applications). C hai trng hp trn, container tng ng s truy cp cc kim tra security. Hnh bn di miu t vic xc nhn ng cho hai client khc nhau truy cp vo application server.
Authentication xc nhn ng identify ca user, thng thng qua JNDI hoc JAAS Authorization (s cho quyn, y quyn) Authorization l k thut chc chn rng cc principal (cc identity c xc nhn ng) c th truy cp vo cc component ng vi cc quyn ca n. Cc Role c chp nhn truy cp mt component c ch nh trong EJB deployment descriptor. Ngi trin khai nh x cc role ny vi cc user thc s bng cch s dng cc file deployment descriptor ca server. Sauk hi mt user c xc nhn ng (authenticated), container s gi li mt security context ca user. Khi no user truy cp
147 Nguyn Qung i
vo mt component c bo v, container s kim tra security trn cc role c ch nh trong deployment descriptor quyt nh cho php hay t chi user truy cp. Encryption (m ha) Digital Siging (ch k s) Auditing (kim tra qun l) v Filtering Auditing l k thut cho php ta thit lp cc hnh ng theo di v duy tr cc log cho cc hnh ng nhy cm da ra cc phn tch sau ny. N tr gip trong vic tm kim li v l hng bo mt. Filtering l k thut cho php ta cu hnh mt firewall ng hay t chi cc yu cu ca client da trn hostname hoc a ch IP, hoc giao thc c s dng trong kt ni ca client. Nn tng J2EE khng chun ha k thut auditing, n ph thuc vo s trin khai ca cc nh cung cp container. Administration (qun tr) Qun tr l mt vn phc tp v tn km ca bo mt. Nu l mt ngi qun tr, ta s phi qun l cc securiry realm, cc chnh sch bo mt. Cc nhim v khc l , y nhim cc quyn qun tr, chp nhn cho cc user t ng k, kim tra v trin khai cc h thng mi. J2EE khng c mt chun no cho vic qun tr ny, N ph thuc vo cc nh cung cp J2EE container cung cp cc cng c c s dng.
Hnh trn l mt trng hp ph bin nht trong Java EE security. Mt user i vo mt ng dng thng qua tng web. Tng web ly thng tin lm cng vic xc thc t user v xc thc nhng credentials c cung cp bng cch s dng JAAS da vo mt h thng bo mt nm bn di. Khi qu trnh xc thc thnh thng th s to ra mt user c gi tr, c gi l mt Principal. Ti thi im ny, principal nu trn c kt hp vi mt hoc nhiu role. i vi mi ti nguyn c bo v, application server kim tra principal/role c c php truy cp vo ti nguyn hay khng. Principal c truyn mt cch trong sut t tng web sang tng EJB nu cn thit.
6.25
Khi vit code cho client s dng EJB c to, ngoi tr vic phi thc hin ng cch bc to cc class, cc interface ra, ta cn ch khi bin dch v chy file client. Ta cn phi classpath tr n 2 file jar l : jboss-javaee.jar jbossall-client.jar ( jbossall-client.jar lm g th khng bit r lm ???) Nu sau khi add cc file ny vo ri m vn li hoc bo thiu g , th tt nht ta add lun c th vin ca application server vo. V ta cng cn phi ch n cc file .class cn s dng n bn pha client, c bit l hai interface : remote-interface.class v home-interface.class c bin dch bn pha server.
Sau to cc file ejb-jar v file jboss.xml nh cc enterprise bean khc. Ch nhng dng nh du mu . Ni dng file ejb-jar.xml
<?xml version="1.0"?> <!DOCTYPE ejb-jar PUBLIC '-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN' 'http://java.sun.com/dtd/ejb-jar_2_0.dtd'> <ejb-jar> <enterprise-beans> <entity> <ejb-name>StudentEJB</ejb-name> <home>day10.StudentHome</home> <remote>day10.Student</remote> <ejb-class>day10.StudentEJB</ejb-class> <persistence-type>Bean</persistence-type> <prim-key-class>java.lang.String</prim-key-class> <reentrant>False</reentrant> <env-entry> <env-entry-name>param/StudentDAOClass</env-entry-name> <env-entry-type>java.lang.String</env-entry-type> <env-entry-value>day10.StudentDAOPB</env-entry-value> </env-entry> <resource-env-ref> <resource-env-ref-name>jdbc/version_2.0</resource-env-ref-name> <resource-env-ref-type>javax.sql.DataSource</resource-env-reftype> </resource-env-ref> </entity> </enterprise-beans> <assembly-descriptor> <container-transaction> <method> <ejb-name>StudentEJB</ejb-name> <method-name>*</method-name> </method> <trans-attribute>Required</trans-attribute> </container-transaction> </assembly-descriptor> </ejb-jar>
Sau khi to sau cc file cu hnh server ch nh cc DataSource nh ta mong mun. n khi ta mun s dng DataSource to connection ta s lm nh sau.
Properties props = System.getProperties(); props.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory" ); props.put( Context.PROVIDER_URL, "host:1099" ); props.put( Context.URL_PKG_PREFIXES, "org.jboss.naming" ); Context context = new InitialContext(); DataSource ds = (DataSource) context.lookup("java:comp/env/jdbc/version_2.0"); Connection con = ds.getConnection();
Ch : Khi mt i tng ca lp InitialConext c to ra, cc thnh phn ca file cu hnh trong server (thng thng l file context.xml ) s c np vo v tr thnh thuc tnh ca i tng context va c to ra. Ngoi ra phng thc khi to ca lp InitialConext s dng mt s thng tin khc ly t cc thuc tnh ca h thng ( nm trong lp Properties) khi to i tng context. Nu nh cc thuc tnh ny khng c t li, th n s s dng nhng gi tr mc nh ca thuc tnh . Nh trong on code trn, mt s thuc tnh c t li l: Context.INITIAL_CONTEXT_FACTORY : cha thng tin cu trc th mc ca jndi service. Context.PROVIDER_URL : thng tin v tn host v cng lng nghe ca jidi service m ta s dng lookup i tng l hostname : 1099. Nu nh cc thuc tnh ny khng ch nh, th khi khi to i tng context n s s dng gi tr mc nh l localhost:1099 (i vi mt s server th cng c th thay i khc i) Chnh v vy nu nh s dng phng thc lookup() ca i tng context mt my khc vi my cha jndi service th phi t li cc gi tr nh on code trn. Cn nu s dng trn cng mt my vi my cha jndi service th khng phi t li thuc tnh, i tng s s dng nhng thuc tnh mc nh.
Gi tr t mt bng c th c map t ng sang mt i tng Student v ngc li. Nh vy, nu dng nh du th c nhiu cch nh t tn Class tng ng vi bng, t comment, properties,...Nh thy, tn bng v cc trng trong bng khng trng vi tn class v cc trng trong class. Mt cch l bt lp trnh vin phi t tn tng ng vi tn bng. Nhng nh vy s lm cng nhc, gii hn phm vi linh ng trong vic chn tn v mt d n thng rt nhiu class. Ngi ta hay dng n comment, properties, XML hn. Annotation l mt sng kin hin i, hiu qu, ngn gn, nhanh,...hn rt nhiu so vi cc phng php khc. Nh thit k Hibernate c th to ra cc Annotation cho framework ca ring h. Chng hn:
public @interface Hibernate_Table { String value(); } public @interface Hibernate_Field { String value(); }
Bn thy , ch cn nhn vo class ta cng bit c Bean to ra s y d liu vo u. Xin c im qua mt s li im di y: - Tng minh: Nhn vo class trn bn c th thy r mc ch. - n gin. - Trnh c rt nhiu li trong Runtime: Trong lp trnh, chng ta thng rt s li v runtime. Li c bo khu compile thng t nguy him v c gii quyt nhanh chng bi lp trnh vin nhng li trong runtime l nhng li khoai, kh nhn, mt nhiu thi gian tm ra nguyn nhn. Annotation l mt cch y cc li c php trong qu trnh config v khu compile. Ngha l compiler c th bo nhanh cho lp trnh vin mt s config sai trong lc dch. Nu dng cc phng php nh comment, properties hoc XML th cc li ny ch c bo trong runtime bi chng n thun l text data. - ng dng chy nhanh hn: Vic dng nh dng nh XML chng ta phi tn thi gian, b nh chuyn i t XML sang cc dng i tng c API d tng tc lnh nh DOM hoc SAX cng l mt tr ngi. Dng Annotation th i c rt nhiu. V khng
156 Nguyn Qung i
c nhiu thi gian nn ti khng th vit trnh by chi tit. C l nhng coder lm vic vi Annotation s t chim nghim c hiu qu m Framework h tr Annotation mang li. Ch Annotation c nhim v cng gn ging nh cc comment trong code ca mt chng trnh ng dng. C iu, comment l li ch thch cho nhng ngi c code d hiu hn v nhng ni dung trong on code , trnh bin dch s b qua cc comment ny trong qu trnh bin dch code. Cn annotation th khc, thay v dng gii thch cho ngi, annotation dng gii thch cho my. Annotation s ch thch cho my hiu cc hnh vi, ngha ca mt on code trong chng trnh hay mt on trong mt annotation khc.
S dng:
@Example public void anymethod() { -----------}
S dng:
@Example ("Hi ! How r you") public void anymethod(){ -------}
V d:
Multi - value hoc Full value: Cc annotation kiu ny c th c nhiu thnh phn trong n.
public @interface Example{ String showSomething(); int num; String name; }
S dng:
@Example (showSomething = "Hi! How r you", num=5, name="zulfiqar" ) public void anymethod{ // code here }
7.1.3 Cc annotation
JDK 5 c hai loi annotation: simple v meta. Simple annotation Loi ny ch c s dng ch gii code. Ta c th khng s dng loi ny to cc annotation theo mun. JDK5 c 3 loi simple annotation: Override: phng thc c ch thch mt annotation loi ny bt buc phi ghi ln phng thc ca lp cha, nu khng trnh bin dch s thng bo li Deprecated: Suppresswarings: Meta annatation c coi l ch gii ca cc annotation. N dng ch thch cc khai bo annotationtype
@Stateful
@Local
c dng ch gii mt interface, n ni vi EJB container rng EJB ny ch c th c truy cp cc b thng qua interface. c dng ch gii mt interface, n ni vi EJB container rng EJB ny c th c truy cp t xa thng qua interface. c dng ch gii cho interface hoc cho lp bean. Khi EJB s c truy cp t xa da vo web service, c ngha l n c th c truy cp bi cc client khng phi Java, v d nh cc ng dng Microsoft.net. c dng ch gii mt bin. N ni vi container khi to mt bin vi mt EJB no c tn nh c khai bo trc tn bin, trc khi bin ny c s dng. V d:
@EJB private PlaceBid placeBid;
@Remote
@WebService
@EJB
Trong v d ny, container s khi to mt bin c tn la placeBid vi EJB c tn l PlaceBid. @Resource @PersistenceContext @Remove Dng nh du kt thc mt workflow c m hnh ha bi mt stateful bean. Khi n t trn mt phng thc ca bean, n s bo cho container bit rng khng cn gi session ca bean vi client na sau khi phng thc ny c gi. Nu khng s dng annotation ny, container s i n khi timeout n mi kt thc workflow ni trn. Thng bo lp ny l message-driven bean. V d:
@MessageDriven( activationConfig = { @ActivationConfigProperty( propertyName="destinationName", propertyValue="jms/OrderBillingQu eue") } ) public class OrderBillingMDB implements MessageListener { ... public void onMessage(Message message) { ... } ... }
@ MessageDriven
Ch gii lp ang xt l mt entity c s dng trong lp bean kiu stateless v stateful c s dng trong lp bean kiu stateless v stateful Ch c lp bean kiu stateless session bean mi c ch gii annotation ny
trong thi gian chy (runtime). Khi , ta khng cn vit code cho vic lookup, v d dng thay i cu hnh chuyn i cc bean v cc ti nguyn ta cn V d nu ta mun truy cp vo EJB HelloUser t mt EJB hoc servlet khc, ta c th s dng on code sau:
... @EJB private HelloUser helloUser; void hello(){ helloUser.sayHello("Curious George"); } ...
7.4.1 Entity
Cc JPA entity ch nh d liu ca ng dng nh x nh th no ti c s d liu quan h. V d nh sau:
import import import import import import import import java.io.Serializable; java.sql.Date; javax.persistence.Column; javax.persistence.Entity; javax.persistence.Id; javax.persistence.Table; javax.persistence.GenerationType; javax.persistence.GeneratedValue;
//Marks POJO as entity @Entity //Specifies table mapping @Table(name = "BIDS") public class Bid implements Serializable { private Long bidID; private Long itemID; private Long bidderID; private Double bidAmount; private Date bidDate; // Contains entity ID @Id // Generates ID value @GeneratedValue(strategy = GenerationType.AUTO) // Specifies column mappings @Column(name = "BID_ID") public Long getBidID() { return bidID; } public void setBidID(Long bidID) { this.bidID = bidID; } 161 Nguyn Qung i
@Column(name = "ITEM_ID") public Long getItemID() { return itemID; } public void setItemID(Long itemID) { this.itemID = itemID; } @Column(name = "BIDDER_ID") public Long getBidderID() { return bidderID; } public void setBidderID(Long bidderID) { this.bidderID = bidderID; } @Column(name = "BID_AMOUNT") public Double getBidAmount() { return bidAmount; } public void setBidAmount(Double bidAmount) { this.bidAmount = bidAmount; } @Column(name = "BID_DATE") public Date getBidDate() { return bidDate; } public void setBidDate(Date bidDate) { this.bidDate = bidDate; } }
Mt s c im ng lu ca Entity: L mt lp Java n gin, khng cn k tha bt kt mt lp hay mt interface no. Thm ch n khng cn implement Serializable. Trong v d trn entity implement Serializable l th hin ca entity c th c s dng nh mt bn ghi d liu n gin, hoc c th c truyn nh l mt tham s ca mt li gi t xa. Bn than entity khng cung cp remote interface. Lp entity nh x (map) mt nh ngha d liu trong mt gin c s d liu quan h, l nh ngha bng quan h. Trong lc chy, mt th hin ca lp entity s nh x ti mt dng trong bng. Java Persistence API nh ngha mt cch nh x chun t lp entity ti bng c s d liu quan h, chp nhn cho ta iu khin vic nh x ny thng qua cc annotation hoc qua cc file XML. Entity phi c mt kha chnh, kha chnh ny c th l mt trng hoc nhiu trng ty theo ta nh ngha N cng c cc phng thc callback, persistence provider s gi nhng phng thc ny qun l entity Vng i ca Entity
162 Nguyn Qung i
Mc d khng phi c i tng c qun l bi container nh session bean v message-driven bean, nhng entity vn c vng i ca n. Bi v chng c qun l bi JPA, persistence provider nm gi cc du vt ca chng v thm ch cn t ng ng b ha trng thi ca entity vi c s d liu khi c th. EntityManager khng bit g v cc POJO c ch thch (cc entity c ch thch), cho n khi chng ta ni vi trnh qun l bt u i x vi POJO ging vi mt JPA entity. iu ny tri ngc vi cc POJO c ch thch nh ca session bean v message-driven bean, chng c container np v qun l ngay khi ng dng bt u. V li, cch thc hot ng mc nh ca EntityManager l qun l mt entity trong thi gian ngn nht c th. y li l mt s tri ngc vi cc bean c container qun l, n duy tr s qun l cho n khi ng dng b shutdown. Mt entity c qun l th c gi l attached, cn EntityManager dng khng qun l entity na th n c gi l detached. Mt entity cha bao gi c qun l th chng c gi l new hoc transient Hay ni cch khc, mt entity c bn trng thi sau trong vng i ca n: New lc ny th hin entity c to ra trong b nh, nhng vn cha c kt hp vi mt i tng (persistence identity) no trong c s d liu cng nh cha kt hp vi mt persistence context no. Nu ta c thay i trng thi ca th hin ny th cng khng nh hng g n c s d liu c. Managed th hin entity trng thi ny c mt i tng tng ng trong c s d liu, v hin thi cng c kt hp vi mt persistence context. Nhng thay i i vi th hin ny s ng b ha vi c s d liu khi transaction c commit hoc khi s ng b ha c yu cu bng cch gi phng thc flush(). Detached th hin trng thi ny c mt persistence identity nhng khng cn kt hp vi persistence context na. Removed. Th hin trng thi ny c mt persistence identity v hin thi c kt hp vi mt persistence context nhng b d nh l hy b t c s d liu (hnh nh l d liu tng ng ca th hin ny trong c s d liu b xa).
Khi ni v s qun l trng thi ca mt entity, c ngha l EntityManager chc chn rng d liu ca entity c ng b ha vi c s d liu. EntityManager m bo c vic ny bng cch lm hai vic. Th nht, ngay khi chng ta yu cu EntityManager bt u qun l mt entity, th n s ng b ha trng thi ca entity vi c s d liu. Th hai, cho n khi entity ny khng cn c qun l na, th EntityManager chc chn rng nhng thay i i vi d liu ca entity s c nh x vo c s d liu. EnittyManager thc hin thnh cng c vic ny l nh gi mt tham chiu i tng ti entity c qun l v kim tra nh k s lm mi d liu. Nu EntityManager tm thy d liu ca entity no b thay i, n s t ng ng b ha nhng thay i n c s d liu. EntityManager dng qun l entity khi entity b xa hoc l ri khi phm vi ca persistence provider. Mt entity c th c gn (attached) ti context ca EntityManager khi m ta truyn entity vo phng thc persist, merge, hoc refresh . Cng nh vy, mt entity tr thnh attached khi ta ly li bng phng thc find hoc mt truy vn trong mt transaction. Trng thi ca entity s quyt nh phng thc chng ta s dng. Khi entity ln u c khi to nh on code bn di, th n trong trng thi new hoc transient bi v EntityManager vn cha bit n tn ti.
Bid bid = new Bid();
Do vy th hin entity vn cha c qun l. N s c qun l nu nh phng thc persist ca EntityManager to ra mt bn ghi (record) mi trong c s d liu tng ng vi entity ny. y l cch t nhin nht gn mt entity ti context ca EntityManager.
manager.persist(bid);
Mt entity c qun l tr thnh detached khi n ra khi phm v, b hy, b tun t ha (serialized), hoc b nhn bn (cloned). V d th hin ca entity Bid s tr thnh detached khi giao dch nm bn di commit.
} private Bid save(Bid bid) { //persists entity instance entityManager.persist(bid); return bid; }
Cc hm API ca EntityManager
Cc kiu persistence context Persistence context c kt hp vi mt trnh qun l entity (entity manager), c th l mt trong hai kiu, cc kiu s quyt nh n thi gian sng ca context . Hai kiu l: transaction-scoped v extended . bn trong mt container ca J2EE, kiu transaction-scoped c s dng vi stateless session bean, cn extended c s dng vi stateful session bean. Context ca kiu transaction-scoped kt thc khi transaction kt thc. Khi , tt c cc entity trong persistence context ny tr thnh detached. Context ca kiu extended kt thc khi stateful session bean b container hy. Cc entity vn c qun l xuyn qua mt vi li gi cc phng thc nghip v (business) ca bean v c th c thay i thm ch bn ngoi cc transaction Khi s dng annotation @PersistenceContext, kiu context mc nh s l kiu transaction-scoped. Mun thay i kiu ca persistence context ta s dng thuc tnh type trong annotation @PersistenceContext. V d:
@PersistenceContext(type=PersistenceContextType.EXTENDED,uniteName= intro) private EntityManager manager;
Vi kiu extended, entity trong trng thi c qun l (managed) bi v persistence context ni kt nhiu transaction v ch kt thc khi bean b hy. Kiu persistence context no v session bean no l thch hp ph thuc vo mc ch ca vic s dng d liu entity: nu nh client ly nhiu entity v tng tc vi chng thng qua mt s li gi, th tt nht nn gi cc th hin ca entity trong stateful session bean; cn nu client ch truy cp n mt entity mt ln, th khng cn phi xy dng trng thi ca client, v stateless session bean c xem l thch hp hn. Cc phng thc life-cycle callbak Cng ging nh vi cc EJB, ta c th nh ngha cc callback cho cc entity, cc phng thc ny s c gi khi entity chuyn t trng thi ny sang trng thi khc. V cc phng thc ny c persistence provider gi. Cc phng thc ny s c ch gii bng cc annotation tng ng sau: @PrePersist @PostPersist @PreRemove @PostRemove @PreUpdate @PostUpdate @PostLoad V d: @PrePersist
void prePersist(){ System.out.println(prePersist called); }
Ngoi cch t annotation nh trn ngay trong lp entity, ta c th nh ngha mt lp Listener ring bit cho cc s kin life-cycle trn cc entity. Sau ta s s dng annotation sau trn lp entity ang xt:
@Entity @EntityListeners(AccountListener.class) public class Account ... 166 Nguyn Qung i
S khc bit gia hai kiu ny l: theo kiu lp Listener ta c th truyn vo phng thc callback tham s entity. Khi gi tham s ny s c t ti entity sinh ra s kin lifecycle.
t nht th ta cng phi cung cp thnh phn con persistence-unit cng vi mt thuc tnh name. File persistence.xml c th c nhiu nh ngha persistence unit, mi mt nh ngha nm trong mt thnh phn persistence-unit nh v d trn. Nu ch c mt persistence unit trong ng dng ca chng ta th ta cng khng cn phi tham chiu mt cch r rng trng unitName ca annotation @PersistenceContext. Nu file persistence.xml khng lp ra danh sch cc lp entity mt cch r rng, th tt c cc lp trong trong mt bn trong cng mt gi (archive) vi file persistence.xml s c xem nh l thnh vin ca persistence unit ny. Thnh phn persistence-unit c mt vi thuc tnh v thnh phn con khc. Tt c chng u l ty . Chng gm c : <description> <provider> <transaction-type> mt thuc tnh ca thnh phn <persistence-unit>. Gi tr ca thnh phn ny l JTA hoc RESOURCE_LOCAL. Mc nh l JTA <jta-data-source>,<non- jta-data-source >ch nh tn JNDI ca datasource c persistence provider s dng. Nu khng nh ngha, n s phi c ngi i trin khai nh ngha, hoc cung cp mc nh. <mapping-file>Thng tin OR-mapping cho cc lp entity trong persistence unit, c th to c t cc annotation, nhng cng c th ch nh trong file xml c tn orm.xml nm cng th mc META-INF vi file persistence.xml. Thnh phn ny c th ln danh sch mt hoc nhiu file XML mapping s dng cho vic OR mapping. Nhng file mapping ny ln danh sch r rng cc lp entity. Chng c th dng c trong persistence unit ang xt.
167 Nguyn Qung i
V d :
<jar-file>,<class> thnh phn ny lit k ra danh sch cc ti liu (archive) tm kim cc lp entity c th dng c trong persistence unit ang xt. <exclude-unlist-classes>Nu thnh phn ny c, th ch cc lp entity hoc cc ti liu (archive) c ln danh sch bng cch s dng cc thnh phn <mapping-file>,<jar-file>,hoc <class> s c th s dng c trong persistence unit ang xt. <properties> cc thuc tnh cu hnh ca nh cung cp c th cho persistence unit ang xt. Nu c cc thuc tnh m persistence provider khng nhn ra, th chng s b l i.
<persistence> <persistence-unit name="EntityBean"> <jta-data-source>java:/DefaultDS</jta-data-source> <properties> <property name="hibernate.hbm2ddl.auto" value="create-drop"/> <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/> </properties> </persistence-unit> </persistence>
V d:
@MessageDriven( name="ShippingRequestProcessor", activationConfig = { @ActivationConfigProperty( propertyName="destinationType", propertyValue="javax.jms.Queue"), @ActivationConfigProperty( propertyName="connectionFactoryJndiName", propertyValue=" jms/QueueConnectionFactory") @ActivationConfigProperty( propertyName="destinationName", propertyValue="jms/ShippingRequestQueue") } ) public class ShippingRequestProcessorMDB implements MessageListener { ... }
Trong trng hp comment th hai trn, khi ta khng khai bo interface messageListener trong ch gii @MessageDriven th lp bean ang xt phi implement interface trong code. V d
@MessageDriven( name="ShippingRequestJMSProcessor", messageListenerInterface="javax.jms.MessageListener") public class ShippingRequestProcessorMDB { 169 Nguyn Qung i
... }
Tng ng vi:
@MessageDriven(name="ShippingRequestJMSProcessor") public class ShippingRequestProcessorMDB implements MessageListener { ... }
7.7.2 @ActivationConfigProperty
public @interface ActivationConfigProperty { String propertyName(); String propertyValue(); }
V d
@MessageDriven( name="ShippingRequestProcessor", activationConfig = { @ActivationConfigProperty( propertyName="destinationType", propertyValue="javax.jms.Queue"), @ActivationConfigProperty( propertyName="connectionFactoryJndiName", ni vi container bit tn JNDI ca connection factory, y l ci to ra cc JMS connection cho MDB. propertyValue="jms/QueueConnectionFactory" ), @ActivationConfigProperty( propertyName="destinationName", propertyValue="jms/ShippingRequestQueue") } )
acknowledgeMode Cc Message t Queue s khng b b i cho n khi consumer tha nhn (acknowledge) chng. C nhiu kiu xc nhn message. Mc nh l kiu AUTO_ACKNOWLEDGE. Nhng ta c th thay i kiu no ta cho l hp l v d nh sau:
@ActivationConfigProperty( propertyName="acknowledgeMode", propertyValue="DUPS_OK_ACKNOWLEDGE")
subscriptionDurability Nu MDB ca ta ang lng nghe mt Topic, th ta c th ch nh topic subscription l lu bn (duarable) hay khng lu bn (nonduarable) V d:
@ActivationConfigProperty( propertyName="subscriptionDurability", propertyValue="Durable")
messageSelector
Timer createTimer(long duration, Serializable info) Timer createTimer(Date expiration, Serializable info)
Vi cc Interval Timer:
Timer createTimer(long initialDuration, long intervalDuration, Serializable info) Timer createTimer(Date initialExpiration, long intervalDuration, Serializable info)
Ta c th s dng phng thc Collection getTimers ly v tp hp cc timer c to ra bi cc cc enterprise bean khc m c l trong cc phn khc ca h thng. Timer Interface ny nm gi thng tin v cc timer c to ra trc bi cc enterpeise bean.
Serializable getInfo ()
172
Nguyn Qung i
Tr li i tng c enterprise bean truyn vo trc trong khi to i tng timer. i tng ny phi implement interface Serializable
Date getNextTimeout() Tr li thi im (mt i tng Date) mn hn tip theo s xy i vi i tng timer ny. long getTimeRemaining() Cng nh phng thc trn, nhng phng thc ny tnh bng n v mili-giy.
TimerHandle getHandle() Returns an instance of TimerHandle object which at a later time can be used to reconstruct the Timer object.
void cancel() Xa b mt i tng timer. Sau khi xa b, cc enterprise bean c ng k c c cc thng bo da vo thi gian (thng qua phng thc ejbTimeout() hoc annotation @Timeout) khng cn nhn cc s kin na. TimedObject
Cc enterprise bean implement interface ny c th nhn c cc thng bo da vo thi gian (time-based notifications) hoc cc callbacks trn cc i tng Timer. Phng thc ejbTimeout() s c container gi khi m thi gian n lc mn hn. i vi single action timer, th phng thc ejbTimeout() s ch c gi mt ln, nhng i vi cc interval timer, phng thc callback ny c gi c th nhiu ln. void ejbTimeout(java.ejb.Timer timer) C hai cch implement mt phng thc callback: Cch th nht: implement interface TimedObject
@Stateless @Remote class MyBeanImpl implements MyBean, TimedObject{ Public void ejbTimedout(Timer timer){ . . } }
Cch th hai: s dng annotation @Timeout, nu dng cch ny th khng cn phi implement interface TimedObject
@Stateless @Remote class MyBeanImpl implements MyBean{ 173 Nguyn Qung i
TimerHandle This interface is implemented by the container so that enterprise beans at a later point can use this handle to reconstruct the timer object. TimerHandle extends the Serializable interface. So, the clients may serialize the handle. Because of this, TimerHandle are local objects, hence it is illegal to pass this object as an argument to remote interfaces.
Timer getTimer()
PHN 8 JBOSS
8.1 Cu hnh Jboss
http://docs.jboss.org/jbossweb/3.0.x/config/context.html
PHN 9 MT S VN KHC
9.1AOP Aspect Oriented Programming 9.1.1 nh ngha AOP
Ai chng bit AOP l t vit tt ca Aspect Oriented Programming, my bc thch dch ra ting Vit th bo rng AOP l phng php lp trnh hng khi cnh. C l theo cch hiu y nn khng t ln ti nhn thy my ci slide kiu tr chi ghp hnh trong cc seminar v AOP hi hc i hc. Lc th OOP cn cha lnh hi ht ch ng ni AOP, bi vy xem xong cng chng hiu chi c. :bbpcuoi3:n by gi khi hiu c nhng khi nim c bn, ti thch gi AOP l A P hn, khi dch ra chi cho li thi. Trong bi vit ny, ti s gii thiu v AOP v cch s dng AOP vi Spring.NET. - Trong khi xy dng cc chng trnh ng dng, chng ta s c rt nhiu nhng vn lin quan n phn mm m ta phi quan tm. Ti xin ly v d sau y: ti phi vit mt chng trnh upload files, folders ln mt server. Vn kh n gin phi khng? Nu object c chn l file th ch vic upload ci file ln. Cn nu object c chn l mt folder th upload ht cc file con bn trong folder , sau li duyt cc folder con ca n v gi hm quy. H h, nhng cng vic khng ch c vy, ti c yu cu phi thm nhiu ci linh tinh khc nh phi kim tra xem 1 folder, 1 file c tn ti cha, phi kim tra xem user hin ti c quyn hay khng, phi ghi mi thao tc ghi xa hay thng bo li xung file log, phi hin th process bar, phi th ny, phi th kia. Kt qu l hm upload ca tui tr thnh mt ng bi nhi, phn code phc v cho vic c, ghi file ch c vi dng trong khi nhng code cho cc vic kim tra, thng bo li, hin th process bar chim rt nhiu ni dung ca mt hm. Ngoi ra code ca ti b ph thuc ln nhau nhiu ni, chng hn nh nhng x l c ghi file do cn phi update process trn process bar nn n li phi reference n project winform, ng l ri hn ch RI. - Trong chng trnh ny, vn quan tm chnh ca ti l upload folder/files v bn cnh s c mt s vn khc cn phi thc hin. Cc bn c th thy rng trong khi vit phn mm, ta thng gp hai loi concern: core concerns v cross-cutting concerns: + Core concern: l requirement chnh ca chng trnh, v d nh upload file/folder, c danh sch user, + Cross-cutting concerrns: l nhng x l ph cn c thc hin khi core concern c gi. Cross-cutting concerns thng xy ra nhiu ni trong chng trnh, n c th xy ra trong nhiu layer ca ng dng, nhiu class, nhiu method; chng hn nh tnh ton thi gian chy cc hm c ghi database, ghi log li mi ln cp nht thng tin user, - T lu, ngi ta ngh ra chiu thc AOP gii quyt vn trn. AspectOriented Programming(AOP) cn c gi l Aspect-Oriented Software Development (AOSD) l mt nguyn tc thit k gip tch ri cc yu cu hay cc vn c quan tm (separation of concerns) trong chng trnh thnh cc thnh phn c lp v t tng tnh uyn chuyn cho chng trnh. Separation of concerns l mt trong nhng k thut c quan tm nht trong ngnh phn mm. Ngi ta cho rng nhng vn tng t nhau nn c gii quyt trong mt unit of code. Khi lp trnh th tc, mt unit of code l 1 function, 1 method. Cn trong lp trnh hng i tng th unit of code l mt class.
injections. V th, nhiu ti liu ni rng AOP gip module ha ng dng, bin chng trnh thnh cc module hot ng c lp, mi module lm mt chc nng ring, t d bo tr v nng cp. - vai tr ca ngi thit k phn mm, chng ta nn a ra cc cch lm n gin nht. tha mn yu cu ca chng trnh, ngi ta s to ra thnh phn chnh ca chng trnh (gm cc class/component/method); cc chc nng b sung nh loging, tnh ton performance, .. cng s c xem xt to ra. V do cc chng nng b xung ny khng phi l yu cu chnh ca h thng nn ngi ta s c yu cu bt tt chng theo mun. Vy lm th no c th to ra chng trnh c th linh hot c nh th? Cu tr li l Separate of concerns. - vai tr ca ngi lp trnh, chng ta c hai vn cn quan tm l x l logic chnh ca chng trnh v cc x l logic cho nhng thnh phn ph. Do tt nhin s phi to ra cc class/method cho cc yu cu thc s, v to ra nhng class/method khc c lp thc hin cc yu cu ph kia. Tt c cc class/method ny c th c kt hp lc runtime theo mun. Chng hn nh trong mi trng test, ngi ta c th bt chc nng log, o c performance theo di nhng khi ci t trn mi trng Production, cc chc nng ph ny c th c disable. V trn nguyn tc, trong code ca nhng x l logic chnh s khng c code thc hin cc yu cu ph. - Tm li, ta c th lit k mt s li ch nh sau: + Chc nng chnh ca chng trnh khng cn bit n cc chc nng ph khc + Cc chc nng ph c th c thm tht, bt tt lc runtime ty theo yu cu + Cc thay i, sa li, nng cp nu c i vi cc chc nng ph s khng nh hng n chng trnh chnh. + H thng s uyn chuyn v gim thiu tnh ph thuc ln nhau ca cc module.