JDK1.6 新增java脚本支持,为各种动态语言编写的程序,提供了一种统一的方式,你可以在运行java代码的时候调用脚本。Java SE6中实现了JSR223。这是一个脚本框架,提供了让脚本语言来访问Java内部的方法。你可以在运行的时候找到脚本引擎,然后调用这个引擎去执行脚 本。这个脚本API允许你为脚本语言提供Java支持。另外,Web Scripting Framework允许脚本代码在任何的Servlet容器(例如Tomcat)中生成Web内容。
关于java脚本的API,在这里我就不多介绍了。下面请看一下java代码:
package scripting;
import java.io.InputStream;
import java.io.InputStreamReader;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
public class ScriptEngineManagerTest {
/**
* @param args
*/
public static void main(String[] args) {
ScriptEngineManager manager = new ScriptEngineManager();
//ScriptEngine 来运行脚本文件
ScriptEngine engine = manager.getEngineByName("javascript ");
try {
InputStream is = ScriptEngineManagerTest.class .getResourceAsStream("ScriptEngine.js");
//engine put 与setjavax.script.Bindings检索与保存关键字
engine.put(ScriptEngine.NAME, "ScriptEngine.js");
//执行脚本
engine.eval(new InputStreamReader(is));
//运行脚本里面的方法InvocableScriptEngines 实现的可选接口,该 ScriptEngines 的方法允许在以前执行过的脚本中调用程序
((Invocable) engine).invokeMethod(engine.get("obj"), "show", "xukeping");
} catch (Exception e) {
e.printStackTrace();
}
}
}
执行结果如下:
hello word....
你的姓名kpxu
hello word....xukeping
如果运行出现错误:
java.lang.NullPointerException
at java.io.Reader.<init>(Reader.java:61)
at java.io.InputStreamReader.<init>(InputStreamReader.java:55)
则 InputStream is = ScriptEngineManagerTest.class .getResourceAsStream("ScriptEngine.js");
程序读取ScriptEngine.js文件出现错误,必须要有ScriptEngine.js文件
测试javascript代码如下:
//定义空间,模拟于java包的概念'
var space = {};
var out = java.lang.System.out;
space.person = {
"name" : "kpxu",
"show" : function(name) {
out.println("hello word...." + name);
}
}
var obj = space.person;
obj.show("");
out.println("你的姓名"+space.person.name);
不过在运行当中还是觉得scripting有点小bug,下面将我们将java代码修改成
public static void main(String[] args) {
ScriptEngineManager manager = new ScriptEngineManager();
//ScriptEngine 来运行脚本文件
ScriptEngine engine = manager.getEngineByName("javascript ");
try {
InputStream is = ScriptEngineManagerTest.class .getResourceAsStream("ScriptEngine.js");
//engine put 与setjavax.script.Bindings检索与保存关键字
engine.put(ScriptEngine.NAME, "ScriptEngine.js ");
//执行脚本返回的值
engine.eval(new InputStreamReader(is));
//运行脚本里面的方法
((Invocable) engine).invokeMethod (engine.get("space.person"), "show","xukeping");
} catch (Exception e) {
e.printStackTrace();
}
}
将会出现如下异常:
java.lang.IllegalArgumentException: script object can not be null
at com.sun.script.javascript.RhinoScriptEngine.invokeMethod(RhinoScriptEngine.java:148)
at scripting.ScriptEngineManagerTest.main(ScriptEngineManagerTest.java:26);
jdk1.6不支持javascript空间命名方式,只能以var obj = space.person;获取空间里面的对象,才能调用obj对象里面的函数.对使用javascript面向对象访问支持不是很好