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 脚本在某些特 ...
随机推荐
- 通过JDK动态代理实现 Spring AOP
1.新建一个目标类 接口:public interface IUserService //切面编程 public void addUser(); public void updateUser( ); ...
- word域实现动态填充信息附件下载
1.问题描述:在页面上一些下载附件功能,点击触发执行下载操作时候,有些电脑的浏览器可以,有些电脑的浏览器下载不了,电脑打开弹出的下载框下载的不是一个文件,而是一个如jspx后缀名的页面,jspx后缀是 ...
- MySQL高级语句(二)
目录: 1.别名 2.子查询 3.EXISTS 4.连接查询 5.CREATE VIEW 视图 6.UNION 联集 7.交集值 8.无交集值 9.CASE 10.算排名 11.算中位数 12.算累积 ...
- (6)java Spring Cloud+Spring boot+mybatis企业快速开发架构之SpringCloud-Spring Boot项目详细搭建步骤
在 Spring Tools 4 for Eclipse 中依次选择 File->New->Maven Project,然后在出现的界面中按图所示增加相关信息. <paren ...
- java短信群发项目:
编写一个项目, 1. 以下手机号码段,添加到Map集合当中 2. 从控制台输入要发送信息的短信号码,如果要发送多个,请用英文逗号隔开,输入短信内容 3. 编写一个短信发送类,号码发送前,先判断号码是否 ...
- ci框架 查询构造器类
$this->db->get() 该方法执行 SELECT 语句并返回查询结果,可以得到一个表的所有数据: $query = $this->db->get('mytable') ...
- [转载]linux下配置mariadb支持中文
转载网址:http://www.cnblogs.com/vingi/articles/4302330.html 修改/etc/mysql/my.cnfOn MySQL 5.5 I have in my ...
- Git:分布式版本控制系统
参考廖雪峰的 Git 教程:https://www.liaoxuefeng.com/wiki/896043488029600 讲解很详细,这里只做一些个人笔记: 各系统安装 Git :https:/ ...
- Unittest 框架之测试固件-----(setUp与tearDown)你真的会用吗?
前言 做自动化测试中,需要管理大量的测试用例,如果不用框架管理用例,那会是一件很麻烦的事. 如果所示只写了一个用例,内容就是输入网易邮箱账号和密码 test fixture:测试固件 简单来说就是做一 ...
- Kubernetes-Service介绍(一)-基本概念
前言 本篇是Kubernetes第八篇,大家一定要把环境搭建起来,看是解决不了问题的,必须实战.Pod篇暂时应该还缺少两篇,等Service和存储相关内容介绍以后,补充剩下的两篇,有状态的Pod会涉及 ...