在我们开发的过程中,可能有这么一种情况,在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调用JavaScript 使用`addJavascriptInterface()`方法暴露一个Java对象给JavaScript环境,这样JavaScript就可以调用这个对象的方法: ```java webView.addJavascriptInterface(new Object() { @...
标题中的“Java调用JavaScript代码”是指在Java程序中执行JavaScript脚本,实现跨语言通信。这主要通过Java的ScriptEngine接口和其相关的API来实现,这些API位于Java的javax.script包中。ScriptEngine接口提供了执行...
Java 调用 JS 方法是指在 Java 代码中调用 JavaScript 代码的方法,从而实现 Java 和 JavaScript 之间的交互。在本文中,我们将详细介绍 Java 调用 JS 方法的实现步骤和相关知识点。 Java 调用 JS 方法的实现 在 ...
标题中的".net调用js脚本"涉及到的技术领域是.NET框架下的C#编程与JavaScript交互。在.NET开发中,有时我们需要在C#代码中执行JavaScript脚本来处理特定的逻辑,例如解析HTML、与浏览器交互或者利用JavaScript库的...
这主要得益于Oracle公司在Java 6版本引入的一个新特性——Java Scripting API(JSR 223),它允许Java程序执行多种脚本语言,包括JavaScript。 ### 1. Java Scripting API (JSR 223) JSR 223是Java的一个标准接口...
首先,Groovy是一种与Java高度兼容的脚本语言,它可以无缝地与Java代码集成,共享Java类库。Groovy代码可以被Java编译器理解,并且在运行时,GroovyShell或GroovyClassLoader等工具能够即时编译和执行Groovy脚本,这...
### Java调用JS代码实现动态配置 在现代软件开发中,动态配置的需求越来越普遍,特别是在不希望频繁重启服务的情况下更新业务逻辑或算法时。本文将详细介绍如何利用Java调用JavaScript来实现这一目标,并通过一个...
"java调用js方法.doc"很可能是详细描述如何从Java调用JS函数的步骤和示例。 在实际应用中,Java代码可能会通过Ajax发送一个请求到服务器,服务器解析请求后调用对应的JS函数,例如在"des.js"中执行解密操作,然后将...
Java调用Kettle代码主要涉及两个关键点:Java编程与Kettle(Pentaho Data Integration,简称PDI)工具的集成。Kettle是一款强大的ETL(Extract, Transform, Load)工具,用于数据抽取、转换和加载。Java作为广泛应用...
例如,Java后端可以调用Python脚本来进行复杂的数据分析,JavaScript通过Node.js可以在服务器端运行,实现全栈开发。此外,Java也可以通过Jython、GraalVM等工具直接执行Python或JavaScript代码,进一步提高了集成的...
标题“Java如何与脚本(JavaScript)之间相互调用二”主要探讨的是在Java应用程序中如何集成和调用JavaScript代码,以及反过来JavaScript如何调用Java的功能。这涉及到跨语言交互的技术,通常通过Java的ScriptEngine...
Java Applet调用C++ SSO登录JavaScript脚本开发教程主要涉及了跨语言交互、SSO(Single Sign-On,单点登录)技术以及自动化登录流程的实现。在本教程中,我们将探讨如何利用Java Applet作为桥梁,调用C++实现的SSO...
SpringBoot整合Direct Web Remoting (DWR)是一个常见的技术实践,它允许JavaScript在浏览器端直接调用服务器端的Java方法,极大地增强了Web应用的交互性。在这个过程中,我们通常会结合使用FreeMarker或JSP作为视...
这意味着开发者可以在JavaScript脚本中调用Java类库,或者在Java程序中执行JavaScript代码。 2. **兼容ECMAScript规范**:Rhino遵循ECMAScript第三版(ES3)标准,尽管它不支持最新的ES6或更高版本的特性,但在处理...
Java调用Javascript的技术涉及了在Java Applet中通过脚本接口与Web页面上的JavaScript代码进行交互。这部分技术在当前的Web开发中已较少使用,因为Java Applet的安全性问题和浏览器的兼容性问题,使得现代浏览器逐渐...
在Java中,自JDK 1.6版本起,通过JSR 223(Java Scripting API)提供了对脚本语言的支持,包括JavaScript。下面将详细介绍两种主要的Java调用JavaScript方法的方式: 1. **调用Java代码内部编写的JavaScript方法** ...
- **JSR 223 Scripting**: Android支持JSR 223规范,允许使用各种脚本语言(如Groovy、JavaScript等)编写代码,然后通过`ScriptEngineManager`和`ScriptEngine`接口执行。 5. **AOSP源码集成**: - 对于更复杂的...