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

DANH MC T VIT TT V THUT NG

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

JSE RPC RMI JNDI OQL JMS DTP

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

1.2Ci t Tomcat v thit lp bin mi trng


o

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

Chng ta test kim tra server Tomcat nh sau

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

1.3Cu hnh cho Tomcat


Cc bc chung khi cu hnh server: Xc nh th mc ci jdk : t bin mi trng JAVA_HOME Ch nh cng: mc nh Tomcat l cng 8080 To cc cu hnh ty chnh khc

1.3.1 Thay i cng ca server Tomcat


o

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

1.3.2 Enabling servlet reloading


Cng vic ny bo vi Tomcat kim tra ngy thay i cc file class ca cc servlet c yu cu v np li chng k t khi chng c np vo trong b nh ca server.Vic ny s c cht nh hng n hiu xut thc thi trong tnh hung trin khai ca server v vy m mc nh chng s b tt. Tuy nhin nu ta khng bt n ln th ta s phi restart li server hoc np li web application mi ln chng ta bin dch li mt servlet m c np vo trong b nh ca server. bt servlet reloading, m file install_dir/conf/server.xml, thm vo thnh phn con DefaultContext bn trong thnh phn Service v thit lp gi tr true cho thuc tnh reloadable. Cch d nht lm vic ny l tm n dng comment sau: <!-- Define properties for each web application. ... ... --> V chn dng sau bn di <DefaultContext reloadable="true"/> Lu , hy to mt bn backup cho file server.xml trc khi thc hin cng vic ny.

1.3.3 Enabling the ROOT Context


ROOT Context l ng dng web mc nh trong Tomcat. N rt thun tin chng ta s dng trong ln u tm hiu v servlet v Jsp ( mc d chng ta s s dng nhng ng dng web ca chng ta khi chng ta c kinh nghim hn). Nhng ng dng web mc nh c chp nhn trong Tomcat phin bn 4.0 v mt s phin bn ca 4.1 . Nhng phin bn 4.1.24 th n b b i. chp nhn li n, chng ta b comment ca dng sau trong file install_dir/conf/server.xml:
7 Nguyn Qung i

<Context path="" docBase="ROOT" debug="0"/>

1.3.4 Turning on the Invoker Servlet


Invoker Servlet cho php chng ta chy cc servlet m trc tin khng cn thay i file WEB-INF/web.xml trong ng dng web ca chng ta.Thay v th chng ta ch cn th cc servlet vo trong WEB-INF/classes v s dng URL http://host/servlet/ServletName (cho Web application mc nh) hoc http://host/webAppPrefix/servlet/ServletName (cho cc ng dng web c to mi custom web applications). Invoker Servlet rt thun tin trong khi chng ta mi hc v ngay c trong giai on pht trin ban u ca d n thc t. C iu trong thi gian gn y, vn v bo mt nh hng n Invoker Servlet. N c th b s dng thy c code ca cc servlet t cc trang Jsp (ko hiu lm). V vy m phin bn Tomcat 4.1.12 disable n trong cu hnh mc nh.Tuy nhin trong tng lai gn d n Jakarta c l s khc phc c vn ny. Khi chng ta hc, chng ta c th s dng n m khng phi lo lng v vn ni trn, v ta khng cn phi kt ni vi internet. chp nhn invoker servlet, ta b comment ca thnh phn servlet-mapping sau file install_dir/conf/web.xml. Ch tn file l web.xml ch khng phi l server.xml, v khng lm xo trn file tomcatspecific web.xml trong th mc WEB-INF ca mi ng dng web. 1. Ta nh url nh sau: localhost/servlet/Package_Name.Class_Name (tt nhin khi ng Tomcat) 2. Nu chy ko c l do cu hnh chy servlet trong Tomcat b kha. Ta phi lm nh sau: * M file web.xml trong th mc conf. * Tm t kha invoker bng cch n Ctrl + F, ri b dng ch thch <!-- v --> trc v sau tab <servlet> ...invoker ...</servlet>, <servlet-mapping> .. invoker .. </servlet-mapping> <!-- (xa dng ny i) <servlet> <servlet-name>invoker</servlet-name> <servlet-class>org.apache.catalina.servlets.InvokerServlet </servlet-class> <init-param> <param-name>debug</param-name> <param-value>0</param-value> </init-param> <load-on-startup>2</load-on-startup> </servlet> --> (xo dng ny i) <!-- (xa dng ny i) <servlet-mapping> <servlet-name>invoker</servlet-name> <url-pattern>/servlet/*</url-pattern> </servlet-mapping> --> (xo dng ny i)

8 Nguyn Qung i

1.4 Deploy ng dng trn Tomcat c lp vi Netbean


i vi cc bn lp trnh web bng JSP hay servlet th thng hay xi server Tomcat v n d xi v nh. Khi build xong mt project hay n gin bn c mt vi file JSP v mun chy n trn Tomcat mt cch nhanh chng m khng cn phi nh vo cc tools nh Eclipse hay Netbeans th y l mt s cch m ti xin gii thiu vi cc bn. Mc ch: Ch ca bi ny cp n chng ta trin khai mt gi ng dng web nh th no vo server Tomcat. Bn cnh , chng ti a ra cch thc cu hnh cho server tomcat trn my computer bnh thng khng l thuc vo Netbeans. y l mt vn m mi ngi lp trnh phi nm vng vit hng dn ci t cho ngi i trin khai ng dng web Cu trc ca ng dng web

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

1.4.1 Trin khai bng th mc


Chp th mc cha project hay cc file JSP vo th mc webapps

1.4.2 Trin khai bng file war


Tng t nh cch 1, ch cn chp file war vo th mc webapps.

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

Chp gi war vo th mc webapp, y chng ti chp tp tin JQueryValidation.war vo

Chng ta thy trn server console

11 Nguyn Qung i

Trong th mc webapp chng ta thy server to th mc tng ng vi ni dung

Chng ta testing trn Browser nh sau

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

Kt qu trn mn hnh server console


13

Nguyn Qung i

1.4.3 Trin khai bng nh x alias


Vo th mc conf\Catalina\localhost m file manager.xml -> 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 ti lu li l training.xml. By gi ta chnh sa file training.xml ny, dng <Context docBase sa li ng dn n th mc mun trin khai. V d ti sa li l docBase=D:\Training :

Vy l xong, by gi hy startup tomcat v g http://localhost:8080/training/ l c th chy c th mc D:Training. Chc cc bn thnh cng!

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.

1.5Cache ca server Tomcat

Cache ca server c lu tr ti v tr

1.6Ch khi ci Tomcat


Sau khi ci xong jdk, ta gii nn tomcat ra mt th mc nhng ch khng gii nn tomcat ra th mc nm trn C ( gy ra li HTTP 500 khng hiu sao, c l do s phn quyn ca win 7 trn ci h iu hnh)

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.

2.2S dng JDBC v kim tra Connector/J hot ng cha


S dng JDBC Mun kt ni ti c s d liu v s dng JDBC API thao tc vi d liu ta cn phi lu hai vn sau. Th nht l URL c s d liu trong JDBC theo mu jdbc:subpro-tocol:subname, trong subprotocol bin din c s d liu m ta mun kt ni ti v d nh mysql, oracle, odbc, cn subname th cung cp thm thng tin v vic kt ni ti u v kt ni nh th no. V d v cc Database URL:

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

jdbc:mysql://host_name:port/dbname - MySQL Connector/J JDBC Driver.

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

np driver bng cch s dng phng thc Class.forName()trong code:


Class.forName("com.mysql.jdbc.Driver").newInstance();

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.

Chng trnh trn s dng TCP/IP kt ni vo h c s d liu MySQL.

2.3Khc phc li khng ci c MySQL Server

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:

Hoc ti phn start service th b bo li nh sau:


18 Nguyn Qung i

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.

2.4Hng dn s dng Navicat Create , Backup , Restore Database


Ban thng s dung phpmyadmin cho vic tng tac vi MySQL , Navicat cung co chc nng tng t nh phpmyadmin , tuy nhin no con co nhiu tinh nng ma
19 Nguyn Qung i

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

y l cc bc c bn Create , Backup , Restore Database .

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

3.1Abstract v Interface , Extends v Implements


im chung ca Interface v Abstract class l u khng cho php to instance, tc l mun to 1 object t chng th phi thng qua cc lp k tha. Interface v Abstract class th hin cho tnh a hnh ( Polymorphism ) trong OOP. Interface : L mt Abstract Class cha cc bin( variables ), hng ( constant ) v phng thc ( method ). Tt c cc khai bo trong Interface u mc nh l Abstract nn c hay khng t kha Abstract cng c. c im ca cc phng thc trong 1 Interface l chng c khai bo nhng khng c nh ngha tc l ch c tn ch khng c thn, v chng lun phi khai bo Public. abstract interface taychan // Abstract c hay ko cng OK { final int dodaitay = 50; // Final s dng cho khai bo hng public void sudungtay(); // Method khng c nh ngha public void sudungchan(); } Ni v interface ta c th hiu d dng nh sau : i vi mi s vt trong cuc sng, chng c mt s im nhn b ngoi th ging nhau, nhng bn cht bn trong li hon ton khc nhau.Tng hp cc im Nhn b ngoi ging nhau ny, ta cho ra mt Interface. V d nh phng thc Nhy, con ngi nhy th khc m con mo nhy th khc. Cho nn khi ta s dng Interface, ta bt buc phi nh ngha li method. s dng Interface, ta phi dng t kha Implements [Interface A], dch n gin l l Trin khai, th hin cho vic bt buc phi nh ngha method (vit code bn trong thn ca method). Abstract Class : L class cha c abstract method ( khng c phn thn ) v instance method ( c phn thn ). Cc abstract method c khai bo vi t kha Abstract, cc method ny khi s dng ti lp k tha s phi c nh ngha li. Ni v abstract class ta c th hiu d dng nh sau :

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.

abstract class shout { abstract void ShoutLoud(); void ShoutSoft(){ } }

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.

3.2<interface> instanceName = new <Class > ( )


Trng hp 1 Gi s ta c mt interface l StudentDAO. Interface ny cha cc phng thc thao tc vi c s d liu. V d nh sau
package day10; import java.util.Collection; public interface StudentDAO { public void create(String id, String firstName, String lastName, String address) throws StudentDAOSysException; public void remove(String studentId) throws StudentDAOSysException; }

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

import import import import

java.util.*; javax.naming.*; java.sql.*; javax.sql.*;

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

By gi khi ta khai bo mt i tng s dng cc phng thc ca lp trn


StudentDAO dao = new StudentDAOPB();

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

Trng hp 2 Ta c hai interface l A v B nh sau


public interface A { String method_1(); String method_2(); }

public interface B { String method_3(); String method_4(); }

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.

3.3Phng thc hashCode v equals


Gii thiu: - Trong java, c cc kiu d liu nh int, char, String, Date c dng sn ta ch cn s dng. Nhng i khi chnh cc i tng ny c xy dng sn, khin cho ta hay b lm ln gia cc khi nim nh: bng nhau, ln nh hn khi ta t xy dng cc i tng.
30 Nguyn Qung i

- 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.5Server component model


