当前位置:文档之家› 跟我学EJB 分布式编程技术——实现JNDI检索的基类和EJBHandle实现实例

跟我学EJB 分布式编程技术——实现JNDI检索的基类和EJBHandle实现实例

跟我学EJB 分布式编程技术——实现JNDI检索的基类和EJBHandle实现实例
跟我学EJB 分布式编程技术——实现JNDI检索的基类和EJBHandle实现实例

目录

1.1实现JNDI检索的基类和EJBHandle实现实例 (2)

1.1.1实现JNDI检索的基类 (2)

1.1.2修改访问EJB组件的客户端程序 (4)

1.1.3执行该客户程序 (7)

1.1.4使用EJB Bean的句柄来保存EJB (7)

1.1.5句柄应用程序例 (13)

1.1.6HomeHandle的应用例 (13)

1.1.7应用Handle所应该注意的问题 (14)

1.1实现JNDI检索的基类和EJBHandle实现实例

1.1.1实现JNDI检索的基类

1、概述

由于在EJB的客户程序中的JNDI检索是非常标准的,所以我们在应用中没有必要每次写客户程序的时候都重新编写它,而可以专门做一个类GetEJBHomeByJNDI,放在文件GetEJBHomeByJNDI.java中。实际的客户程序可以从该类来继承和派生。

2、GetEJBHomeByJNDI.java文件

(1)添加一个类

(2)包名称为statlessSBclient,类名称为GetEJBHomeByJNDI

(3)编程该类的代码

package statlessSBclient;

import javax.naming.*;

import java.util.Properties;

import javax.rmi.PortableRemoteObject;

public class GetEJBHomeByJNDI extends Object {

public Context getInitialContext() throws Exception {

String url = "t3://localhost:7001";

/* String user = null;

String password = null;

*/

String user = "WebAdmin";

String password = "12345678";

Properties properties = null;

try

{

properties = new Properties();

properties.put(Context.INITIAL_CONTEXT_FACTORY,

"weblogic.jndi.WLInitialContextFactory");

properties.put(Context.PROVIDER_URL, url);

if (user != null) {

properties.put(Context.SECURITY_PRINCIPAL, user);

properties.put(Context.SECURITY_CREDENTIALS, password == null ? "" : password);

}

return new InitialContext(properties);

}

catch(Exception e)

{

System.out.println("Unable to connect to WebLogic server at " + url);

System.out.println("Please make sure that the server is running.");

throw e;

}

}

}

1.1.2修改访问EJB组件的客户端程序

package statlessSBclient;

import statelesssessionbean.*;

import javax.naming.*;

import java.util.Properties;

import javax.rmi.PortableRemoteObject;

public class mathSessionEJBBeanTestClient extends GetEJBHomeByJNDI

{

private mathSessionEJBHome mathSessionEJBHomeObject = null;

private mathSessionEJB mathSessionEJBRemote = null; //声明一个Remote接口对象

//Construct the EJB test client

public mathSessionEJBBeanTestClient()

{

initialize();

}

public void initialize()

{

try

{

Context context = getInitialContext(); //get naming context

Object ref = context.lookup("mathSessionEJBBean"); //look up jndi name

//look up jndi name and cast to Home interface

mathSessionEJBHomeObject = (mathSessionEJBHome) PortableRemoteObject.narrow(ref, mathSessionEJBHome.class);

//下面为创建出Remote主接口类型的对象

mathSessionEJBRemote = mathSessionEJBHomeObject.create();

//下面为利用Remote主接口类型的对象对EJBBean类中的方法进行访问

System.out.println("利用无状态会话EJB计算10+20的结果="+mathSessionEJBRemote.getSummary(10,20));

System.out.println("获得无状态会话EJB中的环境变量"+mathSessionEJBRemote.getEJBEnvItem());

}

catch(Exception e)

{

e.printStackTrace();

}

}

public void executeRemoteCallsWithDefaultArguments(mathSessionEJB mathSessionEJBObject)

{

if (mathSessionEJBObject == null)

{

return ;

}

try

{

mathSessionEJBObject.getSummary(0 ,0);

}

catch(Exception e)

{

e.printStackTrace();

}

}

//----------------------------------------------------------------------------

// Utility Methods

//----------------------------------------------------------------------------

public mathSessionEJBHome getHome()

{

return mathSessionEJBHomeObject;

}

//Main method

public static void main(String[] args)

{

mathSessionEJBBeanTestClient client = new mathSessionEJBBeanTestClient();

// Use the getHome() method of the client object to call Home interface

// methods that will return a Remote interface reference. Then

// use that Remote interface reference to access the EJB.

}

}

