前些天写代码遇到了调用脚本的问题,今天总结总结吧!java从jdk1.6开始支持调用脚本,它的底层实现是Mozilla Rhino,这是一个完全使用java语言编写的开源javascript引擎实现 。
好了,废话不多说了,直接上步骤和代码。
1、获得一个ScriptEngineManager
ScriptEngineManager mgr = new ScriptEngineManager();
2、生成一个ScriptEngine脚本引擎,有三种方法可以获得
a)ScriptEngine engine = mgr.getEngineByExtension(String extension);
其中Extension只可取js,代表JavaScript
b)mgr.getEngineByMineType(String mine)
其中mine可取值有 1>application/javascript 2>application/ecmascript
3>test/javascript 4>test/ecmascript
c)mgr.getEngineByName(String Name)
其中Name可取值有 1>js 2>rhino
3>javascript 4>JavaScript
5>ECMAScript(JavaScript是ECMA-262标准的实现和扩展)
6>ecmascript
实际上可以通过以下代码找出当前环境支持的脚本引擎
package ex.jstest;
import java.util.List;
import javax.script.ScriptEngineFactory;
import javax.script.ScriptEngineManager;
public class ParamType {
public static void main(String[] args) {
// TODO Auto-generated method stub
ScriptEngineManager mgr = new ScriptEngineManager();
List<ScriptEngineFactory> factories = mgr.getEngineFactories();
for (ScriptEngineFactory f : factories) {
System.out.println(
"egine name:"+f.getEngineName() + "\n" +
"engine version:"+f.getEngineVersion()+ "\n" +
"language name:"+f.getLanguageName()+ "\n" +
"language version:"+f.getLanguageVersion()+ "\n" +
"names:"+f.getNames()+ "\n" +
"mime:"+f.getMimeTypes()+ "\n" +
"extension:"+f.getExtensions());
}
}
}
输出如下:
3、调用eval()方法执行脚本
package ex.jstest;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
public class ExecJs {
public static void main(String[] args) {
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine engine = mgr.getEngineByName("js");
String js = "function hello(){return 'Hello World';} hello()";
try {
// Object value = engine.eval("function hello(){return 'Hello World';} hello()");
Object value = engine.eval(js);
System.out.println(value);
} catch (Exception e) {
e.printStackTrace();
}
}
}
I)当然在我们调用函数的时候还要传递一些参数此时可以这样做
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine engine = mgr.getEngineByName("js");
engine.put("name", "Mr Lee");
try {
Object value = engine.eval("function hello(p){return 'Hello world,' + p;} hello(name);" );
System.out.println(value);
} catch (Exception e) {
e.printStackTrace();
}
输出:Hello World,Mr Lee
II)如果想要更灵活的调用脚本,我们可以用到Invocable接口。例子如下:
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine engine = mgr.getEngineByName("JavaScript");
try {
String js = "function test(p){return 'this is a test!' + p}"; 、
engine.eval(js);
} catch (ScriptException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Invocable inv = (Invocable) engine;
try {
//可以多次的调用,动态的设置参数(这里执行了两次)
String value1 = (String) inv.invokeFunction("test", "Mr Lee");
System.out.println(value1);
String value2 = (String) inv.invokeFunction("test", "Mr Wong");
System.out.println(value2);
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ScriptException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
有人可能要问了,能不能调用外部的js脚本呢?答案是肯定的
往这里看(文档原文)
eval()是接受Reader类型的参数的,看代码
package ex.jstest;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStreamReader;
import java.io.Reader;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
/**
*
* @author Eswin
*
*读取文件中的js脚本
*/
public class JsTest3 {
public static void main(String[] args) throws FileNotFoundException {
// TODO Auto-generated method stub
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine engine = mgr.getEngineByName("JavaScript");
File f = new File("F:/test.js");
Reader r = new InputStreamReader(new FileInputStream(f));
try {
engine.eval(r);
} catch (ScriptException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Invocable inv = (Invocable) engine;
try {
String value = (String) inv.invokeFunction("test", "Mr Lee");
System.out.print(value);
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ScriptException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
这是js代码
好吧,暂时到这里,学到更多后续内容我会慢慢补充!加油!↖(^ω^)↗