城市獵人

          在一網情深的日子里,誰能說得清是苦是甜,只知道確定了就義無反顧
          posts - 1, comments - 7, trackbacks - 0, articles - 89
                  
                  在所有的EJB3.0規范中定義的EJB,都不必實現Home接口。

            一個會話Bean必須有一個業務接口,這個接口由會話Bean來實現,或者也可以由會話Bean來產生。這樣,你可以只寫一個文件,就可以生成業務邏輯實現類、遠程接口、本地接口等。

            …
            @Remote
            @Local
            @Stateless

            public class CounterBean
            {
            ……
            }

            在目前jboss的實現中,必須要有一個獨立的業務接口。

            這個接口不必實現EJBObject或者EJBLocalObject。

            一個無狀態會話Bean 必須使用Stateless注釋,以表明它是一個無狀態的會話Bean。EJB容器將根據這個注釋來判定它的類型。或者實現javax.ejb.SessionBean接口

            一個無狀態的會話Bean可以實現setSessionContext方法,也可以不實現。

            一個無狀態的會話Bean可以實現ejbCreate/ejbRemove方法。

            一個無狀態的會話Bean可以通過依賴注入(Dependency Injection)也就是現在吵得挺火的IOC獲取容器的資源和環境屬性。詳細介紹請看后面的章節。

            在Eclipse中導入本文提供的例子Stateless。

            這個例子是一個計數器的例子,它實現了兩個業務方法add和getNumber,add方法就是給計數器加上一個整數值,getNumber方法將得到計數器的當前值。

                      這個例子主要有5個文件:

             Counter.java:業務接口。

             CounterBean.java:業務實現類。將來我們開發的EJB也都是這樣命名(在接口名上加上Bean)。

             Client.java:測試EJB的客戶端類。
            
             jndi.properties:jndi屬性文件,提供訪問jdni的基本配置屬性。

             Build.xml:ant 配置文件,用以編譯、發布、測試、清除EJB。 

                      Counter.java
              
           1        package com.kuaff.ejb3.stateless; 
           2
           3  import javax.ejb.Remote; 
           4
           5  @Remote 
           6
           7  public interface Counter 
           8  
           9  public int add(int i); 
          10  public int getNumber(); 
          11  }
           
          12

                      這個接口很簡單,定義了上面介紹的兩個業務方法,同時,我們為這個接口加上了Remote注釋,這樣我們的遠程客戶端就可以通過JNDI名稱查找到它,并調用它的業務方法。


            它的JNDI名稱怎么配置呢?

            你不必配置它的JNDI名稱,也不必寫它的配置文件。在JBOSS實現的EJB3.0中,你不必寫任何的EJB部署文件和jboss部署文件。JBOSS默認使用接口的全稱作為它的JNDI名。在上面的例子中,它的全稱就是: 

                  com.kuaff.ejb3.stateless.Counter,你也可以通過Counter.class.forName()得到。 (glassfish也同理)

                  CounterBean.java

           1    package com.kuaff.ejb3.stateless; 
           2
           3  import javax.ejb.Stateless; 
           4
           5  @Stateless 
           6
           7  public class CounterBean implements Counter 
           8  
           9  private int number = 0
          10  //給計數器加上i 
          11  public int add(int i) 
          12  
          13  number += i; 
          14  return number; 
          15  }
           
          16
          17  //得到當前的計數 
          18
          19  public int getNumber() 
          20  
          21  return number; 
          22  }
           
          23
          24  }
           
          25

                  這個是計數器的實現類。注意這個類使用Stateless做了注釋,這是必須的。

            Client.java

           1package com.kuaff.ejb3.stateless; 
           2  import javax.naming.InitialContext; 
           3  import javax.naming.NamingException; 
           4
           5  public class Client 
           6  
           7  public static void main(String[] args) 
           8  
           9   InitialContext ctx; 
          10   try 
          11    ctx = new InitialContext(); 
          12    Counter counter = (Counter) ctx.lookup(Counter.class.getName()); 
          13    counter.add(10); 
          14    System.out.println("當前的number:" + counter.getNumber()); 
          15    counter.add(10); 
          16    System.out.println("當前的number:" + counter.getNumber()); 
          17    Counter counter2 = (Counter) ctx.lookup(Counter.class.getName()); 
          18    counter2.add(10); 
          19    System.out.println("當前的number:" + counter2.getNumber()); 
          20    catch (NamingException e) 
          21    
          22     e.printStackTrace(); 
          23    }
           
          24    
          25   }
           
          26  }
           


            這個類用來測試我們發布的計數器EJB。首先通過ctx = new InitialContext();得到上下文,然后通過lookup查找計數器,然后給計數器加10,顯示當前的計數器信息。

           jndi.properties

          1java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory 
          2
          3  java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces 
          4
          5java.naming.provider.url=localhost 
          6
          7

          這個文件配置了JNDI操作所需的屬性,因為我們是測試本機的EJB服務,所以不必修改上面的屬性。

           1Build.xml 
           2
           3  <project name="kuaff_ejb3_tutorial" default="ejbjar" basedir="."> 
           4
           5  <property environment="env"/> 
           6
           7  <property name="src.dir" value="${basedir}/src"/> 
           8
           9  <property name="jboss.home" value="${env.JBOSS_HOME}"/> 
          10
          11  <property name="build.dir" value="${basedir}/build"/> 
          12
          13  <property name="build.classes.dir" value="${build.dir}/classes"/> 
          14
          15
          16  <path id="classpath"> 
          17
          18  <fileset dir="${jboss.home}/lib"> 
          19
          20  <include name="**/*.jar"/> 
          21
          22  </fileset> 
          23
          24  <fileset dir="${jboss.home}/server/all/lib"> 
          25
          26  <include name="**/*.jar"/> 
          27
          28  </fileset> 
          29
          30  <fileset dir="${jboss.home}/server/all/deploy/ejb3.deployer"> 
          31
          32  <include name="*.jar"/> 
          33
          34  </fileset> 
          35
          36  <fileset dir="${jboss.home}/server/all/deploy/jboss-aop.deployer"> 
          37
          38  <include name="*.jar"/> 
          39
          40  </fileset> 
          41  <pathelement location="${build.classes.dir}"/> 
          42  <pathelement location="${basedir}"/> 
          43  </path> 
          44  <property name="build.classpath" refid="classpath"/> 
          45  <target name="prepare"> 
          46  <mkdir dir="${build.dir}"/> 
          47  <mkdir dir="${build.classes.dir}"/> 
          48  </target> 
          49  <target name="compile" depends="prepare"> 
          50  <javac srcdir="${src.dir}" 
          51  destdir="${build.classes.dir}" 
          52  debug="on" 
          53  deprecation="on" 
          54  optimize="off" 
          55  includes="**"> 
          56  <classpath refid="classpath"/> 
          57  </javac> 
          58  </target> 
          59  <target name="ejbjar" depends="compile"> 
          60  <jar jarfile="build/StatelessSample.ejb3"> 
          61  <fileset dir="${build.classes.dir}"> 
          62  <include name="**/*.class"/> 
          63  </fileset> 
          64  </jar> 
          65  <copy file="build/StatelessSample.ejb3" todir="${jboss.home}/server/all/deploy"/> 
          66  </target> 
          67  <target name="run" depends="ejbjar"> 
          68  <java classname="com.kuaff.ejb3.stateless.Client" fork="yes" dir="."> 
          69  <classpath refid="classpath"/> 
          70  </java> 
          71  </target> 
          72  <target name="clean.db"> 
          73  <delete dir="${jboss.home}/server/all/data/hypersonic"/> 
          74  </target> 
          75  <target name="clean"> 
          76  <delete dir="${build.dir}"/> 
          77  <delete file="${jboss.home}/server/all/deploy/StatelessSample.ejb3"/> 
          78  </target> 
          79  </project> 
          80


            請運行{$JBOSS_HOME}/bin目錄下的run.bat: run –c all,啟動JBOSS。
          主站蜘蛛池模板: 怀远县| 靖安县| 眉山市| 成安县| 洛川县| 丹寨县| 内丘县| 海晏县| 绥棱县| 德阳市| 陕西省| 长治县| 盱眙县| 珲春市| 石柱| 扎兰屯市| 松滋市| 远安县| 常州市| 土默特左旗| 施甸县| 老河口市| 东海县| 承德县| 布尔津县| 井研县| 双城市| 沙田区| 莲花县| 兴隆县| 长岛县| 安康市| 如皋市| 沙田区| 九台市| 吉水县| 望城县| 石屏县| 富民县| 延长县| 兰州市|