開發遠程接口的無狀態會話bean
由於無狀態會話bean不維護會話狀態,這就意味着一個bean實例可以爲多個用戶服務。簡單地說就是:當無狀態會話bean部署到應用服務器時,EJB容器會爲它預先創建一些bean實例放在對象池。無狀態會話bean比有狀態會話bean更具性能優勢,在條件允許的情況下開發人員首先考慮使用無狀態會話bean。
3.1 開發實現遠程接口的無狀態會話bean
1、定義一個遠程接口。
package huizhi.HelloEJBRemote;
public interface HelloEJBRemote {
public String hello(String name);
}
2、創建這個接口的實現類:
package huizhi.HelloEJBRemote;
import javax.ejb.Remote;
import javax.ejb.Stateless;
@Stateless
@Remote( { HelloEJBRemote.class })
public class HelloEJBRemotebean implements HelloEJBRemote {
public HelloEJBRemotebean() {
}
public String hello(String name) {
return new String("你好," + name);
}
}
對雙面的註釋的介紹:
@Stateless 註釋用來指定bean實現類是無狀態的。該註釋具有一個name屬性可用來爲bean實現類指定EJB名稱,例如:
@Stateless(name="HelloEJB")
如果不指定該屬性,則默認就是不餓按實現類的類名。
@Remote 註釋用來指定bean實現類的遠程接口。bean實現類可以繼承多個遠程接口,每個接口之間用逗號隔開,例如:
@Remote({HelloEJBRemote.class,UserEJBRemote.class})
如果只有一個遠程接口則可以省去大括號,本例亦是如此。
通過下面的JSP頁面來測試該會話bean:
<%@ page language="java" pageEncoding="GB2312" import="javax.naming.*, huizhi.HelloEJBRemote.*"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB2312">
<title>遠程無狀態會話bean遠程接口</title>
</head>
<body>
<%
try{
InitialContext ctx = new InitialContext();
HelloEJBRemote hr = (HelloEJBRemote)ctx.lookup("HelloEJBRemotebean/remote");
out.println("<br>通過遠程接口調用EJB<br>" + hr.hello("李小婉"));
}catch(Exception e){
out.print("遠程接口調用失敗!");
}
%>
</body>
</html>
上述代碼通過JNDI的方式查找到了HelloEJBRemote接口,並調用了該接口中的hello方法。lookup方法中的參數是會話bean的JNDI名稱,下面是會話bean的JNDI名稱的命名規則。
當EJB組件發佈到JBoss時,如果我們沒有爲它指定全局JNDI名稱,JBoss就會按照默認的命名規則爲會話bean生成全局的JNDI名稱,默認的命名規則如下:
(1) 如果把EJB作爲模塊打包進後綴爲*.ear 的Java EE 企業應用文件中,默認的全局JNDI名稱是:
- 本地接口:EAR-FILE-BASE-NAME/EJB-CLASS-NAME/local
- 遠程接口:EAR-FILE-BASE-NAME/EJB-CLASS-NAME/remote
EAR-FILE-BASE-NAME 是 ear 文件的名稱,EJB-CLASS-NAME 是EJB 的類名。
例如,把本實例作爲EJB模塊打包進名爲HelloEJBRemote.ear 的企業應用文件中,他的遠程接口的JNDI名稱是:HelloEJBRemote/HelloEJBRemotebean/remote
(2) 如果把EJB應用打包成後綴爲*.jar 的模塊文件,默認的全局JNDI名稱是:
- 本地接口:EJB-CLASS-NAME/local
- 遠程接口:EJB-CLASS-NAME/remote
本實例打包成HelloEJBRemote.jar文件,它的遠程接口的JNDI名稱是:HelloEJBRemotebean/remote
我們分別把該實例的會話bean和JSP頁面打包成HelloEJBRemote.jar 和 HelloEJB.war 文件。把這兩個文件複製到JBoss安裝目錄\server\default\deploy文件夾中即完成了部署。