1.1.3执行该客户程序

1.1.4使用EJB Bean的句柄来保存EJB

1、关于句柄的使用

在某些情况下,EJB客户机也许希望把EJBObject引用保留到永久的设备上,以便将来使用,甚至在另一个程序中使用。EJB规范定义了句柄(Handle)的概念。作为一个序列化对象,据柄中封装了足够的信息,以便重建对EJBObject的引用。

2、获得句柄或者重建EJB Bean的引用

只能用remote接口的句柄来重新建立Bean的引用。你不能用句柄来创建Bean本身。如果另一个进程删除了Bean,或者系统崩溃或关闭,删除了Bean的实例,则当应用程序试图用句柄重新建立对Bean的引用时会抛出异常。

当你不确定Bean的实例是否依然存在的时候,你可以不用remote接口的句柄。而是保存Bean的home接口的句柄,在以后要用的时候再通过调用create方法或finder方法重新创建Bean对象。

在客户创建了Bean的实例以后,就能够用getHandle()方法来获得实例的句柄。一旦拥有的句柄,就能够将它写到文件里面去。在以后的时间,客户可以读这个文件,将读出来的对象转化为句柄类型。然后,就可以在句柄上调用的getEJBObject方法来获得bean的引用。最后再将getEJBObject方法返回的值转化为合适的类型。

为了取得句柄,程序员可以调用EJBObject接口中的getHandle()方法,该方法返回一个javav.ejb.Handle实例。

为了重建EJBObject的引用,可以使用Handle接口的getEJBObject()方法。

3、在客户程序中根据Bean的Remote对象获得并保存其句柄

javax.ejb.Handle mathSessionEJBHander=null;

mathSessionEJBRemote = mathSessionEJBHomeObject.create();

mathSessionEJBHander=mathSessionEJBRemote.getHandle();

4、将句柄序列化到某一文件中

FileOutputStream fileOutputStream = new FileOutputStream("mathSessionEJBHander.ser");

ObjectOutputStream objectOutputStream= new ObjectOutputStream(fileOutputStream);

objectOutputStream.writeObject(mathSessionEJBHander);

objectOutputStream.flush();

objectOutputStream.close();

此时在磁盘文件中的项目目录下将产生出一个mathSessionEJBHander.ser文件。

5、从文件中反序列化出句柄

FileInputStream fileInputStream = new FileInputStream("mathSessionEJBHander.ser");

ObjectInputStream objectInputSteam = new ObjectInputStream(fileInputStream); //从文件中读出对象并将它转化为Hander类型。

javax.ejb.Handle mathSessionEJBHanderCopy = (javax.ejb.Handle)objectInputSteam.readObject();

objectInputSteam.close();

6、根据句柄来重建EJB Bean的引用

mathSessionEJB mathSessionEJBRemoteCopy

=(mathSessionEJB)PortableRemoteObject.narrow(mathSessionEJBHanderCopy.getEJBObje ct(),mathSessionEJB.class);

7、完整的程序代码为

package statlessSBclient;

import statelesssessionbean.*;

import javax.naming.*;

import java.util.Properties;

import javax.rmi.PortableRemoteObject;

import java.io.*;

public class mathSessionEJBBeanTestClient extends GetEJBHomeByJNDI

