漫談EJB (3)
發(fā)表時(shí)間:2024-02-11 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]J2EE的十三種技術(shù)\rJava數(shù)據(jù)庫連接(JDBC) JDBC API以一個(gè)統(tǒng)一的方式訪問各種數(shù)據(jù)庫。與ODBC類似,JDBC將開發(fā)者和私有數(shù)據(jù)庫之間的問題隔離開來。由于它建立在Java上,因此JDBC可以提供平臺(tái)無關(guān)的數(shù)據(jù)庫訪問。 JDBC定義了4種不同的驅(qū)動(dòng),具體來說,包括有: ...
J2EE的十三種技術(shù)\r
Java數(shù)據(jù)庫連接(JDBC)
JDBC API以一個(gè)統(tǒng)一的方式訪問各種數(shù)據(jù)庫。與ODBC類似,JDBC將開發(fā)者和私有數(shù)據(jù)庫之間的問題隔離開來。由于它建立在Java上,因此JDBC可以提供平臺(tái)無關(guān)的數(shù)據(jù)庫訪問。
JDBC定義了4種不同的驅(qū)動(dòng),具體來說,包括有:
類型1:JDBC-ODBC橋
在JDBC剛產(chǎn)生時(shí),JDBC-ODBC橋是非常有用的。通過它,開發(fā)者可以使用JDBC來訪問一個(gè)ODBC數(shù)據(jù)源。缺點(diǎn)是,它需要在客戶機(jī)器上安裝有一個(gè)ODBC驅(qū)動(dòng),該機(jī)器通常是應(yīng)該運(yùn)行微軟Windows系統(tǒng)的。使用這一類的驅(qū)動(dòng)器,你就會(huì)失去JDBC平臺(tái)無關(guān)的好處。此外,ODBV驅(qū)動(dòng)器需要客戶端的管理。
類型2:JDBC-native驅(qū)動(dòng)橋
JDBC-native驅(qū)動(dòng)橋提供了一個(gè)建筑在本地?cái)?shù)據(jù)庫驅(qū)動(dòng)上的JDBC接口--沒有使用ODBC。JDBC驅(qū)動(dòng)將標(biāo)準(zhǔn)的JDBC調(diào)用轉(zhuǎn)變?yōu)閷?duì)數(shù)據(jù)庫API的本地調(diào)用。使用類型2的驅(qū)動(dòng)也會(huì)失去JDBC平臺(tái)無關(guān)性的好處,并且需要安裝客戶端的本地代碼。
類型3:JDBC-network橋
JDBC-network橋不需要客戶端的數(shù)據(jù)庫驅(qū)動(dòng)。它們使用網(wǎng)絡(luò)-服務(wù)器中層來訪問一個(gè)數(shù)據(jù)庫。這會(huì)引出諸如負(fù)載均衡、連接池等技術(shù),數(shù)據(jù)緩沖也是可能的。由于類型3的驅(qū)動(dòng)通?蓭硐鄬(duì)小的下載時(shí)間,它是平臺(tái)無關(guān)的,并且不需要客戶端的安裝和管理,因此很適合用作Internet的應(yīng)用。
類型4:純Java驅(qū)動(dòng)
類型4使用純Java數(shù)據(jù)庫驅(qū)動(dòng)來提供直接的數(shù)據(jù)庫訪問。由于類型4驅(qū)動(dòng)運(yùn)行在客戶端,并且直接訪問數(shù)據(jù)庫,因此運(yùn)行在這個(gè)模式暗示要使用一個(gè)兩層的體系。要在一個(gè)n層的體系中使用類型4的驅(qū)動(dòng),可以通過一個(gè)包含有數(shù)據(jù)訪問代碼的EJB,并且讓該EJB為它的客戶提供一個(gè)數(shù)據(jù)庫無關(guān)的服務(wù)。
Java命名和目錄接口(Java Naming and Directory Interface,JNDI)
JNDI是Java Naming and Directory Interface 的簡寫,中意為:Java命名及目錄接口,它是為了對(duì)高級(jí)網(wǎng)絡(luò)應(yīng)用開發(fā)中的使用的目錄基礎(chǔ)結(jié)構(gòu)的訪問。實(shí)際上這個(gè)目錄是一個(gè)特殊的數(shù)據(jù)庫,提供了對(duì)存儲(chǔ)數(shù)據(jù)的快速訪問,不象傳統(tǒng)的目錄服務(wù)訪問方式-你必須提供不同的API接口去訪問不同的目錄服務(wù)(如:LDAP,NIS,ADS等),而它提供了一種標(biāo)準(zhǔn)的API來訪問類型不同的目錄。據(jù)說,使用完整的SDK可以開發(fā)那些JNDI還不支持的目錄服務(wù)提供者。
JNDI是J2EE的一個(gè)API,提供了一套標(biāo)準(zhǔn)的接口,以定位用戶、機(jī)器、網(wǎng)絡(luò)、對(duì)象、以及服務(wù)。例如,你可以使用JNDI來定位內(nèi)部網(wǎng)中的一臺(tái)打印機(jī),你也可以使用它來定位Java對(duì)象或連接到一個(gè)數(shù)據(jù)庫。JNDI可以用于EJB、RMI-IIOP、JDBC中。它是網(wǎng)絡(luò)查找定位的標(biāo)準(zhǔn)方法。 JNDI API被用來訪問命名和目錄服務(wù)。它提供一個(gè)相容的模式來訪問和操作企業(yè)范圍大的資源,例如一個(gè)應(yīng)用服務(wù)器中的DNS、LDAP、本地文件系統(tǒng)或者對(duì)象。
在JNDI中,一個(gè)目錄結(jié)構(gòu)中的每一個(gè)節(jié)點(diǎn)被稱為context。每一個(gè)JNDI的名字都是與一個(gè)context相對(duì)的,沒有一個(gè)絕對(duì)名字的概念。一個(gè)應(yīng)用可以使用InitialContext類來得到它的第一個(gè)context:
Context ctx = new InitialContext();
通過這個(gè)初始的context,應(yīng)用就可以經(jīng)過目錄樹定位到需要的資源或者對(duì)象。例如,假定你已經(jīng)在WebLogic Server中配置了一個(gè)EJB,并且在myApp.myEJB中綁定了home接口。EJB的客戶端,在得到這樣一個(gè)初始的context后,然后就可以使用以下的代碼來定位到home接口:
MyEJBHome home = ctx.lookup( "myApp.myEJB" );
一旦你得到你所需對(duì)象的一個(gè)引用--在這個(gè)例子中,就是EJB的home接口--然后你可以調(diào)用它上面的方法。為了在一個(gè)context中查找到一個(gè)對(duì)象,JNDI還提供方法可以做到:
插入或者綁定一個(gè)對(duì)象到一個(gè)context中。在你配置一個(gè)EJB時(shí),這是非常有效的方法;
從一個(gè)context中移去一個(gè)對(duì)象\r
列出一個(gè)context中的所有對(duì)象\r
創(chuàng)建和刪除subcontexts
企業(yè)Java Beans(Enterprise Java Beans,EJB)
J2EE其中一個(gè)引人注目的技術(shù)是EJB。它提供了一個(gè)架構(gòu)來開發(fā)和配置到客戶端的分布式商業(yè)邏輯,因此可以明顯減少開發(fā)擴(kuò)展性、高度復(fù)雜企業(yè)應(yīng)用的難度。EJB規(guī)范定義了EJB組件應(yīng)該如何及何時(shí)與它們的容器交互。由容器來負(fù)責(zé)提供普通的服務(wù),例如目錄服務(wù)、事務(wù)管理、安全、資源池和容錯(cuò)。
EJB規(guī)范定義了三類基本的bean:
會(huì)話beans(session beans):會(huì)話beans為業(yè)務(wù)流程建模,由于他們通常表示執(zhí)行某個(gè)動(dòng)作,因此可以把它們當(dāng)作是動(dòng)詞。這個(gè)執(zhí)行的動(dòng)作可以是任何事情,例如增加數(shù)量,訪問數(shù)據(jù)庫,調(diào)用其它系統(tǒng),調(diào)用其它企業(yè)Bean。我們可以舉出很多的例子,包括一個(gè)計(jì)價(jià)引擎,一個(gè)工作流引擎,一個(gè)目錄引擎,一個(gè)信用卡認(rèn)證中心,或一個(gè)網(wǎng)上證券交易引擎。
實(shí)體beans(Entity beans):這是持久保存數(shù)據(jù)的代表--典型的是存儲(chǔ)在數(shù)據(jù)庫中--因此在服務(wù)器崩潰后數(shù)據(jù)仍然存在。多個(gè)客戶端可以使用EJB來表示同樣的數(shù)據(jù)。實(shí)體beans為企業(yè)數(shù)據(jù)建模,由于它們表示數(shù)據(jù)對(duì)象(就是緩存數(shù)據(jù)庫信息的Java對(duì)象),因此可以把它們當(dāng)作名詞。實(shí)體beans的例子包括一種產(chǎn)品,一項(xiàng)訂單,一個(gè)雇員,一張信用卡,或一支股票。會(huì)話beans典型的方式是通過實(shí)體beans來實(shí)現(xiàn)業(yè)務(wù)目標(biāo)的,例如一個(gè)證券交易引擎(會(huì)話beans)處理股票(實(shí)體beans)。
Message-Driven beans:Message-Driven beans也表示動(dòng)作,這一點(diǎn)上它類似于會(huì)話beans。它們之間的不同點(diǎn)在于你只能夠通過發(fā)送消息給Message-Driven beans的方式來調(diào)用它們。Message-Driven beans的例子包括了接受股票交易消息的beans,信用認(rèn)證消息,或工作流消息。這些Message-Driven beans也可以調(diào)用其它的企業(yè)beans。
接著,我們討論無狀態(tài)和有狀態(tài)
無狀態(tài)的beans(Stateless beans):這是一個(gè)單一使用的服務(wù),不維護(hù)任何的狀態(tài),在服務(wù)器崩潰時(shí)也不再存在,而且生存期也相對(duì)地短。例如,一個(gè)無狀態(tài)的session bean可能用作執(zhí)行溫度轉(zhuǎn)換。
有狀態(tài)的bean:它提供了一個(gè)傳統(tǒng)的與客戶端交互的方法,存儲(chǔ)客戶端的狀態(tài)。在線購物車就是這樣一個(gè)有狀態(tài)session ean的典型例子。有狀態(tài)session beans在服務(wù)器崩潰時(shí)也不再存在,而且生存期也相對(duì)地短,并且每個(gè)實(shí)例只可以用在一個(gè)單一的線程中。
JavaServer Pages (JSPs)
或許你已經(jīng)對(duì)微軟的Active Server Pages (ASPs)非常熟悉;JSP也是類似的技術(shù),不過它是平臺(tái)無關(guān)的。它們都是設(shè)計(jì)來幫助web內(nèi)容開發(fā)者使用相對(duì)較少的代碼就可以創(chuàng)建動(dòng)態(tài)的網(wǎng)頁。web設(shè)計(jì)者即使不懂得編程,也可以使用JSP來創(chuàng)建動(dòng)態(tài)的網(wǎng)頁。JavaServer Page是HTML代碼和Java代碼的混合。在客戶請(qǐng)求頁面的時(shí)候,服務(wù)器就會(huì)處理Java代碼,然后返回HTML頁面給瀏覽器。
你可以也聽過JHTML,它是一個(gè)舊的標(biāo)準(zhǔn),現(xiàn)在已經(jīng)被JSP取代了。WebLogic Server不但支持JSP,還支持JHTML。不過,在默認(rèn)設(shè)置下,WebLogic Server是不支持JSP的(對(duì)于5.1版本)。你必須編輯weblogic.properties來激活web服務(wù)器,對(duì)于JSPServlet來說,也是這樣。
Java servlets
servlets提供的功能大部分JSP相同,它采用的是一個(gè)有點(diǎn)不同的方法。JSP中大部分是HTML代碼,其中只有少量的Java代碼,而servlets則相反,它完全使用Java編寫,并且產(chǎn)生HTML代碼。
servlet是一個(gè)在服務(wù)器上運(yùn)行的Java小程序,它可以擴(kuò)展Web服務(wù)器的功能。這些服務(wù)器端的應(yīng)用可以在被請(qǐng)求時(shí)動(dòng)態(tài)執(zhí)行,與傳統(tǒng)Web服務(wù)器上的CGI Perl腳本差不多。CGI腳本和servlet的一個(gè)主要不同是:CGI腳本對(duì)于每次請(qǐng)求都啟動(dòng)一個(gè)全新的進(jìn)程--需要額外的系統(tǒng)開銷--而servlet的執(zhí)行只要在servlet引擎內(nèi)啟動(dòng)一個(gè)獨(dú)立的線程就性了。因此Servlet的擴(kuò)展性也更好。
在開發(fā)servlet時(shí),你通常都要擴(kuò)展javax.servlet.http.HttpServlet類,并且覆蓋它的一些方法。感興趣的方法包括有:
service(): 作為command-specific方法的一個(gè)調(diào)度程序\r
doGet(): 處理來自一個(gè)客戶的HTTP GET請(qǐng)求
doPost(): 處理來自一個(gè)客戶的HTTP POST請(qǐng)求\r
還有一些其它的方法來處理不同類型的HTTP請(qǐng)求--可參考HttpServlet API的文本來得到更多相關(guān)的信息。
Java IDL/CORBA
通過Java的IDL支持,開發(fā)者可以將Java與CORBA集成。他們可以創(chuàng)建能配置在一個(gè)CORBA ORB中的Java對(duì)象,也可以創(chuàng)建作為配置在其它ORB內(nèi)的CORBA對(duì)象客戶端的Java類。對(duì)于通過Java將你的新應(yīng)用和以前的系統(tǒng)集成,后者提供了一個(gè)另外的方法。
Java事務(wù)體系(JTA)/Java事務(wù)服務(wù)(JTS)
JTA定義了一個(gè)標(biāo)準(zhǔn)的API,應(yīng)用可以通過它來訪問事務(wù)監(jiān)控器。
JTS是CORBA OTS事務(wù)監(jiān)控器的一個(gè)基本實(shí)現(xiàn)。JTS指定了一個(gè)事務(wù)管理器的實(shí)現(xiàn)(Transaction Manager),這個(gè)管理器在一個(gè)高級(jí)別上支持Java事務(wù)API(JTA)規(guī)范,并且在一個(gè)低級(jí)別上實(shí)現(xiàn)了OMG OTS規(guī)范的Java映射。一個(gè)JTS事務(wù)管理器為應(yīng)用服務(wù)器、資源管理器、standalone應(yīng)用和通信資源管理器提供事務(wù)服務(wù)。
JavaMail和JavaBeans激活架構(gòu)(JavaBeans Activation Framework,JAF)
JavaMail是一個(gè)用來訪問郵件服務(wù)器的API。JavaMail API提供了一套抽象類來模型化一個(gè)郵件系統(tǒng)。支持SMTP和IMAP服務(wù)器。
JavaMail通過使用JavaBeans Activation Framework (JAF) 來處理MIME加密的郵件附件。MIME字節(jié)流和Java對(duì)象間可以互相轉(zhuǎn)化。大多數(shù)的應(yīng)用無需要直接使用JAF。
Java信使服務(wù)(Java Messaging Service,JMS)
JMS是一個(gè)用來和面向信息的中層通信的API。它不但支持點(diǎn)對(duì)點(diǎn)的域,也支持發(fā)布/訂閱域,并且提供對(duì)擔(dān)保信息傳送、事務(wù)信息傳送、持久信息和durable subscribers的支持。對(duì)于將你的應(yīng)用和以前的backend系統(tǒng)集成,JMS提供了另外一個(gè)方法。
擴(kuò)展標(biāo)記語言(Extensible Markup Language,XML)
XML是一個(gè)用來定義其它標(biāo)記語言的的語言。它可被用作商業(yè)之間的數(shù)據(jù)共享。XML的發(fā)展是與Java分開的;不過,它的目標(biāo)和Java類似,都是為了與平臺(tái)無關(guān)。通過將Java與XML結(jié)合,你可以得到一個(gè)完全平臺(tái)無關(guān)的解決方案。多個(gè)公司都為在Java和XML間開發(fā)一個(gè)緊密的集成而工作。具體的信息,可瀏覽Sun站點(diǎn)的Java-XML部分(http://java.sun.com/xml),以及IBM的developerWorks的XML Zone部分(http://www.ibm.com/developer/xml/)。