09
2013
08

Java中使用js脚本

JAVA其实早在JDK1.6中就集成了JSR223包括JavaScript、Python等脚本功能。当我们遇到需要支持插件等拓展功能的项目时,比起反射,脚本更加简单易用。下面以JavaScript为例,简单介绍一下脚本在Java中的用法。

初始化脚本引擎:

ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine jsEngine = manager.getEngineByName("javascript");

 

定义一段简单的js脚本并绑定到脚本引擎中,在Java中传递参数执行脚本的方法,并获得返回值:

try{
    String script = "function getStr(name) { return 'Hello ' + name;}";   
    jsEngine .eval(script);   

    Invocable inv = (Invocable) engine;

    System.out.println((String) inv.invokeFunction("getStr", "LeeStorm"));  
}catch(Exception e)
{
    e.printStackTrace();
}

 

js中也是可以直接操作java对象的,比如我们新建一个Jrame传递给js来设置属性:

Invocable in = (Invocable) jsEngine;
JFrame frame=new JFrame(); 
in.invokeFunction("setFrame",frame);

js代码:

function setFrame(f) {
    f.setSize(400, 300);
    f.setTitle("hello js!");
    f.setVisible(true);
}

运行效果:

1.png

 

还可以给脚本引擎绑定全局的java对象。举个例子,比如我们要委托js做一些界面绘制,但是有些方法在js中封装比较麻烦,我们可以在java中封装一个类似类库的对象:

public class ScriptLib
{
    private static ScriptLib instance = new ScriptLib();
    private ScriptLib()
    {
    }
    public static ScriptLib getInstance()
    {
        return instance;
    }

    public Image loadImage(String filePath){…}
    public void setTextSize(GraphicsContext gc, int size){…}

    public void setDrawColor(GraphicsContext gc, int a, int r, int g, int b){…}

    public void drawImage(GraphicsContext gc, Image img, int x, int y){…}
}

将类库对象绑定到js中作为全局变量:

Bindings bd = jsEngine.createBindings();

bd.put("ScriptLib", ScriptLib.getInstance());
jsEngine.setBindings(bd, ScriptContext.ENGINE_SCOPE);

这样一来,在js中就可以方便地使用啦:

function paint(graphicsContext) {
var img = ScriptLib.loadImage(imgPath);
ScriptLib.drawImage(graphicsContext, img, 0, 0);
}
« 上一篇下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。