程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> eclipse+JBoss 5+EJB3開發指南(1):編寫第一個無狀態的SessionBean

eclipse+JBoss 5+EJB3開發指南(1):編寫第一個無狀態的SessionBean

編輯:關於JAVA

本系列教程使用的軟件版本如下:

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安裝目錄>\server\default\deploy目錄中。如果在 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命 令行參數。

圖1

二、開發無狀態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;

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類定義為無狀態的Session Bean。如果JBoss正 處於啟動狀態,並保存上面寫的類和接口,Eclipse會自動將上面的代碼編譯,並生成jar文件,發布到 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 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());
    }
}

注意:在編寫客戶端程序時,需要引用<JBoss安裝目錄>\client目錄中的所有jar文件。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved