当前位置:  技术问答>java相关

如何在一个页面实现两个Java Applet,且互相关联起来?

    来源: 互联网  发布时间:2014-12-22

    本文导语:  | 关注 | I hope you can solve this problem with the following article.(not write by me) ============================================================================= Inter-applet Communication: Getting Them to Talk to Each Other   H...


|
关注

|
I hope you can solve this problem with the following article.(not write by me)
=============================================================================
Inter-applet Communication: Getting Them to Talk to Each Other  
Here's how applets on the same Web page can find each other, as well as an elegant API for using this mechanism. 
Published  April 18, 2000  
Getting two or more applets within a single Web page to talk to each other has some benefits. Although this applet capability has been around since the earliest version of Java, it抯 not often used, because there抯 more emphasis placed on getting applets to communicate with servers. 

While this is understandable given the current fashion of client/server programming, it抯 still a valuable skill for developers to learn. Another reason the technique isn't used much is that complicated Web-borne applets are usually shown in a single window. If there抯 a lot of information to show, the designers simply make the applet larger. 

However, in terms of Web page design, it抯 better in some cases to place small bits of Java-based functionality in different parts of the page, leaving the rest to be filled with text and images. To do this, you need multiple applet windows that are, in some sense, part of the same program. 

In this article, we'll look into the basic techniques of inter-applet communication. We'll develop a nice API that takes care of the work for us. Then we'll show a sample application called DumChat, which uses the API. 

