一有狀態會話 Bean 的開發和部署 基礎知識
在第一節中
我們給出了一個 HelloWorld 無狀態的會話 Bean
在 EJB
規范中
EJB 包括三種 Bean
第一種便是會話 Bean(Session Bean)
然後還有實體 Bean(EntityBean) 和消息驅動 Bean
會話 Bean 包括無狀態會話 Bean 和有狀態會話 Bean
二者的主要區別是前者在執行的過程中不保存 Bean 的狀態信息
它沒有狀態域
也就是說
無狀態會話 Bean 就只是一個執行過程
我們調用它完成我們的任務而己
它在容器池中無法保存 Bean 狀態
而後者在容器中執行時會保存 Bean 的執行狀態
相對應的
有狀態會話 Bean 中也對應有狀態域
即會話 Bean 在執行的過程中會將與固定客戶端的會話狀態保存起來以備後用
然而
有狀態會話 Bean 它沒有主鍵類
客戶端無法查找出它對應的在容器池中的 EJBObject
那麼我們如何重用我們的 EJBObject 呢?在這篇文章中
我們提供了兩種方法
並給出了示例程序
第一種方法是采用有狀態會話 Bean 的 Handle( 句柄 )
為了取得句柄
可以調用 EJBObject 接口的 getHandle ()方法
返回一個 Handle 實例
為了重新構建對同一 EJBObject 的引用
可以使用 Handle 接口的 getEJBObject ()方法
此方法返回一個對應 Handle 的 EJB 對象
利用此對象
我們就可以重構出對應的 EJBObject
如下示例
Count count = counthome
create();// 產生 Remote 接口對象
javax
ejb
Handle handle = count
getHandle();// 獲得 Remote 接口的句柄
…
Object obj = handle
getEJBObject();// 得獲得 Handle 對應的在容器池中的 EJBObject 對象
Count recount= (Count)PortableRemoteObject
narrow(obj
Count
class);
// 將此對象重構為遠程接口對象即可重新調用它的方法
第二種方法是采用有狀態會話 Bean 的 HomeHandle
它類似 handle
但不能用於引用 EJBObject
HomeHandle 包含足夠的信息
可以重建 EJBHome ()的引用
它的做法是調用 getHomeHandle ()方法 和 getEJBHome ()方法
此方法返回一個對應 Handle 的 EJBHome 對象
利用此對象
可以重新生成出對應的 EJBObject 對象
然後調用它的方法
如下示例
Content ctx = new InitialContext();
Object h = ctx
lookup(
CountHome
);
CountHome home = (CountHome)PortableRemoteObject
narrow(h
CountHome
class);
HomeHandle homehandle = home
getHomeHandle();// 獲取 HomeHandle
CountHome reHome = (CountHome)homeHandle
getEJBHome();
Count recount = rehome
create();
利用以上兩種方法
我們可以自動的存儲並重建引用所需的會話 Bean 中的 EJB 信息
好了
了解了以上知識
下面我們就來一個真實的會話 Bean 來看看它的運行方式!
一個有狀態會話Bean的開發和部署
開發一個會話 Bean
基本的應遵守以下步聚
首先開發 Remote 接口
再編寫 Home 接口
然後是 Bean 本身
同時
為了區別
我們應默認遵守以下命名規則
Remote 接口直接用 xxx 命名
Home 接口用 xxxHome 命名
Bean 本身用 xxxBean 命名
首先
我們手動建立開發環境
在 C:\JBOSS 目錄(這裡指 JBOSS 的安裝目錄
詳見上一節)下新建一個存放我們項目的目錄 myproject
然後再在 myproject 下建一個存放此 Count 會話 Bean 的目錄 CounterStatefullSessionBean
用來存放我們的這個 Bean 的所有相關文件
然後
再在 CounterStatefullSessionBean 目錄下建三個目錄
ejb
jsp 和 src 分別用來存放 ejb 類
Web 應用文件( jsp 文件及 Servlet 類)和我們的源程序
接著
再在 EJB 目錄下建一個 client 目錄和一個 counter
jar 目錄分別用來存放 client 端測試程序和服務器端類
然後再在 client 和 counter
jar 目錄下同時各新建一個 counter 目錄
counter 目錄下再建一個 ejb 目錄
這是我們的包名
然後在 counter
jar 目錄下再建一個 META
INF 目錄
用於存放我們的 ejb 配置文件
接著
再在 jsp 目錄中新建一個 counter
war 目錄用於保存 WEB 發部的程序
再在 counter
war 下新建一個 WEB
INF 目錄
同時在 WEB
INF 目錄中新建一個 classes 目錄
其下面再建包目錄 counter 及 counter 目錄下的 ejb 目錄
好了
我們的目錄己建立成功
我們的目錄結構見圖
所示
圖 好了
我們利用上面的知識來建一個有狀態會話 Bean 及它的測試程序
我們在這裡引入《 Mastering EJB 》 (Second Edition) 中的一個會話 Bean
即 Count
這個 Bean 中有一個狀態域命名為 val
它用來保存相應客戶端調用 EBJ 方法 count 的次數
我們進入 src 目錄
所有的類源程序我們都在此目錄中編寫和存放
編寫 Remote 接口
代碼如下
//Count
java
package counter
ejb;
import javax
ejb
*;
import java
rmi
RemoteException;
public interface Count extends EJBObject{
public int count() throws RemoteException;
}
編寫 Home 接口
代碼如下
//CountHome
java
package counter
ejb;
import javax
ejb
*;
import java
rmi
RemoteException;
public interface CountHome extends EJBHome{
Count create(int val) throws RemoteException
CreateException;
}
編寫 Bean 類
代碼如下
//CountBean
java
package counter
ejb;
import javax
ejb
*;
public class CountBean implements SessionBean{
// 當前的計數值就是對話狀態
public int val;
private SessionContext ctx;
//EJB 方法
public int count(){
System
out
println(
count()
);
return ++val;
}
//EJB 必須的方法
public void ejbCreate(int val) throws CreateException{
this
val=val;
System
out
println(
ejbCreate()
);
}
public void ejbRemove(){
System
out
println(
ejbRemove()
);
}
public void ejbActivate(){
System
out
println(
ejbActivate()
);
}
public void ejbPassivate(){
System
out
println(
ejbPassivate()
);
}
public void setSessionContext(SessionContext ctx){
this
ctx = ctx;
}
public SessionContext getSessionContext(){
return this
ctx;
}}
好了
我們在 src 目錄中產生了三個 java 文件
這是 EJB 必須的類
下面我們用在第一節中編寫的 com
bat 文件來編譯它們
進行 src 目錄
熱行
com *
java 即會產生三個
class 文件
下面我們部署我們的 EJB
首先編寫部署描述符
進入
C
\JBOSS\myproject\CounterStatefullSessionBean\ejb\counter
jar\META
INF 目錄中
新建一個 ejb
jar
xml 文件
內容如下
<?xml version=
encoding=
gb
?>
<!DOCTYPE ejb
jar PUBLIC
//Sun Microsystems
Inc
//DTD Enterprise JavaBeans
//EN
jar_
_
dtd
>
<ejb
jar>
<enterprise
beans>
<session>
<display
name>Count</display
name>
<ejb
name>Count</ejb
name>
<home>counter
ejb
CountHome</home>
<remote>counter
ejb
Count</remote>
<ejb
class>counter
ejb
CountBean</ejb
class>
<session
type>Stateful</session
type>
<transaction
type>Container</transaction
type>
</session>
</enterprise
beans>
</ejb
jar>
此為 EJB 布署描述符文件
它裡聲明了此 CountBean 的一些屬性
如聲明了本地接口
遠程接口及 Bean 的類型
其中 <session
type>Stateful</session
type> 一句聲明此 Bean 是有狀態會話 Bean
如果是無狀態會話 Bean( 見第一節中的 HelloWorld)
則此處應該是 Stateless
然後
我們再在此目錄中新建一個 jboss
service
xml 文件
它是 JBOSS 服務器特有的描述文件
它的內容如下
<?xml version=
encoding=
gb
?>
<jboss>
<enterprise
beans>
<session>
<ejb
name>Count</e
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28547.html