本系列教程使用的軟體版本如下:
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
在本文中將編寫一個簡單的無狀態SessionBean.在發布EJB時,一般需要將EJB程序以jar文件的形式進行發布.這些jar文件將被放在<JBoss安裝目錄>serverdefaultdeploy目錄中.如果在Eclipse中開發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) at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:682) at javax.naming.InitialContext.lookup(InitialContext.java:392) at test.Client.main(Client.java:29) ... ... |
一、配置開發環境
在eclipse中進行開發,也需要設置-b命令行參數.在運行配置對話框中可以按著圖1的方式設置-b命令行參數.
二、開發無狀態Session Bean
在Eclipse中開發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; 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.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 { return "您好 " message; } } |
在上面的代碼中使用了@Stateless註釋將GreeterBean類定義為無狀態的Session Bean.如果JBoss正處於啟動狀態,並保存上面寫的類和介面,Eclipse會自動將上面的代碼編譯,並生成jar文件,發布到jboss的deploy目錄中.該jar文件的目錄結構如下:
MyEJB.jar
entityGreeting.class
serviceGreeter.class
serviceGreeterBean.class
META-INFMANIFEST.MF
META-INFjboss.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 Client { public static void main(String[] args) throws Exception { Properties prop = new Properties(); 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和埠號.
上面積代碼的運行結果如:
您好 李寧 bill gates |
除了在程序中設置屬性值外,也可以通過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介面的方法 Greeter greeter = (Greeter) ctx.lookup("GreeterBean/remote"); System.out.println(greeter.greet("李寧")); System.out.println(greeter.getAllGreetings().get(0).getName()); } } |
[火星人 ] Eclipse JBoss 5 EJB3開發指南(1):編寫第一個無狀態的SessionBean已經有723次圍觀