知识大全 如何实现Applet之间跨浏览器窗口的通信

Posted 通信

篇首语:当生活如同炼狱,必须自己创造阳光。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 如何实现Applet之间跨浏览器窗口的通信相关的知识,希望对你有一定的参考价值。

如何实现Applet之间跨浏览器窗口的通信  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

   java applet包的AppletContext类包含如下两个成员方法 getApplet和getApplets 使用这两个方法 Applet能够寻找到其他的Applet并调用它们的方法 不过这是以满足如下安全条件为前提的     所有Applet位于同一服务器的同一目录   所有Applet运行在同一页面且位于同一浏览器窗口内    或许为Applet加上这些安全限制都有着很充分的理由 但第二个条件给我们实现带有Applet到Applet通信功能的多Applet界面带来了限制      请设想如下情形      你刚好编写完了一个用于股票交易的Applet 接下来想要为它做一个完善的帮助系统 这个帮助系统也是一个Applet 而且应该放到和股票交易Applet不同的另外一个帧里 你作出这个决定的原因可能是出于网站整体结构的考虑 也可能是你想让帮助系统总是处于显示状态 你还想让帮助Applet能够自动根据用户的当前操作切换到相应的帮助条目(就象Microsoft Office帮助系统提供的那样) 此外 你甚至还计划著在帮助系统里做一个向导 使它能够在另外一个窗口中指导用户如何完成股票交易Applet里的各种任务      应当承认这种设想是非常美妙的 然而 由于这些Applet位于不同的页面 AppletContext中的Java API无法帮助你完全实现这种设想——不过本文介绍的技术能够      在介绍新的Applet到Applet通信方法之前 我们先要简要地介绍一下getApplet和getApplets这两个方法的用法 Applet能够寻找到同一页面的其他Applet 这既可以调用getApplet方法通过名字查找 也可以调用getApplets方法找出同一页面内的所有Applet 这两个方法都在调用成功时返回一个或多个Applet对象给调用者 调用者找到目标Applet对象之后 接着就可以调用它的公用方法      假设HTML页面的代码片断如下            通过APPLET标记的name属性 我们可以用如下代码引用指定的Applet   Applet theOtherApplet = getApplet( app );  //调用该Applet的公用方法  theOtherApplet anyMethod();             或者 我们也可以用下面的代码提取页面内的所有Applet   Enumeration allAppletsOnSamePage = getApplets();  while(allAppletsOnSamePage hasMoreElements())     Applet appl = (Applet) allAppletsOnSamePage nextElement();  // 调用Applet的公用方法    appl anyMethod();              当发出调用的Applet提取到同一HTML页面内的一个或多个Applet对象时 它就可以调用这些Applet对象的公用方法      遗憾的是 使用这种标准方法我们只能实现同一页面内的Applet通信 但如果幸运的话 我们可以很方便地突破这一局限 实现跨页面Applet到Applet通信基于这样一个事实 即如果两个Applet具有相同的codebase 那么即使它们运行在不同的浏览器窗口中 它们也将共享同一个运行时环境 所谓的codebase 我们可以粗略地把它看成Applet所在的服务器目录 请参见本文后面参考资源中有关codebase示范的链接      共享运行时环境使得类的静态域和结构能够被所有的Applet实例访问 因此 我们可以用这些静态域和结构在不同的Applet之间传递信息      我们不仅可以把简单数据类型——比如整数 字符 字符串存储到这些静态域 而且还可以存储Applet实例本身的引用 这样 其他的Applet就可以通过访问这些静态域得到该Applet实例的引用      这种方法非常复杂吗?事实上 它并不复杂 下面我们来看一个简单的例子 假设有两个Applet(AppletA class和AppletB class)位于不同的帧 但它们具有相同的codebase      现在我们要从AppletA里面访问AppletB的公用方法 首先我们要在AppletB里面把它自己的引用保存到一个静态公用域 如   public class AppletB     public static AppletB selfRef = null; // Initially zero      public void init()       // 保存当前实例的引用      selfRef = this;                       现在AppletA可以访问AppletB的实例   public class AppletA     AppletB theOtherApplet = null;    public void callAppletB()    // 获得静态域的值 这个静态域保存了   // AppletB实例的引用      theOtherApplet = AppletB selfRef;     // 接下来就可以调用AppletB实例   // 的方法 例如       theOtherApplet repaint();                       这样就实现了两个Applet的通信 由于不同的Applet共享运行时环境 因此即使这些Applet位于不同的页面 这种方法也同样有效      不过应当注意的是 上面的代码不能处理这种情况 在AppletB没有启动之前就在AppletA里面调用callAppletB方法 如果发生这种情况 则selfRef的值将是null Applet之间的通信不能正常进行        当然 我们还可以设计出更加通用的方法 我们可以创建一个类 这个类的唯一用途就是在自己的静态数据结构中保存其他Applet的引用 下面是一个参考实现AppletList 想要让其他Applet访问自己的公用方法的Applet实例首先要在AppletList中注册 按照AppletContext getApplet(string name)方法的处理模式 每个注册的Applet都和一个字符串相关联 以后当其他Applet需要引用某个Applet实例时 这个字符串就可以作为键(即Applet的标识)使用      下面是Applet在AppletList中注册的典型过程   public class AppletA     public void start()       AppletList register( Stock trade applet this);                         其他Applet访问已注册Applet的过程如下   public class AppletB     public void run()       AppletA tradeApplet =        (AppletA) AppletList getApplet( Stock trade applet );                         当Applet结束运行时它必须从ApplietList取消注册   public void stop()     AppletList remove( Stock trade applet );                   AppletList类的完整代码如下    : import java util *;   : import java applet Applet;   :   : public class AppletList    : private static Hashtable applets = new Hashtable();   :   : public static void register(String name Applet applet)    : applets put(name applet);   :    :   : public static void remove(String name)    : applets remove(name);   :    :   : public static Applet getApplet(String name)    : return (Applet) applets get(name);   :    :   : public static Enumeration getApplets()    : return applets elements();   :    :   : public static int size()    : return applets size();   :    :             请从本文后面下载exampleCode zip了解更多有关如何应用AppletList类的信息      本方法的局限      如前所述 参与通信的Applet必须具有相同的codebase 此外 如果你运行的是两个不同的浏览器副本且Applet分别运行于这两个浏览器中 由于这些Applet可能没有共享运行时环境(这和浏览器版本 设置有关) 因此它们可能不能进行通信 然而 如果你是从同一个浏览器创建出新的浏览器窗口 那么这个问题是不存在的      本文所介绍的技术已经顺利通过好几个平台和浏览器版本的测试 但导致多个Applet拥有各自的运行时环境的配置还是存在的 顺利通过测试的操作系统和浏览器组合如下所示       小结      本文介绍了一种新的实现Applet到Applet通信的方法 这种方法在无法使用Java API的getApplet()方法时仍旧有效 掌握了这种方法 你就有更多的机会在Web网站或Intranet上使用Applet——用它来替换getApplets方法 或者补充getApplets方法的不足 cha138/Article/program/Java/hx/201311/26802

