Javascript_Java_Interaction апплет "Codebase" проблема - PullRequest
1 голос
/ 12 июня 2009

Сегодня я увидел статью о Javascript_Java_Interaction по адресу:

 http://www.rgagnon.com/javadetails/java-0184.html
 [ You can try the working version on that site ]
 So I tried it on my PC, after some simple format change the files look like this :

=============================================== =============================================

[C:/Dir_Fit/Javascript_Java_Interaction.html]

    <FRAMESET ROWS="100%,*">
      <FRAME NAME="mainFrame" SRC="Javascript_Java_Interaction_Visible_Page.html" border=0>
      <FRAME NAME="scriptFrame" SRC="Javascript_Java_Interaction_Invisible_Page.html" border=0>
    </FRAMESET>
--------------------------------------------------------------------------------------------

[C:/Dir_Fit/Javascript_Java_Interaction_Invisible_Page.html]

<HTML>
  <HEAD>
    <SCRIPT>
      function replace(s,t,u)
      {
        i=s.indexOf(t);
        r="";
        if (i==-1) return s;
        r+=s.substring(0,i)+u;
        if (i+t.length<s.length) r+=replace(s.substring(i+t.length,s.length),t,u);
        return r;
      }

      function getAndSendMessage()
      {
        theMessage=document.location.search.substring(1,255)
        if (theMessage.length>0)
        {
          // replace all '+" by space
          theMessage=replace(theMessage,'+',' ')
          window.parent.mainFrame.showMessage(unescape(theMessage))
        }
      }
    </SCRIPT>
  </HEAD>
  <BODY onLoad="getAndSendMessage();"></BODY>
</HTML>
-----------------------------------------------------------------------------------------
[C:/Dir_Fit/Javascript_Java_Interaction_Visible_Page.html]

<HTML>
  <HEAD><SCRIPT>function showMessage(s) { alert(s) }</SCRIPT></HEAD>
  <BODY>
    <H1>Simple Java - Javascript interaction</H1><P>
    <APPLET CODEBASE="file://C:/Dir_Fit/build/classes/" CODE="Javascript_Java_Interaction_Demo.class" WIDTH=150 HEIGHT=150></APPLET>
  </BODY>
</HTML>
-----------------------------------------------------------------------------------------
Source : [C:/Dir_Fit/src/Javascript_Java_Interaction_Demo.java]
class  : [C:/Dir_Fit/build/classes/Javascript_Java_Interaction_Demo.class]

import java.applet.Applet;
import java.awt.*;

public class Javascript_Java_Interaction_Demo extends Applet
{
  TextField aMessage;
  Button sendButton;

  public void init()
  {
    aMessage=new TextField(20);
    add(aMessage);
    sendButton=new Button("Send to Javascript");
    add(sendButton);
  }

  public boolean action(Event e,Object o)
  {
    if (e.target.equals(sendButton))
    {
      try { getAppletContext().showDocument(new java.net.URL(getCodeBase(),"Javascript_Java_Interaction_Invisible_Page.html?"+java.net.URLEncoder.encode(aMessage.getText())),"scriptFrame"); }
      catch (Exception ex) { ex.printStackTrace(); }
    }
    return true;
  }
}

=============================================== ===========================================

Он отображал апплет на странице [Javascript_Java_Interaction.html], но если я набираю какой-то текст и нажимаю кнопку, ничего не происходит, проблема в следующей строке:

<APPLET CODEBASE="file://C:/Dir_Fit/build/classes/" CODE="Javascript_Java_Interaction_Demo.class" WIDTH=150 HEIGHT=150></APPLET>

Итак, я скопировал файл класса в тот же каталог, что и HTML-файлы [C: / Dir_Fit /], и изменил приведенную выше строку на:

<APPLET CODE="Javascript_Java_Interaction_Demo.class" WIDTH=150 HEIGHT=150></APPLET>

теперь работает, будет отображаться окно с предупреждением.

Итак, мой вопрос: почему это не сработало, когда я указал кодовую базу? Согласно Java-документу, если файл класса находится в другом каталоге, вы можете сказать это по codebase, апплет будет отображаться, но если вы наберете какой-нибудь текст и нажмете кнопку, ничего не произойдет, я пробовал разные способы указать кодовая база:

    <APPLET CODEBASE="file:///C:/Dir_Fit/build/classes/" CODE="Javascript_Java_Interaction_Demo.class" WIDTH=150 HEIGHT=150></APPLET>

    <APPLET CODEBASE="C:/Dir_Fit/build/classes/" CODE="Javascript_Java_Interaction_Demo.class" WIDTH=150 HEIGHT=150></APPLET>

    <APPLET CODEBASE="build/classes/" CODE="Javascript_Java_Interaction_Demo.class" WIDTH=150 HEIGHT=150></APPLET>

<APPLET CODE="C:/Dir_Fit/build/classes/Javascript_Java_Interaction_Demo.class" WIDTH=150 HEIGHT=150></APPLET>

Тем не менее, ни один из них не работает, почему? Я не хочу, чтобы файл класса был в том же каталоге, что и htmls. Что за исправление?

Frank

1 Ответ

0 голосов
/ 12 июня 2009

Это может быть как-то связано с изменениями, внесенными в Java 6 Update 10. После выпуска мои апплеты начали давать сбой с ClassNotFoundExceptions независимо от браузера - странно, они работали с 6u7 до этого. Сначала я подумал об испорченной установке или настройке, но затем другие испытали то же самое в своей системе.

Мой метод проб и ошибок дал тот же результат, что и ваши наблюдения, а именно, если я укажу даже пустой атрибут codebase, мой апплет завершится ошибкой.

Поиск в Google (сегодня) не дает каких-либо значимых результатов или отчетов об ошибках. Я полагаю, что правила использования атрибута codebase менялись между версиями - возможно, старая не была достаточно строгой или не соответствовала какой-либо спецификации.

...