java_215_脚本引擎执行javascript代码_Rhino引擎_练习

package java_215_脚本引擎执行javascript代码_Rhino引擎_练习;

import java.io.FileReader;
import java.net.URL;
import java.util.List;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
/**

  • 脚本引擎执行javascript代码:
  • 1.脚本引擎介绍:
  •  1)使得java应用程序可以通过一套固定的接口与各种脚本引擎交互,从而达到java平台上调用各种脚本语言的目的
    
  •  2)java脚本API是连通java平台与脚本语言的桥梁
    
  •  3)可以把一些复杂异变的业务逻辑交给脚本语言处理,大大提高开发效率
    
  • 2.获取脚本引擎对象
  • 3.java脚本API为开发者提供了如下功能:
  •  1)获取脚本程序输入通过脚本引擎运行脚本并返回运行结果,这是最核心的接口
    
  •  	注意是:接口. java可以使用各种不同的实现,从而通用的调用js,groovy,Python等脚本
    
  •  	js使用了:Rhino
    
  •  	Rhino是一种使用java语言编写的javaScript的开源实现,原先由Mozilla开发,现在被集成进入JDK
    
  •  2)通过脚本引擎的运行上下文在脚本和java平台间交换数据
    
  •  3)通过java应用程序调用脚本函数
    

*/
public class Demo01 {
public static void main(String[] args) throws Exception {
//获得脚本引擎对象
ScriptEngineManager sem = new ScriptEngineManager();//ScriptEng ineManager脚本引擎管理器
//getEngineByName按名称获取引擎;传入javascript(脚本语言名字)或者传入js(缩写)
ScriptEngine engine = sem.getEngineByName(“javascript”);//ScriptEngine脚本引擎;

	//写入代码;定义变量 ,键值段;这个存储到引擎上下文中 ,js和java都可以读取到
	
	engine.put("msg", "wangwei is a good man!");//msg是自己定义的一个变量
	//也可以通过js定义一个代码
	String str = "var user = {name:'wangwei  ',age:20,schools:['北京大学','南京大学']};";
	//打印
	str +="print(user.name);";//只能通过控制台打印
	
	//执行这个js脚本
	engine.eval(str);//传入字符串;抛出异常
	//在脚本中修改  定义的变量
	engine.eval("msg = '北京大学  is a good school';");
	//在java中获取
	System.out.println(engine.get("msg"));
	System.out.println("==================");
	
	//定义函数
	engine.eval("function add(a,b){var sum = a+b;return sum;}");
	//执行js函数;Invocable可调用接口 ;
	Invocable jsInvoke = (Invocable) engine;
	//执行脚本中定义的方法;传进参数
	Object result = jsInvoke.invokeFunction("add", new Object[]{20,25});
	//获取值
	System.out.println(result);
	
	//导入其他的java包,使用其他包中的java类;把一个数组转化为list
	//String jsCode = "importPackage(java.util);var list = Arrays.asList([\" 北京大学\",\"清华大学\",\"南京大学\"])";
	
	//注意jdk1.6的使用方法规则 ,到1.8已经不适用了;改成如下方法 ;否则会报错
	
	String jsCode = "var list = java.util.Arrays.asList([\"北京大学\",\"清华大学\",\"南京大学\"])";
	//执行
	engine.eval(jsCode);
	//通过调用Arrays.asList方法把数据转换为js变量; 然后转换为java变量
	//获取
	List<String> list2 = (List<String>) engine.get("list");//转化为java的List对象;因为是Object需转型;并且为了方便加了泛型
	//遍历
	for(String temp : list2){
		System.out.println(temp);
	}
	
	//执行一个js文件(注意:将a.javascript至于项目的src下即可)
	//获取;getClassLoader得到类的加载器;getResource获取资源
	URL url = Demo01.class.getClassLoader().getResource("a.javascript");//它会在默认的类下找a.javascript;返回一个URL,导入包import java.net.URL;
	//需要一个FileReader文件阅读器
	FileReader fr = new FileReader(url.getPath());//获取绝对路径
	engine.eval(fr);
	fr.close();//用于测试 ;实际应用要使用try catch finally
	
	//注意 :工程不能用中文名字  否则报错
} 

}
//------------------------------------------------
/如果在电脑某一个地方或网络某一个地方有一个js(javascript)文件;如何执行这个文件
//定义test方法
function test(){
var a = 5;
var b = 6;
//执行这个文件
print(“invoke js file:”+(a+b));//注意 :不能写println

}
//执行这个方法
test();

//结果-------------------------------------------
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值