相关参考

知识大全 js操纵跨frame的三级联动select下拉选项

  运用HTMLCSS以及Javascript相关知识编写多窗口多菜单的内容联动考察学生关于frame浏览器对象以及表单控件的概念javascript事件触发机制和程序设计以及用CSS来组织文字展示的

知识大全 applet在IE浏览器中不能显示的解决方案

applet在IE浏览器中不能显示的解决方案  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  刚刚

知识大全 搜狗浏览器打开新窗口的快捷键是什么?

搜狗浏览器打开新窗口的快捷键是什么?在新窗口中打开搜狗浏览器的快捷键是Ctrl+M你还可以在设置中对一些常用的快捷键进行自行设置,方便使用Chrome打开新窗口的快捷键是什么Chrome打开新窗口的快

知识大全 js 跨浏览器获取鼠标按键的值

  documentonmousedown=function(e)cha138/Article/program/Java/JSP/201311/20465

知识大全 定制浏览器XPSP2弹出窗口阻断设置

定制浏览器XPSP2弹出窗口阻断设置  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!在部署Windo

知识大全 每次看一些网页老是弹出广告窗口,都是些杂七杂八的网站,烦死了

哪个手机浏览器能阻止弹出窗口啊!每次看一些网页老是弹出广告窗口,都是些杂七杂八的网站,烦死了!我现在用的火猴浏览器暂时没发现弹窗广告,题主可以用下,。急!浏览器老是阻止弹出窗口。这是那些网站上面的"弹

知识大全 如何修改浏览器背景颜色啊

如何修改浏览器背景颜色啊?白色太刺眼了~~~~把窗口边成让眼睛能好受点的颜色,操作如下:桌面--右键--属性--外观--高级--项目--窗口--颜色--其他色调:85饱和度:90亮度:205然后单击[

知识大全 js中top/parent/frame概述及案例应用

引用方法top该变量永远指分割窗口最高层次的浏览器窗口如果计划从分割窗口的最高层次开始执行命令就可以用top变量parent该变量指的是包含当前分割窗口的父窗口如果在一个窗口内有分割窗口而在其中一个分

知识大全 让弹出窗口变得“体贴”一些

在网上冲浪时进入一些网站会出现弹出窗口它可能是站长对你的亲切问候也可能是网站的重要通告网站广告之类的但用得不好会让人产生厌烦心理如何才能让弹出窗口发挥作用而又不影响浏览者浏览页面呢?  一般的弹出窗口

知识大全 完全解析浏览器挡不住的网页对话框广告

  一个强制弹出窗口的JavaScript类ForceWindow一个可以不被广告拦截器拦截的弹出窗口  ForceWindowiclassjs代码如下(使用讲解相关说明全部在注释中)