我对Java很陌生。我想创建一个 Java Applet,它允许我的 JavaScript 将命令行传递给 Java Applet。这只会在我的开发机器上运行 - 无需提醒我这是一个安全问题。用例是我的 ExtJS 应用程序有一个内省器,它允许我显示类。我希望能够单击一个类,将相关路径名传递给 Applet 并在 Eclipse 中打开该文件进行编辑。
我正在使用 Win7x64,jre 1.7
因此,要让 Eclipse 从命令行打开文件,命令是:
D:\Eclipse\eclipse.exe --launcher.openFile C:\mytestfile.js
这行得通。
我已经编写了 Applet,对其进行了自签名并使用下面显示的代码测试了 say() 方法。这样可行。但是,当我运行 executecmd() 方法时,我没有得到任何输出。如果我注释掉整个 try/catch 块,以便我只是返回传入的 cmd 字符串,则该方法有效。因此,我怀疑我的 try catch 设置不正确,并且由于我的 Java 技能和异常知识是原始的,我迷失了方向。
任何人都可以帮助我吗?至少要返回一些输出,如果不是如何实际运行传入的命令行?
而且,我正在传递整个命令行,因为当我有这个工作时,我想分享它(因为 Ext introspector 非常有用)。其他开发人员将使用不同的编辑器,因此他们可以通过传递特定的命令行来使用它。
谢谢!默里
我的 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;
}
}