{

private mathSessionEJBHome mathSessionEJBHomeObject = null;

private mathSessionEJB mathSessionEJBRemote = null; //声明一个Remote接口对象javax.ejb.Handle mathSessionEJBHander=null;

public mathSessionEJBBeanTestClient()

{

initialize();

}

public void initialize()

{

try

{

Context context = getInitialContext(); //get naming context

Object ref = context.lookup("mathSessionEJBBean"); //look up jndi name

//look up jndi name and cast to Home interface

mathSessionEJBHomeObject = (mathSessionEJBHome) PortableRemoteObject.narrow(ref, mathSessionEJBHome.class);

//下面为创建出Remote主接口类型的对象

mathSessionEJBRemote = mathSessionEJBHomeObject.create();

mathSessionEJBHander = mathSessionEJBRemote.getHandle();

FileOutputStream fileOutputStream = new FileOutputStream("mathSessionEJBHander.ser");

ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);

objectOutputStream.writeObject(mathSessionEJBHander);

objectOutputStream.flush();

objectOutputStream.close();

FileInputStream fileInputStream = new FileInputStream("mathSessionEJBHander.ser");

ObjectInputStream objectInputSteam = new ObjectInputStream(fileInputStream);

//从文件中读出对象并将它转化为Hander类型。

javax.ejb.Handle mathSessionEJBHanderCopy = (javax.ejb.Handle)

objectInputSteam.readObject();

objectInputSteam.close();

mathSessionEJB mathSessionEJBRemoteCopy = (mathSessionEJB)

PortableRemoteObject.narrow(mathSessionEJBHanderCopy.getEJBObject(),mathSessionEJ B.class);

//下面为利用Remote主接口类型的对象对EJBBean类中的方法进行访问

System.out.println("利用EJB Handle重新构造无状态会话EJB Remote接口对象而计算10+20的结果=" +mathSessionEJBRemoteCopy.getSummary(10, 20));

System.out.println("利用EJB Handle重新构造无状态会话EJB Remote接口对象而获得无状态会话EJB中的环境变量" +mathSessionEJBRemoteCopy.getEJBEnvItem());

}

catch(Exception e)

{

e.printStackTrace();

}

}

public void executeRemoteCallsWithDefaultArguments(mathSessionEJB mathSessionEJBObject)

{

if (mathSessionEJBObject == null)

{

return ;

}

try

{

mathSessionEJBObject.getSummary(0 ,0);

}

catch(Exception e)

{

e.printStackTrace();

}

}

//----------------------------------------------------------------------------

// Utility Methods

//----------------------------------------------------------------------------

public mathSessionEJBHome getHome()

{

return mathSessionEJBHomeObject;

}

//Main method

public static void main(String[] args)

{

mathSessionEJBBeanTestClient client = new mathSessionEJBBeanTestClient();

// Use the getHome() method of the client object to call Home interface

// methods that will return a Remote interface reference. Then

// use that Remote interface reference to access the EJB.

}

}

1.1.5句柄应用程序例

重新执行该客户端程序。

1.1.6HomeHandle的应用例

类似handle ,但不能用于引用EJBObject,HomeHandle 包含足够的信息,可以重建EJBHome()的引用。为了取得对HomeHandle的引用,程序员可以调用EJBHome引用的getHomeHandle()方法。这个方法将返回一个javax.ejb.HomHandle接口的实例。

然后,再通过调用HomeHandle的getEJBHome()方法,收回对Home对象的引用。

1、下面的代码例子片断是根据Home接口对象获得其HomeHandle

Context context = getInitialContext(); //get naming context

Object ref = context.lookup("mathSessionEJBBean"); //look up jndi name

mathSessionEJBHomeObject = (mathSessionEJBHome) PortableRemoteObject.narrow(ref, mathSessionEJBHome.class);

HomeHandle mathSessionEJBHomeHandle = mathSessionEJBHomeObject.getHomeHandle();

2、下面的代码例子片断是根据HomeHandle重建EJB Home的引用

Object objectHomeHandle = mathSessionEJBHomeHandle.getEJBHome(); mathSessionEJBHome newHomeReference = (mathSessionEJBHome)PortableRemoteObject.narrow(objectHomeHandle, mathSessionEJBHome.class);

1.1.7应用Handle所应该注意的问题

1、HomeHandle保留的信息包括

可用于建立针对WebLogic Server的InitialContext,然后可以据此检索正确的Home对象。例如,收到HomeHandle的客户机不需要知道服务器的URL地址,也不需要知道服务器的JNDI 的名字,就可以取得对于EJBHome的引用。

2、经常会有这样的误解

即HomeHandle比正常先建立InitialContext,然后检索JNDI名字更加有效。其实一般的讲,这两种情况执行的步骤是一样的,HomeHandle仅仅是保留了程序员必须提供的信息。3、还有一点要注意

Handle并不保存当前的标识,不能用作安全凭证。

例如,假定有个EJB,只有管理员角色本人能够访问这个EJB,现在管理员本人访问了这个EJB,并保留下了Handle。如果另一个用户收到了这个Handle,当他调用getEJBObject()方法以后,他就有了对这个EJB的引用,尽管他不是管理员权限。这点,在设计中是需要加以注意的。

部编版一年级下语文跟我学写话范文

