Session Bean

很多人说,不采用EJB的系统不算是J2EE系统。EJB到底有哪些用处,很难说清楚,一人一个说法。我要说的是EJB的

Session Bean,用在远程调用。说道远程调用,很多人联想到RMI,这个RMI是个笼统的概念,怎么实现就有很多选择了:

比如MBean,WebService等。显然,我这里选择的是ejb,就是SessionBean实现RMI。

 

工具:

NetBeans6.1及自带的GlassFishv2

可以在本机测试或者独立一台装有GlassFish的服务器

 

围绕SessionBean来说

1,建立SessionBean

直接在NetBeans里面建立一个EJB module,这个Module包含了我们想要远程调用的Bean。

既然如此,建立好Module后,Enterprise Beans-->new Session Bean就建立了Bean。

package dcampus;

import javax.ejb.Stateless;

/**
 */
@Stateless
public class JunSessionBean implements JunSessionRemote, JunSessionLocal {

    public void saySomething() {
        System.out.println("Hello,Test Bean");
    }

    public String getMessage() {
        return "WHat is thsi";
    }


    // Add business logic below. (Right-click in editor and choose
    // "EJB Methods > Add Business Method" or "Web Service > Add Operation")
}

如上是我的Bean内容,注意最后的一句注释,提示了Bean里面写方法的时候比较特殊,需要系统

自动生成,这样的好处是它会自动修改Bean对应的接口文件。在我建立Bean的时候实际上系统已经

自动生成了两个接口文件JunSessionLocal.java,JunSessionRemote.java,这和中间的选择有关,

这两个接口在后面可能会用到。

package dcampus;

import javax.ejb.Local;

/**
 *
 */
@Local
public interface JunSessionLocal {

    void saySomething();

    String getMessage();

   
}


package dcampus;

import javax.ejb.Remote;

/**
 *
 */
@Remote
public interface JunSessionRemote {

    void saySomething();

    String getMessage();
   
}

Bean写好了,build工程,注意会生成一个Jar文件,比如我工程名是EJBModule1,那么生成的是EJBModule1.jar

这个Jar也是Bean,我们部署Bean到GlassFish上就用这个jar文件。

 

2,部署:

启动GlassFish,通过网页登录进入配置页面EJBModules---->deploy,选择刚才打包好的jar文件,ok

 

3,访问Session Bean

说白了,就是远程调用,这是最终目的。

那么我们可以新建任意一个Java Application,选择导入的包,这些包都包含在GlassFish安装目录下:

  1. appserv-rt.jar
  2. javaee.jar
  3. appserv-deployment-client.jar
  4. appserv-ext.jar
  5. imqjmsra.jar
  6. appserv-admin.jar

另外,你还要导入原来的EJBModule项目,方法:右键-properties-libraries-add project

为什么要这个步骤?因为你在Application里面调用了SessionBean,要识别这个Bean,必须导入Bean Module

然后可以写访问方法了,我这里直接帖上来:

import java.io.FileInputStream;
import java.util.Properties;
import javax.naming.InitialContext;
import dcampus.JunSessionRemote;

public class RemoteEjb{

    public static void main(String[] args) throws Exception {
        Properties props = new Properties();
        props.load(new FileInputStream("jndi.properties"));
        System.out.println("prop");
        InitialContext ctx = new InitialContext(props);
        JunSessionRemote testEJB = (JunSessionRemote) ctx.lookup("dcampus.JunSessionRemote");
        System.out.println(testEJB.getMessage());
        testEJB.saySomething();
        System.out.println("why");
    }
}

注意前面的几句properties配置,可以看出用到了jndi.properties文件,这个文件目录是程序的根目录,内容是哪些呢?

java.naming.factory.initial = com.sun.enterprise.naming.SerialInitContextFactory
java.naming.factory.url.pkgs = com.sun.enterprise.naming
java.naming.factory.state = com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl
#optional.  Defaults to localhost.  Only needed if web server is running
#on a different host than the appserver
org.omg.CORBA.ORBInitialHost = localhost
#optional.  Defaults to 3700.  Only needed if target orb port is not 3700.
org.omg.CORBA.ORBInitialPort = 3700

里面的配置是可以修改的,主要是org.omg.CORBA.ORBInitialHost = localhost,如果真的是“远程”调用,而不是本机测试,那么就要改成远程服务器IP,端口我想一般不会去改吧,要是改了就对应起来吧

这个jndi.properties文件也是可以不要的,那么配置时将上面若干行在程序里面直接写就好了,熟悉Context的应该知道怎么做。

 

OK,都好了,保证GlassFish已经Start后,run你新建的访问Session Bean的Application吧

正确结果如下:

Compiling 1 source file to E:/EJBTest/build/classes
prop
WHat is thsi
why
BUILD SUCCESSFUL (total time: 6 seconds)

 

还可以看看GlassFIsh端,最后3行:

LDR5010: All ejb(s) of [EJBModule1] loaded successfully!
Hello,Test Bean
Hello,Test Bean

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值