Vic pht trin cc i tng pha bn server kh hn vit cc GUI hay cc component pha client. Bi v ngoi vic phi vit cc business application logic, cc developer phi quan tm n c cc vn mc h thng nh l a lung, truy cp c s d liu, qun l hiu qu cc ti nguyn, cc giao dch, bo mt, cc legacy system, Mt server component model (architecture) s cung cp nhng h tr cho cc component pha server, lm n gin ha vic trin khai cc component pha server v gip cho cc developer tp trung vo cc business application logic.

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

Thread trong Java

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

3.7.1 nh ngha v start mt thread


Mt ng dng khi to mt instance ca Thread, cn phi cung cp code s chy trong thread . C 2 cch lm iu ny:

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.

3.7.2 Trng thi ca Thread


Mt Thread bao gm 4 trng thi sau:

New Runnable Running Blocked/Waiting/Sleeping Dead

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.

Trng thi Dead: Mt Thread ri vo trng thi Dead vi mt trong 2 l do sau:


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.

3.7.3 Quyn u tin(Priority)


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 join()


38 Nguyn Qung i

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

S dng file jar

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 3.9.1 nh ngha

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

3.9.3 JTA - Java Transaction API


JTA ch nh mt giao thc Java chun gia transaction manager v cc thnh phn khc trong mt distributed transaction : application, application server, resource manager. Ch l JTA vn c th c s dng truy cp vo mt ti nguyn n, lc ny n s t ng chuyn sang ch giao dch a phng (local transaction) v s dng giao thc xc nhn mt pha (one-phase commit protocol)
41 Nguyn Qung i

Quan h gia cc thnh phn c m t nh hnh bn di

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

- Thrown if the transaction manager encounters an unexpected error

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.

3.9.4 Ty chn XACT_ABORT


Cu chuyn s rt n gin nu khng c s xut hin ca ty chn XACT_ABORT. y l ty chn mc kt ni, ch c tc dng trong phm vi kt ni ca bn. XACT_ABORT nhn hai gi tr ON v OFF (OFF l gi tr mc nh). Khi ty chn ny c t l OFF, SQL Server s ch hy b lnh gy ra li trong transaction v vn cho cc lnh khc thc hin tip, nu li xy ra c nh gi l khng nghim trng. Cn khi XACT_ABORT c t thnh ON, SQL Server mi c x ng nh mong i khi gp bt k li no n hy b ton b transaction v quay lui tr li nh lc ban u. V d:
-- to bng vi rng buc ct i khng c cha gi tr 2 CREATE TABLE #t1(i INT, CONSTRAINT ck1 CHECK (i<>2) ) -- dng gi tr mc nh XACT_ABORT = OFF -- SET XACT_ABORT OFF BEGIN TRAN INSERT #t1 SELECT 1 INSERT #t1 SELECT 2 -- vi phm rng buc INSERT #t1 SELECT 3 COMMIT SELECT * FROM #t1 i --1 3 (2 ROW(s) affected)

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.6 Xc nhn hai pha


Trong lnh vc c s d liu, xc nhn hai pha (ting Anh: two-phase commit protocol, hay 2PC) l mt thut ton phn tn m bo cc nt khc nhau ca mt h thng phn tn xc nhn mt giao dch. Trong qu trnh xc nhn, nu mt trong cc nt ca h thng ph nhn giao dch th ton b giao dch s b hu b. Giao dch ch c hon thnh khi tt c cc nt ca h thng xc nhn n. Qu trnh xc nhn bao gm 2 pha l: - Gi yu cu: nt iu phi (coordinator) gi cu truy vn yu cu xc nhn giao dch ti tt c cc nt tham gia, sau i tr li t cc nt . - Xc nhn giao dch: khi nt iu phi nhn c tr li ng ca tt c cc nt tham gia, n s gi li thng ip xc nhn ti tt c cc nt tham gia mt ln na hon tt vic giao dch, v giao dch c xc nhn thnh cng. Trong trng hp nt iu phi nhn c t nht mt tr li ph nh giao dch t mt nt tham gia no , hoc nu sau khong thi gian nht nh vn cha nhn c ton b tr li t cc nt tham gia, th nt iu phi s gi thng ip hu b vic xc nhn ti tt c cc nt tham gia, v vic xc nhn giao dch tht bi.

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.

3.9.8 Cc li truy xut ng thi


Mt d liu cp nht (Lost update)
46 Nguyn Qung i

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

3.9.9 Isolation Level


H QTCSDL dng c ch kho m bo mi giao tc hon ton c lp vi cc giao tc khc mc d cc giao tc c th c thc hin bt c lc no. Tnh tun t (serialization) l mt tnh cht quan trng m bo tnh c lp ca cc giao tc. Tuy nhin nhiu giao tc c th c thc hin khng hon ton c lp vi nhau. Mc chp nhn cc xung t ca giao tc c gi l mc ca tnh c lp. Mc c lp thp cho php tng kh nng thc hin ng thi cc giao tc nhng phi tr gi cho tnh ng n ca d liu. Ngc li, mc ca tnh c lp cao bo m tnh ng n ca d liu nhng ngn cn cc x l d liu ng thi. Cc mc ca tnh c lp (t thp n cao). READ UNCOMMITTED : l mc c lp thp nht, d liu khng c kha v c th thay i trc khi kt thc giao tc. Khng thit lp Shared Lock trn nhng n v d liu cn c.Do khng phi ch khi c d liu (k c khi d liu ang b lock bi giao tc khc). Vn to Exclusive Lock trn n v d liu c ghi, Exclusive Lock c gi cho n ht giao tc. u im: - Tc x l rt nhanh. - Khng cn tr nhng giao tc khc thc hin vic cp nht d liu Khuyt im: C kh nng xy ra mi vn khi x l ng thi : - Dirty Reads - Unrepeatable Reads - Phantoms - Lost Updates READ COMMITTED : l mc c lp mc nh ca SQL Server, d liu c kha dng chung (shared lock), nhng c th thay i trc khi kt thc giao tc. To Shared Lock trn n v d liu c c, Shared Lock c gii phng ngay sau khi c xong d
47 Nguyn Qung i

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)

ISOLATION LEVEL Read uncommitted

DIRTY NON READ REPEATED

PHANTOM

LOST UPDATE

48

Nguyn Qung i

Read committed Repeatable read Serializable Isolation level Read Uncommitted Read Committed Repeatable Read Serializable

Dirty reads Non-repeatable reads Phantoms -

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

JDBC 3.10.1 Kt ni ti mt DataSource

Ti liu tham kho [ 8], [ 9].

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.

3.10.2 Cc cch to i tng Connection


Mun to mt kt ni vi c s d liu ta c nhiu cch: s dng cc file cu hnh ca server hoc s dng trc tip code trong application. Nu theo cch s dng file cu hnh (declarative approach) th ta s c th tch bit c vic cu hnh c s d liu vi code, khi d c thay i tham chiu ti mt c s d liu khc ta cng khng cn thay i code. Ta s s dng phng thc sau
Connection Conn = datasource.getConnection()

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

3.10.3 Commit and Rollback example


thao tc vi mt transaction trong java ta c th s dng JDBC. V d sau y m t phng thc commit() v phng thc rollback().
//STEP 1. Import required packages import java.sql.*; public class JDBCExample { // JDBC driver name and database URL static final String JDBC_DRIVER = "com.mysql.jdbc.Driver"; static final String DB_URL = "jdbc:mysql://localhost/EMP"; // Database credentials static final String USER = "username"; 50 Nguyn Qung i

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);

} System.out.println(); }//end printRs() }//end JDBCExample

3.10.4 Savepoint example


//STEP 1. Import required packages import java.sql.*; public class JDBCExample { // JDBC driver name and database URL static final String JDBC_DRIVER = "com.mysql.jdbc.Driver"; static final String DB_URL = "jdbc:mysql://localhost/EMP"; // Database credentials static final String USER = "username"; static final String PASS = "password"; public static void main(String[] args) { Connection conn = null; Statement stmt = null; try{ //STEP 2: Register JDBC driver 52 Nguyn Qung i

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

3.10.5 Batch Update


Nh cc bn bit, thc hin tc ng ln DB khi lp trnh vi JDBC, ta c th to ra i tng ca cc interface Statement, PreparedStatement v CallableStatement tc ng ln DB. Tuy nhin, mi khi cn tc ng ln DB l ta li tin hnh to ra 1 Connection, thc hin tc ng ln DB ti thi im tng ng, sau ng Connection li. Hy tng tng vi 1 thao tc no ca chng trnh, vd: thao tc insert thng tin ca n Account (vd: n=20 accounts) th vn cng 1 cng vic insert vo DB ta s tin hnh to ln lt 20 Connection chuyn d liu t Client vo DB. Nu trong h thng c nhiu my tnh cng thc hin cng vic loi ny ti 1 thi im DB ca chng ta s gp phi vn l lu lng truyn v DB tng ln ng k. _Cha k n gi thit trong khi nhp 3 accounts th cht nh ra l account u tin cha chnh xc cn iu chnh li, vy l phi to li Connection. _Batch Update l mt k thut m Java cho php chng trnh c th thc thi ng thi nhiu lnh tc ng ln DB vi 1 Connection. Trong chng trnh bn c th to ra 1 Connection gn vi 1 Statement , sau tch hp cc lnh cn thit trc khi tc ng ln
54 Nguyn Qung i

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 Statement Ti s demo insert accounts vo bng Logon.


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('admin','admin','admin','admin')"; String strSQL1 = "insert into Logon values('user','user','user','user')"; Statement st = con.createStatement(); st.addBatch(strSQL); st.addBatch(strSQL1); st.executeBatch(); con.commit(); st.clearBatch(); con.close(); } 55 Nguyn Qung i

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(); }

S dng CallablStatement Store Procedure:


create procedure insertAccount @username varchar(50), @password varchar(50), @fullname varchar(50), @role varchar(50) as BEGIN insert into Logon values( @username, @password, @fullname, @role ) END

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.

4.1Copy ROOT WEB APP ca Tomcat vo trong Eclipse


Eclipse forgets to copy the default apps (ROOT, examples, etc.) when it creates a Tomcat folder inside the Eclipse workspace. Go to C:\apache-tomcat-7.0.8\webapps, Rclick on the ROOT folder and copy it. Then go to your Eclipse workspace, go to the .metadata folder, and search for "wtpwebapps". You should find something like youreclipse-workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps (or .../tmp1/wtpwebapps if you already had another server registered in Eclipse). Go to the wtpwebapps folder, R-click, and paste ROOT (say "yes" if asked if you want to merge/replace folders/files). Then reload http://localhost/ to see the Tomcat welcome page.

4.2To mt ng dng web mi trong Eclispe


Ti liu tham kho [2] Ch : File config cp trong ti liu [2] chnh l file web.xml trong th mc WEB-INF Tomcat bn 7.0 khng th triu gi c servlet (khng hiu sao, cha tm hiu k)

4.3Cu trc th mc ca web trong eclipse


Here is a quick summary of the most commonly used folders in Dynamic Web Projects in Eclipse.

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

PHN 5 JSP V SERVLET


Tham kho ti liu [1]

5.1Cu hnh file web.xml cho cc servlet


