?? ejb2_0中的變化增強,應用程序開發的靈活性和可移植性3.htm
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0056)http://eps.www85.cn4e.com/java/article/devshow.asp?id=68 -->
<HTML><HEAD><title>csdn_EJB2.0中的變化增強,應用程序開發的靈活性和可移植性3</TITLE>
<META content="text/html; charset=gb2312" http-equiv=Content-Type>
<STYLE type=text/css>TD {
FONT-FAMILY: "Verdana", "Arial", "宋體"; FONT-SIZE: 9pt
}
A {
COLOR: #660000; TEXT-DECORATION: underline
}
A:hover {
COLOR: #660000; TEXT-DECORATION: none
}
.line {
LINE-HEIGHT: 14pt
}
</STYLE>
<META content="MSHTML 5.00.2920.0" name=GENERATOR></HEAD>
<BODY bgColor=#ffffff text=#000000>
<table>
<table><tbody>
<TR>
<TD height=21>
<DIV align=center><B><FONT size=3>EJB2.0中的變化增強,應用程序開發的靈活性和可移植性3 <BR><FONT size=2> </FONT></FONT></FONT>
<HR align=center color=#cccccc noShade SIZE=1>
</DIV></TD></TR>
<TR>
<TD class=line><FONT
color=#333300><BR><BR>在部署時,部署者將使用持久性管理器工具來具體實現這個 bean 類及其從屬類。這些具體實現將在運行時保持各種關系,并使各 bean 實例的狀態與數據庫同步。容器將在運行時管理持久性實例,從而提供一種強健的環境,其中具有自動的訪問控制和事務控制。 <BR><BR>bean 也可以定義從屬對象的值,這些對象是可序列化的對象,如 EJB 1.1 示例中的 Address 對象。這些值通過序列化而變為持久的,它們并不形成與 bean 的關系 -- 它們是嚴格的容器管理的持久性字段。 <BR><BR>容器與持久性管理器之間也已經定義了一個合約,使持久性管理器可以獲得事務的句柄,并訪問由該容器管理的數據庫連接池。這個合約稍嫌寬松,將來還需要使其更為嚴格,但它是允許持久性管理器跨 EJB 容器移植的基礎。容器和持久性管理器之間合約的細節已超出了本文的范圍。 <BR><BR>除了通過抽象持久性方案定義持久性之外,EJB 2.0 還提供了一種新的查詢語言,用來說明持久性管理器應該如何實現 CMP 中的各種查找方法。 <BR><BR>EJB 查詢語言 <BR>EJB 查詢語言 (EJB QL) 規定了持久性管理器應該如何實現在本地接口中定義的各種查找方法。 EJB QL 以 SQL-92 為基礎,可由持久性管理器自動編譯,這使得實體 bean 具有更高的可移植性,并且更容易部署。 <BR><BR>EJB QL 和查找方法 <BR>EJB QL 語句是在實體 bean 的部署描述符中聲明的。使用 EJB QL 非常簡單。作為一個例子,Employee bean 的本地接口可以按以下方式聲明: <BR><BR>public interface EmployeeHome extends javax.ejb.EJBHome <BR>{ <BR>... <BR><BR>public Employee findByPrimaryKey(Integer id) <BR>throws RemoteException, CreateException; <BR><BR>public Collection findByZipCode(String zipcode) <BR>throws RemoteException, CreateException; <BR><BR>public Collection findByInvestment(String <BR>investmentName) <BR>throws RemoteException, CreateException; <BR><BR>} <BR><BR><BR><BR>給定了上面的本地接口定義之后,您就可以使用 EJB QL 來指定持久性管理器應該如何執行查找方法。每個實體 bean 都必須有一個 findByPrimaryKey() 方法。為執行該方法所需的查詢是很明顯的 -- 使用主關鍵字的(一個或幾個)字段在數據庫中查找 bean,這樣就不需要任何 EJB QL 語句。 <BR><BR>findByZipCode() 方法用來獲得具有某個郵政編碼的所有 Employee bean。這將使用部署描述符中的下列 EJB QL 來表達。 <BR><BR>FROM contactInfo WHERE contactInfo.zip = ?1 <BR><BR>該語句本質上是表示“選擇其郵政編碼等于 zipcode 參數的所有 Employee bean”。 <BR><BR>在用于查找方法的 EJB QL 語句中,不需要使用 SELECT 子句來表明要選擇的內容。這是因為,查找方法將總是選擇與其自身的 bean 類型相同的遠程引用。在這種情況下,就可以認為選擇語句將返回遠程 Employee bean 的全部引用。 <BR><BR>如果各種查找方法都一起部署在同一個 ejb-jar 文件中,并且其間具有可導航的實際關系,那么這些查找方法就甚至可以跨越到另一些 bean 的抽象持久性方案中去。例如,findByInvestment() 方法將要求該查找查詢從 Employee 導航到投資 bean 的抽象持久性方案中去。聲明來表達這種查找操作的 EJB QL 語句如下所示。 <BR><BR>FROM element IN benefit.investments WHERE element.name <BR>= ?1 <BR><BR><BR><BR>以上語句是說:“選擇全部這樣的 Employee bean:其獲利從屬對象至少包含一個投資 bean 的引用,并且其名稱等于 findByInvestment() 方法的 investmentName 參數。” <BR><BR>EJB QL 和選擇方法 <BR>EJB QL 也用于一種稱為 ejbSelect 方法的新查詢方法中,該方法類似于查找方法,只是它僅供 bean 類使用。該方法不在本地接口中聲明,所以也不顯露給客戶機。此外,ejbSelect 方法可返回范圍更大的各種值,而不僅限于 bean 本身的遠程接口類型。 <BR><BR>存在兩種選擇方法:ejbSelect<METHOD> 和 ejbSelect<METHOD>InEntity。ejbSelect<METHOD> 方法是全局執行的,這是指這種方法并非專用于執行該方法的 bean 實例。ejbSelect<METHOD>InEntity 方法則專用于執行該方法的實體實例。這些選擇方法在 bean 類中被聲明為抽象方法,并在這些類的業務方法中使用。下面是 ejbSelect<METHOD> 方法和 ejbSelect<METHOD>InEntity 方法的示例,同時說明了可以如何在業務方法中使用它們。 <BR><BR>public abstract class EmployeeBean implements <BR>javax.ejb.EntityBean { <BR>... <BR>// ejbSelectInEntity <BR>public abstract Collection <BR>ejbSelectInvestmentsInEntity (String risk); <BR><BR>// ejbSelect <BR>public abstract Collection <BR>ejbSelectInvestments(String risk); <BR>... <BR>} <BR><BR><BR><BR>在上面的聲明中,兩種選擇方法運行于不同的范圍。ejbSelectInvestmentsInEntity() 僅在當前的 Employee bean 實例上執行,所以它只返回雇員的風險投資。 <BR><BR>SELECT invest FROM invest IN benefit.investments WHERE <BR>invest.type = ?1 <BR><BR><BR><BR>另一方面,ejbSelect<METHOD> 方法的范圍則是全局性的,所以同一個查詢將返回整個企業內所有雇員的全部風險投資。 <BR><BR>ejbSelect<METHOD>InEntity 選擇方法可以返回 bean 的遠程類型(如在上面的查詢中那樣)、從屬對象或任何其它 Java 類型。另一方面,全局選擇方法則不能返回 bean 的從屬對象類型。 <BR><BR>選擇方法的 EJB QL 語句要求使用 SELECT 子句,因為它們能夠返回范圍更廣的各種值。 <BR><BR>新的 ejbHome 方法 <BR>在 EJB 2.0 中,實體 bean 可以聲明一些 ejbHome 方法,用來執行與 EJB 組件相關的操作,但并不專用于某個 bean 實例。在 bean 類中定義的 ejbHome 方法在本地接口中必須有一個與其相匹配的本地方法。下面的代碼說明了一個本地方法,它正是作為 Employee bean 的本地接口定義的。applyCola() 方法用來根據最近 COLA(生活費用調整)的增長來更新所有雇員的薪水。 <BR><BR><BR>public interface EmployeeHome extends javax.ejb.EJBHome <BR>{ <BR>// 本地方法 <BR>public void applyCola(double increate) throws <BR>RemoteException; <BR>... <BR>} <BR><BR><BR><BR>applyCola() 方法在 bean 類中必須有匹配的 ejbHome 方法,它被聲明為 ejbHomeApplyCola()。ejbHomeApplyCola() 方法并非專用于一個 bean 實例,它的范圍是全局的,所以它將對所有雇員的薪水使用同一個 COLA。 <BR><BR>public abstract class EmployeeBean implements <BR>javax.ejb.EntityBean { <BR>... <BR>// ejbHome 方法 <BR>public void ejbHomeApplyCola (double increase ){ <BR>Collection col = ejbSelectAllEmployees (); <BR>Iterator employees = col.iterator(); <BR>while(employees.next()){ <BR>Employee emp = <BR>(Employee)employees.next(); <BR>double salary = <BR>emp.getAnnualSalary(); <BR>salary = salary + (salary*increase); <BR>emp.setAnnualSalary(salary); <BR>} <BR>} <BR>} <BR><BR><BR><BR>bean 的開發人員需要為 BMP 和 CMP 實體 bean 都實現 ejbHome 方法。CMP 實現可能在很大程度上要依賴于全局的選擇語句(如上面所說明的那樣)和 finder 方法,而 ejbHome 的 BMP 實現則將使用直接數據庫訪問和 bean 的 finder 方法,來查詢數據和進行更改。 <BR><BR>MessageDrivenBean <BR>在 EJB 2.0 中,對規范的一個基礎性更改是添加了一種全新的企業級 bean 類型,即 MessageDrivenBean。MessageDrivenBean 專門設計來處理入網的 JMS 消息。對于許多開發人員來說,JMS 是一種新的范例,所以本文將花一些時間逐步說明對 JMS 的理解,以及它們在 EJB 2.0 中的用法。 <BR><BR>什么是 JMS? <BR>JMS 是一種與廠商無關的 API,用來訪問消息收發系統。它類似于 JDBC (Java Database Connectivity):這里,JDBC 是可以用來訪問許多不同關系數據庫的 API,而 JMS 則提供同樣與廠商無關的訪問方法,以訪問消息收發服務。許多廠商目前都支持 JMS,包括 IBM 的 MQSeries、BEA 的 Weblogic JMS service 和 Progress 的 SonicMQ,這只是幾個例子。 <BR><BR>JMS 使您能夠通過消息收發服務(有時稱為消息中介程序或路由器)從一個 JMS 客戶機向另一個 JML 客戶機發送消息。消息是 JMS 中的一種類型對象,由兩部分組成:報頭和消息主體。報頭由路由信息以及有關該消息的元數據組成。消息主體則攜帶著應用程序的數據或有效負載。根據有效負載的類型來劃分,可以將消息分為幾種類型,它們分別攜帶:簡單文本 (TextMessage)、可序列化的對象 (ObjectMessage)、屬性集合 (MapMessage)、字節流 (BytesMessage)、原始值流 (StreamMessage),還有無有效負載的消息 (Message)。 <BR><BR>消息收發系統是異步的,也就是說,JMS 客戶機可以發送消息而不必等待回應。比較可知,這完全不同于基于 RPC 的(基于遠程過程的)系統,如 EJB 1.1、CORBA 和 Java RMI 的引用實現。在 RPC 中,客戶機調用服務器上某個分布式對象的一個方法。在方法調用返回之前,該客戶機被阻塞;該客戶機在可以執行下一條指令之前,必須等待方法調用結束。在 JMS 中,客戶機將消息發送給一個虛擬通道(主題或隊列),而其它 JMS 客戶機則預訂或監聽這個虛擬通道。當 JMS 客戶機發送消息時,它并不等待回應。它執行發送操作,然后繼續執行下一條指令。消息可能最終轉發到一個或許多個客戶機,這些客戶機都不需要作出回應 <BR><BR></FONT></TD></TR>
<TR>
<TD height=5>
<HR align=center color=#cccccc noShade SIZE=1>
</TD></TR></TBODY></BODY></HTML>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -