java调用js脚本语言
在我们开发的过程中,可能有这么一种情况,在java中需要取调用js方法完成一些事情。那么什么时候可能出现这种情况呢。比如我们使用爬虫模拟登录别的网站,但有些网站前台使用js对密码进行了加密处理,那么就需要在java中进行调用js方法,完成js密码的加密操作。
在这篇博客记录如下几种调用方式:
1、java执行js文件
2、js方法写在java代码中,然后执行
3、脚本引擎自身的作用域和全局作用域
4、在js中调用java类
实现:
1、java执行js文件
|- 执行js文件中的方法
|- 向js方法中传递参数
|- 获取到js方法执行后的返回值
1.1 js方法的定义
function showUser(name) {
// console.info("haha");
return "haha[" + name + "],我返回了值";
}
1.2 java代码
@Test
public void invokedJsFile() throws Exception {
try (InputStream is = JavaInvokeJsTest.class.getResourceAsStream("script.js")) {
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
// 拿到js脚本引擎
ScriptEngine scriptEngine = scriptEngineManager.getEngineByName("js");
InputStreamReader isr = new InputStreamReader(is);
scriptEngine.eval(isr);
if (scriptEngine instanceof Invocable) {
Invocable invocable = (Invocable) scriptEngine;
/**
* 调用showUser方法,javascript engine 作为参数传入showUser方法中
*/
String result = (String) invocable.invokeFunction("showUser", "javascript engine");
System.out.println("the result is : " + result);
}
}
}
1.3 结果
2、js方法写在java代码中
2.1 java代码
@Test
public void invokedScriptMethod() throws Exception {
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
ScriptEngine scriptEngine = scriptEngineManager.getEngineByName("js");
scriptEngine.put("userName", "张三");
String script = "function showName(flag){ if(flag){ return userName + ',你好.' ;} else { return '不满足条件';} }";
scriptEngine.eval(script);
Invocable invocable = (Invocable) scriptEngine;
String result = (String) invocable.invokeFunction("showName", true);
System.out.println(result);
}
2.2结果
3.脚本引擎自身的作用域和全局作用域
|- ScriptEngineManager的put方法设置全局作用域
|- ScriptEngine的put设置脚本自身的作用域
@Test
public void testScriptScope() throws Exception {
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
ScriptEngine scriptEngine1 = scriptEngineManager.getEngineByName("js");
// 向脚本的全局作用域中设置值
scriptEngineManager.put("globalVal", "全局");
// 此值时脚本自身的作用域
scriptEngine1.put("userName", "张三");
String script1 = "function showName(){ return '获取全局作用域globalVal的值:['+globalVal + ']: 获取自身作用域username的值:[' + userName + '].' ; }";
scriptEngine1.eval(script1);
Invocable invocable1 = (Invocable) scriptEngine1;
String result1 = (String) invocable1.invokeFunction("showName");
System.out.println(result1);
ScriptEngine scriptEngine2 = scriptEngineManager.getEngineByName("js");
scriptEngine2.put("userName", "李四");
String script2 = "function showName(){ return '获取全局作用域globalVal的值:['+globalVal + ']: 获取自身作用域username的值:[' + userName + '].' ; }";
scriptEngine2.eval(script2);
Invocable invocable2 = (Invocable) scriptEngine2;
String result2 = (String) invocable2.invokeFunction("showName");
System.out.println(result2);
System.out.println("=====================================");
System.out.println("全局作用域的值:");
System.out.println("===> gloableVal:" + scriptEngineManager.get("globalVal"));
System.out.println("脚本作用域1的值:");
System.out.println("===> userName:" + scriptEngine1.get("userName"));
System.out.println("脚本作用域2的值:");
System.out.println("===> userName:" + scriptEngine2.get("userName"));
System.out.println("=====================================");
}
结果:
4、在js中调用java类
|- 实现效果,js中将java的list集合中的元素改变,并加上一个new java.util.Date()的值
4.1 Java代码
|- String script 中写出了js中如何调用java方法。
@Test
public void testJava() throws Exception {
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
ScriptEngine scriptEngine = scriptEngineManager.getEngineByName("js");
List<String> list = new ArrayList<>(3);
list.add("张三");
list.add("李四");
list.add("wangwu");
String script = "function show(list){ for(var i=0;i<list.size();i++){ list.set(i,list.get(i)+':'+i); };list.add(new java.util.Date().toString());}";
scriptEngine.eval(script);
Invocable invocable = (Invocable) scriptEngine;
invocable.invokeFunction("show", list);
System.out.println(list);
}
4.2 结果
一般情况下,在java中调用js方法的情况少,不过了解一下也是有好处的。
java调用js脚本语言的更多相关文章
- java调用js脚本
有些情况下,需要java去调用js,groovy等脚本语言,传入参数获取脚本运行的结果. js脚本例子: function add(a,b){ return a + b + number; } jav ...
- java中调用js脚本
JDK1.6加入了对Script(JSR223)的支持.这是一个脚本框架,提供了让脚本语言来访问Java内部的方法.你可以在运行的时候找到脚本引擎,然后调用这个引擎去执行脚本.这个脚本API允许你为脚 ...
- 通过Java调用Python脚本
在进行开发的过程中,偶尔会遇到需要使用Java调用Python脚本的时候,毕竟Python在诸如爬虫,以及科学计算等方面具有天然的优势.最近在工作中遇到需要在Java程序中调用已经写好的Python程 ...
- JS脚本语言里的循环
js脚本语言: 循环:(循环操作某一个功能(执行某段代码)) 四要素: 循环初始值 循环条件 状态改变 循环体 for(穷举 迭代) while 举例:(穷举) 与7相关的数 <scr ...
- 样式其他与JS脚本语言
样式其他:display(显示block和隐藏none,不占位置) visibility(显示visible和隐藏hidden,占位置) overflow(超出范围 hidden隐藏) 透明(op ...
- Java调用Lua脚本(LuaJava使用、安装及Linux安装编译)
依赖包(附件有下载): 包名 类型 操作系统 luajava-1.1.jar jar ALL libluajava-1.1.so .so linux luajava-1.1.dll .dll wind ...
- 关于JS脚本语言的基础语法
JS脚本语言的基础语法:输出语法 alert("警告!"); confirm("确定吗?"); prompt("请输入密码");为弱 ...
- java调用python脚本并向python脚本传递参数
1.安装Eclipse 先安装jdk,再安装Eclipse,成功后开始建立py_java项目,在这个项目的存储目录SRC下建立test包,在test包中New-Class,新建MyDemo类,建好完成 ...
- Java 调用 shell 脚本详解
这一年的项目中,有大量的场景需要Java 进程调用 Linux的bash shell 脚本实现相关功能. 从之前的项目中拷贝的相关模块和网上的例子来看,有个别的“陷阱”造成调用shell 脚本在某些特 ...
随机推荐
- openswan中ISAKMP交互过程关键函数接口
1. ISAKMP交互过程中关键函数接口 下面分别说明不同的阶段和模式下的函数接口以及对应的报文. 2. 第一阶段(Phase I)主模式函数接口 发送端 响应端 main_outI1 主模式第一包 ...
- ubantu 编译安装xl2tpd笔记
1. 下载xl2tpd源码 推荐一个仍在维护的网站: https://www.xelerance.com/archives/202 也可以从其他的网站下载:例如:https://pkgs.org ...
- .net Core 基于EF Core 实现数据库上下文
在做项目时,需要将某一些功能的实体建立在另一个数据库中,连接不同的数据库用以存储记录.通过查找资料,实现EF Core上下文. 下面是实现上下文后的解决方案的目录: 1.UpAndDownDbCont ...
- java.net.NoRouteToHostException: 无法指定被请求的地址
今天压力测试时, 刚开始出现了很多异常, 都是 java.net.NoRouteToHostException: Cannot assign requested address. 经网上查资料, 是 ...
- CLion远程调试嵌入式开发板程序
CLion远程调试嵌入式开发板程序 目录 CLion远程调试嵌入式开发板程序 1. 目的 2. 前提条件 3. CLion设置 3.1 设置一个Deployment 3.2 上传需要的目录到目标板子 ...
- 谷歌浏览器chrome安装插件报"程序包无效: CRX_HEADER_INVALID"错误
今天参加需求评审,看到原来可以谷歌浏览器查看Axure原型文件,真是只有想不到,没有做不到(自己孤陋寡闻了,第一次接触Axure). 需求评审后,我百度"如何使用谷歌浏览器查看Axure原型 ...
- Ubuntu18.04 安装Tomcat 8.5
下载tomcat,登陆官网:https://tomcat.apache.org/ 点击tar.gz后,弹出这个不大懂这是什么? tomcat要求的jdk版本 解压tar包 sudo tar zxvf ...
- python之jsonpath
json 官方文档:http://docs.python.org/library/json.html JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,它使 ...
- thinkphp5.0框架运行机制分享小结
1 访问index.php 入口文件,定义应用目录,加载框架引导文件 <?php // [ 应用入口文件 ] // 定义应用目录 define('APP_PATH', __DIR__ . '/. ...
- django class类即视图类添加装饰器的几种方法
根据别人发布整理,个人爱好收集(原文:https://blog.csdn.net/mydistance/article/details/83958655 ) 第一种:定义函数装饰器,在函数,类中使用函 ...