Khi to mt servlet, ta cn khai bo cc servlet c to trong file web.xml ng dng c th hiu v tm ra cc servlet . C hai yu t cn quan tm, th nht l ni lu tr lp servlet, th hai l mapping ca servlet gip ta c mu url khi truy cp n servlet t trnh duyt V d: ta c servlet LogonServlet c ct d ti vovanhai.wordpress.com.LogonServlet nm trong th mc WEB-INF/classes (hoc th mc build/classes trong Eclipse). Ta gi servlet ny thng qua url ProjectName/LogonServlet. Ta s phi thm trong file web.xml on m sau:
<servlet> <description></description> <display-name>LogonServlet</display-name> <servlet-name>LogonServlet</servlet-name> <servlet-class>vovanhai.wordpress.com.LogonServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LogonServlet</servlet-name> <url-pattern>/LogonServlet</url-pattern> </servlet-mapping>

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.

5.2Bin dch v trin khai mt s servlet n gin


Cc servlet c vit nh nhng lp java thng thng v c lu di dng file .java, gi s nh file HelloServlet.java Cc file .java ny s c bin dch bng b bin dch javac c file HelloServlet.class Ch : khi bin dch nu xy ra li th kim tra li CLASSPATH ( trong trng hp ny l cc file servlet-api.jar v jsp-api.jar) Cc file .class ny s c th vo th mc WEB-INF/classes (xem mc 1.3.4) Chng ta s truy cp cc servlet ny theo URL http://host/servlet/HelloServlet (hoc http://host:port/servlet/HelloServlet) Ch : Khi thc hin vic ni trn phi kim tra file conf/web.xml xem chp nhn invoker servlet cha (xem mc 1.3.4) Khi servlet c gi trong mt pakage, qu trnh bin dch v trin khai servlet ln server c cht t thay i URL ny ch l mt ng dn n mt servlet c bit ( c gi l Invoker Servlet ) chy servlet vi tn c ch nh. Bn thn code ca servlet c th bt c v tr no m server thng s dng ( thng thng WEB-INF/classes cho cc file class c nhn ring l hoc WEB-INF/lib cho cc file JAR cha cc servlet). S dng URL mc nh s thun tin khi ta mi bt u, nhng thc t ta c th ch nh v thay i khc i, ta c th ng k URL ring bit cho mi servlet

60 Nguyn Qung i

5.3Qu trnh hot ng ca Servlet


1. 2. 3. 4. 5. Nhn d liu hin c gi n t pha client. Nhn d liu HTTP request n c gi n t pha client. Thao tc vi cc d liu nhn c Tr v cc kt qu (d liu hin) cho client. Gi nhng d liu HTTP response n ti cho client.

5.4 Vng i ca Servlet


Ch c mt th hin ca mt servlet c to ra phc v cho cc yu cu c gi n t pha client. Vi mi yu cu ca user, server s to ra mt thread mi phc v cho yu cu . Phng thc init Phng thc init c gi khi servlet c to ra ln u tin, v n khng c gi li mi khi cc user sau yu cu servlet ny. Servlet c th c to ra khi mt user ln u tin gi n url tng ng vi servlet , hoc khi server c bt u, ph thuc vo vic ta ng k servlet vi web server nh th no. Mc nh l n s c to ra khi c mt ngi dung u tin gi n url tng ng (hnh nh th). C hai kiu init: mt kiu khng c tham s, mt kiu c tham s truyn vo l i tng ServletConfig. Kiu u tin c s dng khi servlet khng cn c cu hnh ci t no thay i t server n server. Kiu ny c nh ngha nh sau:
// Initialization code...

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

Kt qu khi ta gi servlet trn s nh hnh sau:

5.5 Ly d liu t Form


Khi ly d liu t Form Data ( cc d liu hin gi n t Client) ta cn ch n gi tr ca n. C mt s k t khi ta nhn, mun chuyn i sang text ca HTML th cn dng nhng k hiu c bit (HTML specific charecters),v d nh du < tng ng vi &lt. Xem phng thc ServletUtilities.filter.

5.6S dng Jakarta Common component t ng chuyn i d liu


Trc tin download cc component cn dng v trang http://commons.apache.org/ Ri thc hin theo mt trong hai trng hp sau. Nu ta ang 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. S dng phng thc tnh BeanUtils.populate ( xem file BeanUtilities.java ) Mun s dng c lp ny ta phi thm cc file JAR cn thit nh cch trnh by trn. Cc file l: commons-beanultis.jar, common-collections.jar, common-logging.jar

5.7 Http request header


c cc request header bng cch gi phng thc getHeader ca HttpServletRequest cng vi tn ca header cn gi. N tr v mt String nu nh header c trong request hin ti, v null trong trng hp ngc li. Trong HTTP 1.0 th tt c cc request header l khng bt buc, cn trong HTTP 1.1 th ch mi Host l b yu cu. V vy phi lun kim tra gi tr null khi s dng request header.
63 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.8Nn d liu tr v trnh duyt t server


Listing 5.3 from chng 05. File LongServlet.java and GzipUtilities.java

5.9HTTP_STATUS_CODE 5.10Http response header


respone.sendRedirect(String url) respone.sendError(int http_status_code,String message) response.setIntHeader("Refresh", 30); response.setHeader("Refresh", "5; URL=http://host/path/"); response.setDateHeader("Expires", currentTime + tenMinutes); response.setContentType("application/vnd.ms-excel");

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.

5.13Expression Language (EL)


