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

  

原文地址:https://www.cnblogs.com/Scorpicat/p/12153009.html

时间: 2024-11-08 08:55:35

80 脚本引擎——js脚本引擎的相关文章

Unity中CS脚本于JS脚本交互

这里需要注意的是被调用的脚本必须放在 "Standard Assets". "Pro Standard Assets" 和"Plugins" 这三个文件夹中的任何一个里,而调用它的脚本不能在一个目录文件夹中,否则无法编译通过,原因是Unity会最先编译这三个文件夹,"Editor"目录里的脚本稍后编译,其他的脚本最后编译(既 CS调用JS,CS脚本放在其他文件家中,JS脚本要放在 如上三个文件夹中先编译:JS调用CS,JS脚本

9.12上午 JS脚本语言

JS脚本语言 JS脚本语言全称JavaScript,是网页里面使用的脚本语言,也是一门非常强大的语言. 一.基础语法 1.注释语法 单行注释:// 多行注释:/**/ 2.输出语法 ①alert(信息);效果是弹出信息 ②confirm(信息);效果是弹出一个和用户交互的对话框 ③prompt(信息):效果是弹出一个可以让用户输入的对话框 3.嵌入JS代码 嵌入JS代码时,要尽量靠下写,嵌入代码为<script type="text/javascript"></scr

Atitit.使用引擎加脚本架构的设计&#160;使用php,js来开发桌面程序。。

Atitit.使用引擎加脚本架构的设计 使用php,js来开发桌面程序.. 1. 引擎加脚本架构 跨平台,桌面与web的优势1 2. 架构桌面引擎(java,c#)2 3. php桌面引擎要点2 3.1. 运行环境:同时支持cs桌面与web方式2 3.2. 界面使用html5+css+js实现2 3.3. Cli接口互操作,与web接口互操作2 3.4. 其他----------流程2 3.4.1. Html5界面确定要是有的后台引擎$parser=php c# java js2 3.4.2. 

js模版引擎handlebars.js实用教程

一.为什么选择Handlebars.js 据小菜了解,对于java开发,涉及到页面展示时,比较主流的有两种解决方案: 1. struts2+vo+el表达式. 这种方式,重点不在于struts2,而是vo和el表达式,其基本思想是:根据页面需要的信息,构造出一个实体,这个实体中包含了界面需要的所有属性,通常这个实体是由N个表中的字段构成的,俗称vo.由于vo的属性可以是String.List.Map等等等,又可以vo套vo,因此这种方式非常灵活,也非常好用. 在后台对vo进行赋值,通过strut

为什么要使用JS模板引擎

我之前在写一个输入联想控件的时候,改过好几个版本,每个版本不是因为性能不好就是因为代码凌乱而被推翻,最后用了understore模板引擎,效果有明显改善.整好这两天在研究互联网技术架构,发现很多的开发框架前端都是使用js模板引擎,感悟真的是大道至简,殊途同归啊,哈哈. 关于为什么使用js模板引擎,在博客园发现园友的一片文章<js模版引擎handlebars.js实用教程——为什么选择Handlebars.js>,该文已经做了详细解答.下面内容转自该文: 据小菜了解,对于java开发,涉及到页面

使用javax.script包实现Java设置JS脚本中的变量

下面例子中,我们通过javax.script包ScriptEngine.put()方法设置JS脚本中的变量,JS把所有在线用户输出. package ajava.code.javase; import javax.script.ScriptEngineManager; import javax.script.ScriptEngine; import javax.script.ScriptException; import java.util.Date; public class AjavaAcc

(转)优化js脚本设计,防止浏览器假死

在Web开发的时候经常会遇到浏览器不响应事件进入假死状态,甚至弹出“脚本运行时间过长“的提示框,如果出现这种情况说明你的脚本已经失控了,必须进行优化. 为什么会出现这种情况呢,我们先来看一下浏览器的内核处理方式: 浏览器的内核是多线程的,它们在内核制控下相互配合以保持同步,一个浏览器至少实现三个常驻线程:javascript引擎线程,GUI渲染线程,浏览器事件触发线程. JavaScript引擎是基于事件驱动单线程执行的,JS引擎一直等待着任务队列中任务的到来然后加以处理,浏览器无论再什么时候都

优化js脚本设计,防止浏览器假死

在Web开发的时候经常会遇到浏览器不响应事件进入假死状态,甚至弹出"脚本运行时间过长"的提示框,如果出现这种情况说明你的脚本已经失控了,必须进行优化. 为什么会出现这种情况呢,我们先来看一下浏览器的内核处理方式: 浏览器的内核是多线程的,它们在内核制控下相互配合以保持同步,一个浏览器至少实现三个常驻线程:javascript引擎线程,GUI渲染线程,浏览器事件触发线程. JavaScript引擎是基于事件驱动单线程执行的,JS引擎一直等待着任务队列中任务的到来然后加以处理,浏览器无论再

js脚本语言

js脚本语言,全称javascript,网页里面使用的脚本语言,非常强大的语言,其中注释语法单行注释//,多行注释/*注释内容*/,输出语法alert(信息)起到弹出信息的作用,confirm弹出一个和用户交互的对话框,prompt弹出一个可以让用户输入的对话框,嵌入js代码的时候尽量靠下写,<script type="text/javascript"></script>,程序基本只是,所有的字符全部是英文半角的,大部分情况下每条语句结束之后要加分号.每块代码结