2013-05-01 2 views
0

Это продолжение моего первоначального поста здесь: javascript-to-java-applet-using-deployjava-js-to-run-commandlineJavaScript в Java-апплет - работа

Я довольно новый для Java. Я хочу создать Java-апплет, который позволит моему JavaScript передавать командную строку в Java-апплет. Это будет работать только на моей машине разработки - не нужно напоминать мне, что такое проблема безопасности. Вариант использования заключается в том, что у меня есть интроспектор моего приложения ExtJS, который позволяет мне отображать классы. Я хочу иметь возможность щелкнуть класс, передать соответствующее имя пути в апплет и открыть этот файл в Eclipse для редактирования.

После многих неудачных испытаний это то, что я нашел. Благодаря Andrew Thompson и другим, упомянутым ниже.

Кажется, есть два пути, и мне удалось заставить их работать. Я включаю их обоих здесь. Путь 1 состоит в том, чтобы выполнить программу с параметрами (например, D:/Eclipse/eclipse.exe --launcher.openFile C:/sites/test.js), а Путь 2 - установить Win7 для открытия Eclipse при открытии файла * .js (т.е. связать * .js с Eclipse).

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Помните, что путь 1 полностью небезопасен на общедоступном сервере - было бы относительно легко передать команду форматирования или удаления или любые другие ошибки через JavaScript!

Для новичков Java, таких как я, я буду как можно яснее о шагах.

Класс для выполнения программ. Спасибо: https://stackoverflow.com/users/80389/corgrath

package systemcmd; 


import java.applet.Applet; 
import java.io.*; 

public class Runcmd extends Applet { 

    private static final long serialVersionUID = 1L; 

    public void init() { 
     // It seems that even though this command is not executed when the 
     // applet is run via JS we still need to refer to the exec command here, 
     // I presume so it is linked? If I comment these out altogether, the 
     // applet doesnt work. Either of the following will suffice. 
     // FYI. Just betraying my Java newbie status! :-) 

     //exec("notepad c:/sites/test.txt"); 
     exec("calc"); 
    } 
     // From https://stackoverflow.com/questions/1068271/signed-applet-gives-accesscontrolexception-access-denied-when-calling-from-jav 
     // Thank you !!! 
    public void exec(String command) { 

     try { 
      // launch EXE and grab stdin/stdout and stderr 
      Process process = Runtime.getRuntime().exec(getParameter("command")); 

      //  OutputStream stdin = process.getOutputStream(); 
      InputStream stderr = process.getErrorStream(); 
      InputStream stdout = process.getInputStream(); 

      // clean up if any output in stdout 
      String line = ""; 
      BufferedReader brCleanUp = new BufferedReader(new InputStreamReader(stdout)); 
      while ((line = brCleanUp.readLine()) != null) { 
       //System.out.println ("[Stdout] " + line); 
      } 
      brCleanUp.close(); 

      // clean up if any output in stderr 
      brCleanUp = new BufferedReader(new InputStreamReader(stderr)); 
      while ((line = brCleanUp.readLine()) != null) { 
       //System.out.println ("[Stderr] " + line); 
      } 
      brCleanUp.close(); 

     } catch (Exception exception) { 
      exception.printStackTrace(); 
     } 

    } 

} 

класса для выполнения программ, связанных с файлами:

package systemcmd; 


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

public class Launchapp extends Applet { 

    private static final long serialVersionUID = 1L; 

    public void init() { 
     // It seems that even though this command is not executed when the 
     // applet is run via JS we still need to refer to the exec command here, 
     // I presume so it is linked? If I comment these out altogether, the 
     // applet doesnt work. Either of the following will suffice. 
     // FYI. Just betraying my Java newbie status! :-) 

     //launch("notepad c:/sites/test.txt"); 
     launch("calc"); 
    } 
     // From https://stackoverflow.com/questions/1068271/signed-applet-gives-accesscontrolexception-access-denied-when-calling-from-jav 
     // Thank you !!! 
    public void launch(String command) { 

     try { 

      Desktop.getDesktop().open(new File(getParameter("command"))); 

     } catch (Exception exception) { 
      exception.printStackTrace(); 
     } 

    } 

} 

