posts - 51, comments - 17, trackbacks - 0, articles - 9
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          簡單的EJB 及其部署文件

          Posted on 2007-02-27 22:51 chenweicai 閱讀(387) 評論(0)  編輯  收藏

          三個基本class
          EJB最少也需要三個class, remote interface, home interface, and bean implementation(bean行為).

          1. remote interface 用來揭示EJB對外的一些方法.在這個例子中,the remote interface 就是org.jboss.docs.interest.Interest.

          ackage org.jboss.docs.interest;

          import javax.ejb.EJBObject;
          import java.rmi.RemoteException;

          /**
          This interface defines the `Remote' interface for the `Interest' EJB. Its
          single method is the only method exposed to the outside world. The class
          InterestBean implements the method.
          */
          public interface Interest extends EJBObject
          {
            public double calculateCompoundInterest(double principle,
                double rate, double periods) throws RemoteException;
          }

          ?

          2.home interface 是用來規(guī)定怎樣創(chuàng)建一個實現(xiàn)remote interface的bean. 在本例中home interface 是 org.jboss.docs.InterestHome.

          package org.jboss.docs.interest;

          import java.io.Serializable;
          import java.rmi.RemoteException;
          import javax.ejb.CreateException;
          import javax.ejb.EJBHome;

          /**
          This interface defines the `home' interface for the `Interest' EJB.
          */
          public interface InterestHome extends EJBHome
          {
          /**
          Creates an instance of the `InterestBean' class on the server, and returns a
          remote reference to an Interest interface on the client.
          */
            Interest create() throws RemoteException, CreateException;
          }


          3.bean implementation 是提供方法的實現(xiàn),這些方法在上述兩種interface中都有規(guī)定了,在本例中是兩個方法: calculateCompoundInterest和create().

          這個bean implementation 是 org.jboss.docs.interest.InterestBean.

          package org.jboss.docs.interest;

          import java.rmi.RemoteException;
          import javax.ejb.SessionBean;
          import javax.ejb.SessionContext;

          /**
          This class contains the implementation for the `calculateCompoundInterest'
          method exposed by this Bean. It includes empty method bodies for the methods
          prescribe by the SessionBean interface; these don't need to do anything in this
          simple example.
          */
          public class InterestBean implements SessionBean
          {
            
            public double calculateCompoundInterest(double principle,
              double rate, double periods)
            {
              System.out.println("Someone called `calculateCompoundInterest!'");
              return principle * Math.pow(1+rate, periods) - principle;
            }

            /** Empty method body
            */
            public void ejbCreate()
            {}

            /** Every ejbCreate() method ALWAYS needs a corresponding
            ejbPostCreate() method with exactly the same parameter types.
            */
            public void ejbPostCreate()
            {}

             /** Empty method body
            */
            public void ejbRemove()
            {}
            /** Empty method body
            */
            public void ejbActivate()
            {}

            /** Empty method body
            */
            public void ejbPassivate()
            {}
            /** Empty method body
            */
            public void setSessionContext(SessionContext sc)
            {}
          }


          ?

          這些classes必須打包進(jìn)一個JAR文件中,JAR文件中包含了目錄結(jié)構(gòu)和包的層次.在本例中,這些classes是在包org.jboss.docs.interest, 這樣他們需要在目錄org/jboss/docs/interest/ 下.

          部署發(fā)布描述器ejb-jar.xml和jboss.xml
          在JAR文檔創(chuàng)建之前,還需要一個叫META-INF的目錄,這是存放部署發(fā)布描述器的(一般叫ejb-jar.xml).大部分商用EJB Server提供圖形化工具來編輯這個 描述器.在JBoss中需要手工:

          <?xml version="1.0" encoding="UTF-8"?>

          <ejb-jar>
            <description>JBoss Interest Sample Application</description>
            <display-name>Interest EJB</display-name>
            <enterprise-beans>
            <session>
              <ejb-name>Interest</ejb-name>

                <!-- home interface -->
                <home>org.jboss.docs.interest.InterestHome</home>

                <!-- remote interface -->
                <remote>org.jboss.docs.interest.Interest</remote>

                <!-- bean implementation -->
                <ejb-class>org.jboss.docs.interest.InterestBean</ejb-class>

                <!--bean 的類型 這里是Stateless -->
                <session-type>Stateless</session-type>
                <transaction-type>Bean</transaction-type>
            </session>
            </enterprise-beans>
          </ejb-jar>

          在本例中,一個包中只有一個EJB 這樣就不用描述多個EJB之間是怎樣交互的.

          盡管對于所有的EJB服務(wù)器,ejb-jar.xml部署描述器的格式是一樣的(更多精確的定義可以從sun得到DTD).它并沒有規(guī)定所有的必須的信息,比如如何將EJB-NAME和JNDI naming service聯(lián)系起來.

          缺省情況下,JNDI name將使用在ejb-jar.xml中<ejb-name>XXX</ejb-name>中的XXX來使用EJB的home interface.

          但是如果有多個EJB,在ejb-jar.xml中,在<ejb-name>XXX</ejb-name>中XXX就不能用同一個名字了,一般格式是"[application name]/[bean name]".

          那么如果再按照缺省情況,JNDI name就可能找不到你的應(yīng)用程序的入口了,因此我們要特別規(guī)定一下.這就需要在jboss.xml中規(guī)定:

          <?xml version="1.0" encoding="UTF-8"?>
          <jboss>
            <enterprise-beans>
              <session>
                <ejb-name>Interest</ejb-name>
                <jndi-name>interest/Interest</jndi-name>
              </session>
            </enterprise-beans>
          </jboss>

          這樣,你所有叫Interest文件都被梆定到JNDI name:interest/Interest下面

          jndi.properties
          雖然有了上面你的應(yīng)用程序和JNDI name的梆定,但是一旦部署發(fā)布到JBoss服務(wù)器上,你還需要一個jndi.properties文件,以告訴調(diào)用你程序的客戶端請求到哪里去初始化JNDI naming service.

          ?

          java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
          java.naming.provider.url=localhost:1099
          java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces

          ?

          在本例中,客戶端請求將尋找Interest 這個bean, 然后得到這個bean的home interface. home interface是用來得到這個bean的remote interface.最后,客戶端請求將通過remote interface來使用由EJB提供的功能.


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 芷江| 沽源县| 随州市| 西畴县| 台南市| 祥云县| 天门市| 尖扎县| 永胜县| 南安市| 浦东新区| 象山县| 莒南县| 万年县| 台北县| 中江县| 阳泉市| 佛冈县| 西乌珠穆沁旗| 西乌| 开封县| 余庆县| 武川县| 延川县| 教育| 苏尼特右旗| 达孜县| 元朗区| 乐亭县| 永定县| 金门县| 宁化县| 宣城市| 汤阴县| 贵港市| 信阳市| 兴城市| 宜兰县| 永胜县| 郧西县| 侯马市|