Это продолжение моего первоначального поста здесь: 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 для соответствия различным классам.
Еще раз спасибо всем, кто помог мне получить эту работу. Теперь я могу вернуться к первоначальной цели - закончить мой внешний интроспектор!
Мюррей
Обратите внимание, что ответы не должны быть частью вопросов. Вы можете переписать вопрос и поставить большинство остальных в ответ. –