jdk1.6中对scripting的支持

来源:互联网 发布:tcl通讯宁波知乎 编辑:程序博客网 时间:2024/05/17 22:45

jdk1.6中对scripting的支持

JDK1.6新增java脚本支持,为各种动态语言编写的程序,提供了一种统一的方式,你可以在运行java代码的时候调用脚本。JavaSE6中实现了JSR223。这是一个脚本框架,提供了让脚本语言来访问Java内部的方法。你可以在运行的时候找到脚本引擎,然后调用这个引擎去执行脚本。这个脚本API允许你为脚本语言提供Java支持。另外,Web ScriptingFramework允许脚本代码在任何的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面向对象访问支持不是很好

原创粉丝点击