Использование Eclipse, я экспортировал эти два класса в один файл JAR называется runcombo.jar, расположенный в той же папке, что и следующий HTML-файл. Затем я сам подписал банку, которая также необходима для проблем безопасности. Я нашел этот учебник полезным в этом процессе. http://www.jade-cheng.com/uh/ta/signed-applet-tutorial/.

HTML, и тестовая страница JavaScript:

<html> 
    <head> 
<script type="text/javascript"> 

    function exec(command) {                         
      var applet = "<object type='application/x-java-applet' height='100' width='100' name='jsApplet'><param name='code' value='systemcmd.Runcmd'/><param name='archive' value='runcombo.jar' /><param name='mayscript' value='true'/><param name='command' value='" + command + "'/>Applet failed to run. No Java plug-in was found.</object>"; 

      var body = document.getElementsByTagName("body")[0]; 
      var div = document.createElement("div"); 
      div.innerHTML = applet; 
      body.appendChild(div); 
    } 

    function launch(command) {                          
      var applet = "<object type='application/x-java-applet' height='100' width='100' name='jsApplet'><param name='code' value='systemcmd.Launchapp'/><param name='archive' value='runcombo.jar' /><param name='mayscript' value='true'/><param name='command' value='" + command + "'/>Applet failed to run. No Java plug-in was found.</object>"; 

      var body = document.getElementsByTagName("body")[0]; 
      var div = document.createElement("div"); 
      div.innerHTML = applet; 
      body.appendChild(div); 
    } 
</script> 

    </head> 
    <body> 
      <a href="#" onclick="exec('notepad c:/sites/test.txt');">Exec Notepad</a> 
     <br> <a href="#" onclick="exec('calc');">Exec Calculator</a> 
     <br> <a href="#" onclick="exec('D:/Eclipse/eclipse.exe --launcher.openFile C:/sites/test.js');">Exec Eclipse with command line parms</a> 
     <br> <a href="#" onclick="launch('C:/sites/test2.txt');">Launch Notepad via *.txt association</a> 
     <br> <a href="#" onclick="launch('C:/sites/test2.js');">Launch Eclipse via *.js association</a> 
    </body> 
</html> 

Обратите внимание, что апплет будет добавлен в DOM при вызове функции JS. Это часть работы с безопасностью Java и позволяет избежать вышеупомянутых проблем безопасности, из-за которых не удалось запустить апплет. Обратите внимание также, что есть два вызова функций JS для соответствия различным классам.

Еще раз спасибо всем, кто помог мне получить эту работу. Теперь я могу вернуться к первоначальной цели - закончить мой внешний интроспектор!

Мюррей

+0

Обратите внимание, что ответы не должны быть частью вопросов. Вы можете переписать вопрос и поставить большинство остальных в ответ. –

ответ

0

вам не нужно, чтобы сделать новый экземпляр апплета каждый раз, используя MAYSCRIPT тег для апплета вы можете сказать браузеру, чтобы ява скрипт апплет связи.

Кроме того, вы должны очистить метод инициализации

<head> 
    <script type="text/javascript"> 
    //whatToDo can be from an input box 
    //in applet check if its del or rmdir or move or delete at a minimum 
     function callJavaCmd (whatToDo) { 
       // call the MessageBox method of the applet 
      var applet = document.getElementById ("myApplet"); 
      applet.command (whatToDo); 
     } 

    </script> 
</head> 
<body> 
    <applet id="myApplet" code="Your.class" codebase="/base/" 
      mayscript="mayscript" style="width:300px; height:50px;"> 
    </applet> 

Ref http://help.dottoro.com/lhbkaqko.php и http://docs.oracle.com/javase/6/docs/technotes/guides/plugin/developer_guide/java_js.html Старые классы Netscape часть каждой виртуальной машины Java (netscape.javascript.)