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 脚本在某些特 ...
随机推荐
- kernel_thread()和kthread_run()/kthread_create()的根本区别
0 本质区别 kthread_run()调用kthread_create(), kthread_create()加入链表后,有kthreadd()线程读取链表然后再调用kernel_thread()创 ...
- 简单操作:10分钟实现在kubernetes(k8s)里面部署服务器集群并访问项目(docker三)
前言 经过docker安装.k8s开启并登录,我们终于到 "部署k8s服务器集群并访问项目" 这一步了,实现的过程中有太多坑,好在都填平了,普天同庆. 在进行当前课题之前,我们需要 ...
- 洛谷P1803——凌乱的yyy(贪心)
题目描述 现在各大oj上有n个比赛,每个比赛的开始.结束的时间点是知道的. yyy认为,参加越多的比赛,noip就能考的越好(假的) 所以,他想知道他最多能参加几个比赛. 由于yyy是蒟蒻,如果要参加 ...
- Django学习day05随堂笔记
每日测验 """ 今日考题 1.反向解析的本质是什么,无名和有名反向解析如何操作? 2..路由分发能够实现的前提是什么,需要注意什么,名称空间什么时候使用 3..什么是虚 ...
- JMeter脚本开发
什么是jmeter脚本 用户操作系统的动作流程 用户操作系统的请求 类似演戏的剧本 怎么快速开发漂亮的jmeter脚本 准确 快速 漂亮,脚本逻辑清晰,维护性高 脚本开发方案 代理 http代理服务器 ...
- lua自写限制并发访问模块
注意:ngx.say跟ngx.exit是不可以共存,否则会出现ngx.exit无法正常执行 1.定义lua共享内存20m lua_shared_dict ceshi 20m; 2.再location ...
- 测试开发【提测平台】分享11-Python实现邮件发送的两种方法实践
微信搜索[大奇测试开],关注这个坚持分享测试开发干货的家伙. 按照开发安排,本篇本应该是关于提测页面的搜索和显示实现,怕相似内容疲劳,这期改下内容顺序,将邮件服务的相关的提前,在之前的产品需求和原型中 ...
- P2012-拯救世界2【EGF】
正题 题目链接:https://www.luogu.com.cn/problem/P2012 题目大意 \(12\)种东西排列成长度为\(n\)的序列,要求前四种出现奇数次,后四种出现偶数次,求方案. ...
- span标签的巧用
前言: 用struts的标签结合<td>标签将后台数据在表格里渲染了出来,目前需求是需要将两个状态组合在一起显示 解决:通过span标签在td里的套用可以实现 <logic:notE ...
- 深入浅出WPF-08.Event( 事件)02
路由事件 为了方便程序中对象之间的通信常常需要我们定义一些路由事件.使用路由事件比直接事件方便得多. 创建自定义路由事件的步骤: 1)声明并注册路由 2)为路由事件添加CLR事件包装 3)创建可以激发 ...