Abd*_*dad 5 javascript java web
这可能不实用,但我把它作为一项任务.我在java中打开了一个ServerSocket.现在我想读取一个包含html和javascript的文件,并将javascript结果输出到浏览器.所以这样,我会评估服务器端的javascript.所以我想要评估内部的内容.
我试过这个测试,它有效,但它有一些问题,例如它将消息打印到System.out.和engine.eval("print('Welocme to java worldddd')"); 不返回一个String,以便我可以将它输出到套接字的输出流:
import javax.script.*;
// create a script engine manager
ScriptEngineManager factory = new ScriptEngineManager();
// create a JavaScript engine
ScriptEngine engine = factory.getEngineByName("JavaScript");
try {
// evaluate JavaScript code from String
engine.eval("print('Welocme to java worldddd')");
//engine.eval("a");
} catch (ScriptException ex) {
Logger.getLogger(doComms.class.getName()).log(Level.SEVERE, null, ex);
}
Run Code Online (Sandbox Code Playgroud)
Jes*_*per 10
您可以通过在以下位置设置编写器来获取脚本的输出(print()在JavaScript中打印的内容)ScriptContext:
ScriptEngine engine = new ScriptEngineManager().getEngineByName("javascript");
ScriptContext context = engine.getContext();
StringWriter writer = new StringWriter();
context.setWriter(writer);
engine.eval("print('Welocme to java worldddd')");
String output = writer.toString();
System.out.println("Script output: " + output);
Run Code Online (Sandbox Code Playgroud)
我在过去通过在里面创建一个javascript函数eval()并调用它来获得结果来解决这个问题:
import javax.script.*;
// create a script engine manager
ScriptEngineManager factory = new ScriptEngineManager();
// create a JavaScript engine
ScriptEngine engine = factory.getEngineByName("JavaScript");
try {
// evaluate JavaScript code from String
engine.eval("function sum(a,b){ return a + b;}");
System.out.println(((Invocable) engine).invokeFunction("sum", new Object[]{10,20}));
} catch (ScriptException ex) {
Logger.getLogger(doComms.class.getName()).log(Level.SEVERE, null, ex);
}
Run Code Online (Sandbox Code Playgroud)
请注意,invokeFunction(第一个参数)中的函数名称应与先前声明的函数名称匹配.
请记住,这可能很危险.你对javascript代码的来源有绝对的控制吗?否则,简单while(true){}的服务器可能会非常灾难性.