使用Java调用JS
import junit.framework.TestCase;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import javax.swing.JButton;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.stream.Collectors;
public class CallJs extends TestCase {
public void testConsoleLog() throws ScriptException {
ScriptEngine engine = new ScriptEngineManager().getEngineByExtension("js");
//此处会抛出异常,Java的script引擎并不包含console对象
engine.eval("console.log('hello world')");
}
public void testConsoleLog2() throws ScriptException {
ScriptEngine engine = new ScriptEngineManager().getEngineByExtension("js");
engine.put("console", System.out);
//此处会抛出异常,Java的script引擎并不包含console对象
engine.eval("console.println('hello world')");
}
public void testUseJsFunction() throws ScriptException {
ScriptEngine engine = new ScriptEngineManager().getEngineByExtension("js");
engine.eval("function add(x,y){return x+y}");
Object value = engine.eval("add(3,7)");
System.out.println(value.getClass() + " " + value);
}
/**
* 注意,这个内部类必须是public否则js编译器看不见
*/
public class SubWrapper {
public int sub(int x, int y) {
return x - y;
}
}
public void testUseJsFile() throws IOException, ScriptException {
ScriptEngine engine = new ScriptEngineManager().getEngineByExtension("js");
InputStream cin = getClass().getResourceAsStream("/calljs.js");
InputStreamReader reader = new InputStreamReader(cin);
engine.put("subWrapper", new SubWrapper());
engine.eval(reader);
engine.put("console", System.out);
System.out.println(engine.eval("add(3,4)"));
System.out.println(engine.eval("sub(5,6)"));
}
public void testUpdateJavaObject() throws ScriptException {
JButton button = new JButton();
ScriptEngine engine = new ScriptEngineManager().getEngineByExtension("js");
engine.put("button", button);
engine.eval("button.text='hello world'");
System.out.println(button.getText());
}
public void testlistAllScriptEngine() {
//列出全部脚本引擎
new ScriptEngineManager().getEngineFactories().forEach(fac -> {
System.out.println("name " + fac.getEngineName()
+ "\nlanguage " + fac.getLanguageName()
+ "\nversion " + fac.getEngineVersion()
+ "\nlanguageVersion " + fac.getLanguageVersion()
+ "\nextensions " + fac.getExtensions().stream().collect(Collectors.joining(","))
+ "\nmimetypes " + fac.getMimeTypes().stream().collect(Collectors.joining(","))
+ "\n"
);
});
}
}
js
function add(x, y) {
return x + y
}
function sub(x,y){
return subWrapper.sub(x,y)
}
使用Java调用JS的更多相关文章
- java调用js脚本
有些情况下,需要java去调用js,groovy等脚本语言,传入参数获取脚本运行的结果. js脚本例子: function add(a,b){ return a + b + number; } jav ...
- java调用js代码
jdk8里使用脚本引擎调用js 1.定义一个js方法: function getRouteInfo(province){ //注意,参数不要带var..在java里执行会报错.. if (provin ...
- java调用js脚本语言
在我们开发的过程中,可能有这么一种情况,在java中需要取调用js方法完成一些事情.那么什么时候可能出现这种情况呢.比如我们使用爬虫模拟登录别的网站,但有些网站前台使用js对密码进行了加密处理,那么就 ...
- java调用js函数
问题:js函数可能有多个,之间有相互调用关系,有jquery jar包 org.mozilla.javascript-1.7.2 js envjs-1.2.js java代码 import jav ...
- gwt中java与js的相互调用
1. java通过jsni调用内部js Button button = new Button("java调用内部jsni的js方法"); button.addClickHandle ...
- java与js交互,相互调用传参
随着前端技术的发展与H5的广泛使用,移动端采用native+h5的方式越来越多了,对于Android来说就涉及到java与js的交互,相互调用传参等.下面就来看一下java与js交互的简单demo. ...
- Android WebView加载本地html并实现Java与JS交互
最近做的一个项目中,用到自定义地图,将自定义地图转换成html页面,现在需要做的是如何将本地的html加载到android中,并可以实现交互. 相关讲解: 其实webview加载资源的速度并不慢,但是 ...
- Android与H5交互(java与js的交互)
一.理论概述 1.js调用java方法 直接调用WebView的该方法就可以添加接口了,不过先要启动交互 // 启用javascript mWebView.getSettings().setJavaS ...
- android webview js交互 第一节 (java和js交互)
转载请注明出处 挺帅的移动开发专栏 http://blog.csdn.net/wangtingshuai/article/details/8631835 在androi ...
随机推荐
- 关于UITableView的黑线条
这里採用分组形式.底色可用图片覆盖,设置为cell(是一个view)的子视图,并把cell'的颜色设置为底色 当UITableView的cell没有满屏显示时,就会出现黑线条.我们仅仅需在初始化时,加 ...
- TensorFlow实战12:Bidirectional LSTM Classifier
https://blog.csdn.net/felaim/article/details/70300362 1.双向递归神经网络简介 双向递归神经网络(Bidirectional Recurrent ...
- Kafka:ZK+Kafka+Spark Streaming集群环境搭建(一)VMW安装四台CentOS,并实现本机与它们能交互,虚拟机内部实现可以上网。
使用VMW安装四台CentOS-7-x86_64-DVD-1804.iso虚拟机: 计划配置三台centos虚拟机: master:192.168.0.120 slave1:192.168.0.121 ...
- Linux扩展文件分区
**************操作之前请看章节6,看系统是否支持LVM分区管理方式*************** 1:新增磁盘 插入新的磁盘,比如物理机可以直接在卡槽插入,虚拟机可以在控制台添加磁盘或者 ...
- java 让图片变黑白
import java.awt.Image;import java.awt.color.ColorSpace;import java.awt.image.BufferedImage;import ja ...
- fortune 计算公式
fortune 计算PV值. 举例:一笔 120.00的债权; 12天还完,3.15号借款,3.16开始还款.等额本息还款计算出每天还款: 10.22 根据 现值计算公式 PV = CFn/(1+r) ...
- Android应用Preference相关及源代码浅析(SharePreferences篇)
1 前言 在我们开发Android过程中数据的存储会有非常多种解决方式,譬如常见的文件存储.数据库存储.网络云存储等,可是Android系统为咱们提供了更加方便的一种数据存储方式.那就是SharePr ...
- Awk使用及站点日志分析
Awk使用及站点日志分析 Awk简单介绍 概述 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入, ...
- 【linux】Ubuntu中shell脚本无法使用source的原因及解决方法
问题现象: shell脚本中source aaa.sh时提示 source: not found 原因: ls -l `which sh` 提示/bin/sh -> dash 这说明是用dash ...
- windows安装python2.7后的注册(registry)问题
[提要]win平台上,python2.7官网的安装包在安装后不会添加环境变量且不会把安装信息写入注册表. 把python和pip的安装路径添加到环境变量是做python开发必要的一步,而写入注册表的原 ...