隨筆 - 312, 文章 - 14, 評論 - 1393, 引用 - 0
          數據加載中……

          eclipse + JBoss 5 + EJB3開發指南(1):編寫第一個無狀態的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

              在本文中將編寫一個簡單的無狀態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文件。

          下一篇:eclipse + JBoss 5 + EJB3開發指南(2):編寫有狀態的SessionBean




          Android開發完全講義(第2版)(本書版權已輸出到臺灣)

          http://product.dangdang.com/product.aspx?product_id=22741502



          Android高薪之路:Android程序員面試寶典 http://book.360buy.com/10970314.html


          新浪微博:http://t.sina.com.cn/androidguy   昵稱:李寧_Lining

          posted on 2009-05-01 14:39 銀河使者 閱讀(5296) 評論(3)  編輯  收藏 所屬分類: java 原創ejb3JBoss

          評論

          # re: eclipse + JBoss 5 + EJB3開發指南(1):編寫第一個無狀態的SessionBean  回復  更多評論   

          bill gates...
          2009-05-02 00:01 | Burun Estetigi

          # re: eclipse + JBoss 5 + EJB3開發指南(1):編寫第一個無狀態的SessionBean  回復  更多評論   

          java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
          2009-05-02 00:01 | Yuz Estetigi

          # re: eclipse + JBoss 5 + EJB3開發指南(1):編寫第一個無狀態的SessionBean  回復  更多評論   

          為什么是GreeterBean notfound。。。。。
          2009-06-14 17:39 | 匿名
          主站蜘蛛池模板: 宁波市| 云浮市| 册亨县| 星座| 文安县| 龙南县| 丰顺县| 阿瓦提县| 老河口市| 双桥区| 平乡县| 靖州| 五寨县| 基隆市| 灵武市| 沧源| 波密县| 商丘市| 和龙市| 肥东县| 怀安县| 资中县| 周口市| 中西区| 依兰县| 四会市| 琼中| 庄河市| 万年县| 大理市| 双江| 永济市| 农安县| 上林县| 镇巴县| 荥经县| 盈江县| 桂东县| 荣昌县| 平果县| 绩溪县|