如何開發EJB?

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菜單下查看



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章