• 80 脚本引擎——js脚本引擎


    脚本引擎管理工具

    java提供了一个脚本引擎管理工具,从这个工具可以获得各种脚本语言的脚本引擎,如js、python等。我们可以通过脚本引擎,来调用已经写好的脚本文件。相当的方便。

    我们可以使用:new ScriptEngineManager()获取一个脚本引擎管理工具对象。

    然后,可以通过getEngineByName(scriptName)的方式得到我们想要的脚本引擎。

    //获取脚本引擎管理器
    ScriptEngineManager sem = new ScriptEngineManager();
    //获取js脚本引擎
    ScriptEngine engine = sem.getEngineByName("js");
    

     

    JS脚本引擎

    js脚本引擎可以存储由java程序传入的js数据。如java程序通过put方法传入一个js属性,我们就可以用get方法得到这个属性。同时js脚本引擎也可以直接执行java程序传入的js代码。更为常用的是,js脚本引擎可以以Reader流的方式读取一个js文件,并运行它。下面我们来看看它的常见用法。

    put方法

    put(key,value)方法可以向js脚本引擎中添加js属性。

    engine.put("name", "lily");
    

      

    get方法

    Object get(key)方法可以读取存储在引擎中的js属性。

    System.out.println(engine.get("name"));
    //运行结果
    lily
    

      

    eval方法

    eval添加进的无论是String类型的js代码还是以Reader传入js文件,都会执行并存储在js脚本引擎中。

    eval(String script)

    以java字符串的方式传入js脚本引擎中并执行。

    String aFunction = "function ff(){print('what hell?due?');}ff();";
    engine.eval(aFunction);
    //运行结果
    what hell?due?
    

      

    eval(Reader)

    以Reader流的方式传入一个js文件到js脚本引擎并执行

    //直接执行现有的js文件
    	//将加载得到的URL对象获取字符输入流
    FileReader fr = new FileReader("c:/newFolder/a.js");
    	//通过engine.eval(Reader)执行js文件
    engine.eval(fr);
    	//关闭流
    fr.close();
    

      

    将js引擎作为一个java接口使用

    我们可以将脚本引擎转为一个java的接口来调用保存在其中的js函数。

    注意:当向js函数中传递传输时,传递的是Object对象。它是多值传参,可以使用Object数组的方式进行多值传参(将参数写在一个Object数组中,在单独传入这个数组),也可以直接传递多个Object对象。

    //将引擎作为借口调用引擎中存储的js代码中的函数
    			//先添加一个函数
    		engine.eval("function returnWhatYouInput(a){return a;}");
    			//将engine转为Invocable的引用
    		Invocable jsInvoke = (Invocable)engine;
    		Object result = jsInvoke.invokeFunction("returnWhatYouInput", new Object[]{"sick"});//多值传参Object类型,如只传一个可以这样写,也可以传已经创建好的Object引用
    		System.out.println(result);
    

      

    js引擎中引入Java工具的方法

    //js脚本中引入java包的方法
    engine.eval("var list = java.util.Arrays.asList("你","我")");//就是这一行,示例为传入java.util.Arrays工具
    List<String> list = (List<String>) engine.get("list");
    for(String s : list){
    	System.out.println(s);
    }
    

      

    完整代码

    package _20200105_ScriptEngine;
    
    import java.io.FileReader;
    import java.util.List;
    
    import javax.script.Invocable;
    import javax.script.ScriptEngine;
    import javax.script.ScriptEngineManager;
    
    public class Demo02 {
    	public static void main(String[] args) throws Exception{
    		//获取脚本引擎管理器
    		ScriptEngineManager sem = new ScriptEngineManager();
    		//获取js脚本引擎
    		ScriptEngine engine = sem.getEngineByName("js");
    		//向引擎中添加js代码
    		engine.put("name", "lily");
    		//直接执行java字符串类型的js代码
    		String aFunction = "function ff(){print('what hell?due?');}ff();";
    		engine.eval(aFunction);
    		//读取引擎中存储的js代码中的属性
    		System.out.println(engine.get("name"));
    		//将引擎作为借口调用引擎中存储的js代码中的函数
    			//先写一个函数
    		engine.eval("function returnWhatYouInput(a){return a;}");
    			//将engine转为Invocable的引用
    		Invocable jsInvoke = (Invocable)engine;
    		Object result = jsInvoke.invokeFunction("returnWhatYouInput", new Object[]{"sick"});//多值传参Object类型,如只传一个可以这样写,也可以传已经创建好的Object引用
    		System.out.println(result);
    		//js脚本中引入java包的方法
    		engine.eval("var list = java.util.Arrays.asList("你","我")");
    		List<String> list = (List<String>) engine.get("list");
    		for(String s : list){
    			System.out.println(s);
    		}
    		//直接执行现有的js文件
    			//将加载得到的URL对象获取字符输入流
    		FileReader fr = new FileReader("c:/newFolder/a.js");
    			//通过engine.eval(Reader)执行js文件
    		engine.eval(fr);
    			//关闭流
    		fr.close();
    	}
    }
    

      

    运行结果

    其中1120是js文件中的一个属性。

    what hell?due?
    lily
    sick
    你
    我
    invoke js file:7
    1120
    

      

  • 相关阅读:
    Java合并png图片
    MiniUi遇到的一个Bug或者说坑,以div里面的内容自适应高度
    Javascript/JQuery遇到的bug
    SQL Server将列以分隔符分割后存到临时表
    Java Miniui实现批量上传文件demo 201906221520
    Java MiniUi datagrid加载数据时,如果使用virtualScroll="true",数据多一点可能就会加载不出来
    Java调用存储过程出现Bug,sql语法错误
    Java的jdbc调用SQL Server存储过程Bug201906131120
    Java的jdbc调用SQL Server存储过程Bug201906131119
    用深度优先搜索(DFS)解决多数图论问题
  • 原文地址:https://www.cnblogs.com/Scorpicat/p/12153009.html
Copyright © 2020-2023  润新知