?? 16. ejb note.txt
字號(hào):
EJB 3.0
Sun App/JBoss/Weblogic
-----------------------------------------------------------
Day1
1. What is EJB
EJB(Enterprise JavaBean)是JavaEE應(yīng)用的業(yè)務(wù)層技術(shù)標(biāo)準(zhǔn), 以這項(xiàng)技術(shù)開(kāi)發(fā)的組件叫做EJB組件,常常簡(jiǎn)稱(chēng)EJB
EJB架構(gòu)是一個(gè)用于開(kāi)發(fā)和部署基于組件的分布式業(yè)務(wù)應(yīng)用的組件架構(gòu)。
采用EJB架構(gòu)編寫(xiě)的應(yīng)用是可伸縮的、事務(wù)性的、多用戶(hù)安全的。
可以一次編寫(xiě)這些應(yīng)用,然后部署到任何支持EJB規(guī)范的應(yīng)用服務(wù)器平臺(tái)上。
特點(diǎn)(和JavaBean比較):
1)提供遠(yuǎn)程訪問(wèn)的能力
2)可擴(kuò)展、可插拔的能力
3)必須在EJB服務(wù)器上運(yùn)行, 可享受服務(wù)器提供的事務(wù)、安全等服務(wù)
(Jboss, Weblogic, Websphere, Sun Application server)
名詞解析:
1.分布式計(jì)算:
1)把大任務(wù)分成小塊,分發(fā)給大家分別地做,再把每個(gè)人的計(jì)算結(jié)果匯總。
特點(diǎn):分解工作,減輕成員的負(fù)擔(dān),成員之間做到職責(zé)分明。
2)充分利用網(wǎng)絡(luò)上空閑的計(jì)算機(jī)的計(jì)算能力。
分布式組件:
1)分布對(duì)象技術(shù)是伴隨網(wǎng)絡(luò)而發(fā)展起來(lái)的一種面向?qū)ο蟮募夹g(shù)。
以前的計(jì)算機(jī)系統(tǒng)多是單機(jī)系統(tǒng),多個(gè)用戶(hù)是通過(guò)聯(lián)機(jī)終端來(lái)訪問(wèn)的,沒(méi)有網(wǎng)絡(luò)的概念。
網(wǎng)絡(luò)出現(xiàn)后,產(chǎn)生了C/S、B/S的計(jì)算服務(wù)模式。
2)分布式對(duì)象技術(shù)主要使用了面向?qū)ο蠹夹g(shù)的封裝性,組件可以分布在網(wǎng)絡(luò)的任何位置。
對(duì)外界來(lái)說(shuō),它所需關(guān)心的只是組件的界面(接口),至于內(nèi)部是如何實(shí)現(xiàn)的則無(wú)需考慮,
遠(yuǎn)程客戶(hù)通過(guò)方法調(diào)用來(lái)訪問(wèn)它。這是分布式對(duì)象技術(shù)和傳統(tǒng)的面向?qū)ο蠹夹g(shù)的最大不同點(diǎn)。
2.組件:可獨(dú)立發(fā)布的二進(jìn)制單元
3.框架,即framework。其實(shí)就是某種應(yīng)用的半成品,就是一組組件,供你選用完成你自己的系統(tǒng);
代表:Struts,Spring,Hibernate…
4.中間件,是一種獨(dú)立的系統(tǒng)軟件或服務(wù)程序,分布式應(yīng)用軟件借助這種軟件在不同的技術(shù)之間共享資源;
代表:Weblogic,WebSphere,Sun App Server…
5.容器:
EJB的家。 離開(kāi)容器,EJB就失去了它的生命和意義
EJB分布式對(duì)象的基礎(chǔ)
JRMI(Java Remote Method Invocation) (遠(yuǎn)程方法調(diào)用)
--- 使用遠(yuǎn)程消息交換協(xié)議JRMP(Java Remote Messaging Protocol) 進(jìn)行通訊
CORBA對(duì)象調(diào)用
--- 使用IIOP(Internet Inter-ORB Protocal)
2. Why EJB
簡(jiǎn)化大型分布式系統(tǒng)的開(kāi)發(fā)過(guò)程。
1)利用網(wǎng)絡(luò)中多臺(tái)計(jì)算機(jī)的計(jì)算能力,構(gòu)建瘦客戶(hù)端(簡(jiǎn)化分布式訪問(wèn))
2)使用EJB服務(wù)器提供的系統(tǒng)級(jí)的企業(yè)服務(wù)(事務(wù)、安全、對(duì)象池....),開(kāi)發(fā)人員需要寫(xiě)業(yè)務(wù)組件
3)EJB組件具有熱部署的能力(可插拔)
4)可以擴(kuò)展現(xiàn)有系統(tǒng)的JavaBean
優(yōu)點(diǎn):可維護(hù)性、重用性、可擴(kuò)展性、可插拔性
1)縮短開(kāi)發(fā)時(shí)間: 編程人員可將先行開(kāi)發(fā)的部件裝配到新的程序中,從而加速了新程序的開(kāi)發(fā)
2)降低集成費(fèi)用: 在將組件集成為一個(gè)完整的方案時(shí),不同開(kāi)發(fā)商采用了一致的標(biāo)準(zhǔn)接口,減少了特殊的定制工作
3)開(kāi)發(fā)更具靈性: 只需簡(jiǎn)單調(diào)整全部應(yīng)用的一些組件,即可為企業(yè)不同領(lǐng)域的應(yīng)用提供特定的解決方案
4)降低維護(hù)費(fèi)用: 各組件的軟件功能是相對(duì)獨(dú)立的,在維護(hù)和升級(jí)一個(gè)組件時(shí),不必變動(dòng)整個(gè)應(yīng)用。維護(hù)簡(jiǎn)便
3. When to use EJB
少量的需要分布式技術(shù)支持的大型項(xiàng)目,比如:
1)應(yīng)付巨大的客戶(hù)訪問(wèn)量 2)和已有的系統(tǒng)做集成
EJB可以做什么?
1)服務(wù)器端的業(yè)務(wù)層框架 2)遵循EJB規(guī)范的標(biāo)準(zhǔn)組件 3)分布式組件
4)持久化數(shù)據(jù)支持 5)事務(wù)性支持 6)支持并發(fā)多用戶(hù)安全
技術(shù)選擇:
表現(xiàn)層技術(shù):Servlet, JSP MVC框架:Struts,Tapestry,MyFaces...
業(yè)務(wù)層組件:JavaBean 集成層: Spring,EJB
持久層技術(shù):JDBC ORM框架:Hibernate,TopLink,OpenJPA,EJB JPA...
常見(jiàn)技術(shù)組合:
Struts/MyFaces + EJB(JDBC)
需要分布式技術(shù)的大型項(xiàng)目,大并發(fā)訪問(wèn)量,性能要求高
Struts/MyFaces + Spring + Hibernate
多數(shù)中小型項(xiàng)目
EJB 3.0
1)會(huì)話Bean:對(duì)業(yè)務(wù)邏輯建模
分類(lèi): 有狀態(tài),能分辨不同的客戶(hù);無(wú)狀態(tài),不能分辨不同的客戶(hù)
2)實(shí)體(Entity)
POJO
3)消息Bean
支持異步通信。沒(méi)有直接的客戶(hù)端,由消息觸發(fā)(驅(qū)動(dòng))
4. First EJB開(kāi)發(fā)步驟:
EJB組件開(kāi)發(fā):
1)安裝JBoss,并啟動(dòng)
默認(rèn)端口:8080;可以修改 %jboss_home%/server/default/deploy/jboss-web.deployer 的server.xml
把 <Service name="jboss.web"> 的 <Connector port="8080" ... 改成想要的就行
2)開(kāi)發(fā)一個(gè)普通的Java組件
3)classpath加上Java EE 5 Libraries(MyEclipse自帶類(lèi)庫(kù))
4)加EJB的標(biāo)注,聲明為EJB組件
IHello.java (接口標(biāo)注:@Remote )
HelloBean.java (無(wú)狀態(tài)會(huì)話bean標(biāo)注:@Stateless )
5)編譯,在 FirstEJB/bin 運(yùn)行命令: jar cvf HelloEJB.jar .
6)拷貝HelloEJB.jar到%jboss_home%/server/default/deploy目錄下
這是正常發(fā)布方法。需要啟動(dòng)%jboss_home%/bin/run.jar (win下用run.bat,linux用run.sh啟動(dòng))
7)確認(rèn)組件已部署(控制臺(tái)沒(méi)有異常)
EJB客戶(hù)端開(kāi)發(fā):
1)classpath加上jbossall-client.jar(這個(gè)包在 %jboss_home%/client/ 下)
引入這個(gè)jar包之后才可以初始化上下文(context)
2)引入IHello.class
3)Client.java
5. JNDI(Java 命名和目錄服務(wù)接口)
JNDI為JavaEE平臺(tái)提供了一個(gè)通過(guò)名字查找網(wǎng)絡(luò)中一切對(duì)象的標(biāo)準(zhǔn)機(jī)制
是一套為開(kāi)發(fā)者提供通過(guò)名字方便查找用戶(hù)、機(jī)器、網(wǎng)絡(luò)、對(duì)象和服務(wù)的 Java API
JNDI實(shí)現(xiàn)了EJB對(duì)象位置的透明性,客戶(hù)端只要能訪問(wèn)JNDI服務(wù),便可以調(diào)用EJB服務(wù)。
1) 部署ejb的時(shí)候,容器將會(huì)把EJB對(duì)象綁定到命名服務(wù)
2) 像JDBC可以訪問(wèn)不同的數(shù)據(jù)庫(kù),可以通過(guò)JNDI訪問(wèn)不同的JNDI服務(wù)
a.設(shè)置上下文工廠
b.設(shè)置JNDI服務(wù)提供者的url
3) JNDI的API的使用
初始化上下文(Context ctx = new InitialContext() )
--- 不同的應(yīng)用服務(wù)器初始化上下文的工廠類(lèi)是不同的,協(xié)議也可能不一樣!!!查文檔吧
三種方式初始化上下文:
a)設(shè)置系統(tǒng)屬性(Test.java中)
System.setProperty(Context.INITIAL_CONTEXT_FACTORY,
org.jnp.interfaces.NamingContextFactory.class.getName());
上句也可以這樣寫(xiě): System.setProperty("java.naming.factory.initial",
"org.jnp.interfaces.NamingContextFactory");
System.setProperty(Context.PROVIDER_URL, "localhost");
//"localhost" 也可以寫(xiě): jnp://127.0.0.1:1099
b)通過(guò)命令行設(shè)置
c)在類(lèi)路徑下添加jndi.properties ---名字不能修改!!
jboss中:
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.provider.url=jnp://localhost:1099
Sun App Server 9.0 中:
java.naming.factory.initial=com.sun.enterprise.naming.SerialInitContextFactory
java.naming.provider.url=iiop://127.0.0.1:3700
4) JNDI API(javax.naming.Context接口) 主要方法的使用
void bind(String name, Object object); //將名稱(chēng)綁定到對(duì)象。如果已經(jīng)存在,則拋出異常。
void rebind(String name, Object object); //將名稱(chēng)綁定到對(duì)象。如果存在,重寫(xiě)所有綁定。
void rename(String oldName,String newName); //把某一個(gè)已經(jīng)綁定的舊名稱(chēng)改新名字
void unbind(String name); //取消指定對(duì)象的綁定。
Object lookup(String name); //查找指定的對(duì)象。
注意:這4個(gè)方法都 throws NamingException;
5) JBoss下配置JNDI名稱(chēng)
在jboss下配置bean的JNDI名可以采取三種方式:
第一種:也是默認(rèn)的,"beanname/remote"
第二種:使用@RemoteBinding注釋。(導(dǎo)入jboss-annotations-ejb3.jar)
@RemoteBinding(jndiBinding="jndiName") --- 這種方式不好,與JBoss耦合!!!
第三種:使用jboss.xml文件,此文件要放在src\META-INF目錄下。具體內(nèi)容見(jiàn)下面:
<jboss>
<enterprise-beans>
<session>
<ejb-name>BeanName</ejb-name>
<jndi-name>jnidname</jndi-name>
</session>
</enterprise-beans>
</jboss>
6. 遠(yuǎn)程調(diào)用的原理
1)使用Socket進(jìn)行網(wǎng)絡(luò)通信
2)使用代理模式,使得調(diào)用服務(wù)器端的遠(yuǎn)程對(duì)象,看起來(lái)像調(diào)用本地對(duì)象一樣
3)客戶(hù)端的代理叫做Stub(樁)
4)服務(wù)端的Skeleton(框架)
5)調(diào)用過(guò)程: Client -> Stub(遠(yuǎn)程接口) -> Skeleton -> EJB Object(也叫遠(yuǎn)程對(duì)象)
RMI簡(jiǎn)介
1)RMI(Remote Method Invocation,遠(yuǎn)程方法調(diào)用)是用Java在JDK1.1中實(shí)現(xiàn)的,它增強(qiáng)了開(kāi)發(fā)分布式應(yīng)用的能力。
2)Java RMI 則支持存儲(chǔ)于不同地址空間的程序級(jí)對(duì)象之間彼此進(jìn)行通信,實(shí)現(xiàn)遠(yuǎn)程對(duì)象之間的無(wú)縫遠(yuǎn)程調(diào)用。
3)RMI目前使用Java遠(yuǎn)程消息交換協(xié)議JRMP(Java Remote Messaging Protocol)進(jìn)行通信。
4)用Java RMI開(kāi)發(fā)的應(yīng)用系統(tǒng)可以部署在任何支持JRE(Java Run Environment,Java運(yùn)行環(huán)境)的平臺(tái)上。但由于JRMP是專(zhuān)為Java對(duì)象制定的,因此,RMI 對(duì)于用非Java語(yǔ)言開(kāi)發(fā)的應(yīng)用系統(tǒng)的支持不足。不能與用非Java語(yǔ)言書(shū)寫(xiě)的對(duì)象進(jìn)行通信。
RMI架構(gòu)
1) Stub/Skeleton層
該層提供了客戶(hù)程序和服務(wù)程序彼此交互的接口。
2) 遠(yuǎn)程引用層(Remote Reference)
中間層,負(fù)責(zé)處理遠(yuǎn)程對(duì)象引用的創(chuàng)建和管理。
3) 傳輸協(xié)議(Transport Protocal)
提供了數(shù)據(jù)協(xié)議,用以通過(guò)線路傳輸客戶(hù)程序和遠(yuǎn)程對(duì)象間的請(qǐng)求和應(yīng)答。
編寫(xiě)RMI的程序
1) 定義遠(yuǎn)程接口
通過(guò)擴(kuò)展 java.rmi.Remote 接口,并定義所需的業(yè)務(wù)方法實(shí)現(xiàn)
遠(yuǎn)程方法必須聲明拋出 java.rmi.RemoteException 異常;或者這異常的父類(lèi)
遠(yuǎn)程方法的參數(shù)和返回值必須是實(shí)現(xiàn)序列化接口的類(lèi)(基本類(lèi)型也可以)
2) 定義遠(yuǎn)程接口的實(shí)現(xiàn)類(lèi)
即實(shí)現(xiàn)上一步所定義的接口,給出業(yè)務(wù)方法的具體實(shí)現(xiàn)邏輯。
3) 編寫(xiě)運(yùn)行 Skeleton 引導(dǎo)程序注冊(cè)RMI服務(wù) (定義協(xié)議,并等待客戶(hù)端調(diào)用)
4) 編寫(xiě)客戶(hù)端 Stub;(遵守協(xié)議的端口、讀取發(fā)送信息的方式;供調(diào)用)
使用動(dòng)態(tài)類(lèi)加載機(jī)制(反射機(jī)制)
5) 編寫(xiě)客戶(hù)端Client,調(diào)用遠(yuǎn)程對(duì)象
7. Local接口和EJB組件的依賴(lài)注入
1)本地接口: @Local
2)EJB組件的依賴(lài)注入:@EJB(mappedName="EJB Name/remote")
ejb客戶(hù)端開(kāi)發(fā)步驟:
1)引入ejb遠(yuǎn)程接口(a方式.引入ejb工程, b.把遠(yuǎn)程接口直接Copy過(guò)來(lái))
2)引入jbossall-client.jar
3)保證src目錄下面有一個(gè)jndi.properties
4)客戶(hù)代碼,如:Test.java
8. Remote 和 Local
Local(默認(rèn)方式) Remote
使用@Local標(biāo)注 使用@Remote標(biāo)注
只能本地調(diào)用,遠(yuǎn)程不行 既可以本地調(diào)用,也可以遠(yuǎn)程調(diào)用
避免網(wǎng)絡(luò)交換過(guò)程 無(wú)法避免網(wǎng)絡(luò)交換過(guò)程,性能差
允許傳遞未序列化的參數(shù) 不允許傳遞未序列化的參數(shù)
注意:要調(diào)用實(shí)現(xiàn)Local接口的sessionbean,客戶(hù)端程序和EJB必須在同一JVM的服務(wù)器環(huán)境。
遠(yuǎn)程客戶(hù)端也可以通過(guò) 與EJB在同一JVM的代理去訪問(wèn)(如Stub/Skeleton;或者用一個(gè)@Remote的Bean間接調(diào)用)
-----------------------------------------------------------
Day2
1. EJB的Web客戶(hù)
在web項(xiàng)目中調(diào)用EJB
web項(xiàng)目在tomcat部署:
web項(xiàng)目中必須包含遠(yuǎn)程接口
web項(xiàng)目必須導(dǎo)入jbossall-client.jar
web項(xiàng)目在jboss部署: (在同一臺(tái)服務(wù)器上部署)
web項(xiàng)目: 不需要 遠(yuǎn)程接口和jbossall-client.jar(注意: 一個(gè)JBoss中不能出現(xiàn)兩個(gè)相同的類(lèi))
2. EJB編程模型
3. EJB的分類(lèi)(2.X分類(lèi))
1)Session Bean(會(huì)話Bean) (Stateless和Stateful) --- 對(duì)業(yè)務(wù)邏輯建模
2)Entity Bean(實(shí)體Bean,3.0使用JPA替代) -- POJO ---對(duì)領(lǐng)域模型建模
3)Message Driven Bean(消息驅(qū)動(dòng)Bean) --- 支持異步通訊,沒(méi)有直接的客戶(hù)端,由消息驅(qū)動(dòng)
4.EJB的系統(tǒng)服務(wù)
1)事務(wù)
2)安全
3)對(duì)象池
5. 部署描述符和標(biāo)注
早期版本使用配置文件開(kāi)發(fā)EJB, EJB3.0使用Annotation簡(jiǎn)化開(kāi)發(fā)
1)開(kāi)發(fā)階段:開(kāi)發(fā)人員使用Annotation開(kāi)發(fā)
2)部署階段:部署人員使用部署描述符部署(將覆蓋annotation配置)
部署描述符:
1) 標(biāo)準(zhǔn)部署描述符:ejb-jar.xml
<ejb-jar version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd ">
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -