使用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 ...
随机推荐
- Tensorflow进行POS词性标注NER实体识别 - 构建LSTM网络进行序列化标注
http://blog.csdn.net/rockingdingo/article/details/55653279 Github下载完整代码 https://github.com/rockingd ...
- Java-JUC(八):使用wait,notify|notifyAll完成生产者消费者通信,虚假唤醒(Spurious Wakeups)问题出现场景,及问题解决方案。
模拟通过线程实现消费者和订阅者模式: 首先,定义一个店员:店员包含进货.卖货方法:其次,定义一个生产者,生产者负责给店员生产产品:再者,定义一个消费者,消费者负责从店员那里消费产品. 店员: /** ...
- JSP中利用JSTL标签对日期格式化
数据库:Mysql 开发语言:JAVA 页面类型:JSP 对Mysql中的日期类型格式化,在JSP中,如何办呢,很多人说在JAVA后台去日期格式化,无奈了,于是找到了比较靠谱的答案 需要先引入JSTL ...
- [Algorithm] Reservoir Sampling
Given a stream of elements too large to store in memory, pick a random element from the stream with ...
- VC++中多字节字符集和Unicode之间的互换
在Visual C++.NET中,默认的字符集是Unicode,这和Windows默认的字符集是一致的,不过在老的VC6.0等工程中,默认的字符集形式是多字节字符集(MBCS:Multi-Byte C ...
- linux install nodejs
下载/安装python yum install -y bzip2* #nodejs 0.8.5需要,请安装python前,先安装此模块. wget http://www.python.org/ft ...
- 【原】【BG】-一次虚拟化环境实践简要记录
部分涉及到Linux.Nginx.tomcat.MySQL等的点滴操作记录,时间长了,就忘掉了,偶尔整理一下操作的history,就此简要备份一下: [原][BG]-一次虚拟化环境实践简要记录: ht ...
- 【转】一些linux基础命令
学习Linux,其实很多基础命令很重要. 不论多么复杂的shell或者命令组合,都是一个一个的拼接组合命令拼接而成: 大号一个基本功,遇到需要的场景,信手拈来,随意组合拼接,是非常重要的. 恰好看到一 ...
- 转:NGNIX模块开发——nginx的配置系统
From:http://tengine.taobao.org/book/chapter_02.html nginx的配置系统 nginx的配置系统由一个主配置文件和其他一些辅助的配置文件构成.这些配置 ...
- vue初始化数据加载
使用created钩子 import AppLayout from '@/components/app-layout' import axios from 'axios' export default ...