2013-04-24 4 views
1

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

Я использую Win7x64, JRE 1.7

Итак, чтобы получить Eclipse, чтобы открыть файл из командной строки команду:

D:\Eclipse\eclipse.exe --launcher.openFile C:\mytestfile.js

Это работает.

Я написал Апплет, сам подписал его и протестировал метод say(), используя приведенный ниже код. Это работает. Однако, когда я запускаю метод executecmd(), я не получаю никакого вывода. Если я прокомментирую весь блок try/catch, так что я просто возвращаю строку cmd, переданную, метод работает. Поэтому я подозреваю, что у меня неправильно установлена ​​настройка try catch, и поскольку мои навыки Java и знание исключений примитивны, я теряюсь.

Может ли кто-нибудь мне помочь? По крайней мере, чтобы получить возвращаемый результат, если не как выполнить прогон командной строки?

И я передаю всю командную строку, потому что, когда у меня есть эта работа, я хотел бы поделиться ею (так как интроспектор Ext действительно полезен). Другие разработчики будут использовать разные редакторы, чтобы таким образом они могли использовать его, передав свою конкретную командную строку.

Спасибо! Мюррей

Мой HTML тестовой страницы:

<html> 
<head> 
    <meta charset="UTF-8"> 
    <title>Test Run</title> 
    <script src="http://www.java.com/js/deployJava.js"></script> 
    <script> 
     var attributes = { id:'testapp', code:'systemcmd.Runcmd', archive:'runcmd.jar', width:300, height:50} ; 
     var parameters = {} ; 
     deployJava.runApplet(attributes, parameters, '1.6'); 
    </script> 
</head> 
<body> 

<p>Hello</p> 

<script type="text/javascript"> 

    //alert(testapp.say("Hello test")); // This works 

    var command = "D:\Eclipse\eclipse.exe --launcher.openFile C:\mytestfile.js"; 

    alert(testapp.executecmd(command)); // Nothing returned at all. 

</script> 

</body> 
</html> 

Мой класс:

package systemcmd; 


import java.applet.Applet; 
import java.io.IOException; 
import java.security.AccessController; 
//import java.security.PrivilegedAction; 
import java.security.PrivilegedActionException; 
import java.security.PrivilegedExceptionAction; 

public class Runcmd extends Applet { 

    private static final long serialVersionUID = -4370650602318597069L; 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 

    } 

    public String say(String arg) 
    { 
     String msg[] = {null}; 
     msg[0] = "In Say. You said: " + arg; 
     String output =""; 
     for(String str: msg) 
      output=output+str; 
     return output; 
    } 

    public String executecmd(final String cmd) throws IOException 
    {  
     final String msg[] = {null}; 
     String output =""; 
     msg[0] = "In executecmd, cmd="+cmd; 

     try { 
      try { 
      AccessController.doPrivileged(
        new PrivilegedExceptionAction() { 
        public Object run() throws IOException { //RuntimeException, 
         msg[1] = " Pre exec()"; 
         Runtime.getRuntime().exec(cmd); 
         msg[2] = " Post exec()"; 
         return null; 
        } 
        } 
       ); 
      } catch (PrivilegedActionException e) { 
       msg[3] = " Caught PrivilegedActionException:"+ e.toString(); 
       throw (IOException) e.getException(); 
      } 
     } 
     catch (Exception e) { 
      msg[4] = " Command:" + cmd + ". Exception:" + e.toString(); 
     } 
     msg[5] = " End of executecmd."; 

     for(String str: msg) 
      output=output+str; 
     return output; 
    } 

} 
+0

Я наконец получил эту работу. См [http://stackoverflow.com/questions/16313702/javascript-to-java-applet-working] [ 1] для рабочего примера [1]:... http://stackoverflow.com/questions/16313702/javascript-to-java-applet-working – Murrah

ответ

1

Установить Eclipse, как потребитель по умолчанию для .java файлов и использовать Desktop.open(File) который ..

Launches the associated application to open the file.

+0

Спасибо это другой подход, я проверю это – Murrah

0

Хорошо, @ Андрю. Некоторый прогресс, спасибо!

Я установил программу по умолчанию для файлов * .js в Eclipse, и если я дважды щелкнул файл, который открывается в Eclipse. Все хорошо.

У меня тогда был успех, выполняющий следующие действия с помощью приложения RunAs Java Application - тестового файла, открытого в Eclipse. Подходите ближе!

public class Runcmd extends Applet { 

    File file; 
    private static Desktop desktop; 
    private static final long serialVersionUID = -4370650602318597069L; 

    /** 
    * @param args 
    * @throws IOException 
    */ 
    public static void main(String[] args) throws IOException { 

     System.out.println("hello"); 

     if (Desktop.isDesktopSupported()) { 
      desktop = Desktop.getDesktop(); 
     } 

     File file = new File("C:\\sites\\test.js"); 

     // This works if I execute it from the Eclipse RunsAs Java Application. 
     // ie the file is opened in Eclipse for editing. 
     // And, if I specify a non-existant file, it correctly throws and prints the error 
     try { 

      desktop.open(file); 

     } catch (Exception ioe) { 
      ioe.printStackTrace(); 
      System.out.println("Error: " + ioe.toString()); 
     } 

    }} 

Однако, когда я добавил следующий метод и побежал через DeployJava.js (как на мой оригинальный пост выше), я получаю следующий вывод возвращается с ошибкой появляющейся ли не банка сам подписан.

Started: , Desktop is supported , Error: java.security.AccessControlException: access denied ("java.awt.AWTPermission" "showWindowWithoutWarningBanner")

public static String openfile(String arg) { 
    String output = "Started: "; 

    File file = new File("C:\\sites\\test.js"); 

    if (Desktop.isDesktopSupported()) { 
     desktop = Desktop.getDesktop(); 
     output = output + ", Desktop is supported "; 
    } 

    try { 

     desktop.open(file); 

    } catch (Exception ioe) { 
     output = output + ", Error: " + ioe.toString(); 
    } 

    return output + arg; 
} 

Итак, что же мне нужно добавить, чтобы обойти очевидную проблему безопасности? Я прочитал документы и учебники, и я собираюсь по кругу! Кажется, что существует много противоречивых советов.:-(

Еще раз спасибо, Мюррей

+0

* «Хорошо, Андрей, немного прогресса, спасибо!» * Если это ответ, вы должны принять это. Если это не так, вы должны отредактировать его в вопросе (удалить «не ответ») и уведомить меня в комментарии. –

+0

Спасибо, Андрей. Я действительно собирался это сделать и не мог понять, как добавить новый код, не делая сообщение совершенно запутанным, так как я изменил свой подход на основе вашего полезного совета. Извини за это. И ... как вы можете видеть в моем посте, это еще не ответ, так как я все еще не могу заставить его работать с DeployJava.js в соответствии с исходным сообщением. Любая дополнительная помощь, которую вы могли бы мне дать, была бы очень желанной. Благодарю. – Murrah

+0

Я думаю, вы должны [принять] (http://meta.stackexchange.com/a/65088/155831) [мой ответ] (http://stackoverflow.com/a/16182871/418556) и задать новые вопросы по 'AccessControlException'. Не забывайте, что эти вопросы и ответы должны быть полезны для людей, которые ищут позже, поэтому все они объединяют в «Как я могу исправить свой апплет»? не делает ничего хорошего. Прежде чем вы зададите этот вопрос, найдите SO на '[applet] [javascript] AccessControlException' - ответ (вероятно, я) должен быть в первых нескольких хитах. –