Method
The secret of inter-applet communication (which we'll abbreviate to IAC) is the method AppletContext.getApplets(). This method provides us with an Enumeration of all the applets running on the same page as the calling applet. From this Enumeration, you can take actual Applet objects, allowing you to freely call methods on it. 

Clearly, this is enough to get started. However, it doesn't provide an elegant metaphor for communication. So how should we describe it? Well, how about some kind of message passing? Sounds good. 

What we'll do first is give names to the applets on the page and then allow them to send text strings to each other using the names as destinations. 

Here's an API for this: 



  public void send( String appletName, String message );  
  protected String rcv();


The send() method sends a string to another applet with a given name; the rcv() method returns the next string that has been sent to you. 

This API will be implemented in a class called CommunicatingApplet. To use this, you'll derive all your applets from this instead of directly from Applet, and the methods in the API will be available to you. 

Example 
Our simple chat system is called DumChat because, although it allows chatting between two windows, both windows have to be in the same Web page, on the same screen. So it's not very useful, but it does demonstrate our technology. 

The runtime structure of the DumChat applet is simple. It has a TextArea for displaying things that have been said, and above that it has a TextField for typing things in. Each time something is typed into the textfield, that message is sent to the other applet. And each applet has a background thread that is waiting for messages to come in and which prints them out when they do. 

Here's an excerpt from the code that handles the user typing: 
  // Extract the typed string
  String message = ae.getActionCommand();  
  // Send it to the other applet
  send( otherName, message );
  // Display it in our window
  ta.append( message+"n" );
  tf.setText( "" );


The variable otherName contains the name of the other applet; here you can see that sending a message to the other applet is simple — a single call to send takes care of it. 

Here's the code for the background thread that waits for incoming messages and displays them: 
  while (true) {
// Get the next message
String message = rcv();

// Print it
ta.append( message+"n" );  
  }


Again, very simple. It's worth the effort to put a nice, minimal API over a raw communication mechanism; a more complicated applet would be making lots of calls to send and rcv, and that's better than having lots of bits of code calling Applet.getApplets() and hunting around in that list for other Applet objects. 

We name the applets in the HTML. Here's the HTML for our example setup:



    
  
  
  
  
  
  
  


We've named the applets foo and bar. Very creative of us. Now, each applet needs to have a parameter that tells us what our name is and another one to tell us the name of our peer on the other side of our communication mechanism. 

Implementation
Let's take a look inside our implementation of the send() and rcv() methods: 



  // Send 'message' to applet named 'appletName'
  public void send( String appletName, String message )
      throws CommunicatingAppletException {

   // Have we managed to find our peer and send the message?
   boolean messageSent = false;

   // Zip through all the applets on the page
   Enumeration e = getAppletContext().getApplets();
   while (e.hasMoreElements()) {

    Applet applet = (Applet)e.nextElement();

    // Ignore applets that aren't part of our little game
    if (!(applet instanceof CommunicatingApplet))
     continue;

    // Grab the applet, if it might possibly be our peer
    CommunicatingApplet capplet = (CommunicatingApplet)applet;  

    // If this is the applet we're looking for,
    // give it the message
    if (capplet.getCommunicationName().equals( appletName )) {
     capplet.takeMessage( message );
     messageSent = true;

     // We're done!
     break;
    }
   }

   // The named applet isn't around; throw an Exception
   if (!messageSent)
    throw
      new CommunicatingAppletException(
           "Can't send message "+message );
  }


Here's how sending works: We sort through the list of applets on a page until we find the one with the target name. If we find it, we stuff the message directly into its queue by calling its takeMessage() method. 

Note that we throw an exception if we don't find the target applet. This may or may not be overkill for some applications. Even though our chat example is bogus, it does show a case where we might ignore messages that don't arrive; after all, chat programs don't always warn you when your message doesn't get to everyone. 

Here's the receiving routine: 



  // Receive a waiting message, or block
  // until there is one
  protected String rcv() {
    synchronized( messages ) {

      // We have a lock on the 'messages' object;
      // wait() until there are messages to be had
      while (true) {
        if (messages.isEmpty())
          try { messages.wait(); }
          catch( InterruptedException ie ) {}
        else
          break;
      }

      // Good, there is one.  Remove it from the queue
      // and return it
      String message = (String)messages.elementAt( 0 );  
      messages.removeElementAt( 0 );
      return message;
    }
  }


The trick here is that if there aren't any messages, we have to block until there are some. Which means going into a class wait/condition loop. Once the loop is exited, we know that there is a message, so we take it from the queue and return it to the caller. 

Note that we are using synchronization in this code. We are using a Java.util.Vector object to keep the messages in, and we can't have multiple threads messing with it at the same time; so we control access to it by sychronizing on the Vector itself. We don't want to synchronize on the applet — it would work fine, but you might have other code that's already synchronizing on the applet, and you don't want that interacting. It's best to have a separate object for each synchronization issue in your program, and in this case it was fine to just use the Vector itself. 

Ideas for Further Work
The main thing to do is to use this technique for something useful. After all, DumChat is pretty silly, and it doesn't really suggest what one might use this for. 

As mentioned above, you could have a page where you want to use Java to implement Web site navigational tools. There's a good chance you might want a collection of smaller applets — a collapsible menu on the left, a "What's Hot" ticker at the top, and so on. If these were entirely separate applets, they would likely be duplicating some of the site-layout information they both use, which increases download time. Instead, you can have a master applet telling other applets what to do and what to display. 

Our implementation is also quite bare-bones. We are using String objects as our messages, and we might want to have something more sophisticated. We could allow the applets to send arbitrary Objects to each other (and we then send strings if we wanted, or anything else, depending on the application). We could even define a special CommunicatingAppletMessage class, which could contain the actual string or object, and also contain the name of the applet that sent it — like a return address. The receiving applet might need to know where to send a reply. This latter option is probably most elegant from an object-oriented design standpoint. 

Another idea is to allow some kind of "discovery" of other applets. We hard-coded the name of the "other" applet into our HTML, but in some cases, our applets might be put on the page in different configurations. Our applet might want to sift through a list of other CommunicatingApplets on the page and see which ones it wants to send things to. 

Finally, there might be a problem subclassing from CommunicatingApplet — after all, there might be some other useful abstract applet base class we want to derive from, and that would make it impossible to use CommunicatingApplet. If this were the case, we would want to create another class, say AppletPostOffice, and have the various methods be static methods of that class. 

Conclusion
We've seen how applets on the same Web page can find each other, and we've created a more elegant API for using this mechanism. It's up to you to figure out how you can use this to improve your Java-enabled Web pages. Let me know if you make something interesting! 

About the Author
Greg Travis is a freelance programmer living in New York City. His interest in computers can probably be traced back to the episode of "The Bionic Woman" where Jamie runs around trying to escape a building, whose lights and doors are controlled by an evil artificial intelligence. He's a devout believer in the idea that when a computer program works, it's a complete coincidence. He can be reached at mito@panix.com.
 

|
其实很简单,通过Applet的容器即可访问该容器里的所有Applet.
当然Applet的容器就是浏览器拉!

|
主要是通过appletcontext

|
到javaworld.com上thread编程栏目中的一个例子可以说明

|
建议您访问www.etechbase.net/tech,里面有很多资料,也许可以解决您的问题。
访问http://168.168.18.11:81/etechbase/advsearch.php将您的问题输入查询内容框,选择不同的精确程度,即可以找到你所需要的答案。效果还是可以的。

    
 
 

您可能感兴趣的文章:

  • (急,改天请吃饭,谢)如何把jsp页面的打印按纽关联到IE的打印功能或如何用简单的实现打印页面
  • 如何同时调用两个Jsp页面?
  • 如何控制同页面下两个选择框的内容相互变化???
  • 两个页面之间的控制??????????????(online)
  • 快来救救我(同一页面打开两个窗口)
  • 关于页面的两个小问题
  • 两个JSP页面如何传递变量啊?(如何通信)
  • 表单提交能否给两个页面提供参数?在线给分
  • 页面上左右两个框架的刷新问题
  • 想在页面用orcaledriver连接数据库,如何将两个zip文件引入
  • 两个简单问题:在javaBean中能用out.println()输出页面吗?javaBean中可以使用servlet建立的session对象变量值吗?
  • 请教一个在JSP中前后两个页面进行数据传递的问题
  • 用Linux浏览社区页面怎么没有显示导航栏,代替的 是同步两个字.而且还要 用 鼠标在左边拖开才能显示
  • jsp中怎样将一个页面分成两个?
  • jsp中怎样实现两个页面间的数据传递???
  • 在一个页面中如何将两个下拉框的内容联系起来?在线给分
  • jsp中将一个页面分成两个显示部分
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 通过javascript库JQuery实现页面跳转功能代码
  • 一JSP网站,统一指定一个errorPage页面,统一处理异常,在指定的errorPage页面中,我想知道具体是哪个页面出错的,即想知道出错页面的具
  • JavaScript实现页面跳转的几种方法(参考代码)
  • 求救!weblogic6.0后台运行正确,前台页面跳转或调用其他页面时出“页面无法显示错误”
  • HTML 5 <base> 标签-规定页面中所有链接的基准 url
  • jquery 父页面查找iframe子页面内容、子页面查找父页面内容
  • HTML <!DOCTYPE> 标签用法详解及如何解决<!DOCTYPE html>未声明时导致页面无效的问题
  • 请问applet怎么能与所在的页面进行通讯 即从页面中取得变量和把返回值返回给页面?
  • 页面刷新问题:所有的页面在打开时无论传递的参数是什么,打开的总是上一次打开页面的内容,必需刷新之后才能看到实际的网页。
  • 如何在让表单的提交页面出现在框架页面中。
  • 如何能够只打印,页面上的表格,页面上的上一页,下一页,还有按钮不打印
  • 请问怎么样能自动定向到另一个页面并且给那个页面传参数呀?
  • 诸位大瞎:jsp中不能写方法,可能是因为这个页面里的所有语句都在某个方法中。 我想问一下,怎么复用某个页面里的程序呢? 不用 bean,因为程序要显示很多 html,用 include 也不行,因为 页面有传入参数。
  • 在JSP中如何从一个页面转向另一个页面?
  • 为何我使用javascript中location'****.jsp'跳到某一页面,jsp页面不重新编译执行
  • ?启动jsp页面时,让页面刷新(一次)?
  • 当我修改了一个jsp文件之后刷新页面,为什么页面上的内容没有更新的呢?
  • jsp对页面的大小有否限制,我的页面在60多K之后就断掉了!!!
  • 改变一系列页面的页面风格问题
  • 让JSP页面过期, 保证每次JSP页面都是最新的.
  • JSP中如何在一页面执行后导入另一页面?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3