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();
//结果-------------------------------------------