java与js通信

直接放代码:

Test.java:

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;

import javax.script.Bindings;
import javax.script.Invocable;
import javax.script.ScriptContext;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import javax.swing.JFrame;

import sun.org.mozilla.javascript.internal.Context;
import sun.org.mozilla.javascript.internal.Scriptable;

public class Test
{
    @org.junit.Test
    public void test1()
    {
        Context cx = Context.enter();
        try
        {
            Scriptable scope = cx.initStandardObjects();
            String str = "3/(1+2)";
            Object result = cx.evaluateString(scope, str, null, 1, null);
            System.out.println(str + "=" + Context.toNumber(result));

        }
        finally
        {
            Context.exit();

        }

    }

    @org.junit.Test
    public void test2()
    {
        ScriptEngineManager factory = new ScriptEngineManager();
        // create a JavaScript engine
        ScriptEngine engine = factory.getEngineByName("JavaScript");
        engine.put("a", 4);
        engine.put("b", 6);
        try
        {
            Object maxNum = engine.eval("function max_num(a,b){return (a>b)?a:b;}max_num(a,b);");
            System.out.println("max_num:" + maxNum);
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }

    }

    @org.junit.Test
    public void test3() throws FileNotFoundException, ScriptException, NoSuchMethodException
    {
        // 根据js的后缀名生成一个解析JS的脚本解析引擎

        ScriptEngine engin = new ScriptEngineManager().getEngineByExtension("js");
        // 查询一下这个引擎是否实现了下面很实用的接口

        System.out.println(engin instanceof Invocable);
        // 声明两个对象,传入到JS里面去

        JFrame jf = new JFrame("test");
        List list = new ArrayList();
        // 得到挷定的键值对象,把当前的两个JAVA对象放进去

        Bindings bind = engin.createBindings();
        bind.put("jf", jf);
        bind.put("list", list);
        // 把挷下的键值对象放进去,作用域是当前引擎的范围

        engin.setBindings(bind, ScriptContext.ENGINE_SCOPE);
        // 用引擎执行一段写在JS文件里面的代码

        Object obj = engin.eval(new FileReader("D:\\Javascript\\src\\test.js"));
        // 这个时候返回值当然 是null了

        System.out.println(obj);
        // 把当前的引擎强制转为Invocable,这样就可以调用定义在JS文件里面的一个一个函数了

        Invocable in = (Invocable) engin;
        // 得到了从JS里面返回来的对象

        List l = (List) in.invokeFunction("getNames");
        System.out.println(l);
        // 调用一下定义在JS里面的另一个函数

        in.invokeFunction("testJS");
        // 最后调用一个函数,该函数可以使我们前面定义的窗体显示出来

        in.invokeFunction("doSth");

    }

}

 

test.js文件:

 

function doSth()  
{  
    jf.setSize(500,300);  
    jf.setVisible(true);  
    jf.setDefaultCloseOperation(jf.EXIT_ON_CLOSE);    
}    
function getNames()  
{     
    list.add("doSth");  
    list.add("getNames"); 
  
    return list;  
}    
function testJS()  
{  
    print('Hello world!');  
}  



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值