2009-06-12 4 views
0

Я видел статью о Javascript_Java_Interaction сегодня:Javascript_Java_Interaction апплет "Codebase" проблема

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, если файл класса находится в другом каталоге, вы можете указать его на основе кода, апплет появится, но если вы наберете текст и нажмите кнопку, ничего не произойдет, я пробовал разные способы указать кодовая база:

<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

ответ

0

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

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

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