目录
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的引用,尽管他不是管理员权限。这点,在设计中是需要加以注意的。
(一) 我和几个小伙伴一起玩雪,大家说着笑着,堆起雪人来。我们找来两根树枝当做手,两个纽扣当眼睛,找来一个桶当帽子,用胡萝卜当雪人的鼻子,给它戴上了围巾,还给它画了一张笑脸,就这样,一个可爱调皮的小雪人完成了!接着,我们打起了雪仗,伙伴们向空中扔了许多小雪球,一个小雪球砸到了我的脑袋上…… (二) 文文和她妈妈去公园里玩。文文一进公园就看到了有凉停、石雕、假山,还有各重各样的鲜花。文文看见有一束菊花特别引人注目,她看了又看,文文想伸手去摘,可被妈妈看见了,妈妈说:“这公园里的花只能看,不能摘的,如果你摘一朵,她摘一朵,岂不是这束花都被摘完了。”文文听了妈妈的话,不由自主的脸红了。后来,文文对妈妈说:“妈妈,我知道了,我以后再也不摘了。”
(三) 送伞 星期天早晨,小明在家里专心致志地做作业,妈妈提着篮子上街买菜了。过了一会儿,天空中乌云密布,电闪雷鸣。小明吓了一跳,他赶紧跑到窗前一看,外面下起了倾盆大雨。小明担心地想:“妈妈出去没有带伞,淋了雨会感冒生病的,我得马上给她送伞去!”想到这里,他拿起雨伞,自己也撑了一把伞,大步流星地向菜场跑去。 (四) 元宵节到了,到处都是花灯和观灯的人,热闹极了!小朋友们一边看,一边露出开心的笑容。一位叔叔手里抱着一个小孩儿,他笑眯眯地提着一个小花灯。
(五) 清晨,公园里有许多锻炼身体的人。小朋友们在欢快地跑步,叔叔们在练习唱歌,老爷爷们在打太极。真是热闹极了! (六) 春天到了,各种各样的花都开了,小明和小红来到公园的草地上栽树。小明铲地挖坑,小红为小数浇水。小树栽好后,飞来两只可爱的小鸟围着小树欢乐地歌唱。
我和几个小伙伴一起玩雪,大家说着笑着,堆起雪人来。我们找来两根树枝当做手,两个纽扣当眼睛,找来一个桶当帽子,用胡萝卜当雪人的鼻子,给它戴上了围巾,还给它画了一张笑脸,就这样,一个可爱调皮的小雪人完成了!接着,我们打起了雪仗,伙伴们向空中扔了许多小雪球,一个小雪球砸到了我的脑袋上…… (二) 文文和她妈妈去公园里玩。文文一进公园就看到了有凉停、石雕、假山,还有各重各样的鲜花。文文看见有一束菊花特别引人注目,她看了又看,文文想伸手去摘,可被妈妈看见了,妈妈说:“这公园里的花只能看,不能摘的,如果你摘一朵,她摘一朵,岂不是这束花都被摘完了。”文文听了妈妈的话,不由自主的脸红了。后来,文文对妈妈说:“妈妈,我知道了,我以后再也不摘了。”
送伞 星期天早晨,小明在家里专心致志地做作业,妈妈提着篮子上街买菜了。过了一会儿,天空中乌云密布,电闪雷鸣。小明吓了一跳,他赶紧跑到窗前一看,外面下起了倾盆大雨。小明担心地想:“妈妈出去没有带伞,淋了雨会感冒生病的,我得马上给她送伞去!”想到这里,他拿起雨伞,自己也撑了一把伞,大步流星地向菜场跑去。 (四) 元宵节到了,到处都是花灯和观灯的人,热闹极了!小朋友们一边看,一边露出开心的笑容。一位叔叔手里抱着一个小孩儿,他笑眯眯地提着一个小花灯。
(五) 清晨,公园里有许多锻炼身体的人。小朋友们在欢快地跑步,叔叔们在练习唱歌,老爷爷们在打太极。真是热闹极了! (六) 春天到了,各种各样的花都开了,小明和小红来到公园的草地上栽树。小明铲地挖坑,小红为小数浇水。小树栽好后,飞来两只可爱的小鸟围着小树欢乐地歌唱。
秋天到了,小明和小红拿着扫把在清扫地上金黄的落叶。 (八) 夏日炎炎,小红来到爷爷的瓜地,一边大口大口地吃着又大又甜的西瓜,一边高兴地看着满地碧绿的大西瓜。