Lm n gin ha vic truy cp vo java code ( h tr t bn jsp 2.0 tr ln) Vi bn 1.2 file web.xml s c dng nh sau, v mc nh l n ngn chn hot ng ca EL <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> </web-app> Cn vi bn 2.0 th mc nh EL c kch hot nh sau: <?xml version="1.0" encoding="ISO-8859-1"?> <web-app 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 web-app_2_4.xsd" version="2.4"> </web-app> Vi bn servlet 2.4 (JSP 2.0) ta c th s dng thnh phn el-ignored trong thnh phn jsp-property-group quyt nh trang no b l i khi nh hng ca EL <?xml version="1.0" encoding="ISO-8859-1"?> <web-app 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 web-app_2_4.xsd" version="2.4"> <jsp-property-group> <url-pattern>/legacy/*.jsp</url-pattern> <el-ignored>true</el-ignored> </jsp-property-group> </web-app> Nh v d trn th tt c cc file ( cc trang ) nm trong th mc legacy u b ngng kch hot EL. EL cung cp cho ta nhng truy cp ngn gn v d dng c ti cc bin. Nn i khi ngi lp trnh khng mun s dng nhng thnh phn scripting chun ca java ( standard scripting elements). Ta c th s dng thnh phn scripting-invalid gii hn li nhng thnh phn ny trong nhng trang m ta mun. <?xml version="1.0" encoding="ISO-8859-1"?> <web-app 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 web-app_2_4.xsd" version="2.4"> <jsp-property-group> <url-pattern>*.jsp</url-pattern>
67 Nguyn Qung i

<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 &#36; (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

PHN 6 EJB 2.0


Ti liu tham kho [6] - [10].

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.

6.2Cc dch v ca J2EE


Ni chung, J2EE container cung cp 3 loi dch v chnh: common vertical services, common horizontal services, v common deployment tools.

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.

6.3EJB container ( EJB Server)


EJB container ch l mt chng trnh chy trn server v thc thi cc EJB specification. N cung cp cc loi mi trng ph hp cho vic chy cc enterprise component. EJB container l mt thit b tru tng qun l cc th hin ca cc EJB component. Mt container l mt h thng chy (runtime system) cho mt hoc nhiu EJB m cung cp cc dch v nh giao dch, sercurity, v qun l vng i. Mt container bao gm code v cc cng c sinh (generate) code ring bit vi tng enterprise bean ring bit. N cng cung cp cc cng c trin khai mt EJB v cc phng tin gim st v qun l ng dng. Cc th hin EJB chy bn trong mt EJB container. Cotainer cung cp cc dch v mc h thng (system-level services) cho cc EJB ca n v iu khin vng i ca chng. Bi v Container iu khin hu ht cc vn mc h thng (system-level issues), nn lp trnh vin EJB khng phi a nhng vn ny vo cc phng thc business ca enterprise bean. Container ny thc thi rt nhiu nhim v khc nhau v d nh: Transaction Management: EJB container cho php chng ta qun l giao dch, chp nhn cc dch v giao dch, mt s thc thi mc thp ca qun l giao dch hoc kt hp. Container s dng Java Transaction APIs din t cc dch v giao dch. JTA, mt giao din mc cao c s dng iu khin cc giao dch. Security: JSE tp trung vo vic lm th no c c mt mi trng bo mt hn. Enterprise bean thm thnh phn ny vo cung cp mt phng php bo mt trong sng r rng hn. Khi vic truy cp vo cc bean c th c bo mt ch bng cch ta cung cp cc thuc tnh bo mt. Cn hn l ta phi lm vic vi cc API bo mt. Resource and Life Cycle Management: EJB container qun l cc ti nguyn ging nh cc kt ni c s d liu (database connections),cc lung (threads) v cc socket thay mt cho cc enterprise bean. Container to, hy, ng k i tng, cng nh th ng ha chng. Container cng c kh nng s dng li chng khi c yu cu. Remote Accessibility: Mt client trn my t xa c cha JVM c th gi mt enterprise ang chy trn my ch. h tr vic truy cp t xa, cc containers s dng cng ngh RPC ( remote procedure call). Cc phn mm c pht trin da trn quan nim hng i tng th RPC c xem nh l RMI (Remote Method Invocation). Concurrency Control: Concurrency control cn thit phi bit c bn v v s va
72 Nguyn Qung i

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.

6.4 Enterprise JavaBean


Mt enterprise bean l mt component pha server (server-side component) dng thc hin business logic ca mt enterprise application v lun gn lin vi cc quy lut ca kin trc enterprise bean.(server component model) Enterprise bean c s dng vi nhiu nhim v nh tng tc vi client, gi li cc session cho cc client, ly v gi c s d liu, kt ni ti server, Enterprise javabean sng trong mt EJB container mt mi trng chy (runtime environment) trong mt J2EE server. EJB container cung cp nhiu dch v h tr cc enterprise bean. Kin trc cc enterprise javabean l mt kin trc component (component architecture) cho vic pht trin v trin khai cc ng dng phn tn da vo component. Kin trc ny lm cho vic vit cc ng dng d dng hn: ngi pht trin ng dng khng cn phi hiu cc giao dch mc thp, chi tit qun l trng thi, a lung, connection pooling, v nhiu API mc thp phc tp khc. Sau y l cc c im ca EJB: - They contain business logic that operates on the enterprises data. - They depend on a container environment to supply life-cycle services for them. EJB instances are created and maintained by the container. - They can be customized at deployment time by editing the deployment descriptor. - System-level services, such as transaction management and security, are described separately from the enterprise bean. - A client never accesses an enterprise bean directly; the container environment mediates access for the client. This provides component-location transparency. - The EJB is designed to be portable across EJB servers provided by different vendors. - They can be included in an assembled application without requiring source code changes or recompilation of them. - Beans are always single threaded; you never have to write thread-safe code. You design your threads as single-threaded components, and the EJB container handles
73 Nguyn Qung i

multiple client requests by load balancing and instantiating multiple instances of the single-threaded components.

6.5Cc vai tr trong EJB


EJB specification nh ngha cc vai tr trong vic pht trin (development), lp rp (assembly), v trin khai (deployment) cc ng dng enterprise. Kin trc EJB n gin ha vic pht trin cch h thng business phc tp bng cch chia vic x l ra lm 6 vai tr ring bit, mi ci c mt nhim v v mc tiu c th.

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

Look inside EJB

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

6.8.1 Session Bean


Session bean x l cc nghip v business logic nh workflow, thut ton, hay cc business rule. Cc c im ca Session bean Tng trng cho mt cuc i thoi gia client v server. Khng th chia s vi cc client khc nhau ti cng mt thi im. V cng khng th gi c cng mt client bng cch s dng nhiu lung (thread) C th s dng c transaction v security. Khng trc tip biu din d liu trong database. Tuy nhin n c th truy cp v cp nht d liu thay cho client. C thi gian sng tng i ngn. Trng thi (d liu) ca n khng c lu tr vo c s d liu.Chng tn ti cho n khi client cn tn ti. Chng b hy (remove) khi client remove chng hoc khi EJB container shutdown hoc crash. Cc loi Session bean C hai loi session bean l stateless v stateful. Vic cc business process c th gm mt hoc nhiu yu cu (request). V d cng vic xc nhn mt user l mt business process c mt yu cu. Khi ta c th dng stateless session bean. Cn trong trng hp business process c nhiu yu cu nh l vic kim tra account balance, cc component phi gi li du tch ca cc request c lm, phc v cho nhng nhim v sau . Khi ta phi s dng cc stateful session bean. Instance Pool Vic to v hy cc enterprise bean l vic tn km. gim chi ph EJB container duy tr mt instance pool cho kiu stateless session bean. Ti thi im bt u, container to cc th hin c ch nh bn trong file delpoyement descriptor ca stateless session bean. EJB container s s dng li cng mt th hin (instance) phc v cho cc yu cu ca client. K thut ny lm ni bt tnh hiu qu v thi gian phn hi ca cc tng tc client. S dng mt s nh cc th hin trong pool c nh ngha t trc phc v mt lng ln cc client l cch lm tt tng hiu qu cng vic v qun l ti nguyn. Instance pool cng c gi l chnh sch lu tr (caching policy). Ch :
77 Nguyn Qung i

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()

Phng thc ny c gi khi container th ng ha (passivate) mt th hin

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.

6.8.2 Entity Bean


Entity bean dng thao tc vi c s d liu. N c dng to ra cc i tng i din cho c s d liu hin thi, lun c cp nhp ging vi c s d liu. Bnh thng mi entity bean c mt bng nm bn di trong mt c s d liu quan h, v mi mt th hin ca bean tng ng vi mt dng trong bng . V s lu bn (persistence), trng thi ca entity bean trong b nh c ng b ha vi d liu m n biu din trong c s d liu. Nhiu client c th cha s cc entity bean. Bi v cc client ny c l mun thay i cng mt c s d liu, quan trng l cc entity bean lm vic trong cc giao dch (transaction). Entity bean lm nhng nhim v nh chn, cp nht, hy b cc record trong c s d liu. c im ca Entity bean Entity bean c nhng c im nh sau Cung cp mt ci nhn i tng ca d liu trong database. V d nh trong hnh bn di, th hin ca StudentEJB cung cp mt ci nhn ca mt record trong bng student trong c s d liu. Container ng b ha mt cch trong sut d liu gia b nh ca server v c s d liu.

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.

Cc loi Entity Persistence Bean Managed Persistence (BMP).

Container Managed Persistence (CMP).

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( )

Tr li nhng ti nguyn m ta yu cu phc v client v d nh l ng cc kt ni socket li.

Business

Vit cc business logic trong phng thc ny

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( )

Vng i ca mt entity bean

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)

6.8.3 Message Driven Bean


Giao tip gia client v server c th l ng b hoc khng ng b. Trong giao tip ng b, client s b tm dng hot ng hay b kha li cho n khi cc i tng bn pha server hon tt vic x l. Trong thao tc khng ng b, client gi nhng message ca n v khng cn i bn nhn nhn c v x l message . Session bean v entity bean x l cc message theo kiu ng b, c ngha l khi client gi mt phng thc trn mt th hin (instance) ca cc bean ny th client s b kha li v i cho n khi th hin trn thc thi xong cng vic ca mnh th client mi c th hot ng tr li. Cc message-driven bean l cc stateless component c container gi mt cch khng ng b khi mt tn nhn (message) JMS c a n ng ni. Mt messagedriven bean nhn mt message t mt JMS destination, nh l queue hoc topic, v thc hin business logic da vo ni dng ca message nh kiu nhn v x l mt thng bo t pha client. C th ni th ny, nu nh hai bn giao tip vi nhau qua mt dch v JMS, bn gi tin nhn l publicer bn nhn v x l tin nhn l consumer th mt MDB c th c coi nh l mt consumer. V d khi mt ngi mua hang mun t mua online mt ci g . Mt Order bean c th thng bo cho mt creadit verification bean . Mt credit verification bean c th kim tra credit card ca ngi mua hng trong mt background, v gi tin nhn thng bo chp nhn. Bi v thng bo ny l khng ng b, nn ngi mua hang khng cn phi i vic x l background ny hon thnh. Vng i ca MDB

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

6.9.1 File ejb-jar.xml


Tham kho http://www.vipan.com/htdocs/ejb-jar.xml.html EJB deployment descriptor l file cu hnh chung EJB. Ch l tn file bt buc phi l ejb-jar.xml v file ny c t trong th mc META-INF. Ni dung v ngha cc thnh phn trong file ny khng thay i d ta trin khai EJB trn bt c mt application server no V d v mt file ejb-jar.xml s c khai bo c th nh sau:
<?xml version="1.0"?> <!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 1.1//EN" "http://java.sun.com/j2ee/dtds/ejb-jar_1_1.dtd"> <ejb-jar> <--Ni dung miu t cc EJB, c th c hoc khng <description> --> 90 Nguyn Qung i

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>

V bean s truy cp vo Datasource nh sau:


InitialContext ictx = new InitialContext(); DataSource ds = ictx.lookup("java:comp/env/jdbc/AccountExplDs");

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

Ta s phi khai bo nh sau:


<relationships> <ejb-relation> <--Khu vc khai bo mt quan h --> <--t tn ca quan h --> <ejb-relation-name>Order-LineItems</ejb-relation-name> <ejb-relationship-role> <--Khu vc khai bo mt vai tr trong quan h --> <--t tn ca vai tr --> <ejb-relationship-role-name> Order-has-lineitems </ejb-relationship-role-name> <--Khai bo vai tr ca Entity trong quan h ang xt: One|Many--> <multiplicity>One</multiplicity> <--Khai bo tn ca Entity Bean gi vai tr ang xt --> <relationship-role-source> <ejb-name>OrderEJB</ejb-name> </relationship-role-source> <--Khai bo trng quan h --> <cmr-field> <cmr-field-name>lineItems</cmr-field-name> <cmr-field-type>java.util.Collection</cmr-field-type> </cmr-field> </ejb-relationship-role> <ejb-relationship-role> <ejb-relationship-role-name> lineItem-belongsto-Order </ejb-relationship-role-name> <multiplicity>Many</multiplicity> <cascade-delete/> <relationship-role-source> <ejb-name>OrderLineItemEJB</ejb-name> </relationship-role-source> <cmr-field> <cmr-field-name>order</cmr-field-name> </cmr-field> </ejb-relationship-role> </ejb-relation> </relationships>

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.

6.9.2 File jboss.xml


Ngoi tr file ejb-jar.xml, ng dng yu cu mt s thng tin c gn vo (bind) vi mi trng hoc nh cung cp c th. Trong lc trin khai mt EJB ti mt application server c th, ta cn c mt verdor deployment descriptor c th cung cp nhng thng tin v vic nh x (map) tn mt pakage ti mt tn JNDI nh th no, iu khin security v persistence. V d nh file jboss.xml i vi server Jboss, file weblogic-ejb-jar.xml i vi server Bea WebLogic. Cch khai bo trong ni dung ca cc file ny cng ph thuc vo tng nh cung cp khc nhau. Mt v d v cc file jboss.xml.
<?xml version="1.0" encoding="UTF-8"?> <jboss> <enterprise-beans> <entity> <-- Tn khai bo y phi ging vi tn EJB c nh ngha trong file ejb-jar.xml --> <ejb-name>StudentEJB</ejb-name> <-- Container s s dng tn ny ng k home interface ca EJB vi JNDI service --> <jndi-name>day10/Student</jndi-name> <-- Container s s dng tn ny ng k local home interface ca EJB vi JNDI service --> <local-jndi-name>day10/StudentLocal</local-jndi-name> <-- Tag ny tng ng vi tag <resource-env-ref> trong file ejb-jar.xml, on khai bo ny mi thc s l c s container ng k tn ca cc ti nguyn ngoi vi JNDI --> <resource-env-ref> <-- tn ny phi ging vi tn c nh ngha trong file ejb-jar.xml --> <resource-env-ref-name>jdbc/styleDb</resource-env-ref-name> <!-- Container s s dng tn ny ng k ti nguyn vi JNDI service --> <jndi-name>java:/version_2.0</jndi-name> </resource-env-ref> </entity>

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

6.9.3 File jbosscmp-jdbc.xml


http://docs.jboss.org/jbossas/docs/Server_Configuration_Guide/4/html/The_CMP_Engi ne-The_jbosscmp_jdbc_Structure.html Cng l mt vendor deployment descriptor khc dng phc v cho cc CMP. Trong bao gm cc vic cu hnh cc quan h CMR. Tn ca cc file ny cng nh ngha ca ni dung cc thnh phn ph thuc vo tng nh cung cp application server. V d nh server Jboss l jbosscmp-jdbc.xml. Mt v d ca file jbosscmp-jdbc.xml.
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE jbosscmp-jdbc PUBLIC "-//JBoss//DTD JBOSSCMP-JDBC 3.0//EN" "http://www.jboss.org/j2ee/dtd/jbosscmp-jdbc_3_0.dtd"> <jbosscmp-jdbc> <!-- Khai bo datasoure CMP s dng --> <defaults> <datasource>java:/version_2.0</datasource> <datasource-mapping>mySQL</datasource-mapping> <create-table>false</create-table> <remove-table>false</remove-table> <pk-constraint>true</pk-constraint> <preferred-relation-mapping>foreign-key</preferred-relation-mapping> </defaults> <enterprise-beans> <entity> <!-- Tn khai bo y phi ging vi tn c nh ngha trong file ejb-jar.xml --> <ejb-name>OrderEJB</ejb-name> <!-- Tn ca bng tng ng trong c s d liu --> <table-name>orders</table-name> <!-- mapping cc tn trng v cc tn ct tng ng trong bng --> <cmp-field> <field-name>orderId</field-name> <column-name>order_id</column-name> </cmp-field> <cmp-field> <field-name>studentId</field-name> <column-name>student_id</column-name> </cmp-field> ... </entity> <relationships> <!-- Khu vc khai bo cc quan h --> <ejb-relation> <!-- Khai bo tn quan h phi ging vi tn quan h c nh ngha trong file ejb-jar.xml --> <ejb-relation-name>Order-LineItems</ejb-relation-name> <foreign-key-mapping/> <!-- Khu vc khai bo cc vai tr trong quan h ang xt --> <ejb-relationship-role> <!-- Khai bo tn vai tr ging vi tn vai tr c nh ngha trong file ejb-jar.xml --> <ejb-relationship-role-name> Order-has-lineitems 98 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.

6.11Cc bc pht trin v trin khai EJB


1. nh ngha tt c cc phng thc business trong component interface. C th c remote interface hoc local interface hoc c hai, ph thuc vo cch thc m ta thit k.Local interface l truy cp vo EJB t cng mt JVM. 2. nh ngha home interface ca EJB, bao gm tt c cc phng thc qun l vng i ca EJB nh l to, tm kim, hy b. 3. Trin khai (implement) cc phng thc business trong lp bean. Cc phng thc callback khc cng c yu cu cho mt s loi EJB. 4. To deployment descriptor (nh l file ejb-jar.xml,) khai bo kiu ca EJB, transaction, security. 5. Bin dch cc lp v cc interface EJB. 6. Gi cc i tng EJB c bin dch vo mt file JAR cng vi cc file deployment descriptor. 7. Trin khai (deploy) EJB vo trong EJB container.

6.12Stateless Session Bean - EJB2


I. Thit k 1. To remote interface

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

100 Nguyn Qung i

- Remote interface cn phi:


C visibility modifier l public ( c th triu gi t xa) Tha k interface javax.ejb.EJBObject. Cc phng thc tru tng y phi throws java.rmi.RemoteException.

V d y ta to 1 phng thc c t nghip v thao tc vi cc s da trn operator c cung cp.


package calc; import java.rmi.RemoteException; import javax.ejb.EJBObject; public interface CalcRemote extends EJBObject{ public double DoCalculate(double a, double b, char operator) throws RemoteException; }

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.

101 Nguyn Qung i

- Home interface cn phi:


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; }

3.To lp EJB - Lp EJB ci t:


Tt c cc business method khai bo trong remote interface. Cc phng thc dng cho container (phng thc callback).

- Lp EJB cn phi:

Lp EJB phi tha k interface javax.ejb.SessionBean.

package calc; import javax.ejb.SessionBean; import javax.ejb.SessionContext; 102 Nguyn Qung i

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:

103 Nguyn Qung i

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 );

+ To JNDI naming context nh mt giao din gia client v JNDI.


Context ctx = new InitialContext();

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,+');

f) Code hon chnh


import import import import import java.util.Properties; javax.naming.Context; javax.naming.InitialContext; javax.rmi.PortableRemoteObject; calc.*;

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(); } } }

II. Trin khai

105 Nguyn Qung i

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

jnp-client.jar jboss-common-client.jar concurrent.jar jboss-client.jar jboss-serialization.jar jboss-remoting.jar jbosssx-client.jar jboss-transaction-client.jar

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:

3. To th mc META-INF To cc file deployment descriptor trong th mc ny: a. File ejb-jar.xml c ni dung


<?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>Calculator</ejb-name> <home>calc.CalcHome</home> <remote>calc.CalcRemote</remote> <ejb-class>calc.CalcBean</ejb-class> <session-type>Stateless</session-type> <transaction-type>Container</transaction-type> </session> </enterprise-beans> </ejb-jar>

b. File jboss.xml c ni dung


<?xml version=1.0 encoding=UTF-8 ?> <jboss> <enterprise-beans> <session> 106 Nguyn Qung i

<ejb-name>Calculator</ejb-name> <jndi-name>calc/Calculator</jndi-name> </session> </enterprise-beans> </jboss>

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:

108 Nguyn Qung i

6.13Stateless Session Bean EJB2 Xc nhn ng nhp


I. M hnh lm vic ca stateless session bean:

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);

4. Client s dng remote home interface to ra i tng remote sign-on session. V d:


SignOn signOn = (SignOn)signOnHome.create();

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:

III. Hin thc Stateless Session Bean To file hamy/SignOn.java vi ni dung


package hamy; import java.util.*; import java.rmi.*; import javax.ejb.*; public interface SignOn extends EJBObject { public boolean validateUser(String login, String password) throws InvalidLoginException, RemoteException;

To file vi hamy/SignOnHome.java ni dung


package hamy; 110 Nguyn Qung i

import java.rmi.RemoteException; import javax.ejb.*; public interface SignOnHome extends EJBHome { SignOn create() throws CreateException, RemoteException;

To file vi hamy/SignOnEJB.java vi ni dung:


package hamy; import java.util.*; import javax.ejb.*; import javax.naming.*; public class SignOnEJB implements SessionBean { private SessionContext ctx; private Context environment; public SignOnEJB() { print("The container created this instance.\n"); } /* Callback methods */ public void setSessionContext(SessionContext c) { print("The container called the setSessionContext method "); print("to associate session bean instance with its context.\n"); ctx = c; } public void ejbCreate() throws CreateException { print("The container called the ejbCreate method\n"); print("so that we can initialize the bean instance.\n"); try { InitialContext ic = new InitialContext(); environment = (Context) ic.lookup("java:comp/env"); } catch (NamingException ne) { throw new CreateException("Could not look up context"); } } /* * Methods ejbActivate and ejbPassivate are * * not used by stateless session beans */ public void ejbActivate() { } public void ejbPassivate() { } 111 Nguyn Qung i

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 {

To file hamy/InvalidLoginException.java vi ni dung:


package hamy; public class InvalidLoginException extends Exception { public InvalidLoginException() { super(); } public InvalidLoginException(Exception e) { super(e.toString()); } public InvalidLoginException(String s) { super(s); } }

To file META-INF/ejb-jar.xml vi ni dung


112 Nguyn Qung i

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

To file jboss.xml c ni dung sau:


<?xml version="1.0" encoding="UTF-8"?> <jboss> <enterprise-beans> <session> <ejb-name>SignOnEJB</ejb-name> <jndi-name>hamy/SignOn</jndi-name> </session> </enterprise-beans> </jboss>

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

import import import import import import import import import

java.util.Properties; javax.naming.Context; javax.naming.InitialContext; javax.rmi.PortableRemoteObject; javax.*; java.awt.*; java.awt.event.*; javax.swing.*; hamy.*;

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();

props.put( Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFact ory" ); 115 Nguyn Qung i

"org.jboss.naming" );

props.put( Context.PROVIDER_URL, "localhost:1099" ); props.put( Context.URL_PKG_PREFIXES,

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

6.14Stateful Session Bean EJB2 - ShoppingCart


I. Khi nim 1. Stateful Session Bean - Mt phin giao dch gia client v bean cn gi l mt conversation. Mt Stateful Session Bean c kh nng lu li trng thi ca conversation trong cc bin thc th ca lp bean xuyn qua cc request ca conversation. Mt v d quen thuc l shopping cart dng lu tr cc mn hng chn xuyn qua hng lot request chn hng (hoc loi b hng chn) ca mt session mua hng. Nh vy, Stateful Session Bean cha trong n business logic v trng thi conversation ca client. - Stateful Session Bean c thit k phc v cho mt[1] client trong i sng ca n thng qua mt EJB Object. - Stateful Session Bean khng c kh nng t lu gi (persistent) ging nh entity bean. lu gi c trng thi ca conversation nh trn, Stateful Session Bean c 3 trng thi:

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.

- Chn cch ci t Stateful Session Bean khi:


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.

117 Nguyn Qung i

- 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; } }

