Java脚本语言引擎接口

来源:互联网 发布:如何自学seo 编辑:程序博客网 时间:2024/05/29 14:28

JSR 233 为 Java 设计了一套脚本语言 API。这一套 API 提供了在 Java 程序中调用各种脚本语言引擎的接口。任何实现了这一接口的脚本语言引擎都可以在 Java 程序中被调用。在 Mustang 的发行版本中包括了一个基于 Mozilla Rhino 的 JavaScript 脚本引擎。

通过jdk6以后提供的脚本引擎,java语言和脚本语言可以非常方便的交互,给我们进行 软件架构 带来新的思路。

import javax.script.*;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.Reader;import java.util.HashMap;import java.util.Map;/** * Created by wangpl on 1/16/15. */public class Test {    public static void main(String[] args) throws ScriptException, FileNotFoundException, NoSuchMethodException {        ScriptEngineManager manager = new ScriptEngineManager();        // 打印所有的脚本引擎        for (ScriptEngineFactory factory : manager.getEngineFactories()) {            System.out.println(factory.getEngineName());        }        ScriptEngine engine = manager.getEngineByName ("JavaScript");//        ScriptEngine engine = manager.getEngineByExtension ("js");//        ScriptEngine engine = manager.getEngineByMimeType ("application/javascript");        System.out.println(engine.getFactory().getEngineName());        // 直接执行脚本        engine.eval("print ('Hello World')");        // 绑定java方法,供脚本使用        HelloWorld hello = new HelloWorld();        engine.put("script_hello", hello);//绑定        engine.eval("script_hello.sayHello('Li Sir')");//在脚本中使用,也可以直接写在外部js文件中调用        // 执行脚本文件        engine.eval(new FileReader("/home/wangpl/mine/WORK_SPACE/idea_work/Eden/jse/src/main/java/HelloWorld.js"));        // 脚本函数 调用        String script = "function say(first,second) { print(first +' '+ second); }";        engine.eval(script);        Invocable inv = (Invocable) engine;        inv.invokeFunction("say", "Hello", "Tony");        //到目前为止,我们的脚本全部都是解释执行的,相比较之下编译执行将会获得更好的性能。这里将介绍 ScriptEngine 的另外一个可选接口 —— Compilable,        //实现了Compilable接口的脚本引擎支持脚本的编译执行。下面这个例子实现了一个判断给定字符串是否是 email 地址或者 ip 地址的脚本:        String myScript = "var email=/^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]"                + "+(\\.[a-zA-Z0-9_-]+)+$/;";        myScript += "var ip = /^(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])"                +"(\\.(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])){3}$/;";        myScript += "if(email.test(str)){println('it is an email')}"                + "else if(ip.test(str)){println('it is an ip address')}"                + "else{println('I don\\'t know')}";        engine.put("str", "email@address.tony");        Compilable compilable = (Compilable) engine;        CompiledScript compiled = compilable.compile(myScript);        compiled.eval();    }}

js文件内容:

print ('I am from HelloWorld.js')script_hello.sayHello('JS Sir')

其它:

Apache BSF 提供了一个脚本语言交互框架, 具有更多功能。

http://www.ibm.com/developerworks/cn/java/j-lo-mustang-script/

http://www.ibm.com/developerworks/cn/web/wa-aj-javaee/

0 0
原创粉丝点击