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 脚本在某些特 ...
随机推荐
- python库--tensorflow--RNN(循环神经网络相关)
类/方法 返回值类型 参数 说明 tf.contrib.rnn① / tf.nn.rnn_cell② .RNNCell() 实例r 看不懂 trainable=True name=None d ...
- Nginx rewrite跳转 location匹配
目录: 一.常用的Nginx 正则表达式 二.location 三.rewrite 一.常用的Nginx 正则表达式 1 ^ :匹配输入字符串的起始位置 2 $ :匹配输入字符串的结束位置 3 * : ...
- 网站URL如何SEO优化
前言 本文讲解网站的URL如何进行SEO优化,并在自己的WordPress博客echeverra中优化URL. 起因 对于SEO我了解的并不多,只知道SEO做的好,那么各大搜索网站搜索你网站相关内容时 ...
- 动态规划精讲(一)LC最长公共子序列
P1439 [模板]最长公共子序列 题目描述 给出1,2,-,n 的两个排列P1 和P2 ,求它们的最长公共子序列. 输入格式 第一行是一个数 n. 接下来两行,每行为 n 个数,为自然数 1,2 ...
- python 爬虫新手入门教程
python 爬虫新手教程 一.什么是爬虫 爬虫就是把一个网站里的内容读取下来 这里我们就要学习一个知识 我们看到的网页是有一种叫HTML的语言编写的 他可以给文字显示不同的样式 如:<p> ...
- javascript,jquery在父窗口触发子窗口(iframe)某按钮的click事件
$('iframe').contents().find(".btn").click(); 其中 contents(): 查找匹配元素内部所有的子节点(包括文本节点).如果元素是一个 ...
- 怎样在Linux中查看apache是用那个httpd.conf
第一步:找到apache启动命令: [root@WAPBJ01 ~]# ps -ef|grep httpdroot 10575 1 0 19:45 ? 00:00:03 ...
- Shell系列(20)- 字符截取命令cut
前言 grep是按行提取:cut默认是通过制表符,按列提取,不能识别用空格作为分隔符 语法 cut [选项] [文件] 选项 -f :列号,截取哪几列数据,多个列号用逗号隔开:列与列之间默认用TAB制 ...
- Oracle Haip无法启动问题学习
一.目标:Oracle Haip 启动报错 需求:日常运维过程中,已经遇到两次由于HAIP引发的问题,特此进行记录. 本次问题是看着大佬-李海清操作,整完了记录一下,上一次HAIP折腾了4个小时. O ...
- 如何理解 jmeter 的线程数与并发数之间的关系
https://blog.csdn.net/weixin_39955351/article/details/110548162 多个线程组的并发是如何计算的?