B. To client truy xut Staful Session Bean 1. nh v home interface


System.setProperty(java.naming.factory.initial, org.jnp.interfaces.NamingContextFactory); System.setProperty( java.naming.provider.url, 192.168.0.3:1099 ); System.setProperty( java.naming.factory.url.pkgs, org.jboss.naming );

+ To JNDI naming context nh mt giao din gia client v JNDI.


Context initial = new InitialContext();

2. Tm i tng thng qua JNDI


Object objref = initial.lookup( cart/CartJNDI );

3. Thu hp (narrow) tham chiu


CartHome home = ( CartHome )PortableRemoteObject.narrow( objref, CartHome.class );

4. Sinh ra mt thc th EJB


shoppingCart = home.create( Bill Gates, 123 ); 122 Nguyn Qung i

5. Triu gi cc business method (phng thc nghip v) 6. Code hon chnh


import import import import import import import import import import import cart.Cart; cart.CartHome; helper.BookException; java.awt.*; java.awt.event.*; javax.swing.*; java.util.Vector; java.util.Enumeration; javax.naming.Context; javax.naming.InitialContext; javax.rmi.PortableRemoteObject;

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>

- Chun b jboss.xml, trong th mc META-INF.


<?xml version="1.0" encoding="UTF-8"?> <jboss> <enterprise-beans> <session> <ejb-name>Calculator</ejb-name> <jndi-name>calc/Calculator</jndi-name> </session> <session> <ejb-name>SignOnEJB</ejb-name> <jndi-name>hamy/SignOn</jndi-name> </session> <session> <ejb-name>Cart</ejb-name> <jndi-name>cart/CartJNDI</jndi-name> </session> </enterprise-beans> </jboss>

2. ng gi EJB - Dng cng c jar ca JDK ng gi EJB