(一) 我和几个小伙伴一起玩雪,大家说着笑着,堆起雪人来。我们找来两根树枝当做手,两个纽扣当眼睛,找来一个桶当帽子,用胡萝卜当雪人的鼻子,给它戴上了围巾,还给它画了一张笑脸,就这样,一个可爱调皮的小雪人完成了!接着,我们打起了雪仗,伙伴们向空中扔了许多小雪球,一个小雪球砸到了我的脑袋上…… (二) 文文和她妈妈去公园里玩。文文一进公园就看到了有凉停、石雕、假山,还有各重各样的鲜花。文文看见有一束菊花特别引人注目,她看了又看,文文想伸手去摘,可被妈妈看见了,妈妈说:“这公园里的花只能看,不能摘的,如果你摘一朵,她摘一朵,岂不是这束花都被摘完了。”文文听了妈妈的话,不由自主的脸红了。后来,文文对妈妈说:“妈妈,我知道了,我以后再也不摘了。”

(三) 送伞 星期天早晨,小明在家里专心致志地做作业,妈妈提着篮子上街买菜了。过了一会儿,天空中乌云密布,电闪雷鸣。小明吓了一跳,他赶紧跑到窗前一看,外面下起了倾盆大雨。小明担心地想:“妈妈出去没有带伞,淋了雨会感冒生病的,我得马上给她送伞去!”想到这里,他拿起雨伞,自己也撑了一把伞,大步流星地向菜场跑去。 (四) 元宵节到了,到处都是花灯和观灯的人,热闹极了!小朋友们一边看,一边露出开心的笑容。一位叔叔手里抱着一个小孩儿,他笑眯眯地提着一个小花灯。

(五) 清晨,公园里有许多锻炼身体的人。小朋友们在欢快地跑步,叔叔们在练习唱歌,老爷爷们在打太极。真是热闹极了! (六) 春天到了,各种各样的花都开了,小明和小红来到公园的草地上栽树。小明铲地挖坑,小红为小数浇水。小树栽好后,飞来两只可爱的小鸟围着小树欢乐地歌唱。

一年级下册部编语文跟我学写话范文

我和几个小伙伴一起玩雪,大家说着笑着,堆起雪人来。我们找来两根树枝当做手,两个纽扣当眼睛,找来一个桶当帽子,用胡萝卜当雪人的鼻子,给它戴上了围巾,还给它画了一张笑脸,就这样,一个可爱调皮的小雪人完成了!接着,我们打起了雪仗,伙伴们向空中扔了许多小雪球,一个小雪球砸到了我的脑袋上…… (二) 文文和她妈妈去公园里玩。文文一进公园就看到了有凉停、石雕、假山,还有各重各样的鲜花。文文看见有一束菊花特别引人注目,她看了又看,文文想伸手去摘,可被妈妈看见了,妈妈说:“这公园里的花只能看,不能摘的,如果你摘一朵,她摘一朵,岂不是这束花都被摘完了。”文文听了妈妈的话,不由自主的脸红了。后来,文文对妈妈说:“妈妈,我知道了,我以后再也不摘了。”

送伞 星期天早晨,小明在家里专心致志地做作业,妈妈提着篮子上街买菜了。过了一会儿,天空中乌云密布,电闪雷鸣。小明吓了一跳,他赶紧跑到窗前一看,外面下起了倾盆大雨。小明担心地想:“妈妈出去没有带伞,淋了雨会感冒生病的,我得马上给她送伞去!”想到这里,他拿起雨伞,自己也撑了一把伞,大步流星地向菜场跑去。 (四) 元宵节到了,到处都是花灯和观灯的人,热闹极了!小朋友们一边看,一边露出开心的笑容。一位叔叔手里抱着一个小孩儿,他笑眯眯地提着一个小花灯。

(五) 清晨,公园里有许多锻炼身体的人。小朋友们在欢快地跑步,叔叔们在练习唱歌,老爷爷们在打太极。真是热闹极了! (六) 春天到了,各种各样的花都开了,小明和小红来到公园的草地上栽树。小明铲地挖坑,小红为小数浇水。小树栽好后,飞来两只可爱的小鸟围着小树欢乐地歌唱。

秋天到了,小明和小红拿着扫把在清扫地上金黄的落叶。 (八) 夏日炎炎,小红来到爷爷的瓜地,一边大口大口地吃着又大又甜的西瓜,一边高兴地看着满地碧绿的大西瓜。

相关主题
文本预览
相关文档 最新文档