`

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方法的情况少,不过了解一下也是有好处的。
 

 

 

 

 

 

 

 

 


 

  • 大小: 16.1 KB
  • 大小: 56.9 KB
  • 大小: 10.9 KB
  • 大小: 15.9 KB
分享到:
评论

相关推荐

    android使用webView实现java程序与js脚本的相互调用

    Java调用JavaScript 使用`addJavascriptInterface()`方法暴露一个Java对象给JavaScript环境,这样JavaScript就可以调用这个对象的方法: ```java webView.addJavascriptInterface(new Object() { @...

    Java调用javaScript代码

    标题中的“Java调用JavaScript代码”是指在Java程序中执行JavaScript脚本,实现跨语言通信。这主要通过Java的ScriptEngine接口和其相关的API来实现,这些API位于Java的javax.script包中。ScriptEngine接口提供了执行...

    ( java调用js__方法.docx

    Java 调用 JS 方法是指在 Java 代码中调用 JavaScript 代码的方法,从而实现 Java 和 JavaScript 之间的交互。在本文中,我们将详细介绍 Java 调用 JS 方法的实现步骤和相关知识点。 Java 调用 JS 方法的实现 在 ...

    .net调用js脚本

    标题中的".net调用js脚本"涉及到的技术领域是.NET框架下的C#编程与JavaScript交互。在.NET开发中,有时我们需要在C#代码中执行JavaScript脚本来处理特定的逻辑,例如解析HTML、与浏览器交互或者利用JavaScript库的...

    Java直接运行JS代码

    这主要得益于Oracle公司在Java 6版本引入的一个新特性——Java Scripting API(JSR 223),它允许Java程序执行多种脚本语言,包括JavaScript。 ### 1. Java Scripting API (JSR 223) JSR 223是Java的一个标准接口...

    Java调用Groovy,实时动态加载数据库groovy脚本

    首先,Groovy是一种与Java高度兼容的脚本语言,它可以无缝地与Java代码集成,共享Java类库。Groovy代码可以被Java编译器理解,并且在运行时,GroovyShell或GroovyClassLoader等工具能够即时编译和执行Groovy脚本,这...

    java调用js代码实现动态配置

    ### Java调用JS代码实现动态配置 在现代软件开发中,动态配置的需求越来越普遍,特别是在不希望频繁重启服务的情况下更新业务逻辑或算法时。本文将详细介绍如何利用Java调用JavaScript来实现这一目标,并通过一个...

    Java代码调用HTML5中的JS函数算法

    "java调用js方法.doc"很可能是详细描述如何从Java调用JS函数的步骤和示例。 在实际应用中,Java代码可能会通过Ajax发送一个请求到服务器,服务器解析请求后调用对应的JS函数,例如在"des.js"中执行解密操作,然后将...

    Java调用Kettle代码

    Java调用Kettle代码主要涉及两个关键点:Java编程与Kettle(Pentaho Data Integration,简称PDI)工具的集成。Kettle是一款强大的ETL(Extract, Transform, Load)工具,用于数据抽取、转换和加载。Java作为广泛应用...

    java与脚本语言.rar

    例如,Java后端可以调用Python脚本来进行复杂的数据分析,JavaScript通过Node.js可以在服务器端运行,实现全栈开发。此外,Java也可以通过Jython、GraalVM等工具直接执行Python或JavaScript代码,进一步提高了集成的...

    java如何与脚本(javaScript)之间相互调用二

    标题“Java如何与脚本(JavaScript)之间相互调用二”主要探讨的是在Java应用程序中如何集成和调用JavaScript代码,以及反过来JavaScript如何调用Java的功能。这涉及到跨语言交互的技术,通常通过Java的ScriptEngine...

    Java applet调用c++ SSO登录javascript脚本开发教程

    Java Applet调用C++ SSO登录JavaScript脚本开发教程主要涉及了跨语言交互、SSO(Single Sign-On,单点登录)技术以及自动化登录流程的实现。在本教程中,我们将探讨如何利用Java Applet作为桥梁,调用C++实现的SSO...

    springboot整合dwr实现js调用java方法

    SpringBoot整合Direct Web Remoting (DWR)是一个常见的技术实践,它允许JavaScript在浏览器端直接调用服务器端的Java方法,极大地增强了Web应用的交互性。在这个过程中,我们通常会结合使用FreeMarker或JSP作为视...

    java运行js脚本引擎-----rhino

    这意味着开发者可以在JavaScript脚本中调用Java类库,或者在Java程序中执行JavaScript代码。 2. **兼容ECMAScript规范**:Rhino遵循ECMAScript第三版(ES3)标准,尽管它不支持最新的ES6或更高版本的特性,但在处理...

    Java调用Javascript.pdf

    Java调用Javascript的技术涉及了在Java Applet中通过脚本接口与Web页面上的JavaScript代码进行交互。这部分技术在当前的Web开发中已较少使用,因为Java Applet的安全性问题和浏览器的兼容性问题,使得现代浏览器逐渐...

    java调用js方法.pdf

    在Java中,自JDK 1.6版本起,通过JSR 223(Java Scripting API)提供了对脚本语言的支持,包括JavaScript。下面将详细介绍两种主要的Java调用JavaScript方法的方式: 1. **调用Java代码内部编写的JavaScript方法** ...

    java android 执行脚本代码(java代码)

    - **JSR 223 Scripting**: Android支持JSR 223规范,允许使用各种脚本语言(如Groovy、JavaScript等)编写代码,然后通过`ScriptEngineManager`和`ScriptEngine`接口执行。 5. **AOSP源码集成**: - 对于更复杂的...

Global site tag (gtag.js) - Google Analytics