如何開發EJB?

來源:互聯網
上載者:User

標籤:ejb   demo   開發流程   

EJB開發分為兩部分:開發EJB和使用EJB

本文樣本將使用EJB2.0 :1.工作需要;2.EJB3.0相對於2.0變動不大(添加註解,JPA替換實體Bean實現)

開發EJB的流程

以開發stateless SessionBean為栗.

1.編寫SessionBean。需要實現SessionBean介面,並額外添加ejbCreate()方法

2.編寫Home介面和Remote組件介面。

Remote介面擴充EJBObject介面,添加SessionBean中方法,並拋出異常RemoteException。

Home介面擴充EJBHome介面,添加create()方法,返回Remote組件,拋出異常CreateException、RemoteException。

3.編寫ejb-jar.xml

4.打包

5.部署到J2EE伺服器

舉個栗子

首先你需要個javax.ejb-api.jar

軟體環境

開發環境:intellij idea 13

伺服器:glassfish 4

目錄結構


package com.ejb.bean.sessionbean;import javax.ejb.EJBException;import javax.ejb.SessionBean;import javax.ejb.SessionContext;import java.rmi.RemoteException;/** * Created by Tony.Sun on 7/17/2014. */public class GreetingBean implements SessionBean{    @Override    public void setSessionContext(SessionContext sessionContext) throws EJBException, RemoteException {        System.out.println("setSessionContext");    }    @Override    public void ejbRemove() throws EJBException, RemoteException {        System.out.println("ejbRemove");    }    @Override    public void ejbActivate() throws EJBException, RemoteException {        System.out.println("ejbActivate");    }    @Override    public void ejbPassivate() throws EJBException, RemoteException {        System.out.println("ejbPassivate");    }    /**     * 額外添加的ejbCreate方法     */    public void ejbCreate()    {        System.out.println("ejbCreate");    }    /**     * 問候,沒人規定每次都要say hello啊     * @return     */    public String greet()    {        return "f u c k y o u,EJB world!";    }}

package com.ejb.bean.sessionbean;import javax.ejb.EJBObject;import java.rmi.RemoteException;/** * Created by Tony.Sun on 7/17/2014. */public interface GreetingRemote extends EJBObject {    String greet() throws RemoteException;}

package com.ejb.bean.sessionbean;import javax.ejb.CreateException;import javax.ejb.EJBHome;import java.rmi.RemoteException;/** * Created by Tony.Sun on 7/17/2014. */public interface GreetingHome extends EJBHome {    GreetingRemote create() throws CreateException,RemoteException;}

<?xml version="1.0" encoding="UTF-8"?><ejb-jar xmlns="http://java.sun.com/xml/ns/javaee"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee  http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd"         version="3.1">    <enterprise-beans>        <session>            <ejb-name>greetingbean</ejb-name>            <home>com.ejb.bean.sessionbean.GreetingHome</home>            <remote>com.ejb.bean.sessionbean.GreetingRemote</remote>            <ejb-class>com.ejb.bean.sessionbean.GreetingBean</ejb-class>            <session-type>Stateless</session-type>            <transaction-type>Bean</transaction-type>        </session>    </enterprise-beans></ejb-jar>

打包什麼的太費事直接用IDE部署了,(我們只是代碼的搬運工 ^ _ ^)


使用EJB

Bean已經部署在伺服器上了,現在要調用Bean,具體步驟如下

1.引用glassfish/lib下gf-client.jar

2.擷取JNDI上下文服務 new InitContext()。在伺服器上使用時InitContext不需要參數也可以成功運行,獨立程式使用時需要傳遞參數(詳見栗子)。

3.通過上下文服務尋找Bean服務

4.使用PortableRemoteObject進行窄化,並轉換成Home對象

5.使用Home介面對象create() Remote服務介面

6.通過服務介面調用相關方法

來個栗子

package com.ejb.bean.sessionbean;import javax.ejb.CreateException;import javax.naming.Context;import javax.naming.InitialContext;import javax.naming.NamingException;import javax.rmi.PortableRemoteObject;import java.rmi.RemoteException;import java.util.Properties;/** * Created by Tony.Sun on 7/17/2014. */public class GreetingTest {    public static void main(String[] args) throws NamingException, RemoteException, CreateException {        Properties props = new Properties();        //這些參數根據不同伺服器設定不同,具體視伺服器而定        props.put("java.naming.factory.initial", "com.sun.enterprise.naming.impl.SerialInitContextFactory");        props.put("java.naming.factory.url.pkgs", "com.sun.enterprise.naming");        props.put("java.naming.factory.state", "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl");        //伺服器ip        props.put("org.omg.CORBA.ORBInitialHost", "localhost");        //EJB服務連接埠        props.put("org.omg.CORBA.ORBInitialPort", "3700");        //擷取JNDI上下文服務 new InitContext()。        //在伺服器上使用時InitContext不需要參數也可以成功運行,獨立程式使用時需要傳遞參數(詳見栗子)。        Context ctx = new InitialContext(props);        //通過上下文服務尋找Bean服務        Object obj = ctx.lookup("java:global/demo_ejb_exploded/greetingbean");        //使用PortableRemoteObject進行窄化,並轉換成Home對象        GreetingHome home = (GreetingHome) PortableRemoteObject.narrow(obj,GreetingHome.class);        //使用Home介面對象create() Remote服務介面        GreetingRemote remote = home.create();        //通過服務介面調用相關方法        String greet = remote.greet();        System.out.print(greet);    }}


運行結果

f u c k y o u,EJB world!Process finished with exit code 0


補充:

關於JNDI命名服務文法,這一點比較坑,不同伺服器廠商提供的都不一樣,以glassfish為栗,JNDI文法為

java:global/[應用程式名稱]/模組名稱/Bean名稱

關於應用程式名稱什麼時候使用:當你的Bean.jar被打包在其他war包中的時候使用

關於如何確定模組名稱:localhost:4848下Applications菜單下查看



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.