C:\EJB\StatefulSession>jar cvf cart.jar cart/*.class helper/*.class META-INF/*.xml added manifest adding: cart/Cart.class(in = 330) (out= 234)(deflated 29%) adding: cart/CartEJB.class(in = 1705) (out= 867)(deflated 49%) adding: cart/CartHome.class(in = 336) (out= 206)(deflated 38%) adding: helper/BookException.class(in = 292) (out= 209)(deflated 28%) adding: helper/IdVerifier.class(in = 452) (out= 334)(deflated 26%) adding: META-INF/ejb-jar.xml(in = 359) (out= 191)(deflated 46%) adding: META-INF/jboss.xml(in = 203) (out= 133)(deflated 34%)

- Kt qu gi cart.jar c ni dung nh sau:


125 Nguyn Qung i

cart Cart.class CartEJB.class CartHome.class helper BookException.class IdVerifier.class META-INF ejb-jar.xml jboss.xml MANIFEST.MF

3. Chy JBoss server - Chy %JBOSS_HOME%\bin\run.bat trong mt console.


[INFO,MailService] Mail Service Mail bound to java:/Mail [INFO,MailService] Started [INFO,ServiceControl] Started 47 services [INFO,STDOUT] JBoss-2.4.10 Started in 0m:2s.734

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

[INFO,J2eeDeployer] J2EE application: file:/C:/JBoss/deploy/cart.jar is deployed.

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.15u nhc im ca cc loi Session Bean


Stateless Session Bean u im: pooling (vng sng) ca n rt n gin nn ch cn mt vi th hin bean thc hin cc li gi ca client. Do kh c th b overload hn t c kh nng b mt cc conversation hn khi s dng stateless session bean. Nhc im: Vi mi ln gi phng thc, client-specific data cn phi c a n stateless bean. Bi v d liu phi truyn ti mi ln gi, nn nhiu lc s c s tc nghn (congestion) trn mng, lm gim bng thng cho nhng qu trnh x l khc. C th c tr ngi trong input/output khi s dng stateless session. Stateful Session Bean u im: D liu khng phi a ti stateful session mi ln gi phng thc Tt c cc ti nguyn biu din trong mt bean c lu tr trong mt database khi bean b passivate. Do khi bean c active, th hin (instance) mi s c tt c cc ti nguyn c lu tr. Nhc im: Khi s dng stateful session, trng thi ca bean phi b passivate v active gia cc li gi phng thc. iu ny dn n tr ngi v I/O. Client Conversation lun c tr (cache) khi stateful session bean c s dng.C l c mt vn l Conversation with client b mt u. ( Since client conversation is always )

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

BMP CMP 6.18.1 Select method

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.

6.18.2 Abstract Persistent Schema


Abstract Persistent Schema nh ngha cc trng persistence, cc trng quan h (relationship) v quyt nh phng thc truy cp chng. Abstract Schema khng ph thuc vo s thc thi ca entity bean trong mt container ring bit hay mt c s d liu ring bit. Gi s mt CMP tn l OrderEJB c code nh sau:
public abstract class OrderEJB implements EntityBean { protected EntityContext ctx; public abstract String getOrderId(); public abstract void setOrderId(String orderId); public abstract String getStudentId(); public abstract void setStudentId(String studentid); public abstract java.sql.Timestamp getOrderDate(); public abstract void setOrderDate(java.sql.Timestamp timestamp); public abstract String getStatus(); public abstract void setStatus(String status); public abstract double getAmount(); public abstract void setAmount(double amount); ... }

on sau khai bo mt abstract persistent schema cho OrderEJB ni trn :


<entity> <ejb-name>OrderEJB</ejb-name> . . . <cmp-version>2.x</cmp-version> <abstract-schema-name>Order</abstract-schema-name> <cmp-field> <field-name>orderId</field-name> </cmp-field> <cmp-field> <field-name>studentId</field-name> </cmp-field> 129 Nguyn Qung i

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

6.18.3 EJB Quey Language


EJB Query Language cho php ta ch nh nhng truy vn i vi cc entity bean CMP m khng ph thuc vo c s d liu, cng nh rt portable. EJB Query Language s dng mt cu trc ging vi SQL, hng i tng ch nh cc truy vn cho phng thc finder v phng thc select ca CMP entity bean. Ly trng hp trn lm v d, EJB Query Language ca phng thc findByStatus (String status) s nh sau:
SELECT OBJECT(o) FROM Order AS o WHERE o.status = ?1

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.

130 Nguyn Qung i

6.18.4 Container-Managed Relationships


Container-Managed Relationships dng xy dng cc quan h gia cc CMP entity bean. Unidirectional relationships y l quan h theo mt hng duy nht. C ngha l mt bean ny c trng quan h m tn hay phn nhn dng ca n (identify) c kt hp vi bean ch cn li, nhng bean cn li th khng c phn nhn dng trong bean ny. V d, Mt lp c nhiu sinh vin, trong bng sinh vin c trng class_id bit c sinh vin ny thuc lp no. Nhng trong bn lp li khng c ct student_id. Hay ni cch khc, sinh vin bit thng tin v lp, nhng lp khng bit thng tin v sinh vin. Bidirectional relationship Quan h ny th c c hai chiu qua li. C hai bng trong quan h u bit thng tin v nhau. Quan h One - One

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); }

132 Nguyn Qung i

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); }

OrderEJB v LineItemEJB khai bo trong EJB deployment descriptor nh sau.


<ejb-jar> <enterprise-beans> </enterprise-beans> <relationships> <!ONE-TO-MANY bi-directional : Order LineItem > <ejb-relation> <ejb-relation-name>Order-LineItems</ejb-relation-name> <ejb-relationship-role> <ejb-relationship-role-name> Order-has-lineitems </ejb-relationship-role-name> <multiplicity>one</multiplicity> <relationship-role-source> <ejb-name>OrderEJB</ejb-name> </relationship-role-source> <cmr-field> <cmr-field-name>lineItems</cmr-field-name> <cmr-field-type> java.util.Collection </cmr-field-type> </cmr-field> </ejb-relationship-role> <ejb-relationship-role> <ejb-relationship-role-name> LineItems-belongs-to-order </ejb-relationship-role-name> <multiplicity>many</multiplicity> <relationship-role-source> <ejb-name>LineItemEJB</ejb-name> </relationship-role-source> <cmr-field> <cmr-field-name>order</cmr-field-name> </cmr-field> </ejb-relationship-role> </ejb-relation> </relationships> </ejb-jar> 133 Nguyn Qung i

Quan h many - many

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); ... }

Cn trong lp CourseEJB s nh ngha cc phng thc tru tng nh sau:


public abstract class CourseEJB implements EntityBean{ ... public abstract Collection getStudents(); public abstract void setStudents(Collection students); ... }

Cui cng l khai bo trong deployment descriptor:


<ejb-jar> ... <enterprise-beans> ... </enterprise-beans> <relationships> <!--MANY-TO-MANY bi-directional: Student Course --> <ejb-relation> <ejb-relation-name>Student-Course</ejb-relation-name> <ejb-relationship-role> <ejb-relationship-role-name> Students-register-in-courses </ejb-relationship-role-name> <multiplicity>many</multiplicity> <relationship-role-source> <ejb-name>StudentEJB</ejb-name> </relationship-role-source> <cmr-field> <cmr-field-name>courses</cmr-field-name> <cmr-field-type>java.util.Collection</cmr-field-type> </cmr-field> </ejb-relationship-role> <ejb-relationship-role> <ejb-relationship-role-name> Courses-have-registered-students </ejb-relationship-role-name> <multiplicity>many</multiplicity> <relationship-role-source> <ejb-name>CourseEJB</ejb-name> </relationship-role-source> <cmr-field> 134 Nguyn Qung i

<cmr-field-name>students</cmr-field-name> <cmr-field-type>java.util.Collection</cmr-field-type> </cmr-field> </ejb-relationship-role> </ejb-relation> </relationships> ... </ejb-jar>

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.

6.18.5 Cu trc ca jbosscmp-jdbc.xml


http://docs.jboss.org/jbossas/docs/Server_Configuration_Guide/4/html/The_CMP_Engi ne-The_jbosscmp_jdbc_Structure.html nh x cc bin ca bean vi cc ct trong bng c s d liu bn di, ta cn s dng mt vendor deployment descriptor l jbosscmp-jdbc.xml.

135 Nguyn Qung i

6.19Message Driven Bean 6.19.1 JMS


http://docs.oracle.com/javaee/1.3/jms/tutorial/ Java Message Service l cc API chun c cc ng dng J2EE s dng truy cp vo cc dch v Message-Oriented Middleware (MOM). Messaging l kh nng cc ng dng c th tng tc v giao tip vi nhau mt cch khng ng b. N khc vi cc email message gia con ngi vi con ngi. N c thit k vi mc ch lm tng kh nng portability ca cc ng dng. JMS cung cp cc API thng nht cho cc ng dng J2EE enterprise to, gi, nhn v x l message bng bt k cc sn phm MOM no. Cc MOM product cng c gi l cc JMS provider, thc thi cc JMS API, cc ng dng Java c th s dng cc JMS API (interface hoc class) theo cch trung lp. Vic ny gip cc ng dng c th tng tc vi nhau bng cch s dng cc message thng qua bt k JMS provider no. Cc giao tip y l cc giao tip khng ng b, c ngha l bn gi gi mt message i m khng cn phi i tin phn hi, n vn tip tc thc hin cc cng vic ca mnh. JMS c s dng m t cc giao tip gia cc ng dng enterprise. Tt c cc user ca JMS c xem nh l cc JMS client. Mi ng dng JMS bao gm mt tp hp cc application-defined message v mt tp hp cc JMS client trao i chng. Client no m send (hoc publish) mt message c gi l producer, cn client no receives (hoc subcribe) mt message c gi l consumer

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.

137 Nguyn Qung i

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

Transaction 6.20.1 Khai bo kiu transaction

Mun tm hiu v Transaction, quay li mc Transaction ca phn Java pha trn.

t gi tr ca <transaction-type> trong ejb-jar.xml l Container hoc Bean. V d


<ejb-jar> <enterprise-beans> <session> ... <transaction-type>Container</transaction-type> </session> </enterprise-beans> </ejb-jar>

6.20.2 Cc loi Transaction Attribute


Cc loi Transaction Attribute NotSupported - Cc bean khng h tr cc giao dch. Cc giao dch khng c lan truyn qua cc bean. Nu client kt hp vi mt bi cnh giao dch(transaction context) th container s treo li (suppend) giao dch trc khi gi phng thc ca bean. Sau khi phng thc c hon thnh, container s khi phc li giao dch b treo. Support - Nu client kt hp vi mt giao dch, n s c lan truyn ti cc phng thc ca bean. Cn nu client khng kt hp vi giao dch no, th n s b treo (khng hiu lm, nhng phng thc ca bean c gi cng khng c kt hp vi giao dch no). Required Bean s lun tham gia vo mt giao dch JTA. Nu client c gn vi mt giao dch JTA, context s c lan truyn ti phng thc ca bean. Nu client khng kt hp vi mt giao dch JTA, container s bt u mt giao dch mi, v commit khi tr v phng thc.

138 Nguyn Qung i

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

6.20.3 Transaction Senmatics


Session Bean vi CMT Stateless session bean c th c gom li v s dng li bi cc ngi dng khc nhau. S tn ti ca CMT s gn lin vi s tn ti ca mt li gi phng thc. Bi v stateful session bean khng c chia s gia cc ngi dng khc nhau, nn n c thit k khng phi theo kiu transactional. Cc bin thnh vin (trng thi ca bean) khng th rollback khi mt giao dch b hy b. S dng SessionSynchronization Message-Driven Bean

139 Nguyn Qung i

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.

6.20.4 Cc trng hp ca Transaction


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.

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

CMT 6.22.1 Ci t cc Transaction Attribute

CMT l vit tt ca Container Managed Transaction

Ci t cc Transaction Attribute cho ton b EJB


<ejb-jar> ... <assembly-descriptor> ... <container-transaction> <method> <ejb-name> myEJB </ejb-name> <method-name> * </method-name> <trans-attribute>Required</trans-attribute> </method> ... </assembly-descriptor> ... </ejb-jar>

Ci t mt Transaction Attribute cho mt phng thc c th


<ejb-jar> ... <assembly-descriptor> ... <container-transaction> <method> <ejb-name> myEJB </ejb-name> <method-name> methodA </method-name> <trans-attribute>Supports</trans-attribute> </method> ... </assembly-descriptor> ... </ejb-jar> 141 Nguyn Qung i

Ci t mt Transaction Attribute cho phng thc ghi


<ejb-jar> ... <assembly-descriptor> ... <container-transaction> <method> <ejb-name> myEJB </ejb-name> <method-name> methodA </method-name> <method-params> <method-param> java.lang.Object </methodparam> ... <method-param> java.lang.String </methodparam> </method-params> <trans-attribute>RequiredNew</trans-attribute> </method> ... </assembly-descriptor> ... </ejb-jar>

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.

6.22.2 Roll back mt CMT


C hai cch roll back mt container-managed transaction:
142 Nguyn Qung i

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()); } } ... }

6.22.3 Ci t Transaction Timeout


Vi WebLogic:
<weblogic-ejb-jar> <transaction-descriptor> <trans-timeout-seconds>5<trans-timeout-seconds> </transaction-descriptor> </weblogic-ejb-jar>

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)

6.22.4 S dng SessionSynchronization 6.22.5 Cc bc c bn xy dng mt CMT


1. Trong EJB deployment descriptor (file ejb-jar.xml), ta khai bo tag <transaction-type> vi gi tr l Container 2. trong file ejb-jar.xml,ta ci t thuc tnh ca transaction trong tag <trans-attribute> vi mt trong nhng gi tr trnh bnh trong mc transaction attribute trn. Nu tag ny khng c ch nh, EJB containers s s dng gi tr mc nh. 3. Da vo thuc tnh giao dch <trans-attribute>, container s c hnh ng tng ng
143 Nguyn Qung i

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>

Ngoi ra cn to bng c s d liu courses

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

6.23.1 Cc khi nim lin quan


Resources, Users, Groups, Roles Mt resource l mt thc th (entity) c th c truy cp bi cc ng dng enterprise. Ti nguyn c th c chia s, v s truy cp ti chng c iu khin bng cc permission. Trong phm vi ca cc ng dng J2EE, truy cp vo cc ti nguyn sau s phi cn n s cho php (permisssion): cc EJB and Web container (application server) cc EJB, servlet, JSP, HTML JDBC connection pool. JMS destinations. JNDI contexts. Mt User l mt thc th (entity) truy cp cc ti nguyn (resources). User c th l ngi s dng ng dng, hoc c th l mt ng dng khch (client application) (v d nh mt trnh duyt hoc mt chng trnh khc). Ngi qun tr (administrator) l mt loi
144 Nguyn Qung i

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.

6.23.2 Cc k thut security


Cc k thut security cung cp cu tr li cho cc vn lin quan sau y: Identity: ai c nhim v chp nhn quyn truy cp ti cc ti nguyn.
146 Nguyn Qung i

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.

6.23.3 Java EE security


Java EE security b ph thc rt ln vo Java Authentication and Authorization Service (JAAS) API. JAAS tch bit h thng xc thc (authentication) ra khi ng dng Java EE bng cch s dng cc API xc nh c th cm vo c (pluggable). Ni cch khc, cc ng dng Java EE ch cn bit ni chuyn vi JAAS API nh th no m thi. Tri li, JAAS API bit trao i nh th no vi cc h thng xc thc nm bn di ging vi Lightweight Directory Access Protocol (LDAP) nh Microsoft Active Directory or Oracle Internet Directory (OID), bng cch s dng mt plug-in ca nh cung cp. iu ny gip cho ta c th chuyn i gia cc h thng xc thc bng cch chuyn i cc JAAS plugin m khng cn thay i bt k dng code no. Ngoi vic xc thc (authentication), application server s dng JAAS bn trong thc thi s cp php (authorization) cho c tng web v tng EJB.

148 Nguyn Qung i

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.23.4 Tng quan J2EE security qua tt c cc tng


Kin trc J2EE h tr vic qun l bo mt bng c hai cch : lp trnh hoc khai bo (programmatic declarative approach). Bi thi gian tm kim v sa cha phn mm sau khi trin khai l rt ln. Nn hng tip cn theo kiu trin khai c a thch hn, khi vic qun l security da vo cc file xml nm ngoi phm vi code ca ng dng. Phng php qun l security theo hng tip cn kiu lp trnh ch c s dng khi hng tip cn trin khai khng th thc hin c. V d, mt ng dng quyt nh cho php (authorization) da vo cc nhn t no , nh l thng tin user c lu tr trong database. Kin trc J2EE cung cp mt security ton cc t u n cui (end-to-end global security) kt ni nhiu tng. Security context c lan truyn cho cc component gia cc chui li gi, ngang qua cc component c t cc tng khc nhau. iu ny loi b s cn thit ca cc thng tin user c truyn vo nh trong cc li gi phng thc business. Do vy cung cp s m bo v d dng cho vic lp trnh. N cng h tr khi nim ca mt single sign-on (SSO) truy cp cc ng dng. Security context c th c lan truyn qua nhiu server J2EE s dng cc security realm khc nhau trong mi trng sn xut. N cng lan truyn security context ti cc ng dng da vo CORBA trn giao thc IIOP

149 Nguyn Qung i

6.24Nhng hn ch khi s dng EJB


EJB container cung cp cc chc nng nh l qun l vng i, threading, security, v resource pooling. Cc th hin (instance) enterprise bean c th l phn tn, c ngha l cc JVM khc hoc trn cc my khc. qun l hiu qu cc ti nguyn nh l b nh, container c th trao i cc th hin t b nh ln a (disk). chy cho c chnh xc, container bt cc component bn trong n phi chu mt s hn ch. iu ny m bo c cc chc nng ca container chy ng v m bo c tnh portability v tnh scalability ca cc EJB. Sau y l mt s hn ch i vi cc EJB: Must not read/write static fields: Its okay to use read-only static fields. It is better to declare the static fields as final. Static fields are shared among all instances of a particular class. Updating a static field works if all the instances are running in the same JVM, but it doesnt work if the instances are distributed in separate JVMs. Must not use thread synchronization primitives to synchronize execution of multiple instances: Thread synchronization works if all the instances are running in the same JVM, but doesnt work if the instances are distributed in separate JVMs. Must not create or manage (start, stop, suspend, resume, change priority) threads: The EJB container is responsible for creating and managing threads. Allowing the Enterprise JavaBean instances to create and manage threads interferes with the container functionality. Must not read or write files and directories or access file descriptors: Files, directories, and file descriptors are typically local resources to a machine, and cant be distributed across machines in a portable way. Also, access to the file system is a security hazard because the Enterprise JavaBean could potentially read and write the contents of sensitive files. Must not listen or accept connections on a socket: This isnt allowed because if an Enterprise JavaBean is listening on a socket, it cant be swapped to disk. Its okay for Enterprise JavaBeans to be network socket clients
150 Nguyn Qung i

6.25

Ch 6.25.1 Cu hnh cho client ca EJB

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.

6.25.2 S dng Datasource trong Jboss


Gi s ta c mt c s d liu c tn l version_2.0. Sau y l cc file server c th hiu c l c mt c s d liu c to ra v ang c qun l bi MySQL Server ti localhost:3306. u tin phi to file version_2.0-ds.xml (c th ly file mu l mysql-ds.xml ti {jboss_install_dir}\docs\examples\jca) v t n vo {jboss_install_dir}\server\default-\deploy. Cch ny s dng J2EE Connector Architecture (JCA)
<?xml version="1.0" encoding="UTF-8"?> <datasources> <local-tx-datasource> <jndi-name>version_2.0</jndi-name> <connection-url>jdbc:mysql://localhost:3306/version_2.0</connection-url> <driver-class>com.mysql.jdbc.Driver</driver-class> <user-name>root</user-name> <password>admin</password> <exception-sorter-classname>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exceptionsorter-class-name> <!-- sql to call when connection is created <new-connection-sql>some arbitrary sql</new-connection-sql> --> <!-- sql to call on an existing pooled connection when it is obtained from pool <check-valid-connection-sql>some arbitrary sql</check-valid-connection-sql> --> <!-- corresponding type-mapping in the standardjbosscmp-jdbc.xml (optional) --> <metadata> <type-mapping>mySQL</type-mapping> </metadata> </local-tx-datasource> </datasources>

151 Nguyn Qung i

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>

Cn ni dung file jboss.xml th nh sau:


<?xml version="1.0" encoding="UTF-8"?> <jboss> <enterprise-beans> <entity> <ejb-name>StudentEJB</ejb-name> <jndi-name>day10/Student</jndi-name> <resource-env-ref> <resource-env-ref-name>jdbc/version_2.0</resource-env-ref-name> <jndi-name>java:/version_2.0</jndi-name> </resource-env-ref> </entity> </enterprise-beans> </jboss> 152 Nguyn Qung i

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.

6.25.3 Thc hnh vi cc v d trong ti liu [6]


Khi lm theo cch v d trong ti liu [6] hoc [10]. Cn ch n cc h thng EIS (Enterprise Information System). C th y l truy cp n c s d liu do ta nh ngha v truy cp n JMS Destination (Topic / Queue). Th nht l phi to cu hnh c th s dng datasource trong code nh trong mc S dng Datasource trong Jboss pha trn ni. Th hai, khai bo Destination (Topic/Queue) vi JNDI service cc Message-Driven Bean c th s dng. Ta to file jbossmb-destinations-service.xml trong th mc {installed-jboss}/server/default/deploy/ vi ni dung nh 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> <mbean code="org.jboss.mq.server.jmx.Queue" name="jboss.mq.destination:service=Queue,name=RegisterQ"> 153 Nguyn Qung i

<depends optional-attribute-name="DestinationManager"> jboss.mq:service=DestinationManager </depends> </mbean> </server>

154 Nguyn Qung i

PHN 7 EJB 3.0


Tham kho ti liu [11]. EJB 3.0 n gin ha cc API so vi cc phin bn trc . Vic n gin ha ca EJB 3.0 th hin mt s im nh sau : Khng c cc home v component interface. S dng cc Java metadata annotation. Dependency Injection.

7.1 S dng Annotation


Tham kho http://roseindia.net/ejb/Annotations.shtml Thng thng, trc Java 5 ngi ta hay dng Properties (mt dng t in bao gm key, value), XML hay thm ch th thin hn l comment code lm vic ny (in hnh cho vic dng comment code chnh Hibernate). Chng hn, trong mt ng dng nh Hibernate, vic chuyn i gi tr ca mt trng t Java Bean (Java Object) sang trng ca bng trong c s d liu th ta phi nh du vo tn trng l g, thuc bng no. Nh , Hibernate c th chuyn i thnh cu lnh SQL tng ng v tin hnh execute (thc thi) d liu t Bean chuyn vo database. Ngc li, vic chuyn i d liu t bn ghi trong c s d liu sang Java Bean cng c th phi dng n nhng nh du. Nh vo cc h thng lookup class nh ClassLoader m chng ta c th tm thy class. Nhng Class ny c tn khng tng ng vi tn bng trong c s d liu th buc phi dng nhng nh du trong class kim tra. Cc trng trong bng c map (nh x gi tr) sang trng ca Java Bean. Do , trong nhu cu thc t pht trin phn mm, chng ta cn nhng nh du code. Gii quyt bi ton , ngi ta thng dng cc file properties, XML config hoc comment code nh du. n Java 5 th Sun thm vo ci gi l Annotation. Annotation trc tin c hiu l mt dng meta data. Meta data l c t d liu cho mt i tng, gi tr g . Chng hn cc tp tin mp3, nh, hoc mt bi vit c th c meta data dng XML Format l RSS. c t d liu l mt tp gi tr cha nhng thng tin gn gn, c bn m t v i tng no . Chng hn, vi mt bi ht th meta data c th bao gm: tn ca s trnh by, tn nhc s, bi ht ny ht trong bao lu,... Meta data khng phi l "siu d liu" nh mt s ngi tng dch th thin t ting Anh sang ting Vit. Java Annotation khng phi l mt nh dng c nh c cung cp trc tip t JRE. Ngha l chng ta c th nh ngha Annotation cho framework, th vic, ng dng,... m chng ta pht trin. Chng hn, vi bi ton ca Hibernate kia th Annotation s ng dng nh sau: Ta c mt bng trong c s d liu l HocSinh vi ba trng l: ID, Ten, Diem. Yu cu ca nhng ng dng dng n Hibernate l phi map c gi tr ny t bng HocSinh sang mt Java Bean (Java Object) tng ng. Nh thit k v qun tr c s d liu v nh pht trin c th l 2 ngi, lm hai cng vic , tch bit nhau. Nh pht trin vit mt Class l :
public class Student { private int id; private String name; private String score; // Cc setter v getter 155 Nguyn Qung i

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(); }

Nh vy, lp trnh vin s nh du Java Bean ca h nh sau:


@Hibernate_Table("HocSinh") public class Student { @Hibernate_Field("ID") private int id; @Hibernate_Field("Ten") private String name; @Hibernate_Field("Diem") private String score; } // Cc setter v getter

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.

7.1.1 Annotation type


Annotation type c s dng nh ngha cc annotation theo mun, sau ta c th s dng cc annotation ny. V d nh ngha mt annotation (annotation type)
public @interface Example { String showSomething(); }

Ch gii code (Annotation)


@Example (showSomething="Hi! How r you") public void anymethod() { .... }

C ba kiu annotation trong Java. Marker: cc annotation ny khng c bt k thnh phn no V d:


public @interface Example{ }

S dng:
@Example public void anymethod() { -----------}

Single value: loi ny ch cung cp mt gi tr duy nht V d:


public @interface Example{ String showSomething(); }

S dng:
@Example ("Hi ! How r you") public void anymethod(){ -------}

157 Nguyn Qung i

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.2 Cc lut khi nh ngha cc kiu annotation


C mt s quy nh khi ta nh ngha v s dng cc annotation: Khai bo mt annotation bng mt k t @, theo sau l tn ca annotation. Khai bo phng thc khng c nm ra mt exception no Khai bo phng thc khng c mt tham s no. Phng thc s dng annotation nn tr li mt gi tr, theo mt trong nhng kiu nh sau: String, primitive, enum, Class, v mng ca cc kiu ny.

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

7.1.4 Cc annotation s dng trong EJB 3.0


@Stateless c dng ch gii mt lp bean, n ni vi EJB container rng bean c ch gii l mt stateless session bean. c dng ch gii mt lp bean, n ni vi EJB container rng bean c ch gii l mt stateful session bean.
158 Nguyn Qung i

@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) { ... } ... }

Dng ch gii mt bin. N ni vi container khi to mt bin c kt hp vi mt resource no . V d:

@ MessageDriven

159 Nguyn Qung i

@Entity @PostConstruct @PreDestroy @WebService @PrePassivate @PostActivate @Interceptors @ExcludeDefaultInterceptors @ ExcludeClassInterceptors

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

7.2M hnh lp trnh n gin hn EJB 2.0


cc phin bn EJB 2.0 tr v trc, ta phi lm vic vi cc interface, ngoi ra phi code cc phng thc callback. EJB 3.0 cho php ta rt gn hn na cc bc lp trnh bng cch s dng cc POJO v cc POJI, cc i tng v interface ny cha bit g v cc cc dch v nn tng (platform services). Sau ta s cung cp cc metadata cu hnh cho cc POJO v POJI ny bng cch s dng annotation, thm cc dch v nn tng nh l kh nng truy cp t xa, h tr web service, cc phng thc callback vng i (lifecycle callbacks) ch khi no cn. Ta khng cn to cc home interface. Mt s k thut kh dng th gi c t ng bi chnh cc dch v nn tng Ni chung, ta khng phi vit nhiu code trin khai mt EJB.

7.3Dependency Injection v JNDI lookup


c th truy cp vo mt dch v, mt i tng, mt ti nguyn no trong EJB 2.0 tr v trc, ta phi s dng n JNDI lookup. Vn n ca phng php ny l n gn kt code ca ng dng vi application server. iu ny lm cho vic pht trin v kim tra sau ny rt kh khn. Trong EJB 3.0 JNDI lookup c th c thay th bng Dependency Injection (DI). Dependency Injection ngc li vi JNDI lookup. trong m hnh JNDI lookup, bean ly cc ti nguyn m n cn. iu ny lm cho tn ca cc ti nguyn v component b fix cng trong bean s dng n. Vi DI, container s c cu hnh ca bean ch, ri tnh xem cc bean v ti nguyn m bean ch cn l g, v tim chng vo trong bean ch
160 Nguyn Qung i

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.4JPA Entity v EntityManager


Khi lm vic vi JPA, ta cn quan tm n hai th: JAP EntityManager interface v JPA entity. JPA EntityManager interface nh ngha cc API cho vic lu tr lu di, cn cc JPA entity ch nh d liu ca ng dng c nh x th no vi c s d liu quan h.

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

163 Nguyn Qung i

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.

7.4.2 S dng EntityManager


EntityManager interface nh ngha cc API thao tc vi cc entity tr gip cho persistence. Gi s ta c mt entity nh mc trn, by h ta vit mt stateless session bean s dng EntityManager thao tc vi entity ny nh sau:
import javax.persistence.PersistenceContext; import javax.persistence.EntityManager; ... @Stateless public class PlaceBidBean implements PlaceBid { //injects instance of Entity-Manager @PersistenceContext(unitName="actionBazaar") private EntityManager entityManager; ... public Bid addBid(Bid bid) { System.out.println("Adding bid, bidder ID=" + bid.getBidderID() + ", item ID=" + bid.getItemID() + ", bid amount=" + bid.getBidAmount() + "."); return save(bid); 164 Nguyn Qung i

} private Bid save(Bid bid) { //persists entity instance entityManager.persist(bid); return bid; }

Cc hm API ca EntityManager

165 Nguyn Qung i

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

Sau ta s nh ngha cc callback trong lp Listener ny @PrePersist


void prePersist(Account a){ System.out.println(prePersist called+a); }

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.

7.4.3 ng gi v trin khai cc lp Entity


Cc lp entity c ng gi v trin khai trong cc persistence unit. Mt persistence unit bao gm cc lp entity v cc cu hnh cho entity. Mt persistence unit c nh ngha trong file cu hnh persistence.xml. File ny c thm vo th mc META-INF ca cc gi ty (arbitrary archive), nh l ejb-far, .ear, .war, hoc l trong mt file .jar n thun. Khng c file persistence.xml u trong ng dng ca chng ta, th s khng c persistence unit no, v nu khng c t nht mt persistence unit th khng c trnh qun l entity no c th c s dng. Mt v d n gin ca file persistence.xml nh sau:
<?xml version= 1.0 encoding=UTF-8?> <persistence xmlns = http://java.sun.com/xml/ns/persistence> <persistence-unit name = intro/> </persistence>

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>

7.5To Webservice vi EJB 3.0


@WebService public interface BidManagerWS { void addBid(Bid bid); List<Bid> getBids(Item item); }

7.6Stateless v Stateful session bean trong EJB 3.0

168 Nguyn Qung i

7.7Message-driven bean trong EJB 3.0 7.7.1 @MessageDriven


Ta c annotation @MessageDriven c khai bo nh sau:
@Target(TYPE) @Retention(RUNTIME) public @interface MessageDriven { String name() default ""; nh ngha tn ca bean, nu b trng th container s ly tn ca lp lm tn ca bean Class messageListenerInterface default Object.class; Khai bo messageListener interface c lp bean ny trin khai, nu b qua th c th thay th bng cch khai bo implement interface khi vit lp bean. ActivationConfigProperty[] activationConfig() default {}; ch nh cc thuc tnh cn thit nh destinationName, destinationType (Queue hoc Topic), connectionFactoryJndiName, acknowledgeMode, ... String mappedName();nh ngha tn ca bean c map trong server c th String description(); }

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")

C cc kiu acknowledgeMode nh bng sau y:

170 Nguyn Qung i

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

171 Nguyn Qung i

7.7.3 Cc phng thc callback ca MDB 7.8 Interceptors 7.8.1 AOP


Tham kho mc AOP PHN 9

7.8.2 Interceptors 7.9 EJB 3 timer service


http://www.javabeat.net/articles/3-ejb-30-timer-services-an-overview-1.html Ch c stateless session bean v message-driven bean mi c h tr timer service EJB h tr hai dng i tng Timer: Single Action Timer: ch c mt hnh ng xy ra mt thi im xc nh t trc. Interval Timer: c nhiu hnh ng xy ra nhng khong thi gian xc nh. Timer Service API Timer Service Timer TimedObject TimerHandle TimerService to cc i tng Timer, ta s dng phng thc createTimer ca interface TimerService Vi cc Single Action Timer:

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

@Timeout public void myTimedOutMethod(Timer timer){ .... } }

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()

Thu c mt tham chiu ca i tng Timer

174 Nguyn Qung i

PHN 8 JBOSS
8.1 Cu hnh Jboss
http://docs.jboss.org/jbossweb/3.0.x/config/context.html

175 Nguyn Qung i

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.

9.1.2 Nhng li ch ca separate of concerns


- Trong AOP, t Aspect chnh l vn [concern] ngi lp trnh quan tm v n xut hin trong rt nhiu class cng nh nhiu method khc nhau. K thut AOP thng c s dng gii quyt cc vn nh caching, tracking, security hay failure
176 Nguyn Qung i

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.

9.1.3 Cc thut ng thng gp trong AOP


- Join point: Mt im trong chng trnh. V d nh ta cn ghi log li sau khi chy method th im ngay sau method c thc thi gi l mt jointpoint c th chy nhng x l ghi file log. Join point theo ngha ca n c th hiu l nhng ni c th c chn nhng custom action ca bn. - Pointcut: C nhiu cch xc nh joinpoint, nhng cch nh th c gi l pointcut. - Advice: l nhng x l ph c thm vo x l chnh. Code thc hin cc x l c gi l Advice. V cc x l ph c th thm vo trc hoc sau, hoc c hai i vi nhng x l chnh nn c nhiu loi Advice khc nhau.

177 Nguyn Qung i

TI LIU THAM KHO


[1]. http://www.coreservlets.com (Core Servlets and Javaserver Pages_Volume1) [2]. Demo Servlet voi Eclipse ( materials1987@gmail.com ) [3]. http://www.coreservlets.com/Apache-Tomcat-Tutorial/tomcat-7-with-eclipse.html [4]. Core Servlets and Javaserver Pages_Volume2 ( materials1987@gmail.com ) [5]. http://vovanhai.wordpress.com/j2ee/ejb/ [6]. http://ejbvn.wordpress.com [7]. Hng dn ci t Mysql server ( materials1987@gmail.com ) [8]. http://www.tutorialspoint.com/jdbc/ [9]. http://ejbvn.wordpress.com/category/week-2-entity-beans-and-message-drivenbeans/day-09-using-jdbc-to-connect-to-a-database/ [10]. Sams Teach Yourself EJB in 21 Days ( materials1987@gmail.com ) [11]. EJB 3 In Action (materials1987@gmail.com )

178 Nguyn Qung i

You might also like