Eclipse+JBoss+EJB3的編寫,還有實現java.io.Serializable接口的Session Bean代碼,第一個無狀態(tài)的SessionBean的編寫
  本系列教程使用的軟件版本如下:
Eclipse:3.4.2,Eclipse IDE for Java EE Developers
JBoss :5.0.1,http://www.jboss.org/jbossas/downloads/
JDK:1.6.0.14,http://java.sun.com/javase/downloads/index.jsp
在本文中將編寫一個簡單的無狀態(tài)SessionBean。在發(fā)布EJB時,一般需要將EJB程序以jar文件的形式進行發(fā)布。這些jar文件將被放在 \server\default\deploy目錄中。如果在Eclipse中開發(fā)EJB程序,需要進行一些配置。首選需要在首選項(Preferences)對話框中設置JBoss的安裝目錄(如D:\jboss5)。然后在運行配置對話框中添加jboss的運行項。在jboss4.2及以后的版本中,默認情況下jboss只接收來自localhost或127.0.0.1的請求,也就是只接收本地的訪問。為了使 jboss接收來自其他地址的請求,在啟動jboss時需要使用-b命令行參數進行設置。如下面的啟動命令所示:
  - run.bat -b 200.200.200.123  
 - run.bat -b 0.0.0.0  
 
  
  | 
 
上面的第一行命令表示jboss可以接收來自200.200.200.123的請求。第二條命令表示jboss可以接收來自任意地址的請求。如果不設置-b參數,以非本機方式訪問EJB時,JBoss會拋出如下異常:
Exception in thread "main" javax.naming.CommunicationException: Could not obtain connection to any of these urls: 192.168.17.105:1099 and discovery failed with error: javax.naming.CommunicationException: Receive timed out [Root exception is java.net.SocketTimeoutException: Receive timed out] [Root exception is javax.naming.CommunicationException: Failed to connect to server /192.168.17.105:1099 [Root exception is javax.naming.ServiceUnavailableException: Failed to connect to server /192.168.17.105:1099 [Root exception is java.net.ConnectException: Connection refused: connect]]]
    at org.jnp.interfaces.NamingContext.checkRef(NamingContext.java:1725)
    at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:689)ITPUB
    at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:682)
    at javax.naming.InitialContext.lookup(InitialContext.java:392)
    at test.Client.main(Client.java:29)
    ... ...
一、配置開發(fā)環(huán)境
在eclipse中進行開發(fā),也需要設置-b命令行參數。在運行配置對話框中可以按著圖的方式設置-b命令行參數。
 
設置-b命令行參數
二、開發(fā)無狀態(tài)Session Bean
在Eclipse中開發(fā)EJB程序首先需要建立一個EJB Project(工程名為MyEJB)。然后建立一個接口(遠程接口)和一個Session Bean。遠程接口的代碼如下:
  - package service;  
 -  
 - import java.util.List;  
 - import javax.ejb.Remote;  
 - import entity.Greeting;  
 -  
 - @Remote  
 - public interface Greeter  
 - {  
 -     public String greet(String message);  
 -     public List<Greeting> getAllGreetings();  
 - } 
 
  
  | 
 
在上面的代碼中使用了@Remote注釋將Greeter接口定義為遠程接口,也就是在其他的客戶端機器上可以通過該接口來訪問本地的Session Bean。在Greeter接口中還使用了一個Greeting類,該類的代碼如下:
  - package entity;  
 -  
 - import java.io.Serializable;  
 -  
 - public class Greeting implements Serializable  
 - {  
 -     private int id;  
 -     private String name;  
 -     public int getId()  
 -     {  
 -         return id;  
 -     }  
 -     public void setId(int id)  
 -     {  
 -         this.id = id;  
 -     }  
 -     public String getName()  
 -       
 -         return name;  
 -     }  
 -     public void setName(String name)  
 -       
 -         this.name = name;  
 -     }  
 - } 
 
  
  | 
 
要注意的是,由于Greeting類在實例將被傳輸到客戶端,因此,該類需要實現java.io.Serializable接口。
下面來編寫Session Bean,代碼如下:
  - package service;  
 -  
 - import java.util.ArrayList;  
 - import java.util.List;  
 - import javax.ejb.Stateless;  
 - import entity.Greeting;  
 -  
 - @Stateless  
 - public class GreeterBean implements Greeter  
 - {  
 -     @Override  
 -     public List<Greeting> getAllGreetings()  
 -     {  
 -          
 -         List<Greeting> greetings = new ArrayList<Greeting>();  
 -         Greeting greeting = new Greeting();  
 -         greeting.setId(12);  
 -         greeting.setName("bill gates");  
 -         greetings.add(greeting);  
 -         greeting = new Greeting();  
 -         greeting.setId(334);  
 -         greeting.setName("李寧");  
 -         greetings.add(greeting);  
 -         return greetings;  
 -     }  
 -  
 -     @Override  
 -     public String greet(String message)  
 -     {  
 -         return "您好 " + message;  
 -     }  
 -  
 - } 
 
  
  | 
 
在上面的代碼中使用了@Stateless注釋將GreeterBean類定義為無狀態(tài)的Session Bean。如果JBoss正處于啟動狀態(tài),并保存上面寫的類和接口,Eclipse會自動將上面的代碼編譯,并生成jar文件,發(fā)布到jboss的 deploy目錄中。該jar文件的目錄結構如下:
MyEJB.jar
   entity\Greeting.class
   service\Greeter.class
   service\GreeterBean.class
   META-INF\MANIFEST.MF
   META-INF\jboss.xml
其中META-INF目錄中的兩個文件是Eclipse在建立EJB工程時自動生成的,我們不用去管它。讀者也可以手工去編譯上面的接口和類,并使用jar命令生成jar文件。
三、編寫客戶端程序
由于本文使用了遠程接口來訪問Session Bean,因此,在訪問時需要指定EJB所有的機器的IP地址。
  - package test;  
 -  
 - import java.util.Properties;  
 - import javax.naming.Context;  
 - import javax.naming.InitialContext;  
 - import service.Greeter;  
 -  
 - public class ClientITPUB  
 - {  
 -  
 -    public static void main(String[] args) throws Exception  
 -     {  
 -         Properties prop = new Properties();  
 -  
 -         // 設置相關的屬性值ITPUB個人空間 kE;r_!Q }  
 -  
 -         prop.setProperty(Context.PROVIDER_URL, "192.168.17.105:1099");  
 -         prop.setProperty(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.
 - interfaces.NamingContextFactory");  
 -         InitialContext ctx = new InitialContext(prop);(  
 -          
 -        // 開始調用Greeter接口的方法  
 -          
 -         Greeter greeter = (Greeter) ctx.lookup("GreeterBean/remote");  
 -         System.out.println(greeter.greet("李寧"));  
 -         System.out.println(greeter.getAllGreetings().get(0).getName());  
 -     }  
 - } 
 
  
  | 
 
在上面的代碼中,使用了Context.PROVIDER_URL設置了服務端的IP和端口號。
上面積代碼的運行結果如:
 
除了在程序中設置屬性值外,也可以通過jndi.properties文件進行設置。該文件應放在Eclipse工程的src目錄中。該文件的內容如下:
  - java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory  
 - java.naming.provider.url=192.168.17.105:1099  
 
  
  | 
如果使用jndi.properties文件,就不需要在客戶端程序中設置相應的屬性值了,因此,可以使用如下的代碼來調用Session Bean:
  - package test;  
 -  
 - import javax.naming.Context;  
 - import javax.naming.InitialContext;  
 - import service.Greeter;  
 -  
 - public class Client  
 - {  
 -  
 -     public static void main(String[] args) throws Exception  
 -     {  
 -         //不需要在程序中設置相應的屬性值  
 -         InitialContext ctx = new InitialContext();  
 -         // 開始調用Greeter接口的方法ITPUB個人空間8h!w4k bI5a  
 -         Greeter greeter = (Greeter) ctx.lookup("GreeterBean/remote");  
 -         System.out.println(greeter.greet("李寧"));  
 -         System.out.println(greeter.getAllGreetings().get(0).getName());  
 -     }  
 - }  
 
  
  | 
 
注意:在編寫客戶端程序時,需要引用\client目錄中的所有jar文件。
【編輯推薦】
- 使用Eclipse+JBoss+EJB3編寫有狀態(tài)的SessionBean
 
- Eclipse+JBoss+EJB3配置文件發(fā)布Session Bean
 
- 奇怪的Eclipse Debug異常
 
- Eclipse字符編碼
 
- Eclipse RCP編輯器關閉按鈕的屏蔽方法