`
西门吹牛
  • 浏览: 227256 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

java执行JavaScript代码

    博客分类:
  • java
阅读更多
学习资料http://jnotnull.iteye.com/blog/262384

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;

import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

import sun.org.mozilla.javascript.internal.NativeArray;
import sun.org.mozilla.javascript.internal.NativeObject;

public class TestScript {
	public static void main(String[] args) throws Exception {
		ScriptEngineManager factory = new ScriptEngineManager();
		ScriptEngine engine = factory.getEngineByName("JavaScript");
		// engine.eval("print('hello')");
		// testScriptVariables(engine);// 演示如何暴露Java对象为脚本语言的全局变量
		// testInvokeScriptMethod(engine);// 演示如何在Java中调用脚本语言的方法
		// testScriptInterface(engine);// 演示脚本语言如何实现Java的接口
		// testUsingJDKClasses(engine);// 演示脚本语言如何使用JDK平台下的类

		test(engine);
	}

	public static void testScriptVariables(ScriptEngine engine)
			throws ScriptException {
		Map<String, Object> map = new HashMap<String, Object>();

		engine.put("map", map);
		engine.eval("map.put('s',new Date);");
		System.out.println(map.get("s").getClass());
	}

	public static void testInvokeScriptMethod(ScriptEngine engine)
			throws Exception {
		String script = "function hello(name) { return 'Hello,' + name;}";
		engine.eval(script);
		Invocable inv = (Invocable) engine;
		String res = (String) inv.invokeFunction("hello", "Scripting");
		System.out.println("res:" + res);
	}

	public static void testScriptInterface(ScriptEngine engine)
			throws ScriptException {
		String script = "var obj = new Object();obj.run = function() { println('run method called');}";
		engine.eval(script);
		Object obj = engine.get("obj");
		Invocable inv = (Invocable) engine;
		Runnable r = inv.getInterface(obj, Runnable.class);
		Thread th = new Thread(r);
		th.start();
	}

	public static void testUsingJDKClasses(ScriptEngine engine)
			throws Exception {
		// Packages是脚本语言里的一个全局变量,专用于访问JDK的package
		// String js = "function doSwing(t){var f=new
		// Packages.javax.swing.JFrame(t);f.setSize(400,300);f.setVisible(true);}";
		String js = "function doSwing(t){var f=Packages.java.util.UUID.randomUUID();print(f)}";
		engine.eval(js);
		Invocable inv = (Invocable) engine;
		inv.invokeFunction("doSwing", "Scripting Swing");
	}

	/**
	 * 我能想到的应用场景,将前台传过来的json数组构造成java的List<Map<String,
	 * Object>>,然后就可以随心所欲的使用该list了 当然可以使用第三方jar采用json to
	 * bean的方式,而且这种方案更优雅,但是需要引入第三方库
	 * 
	 * @throws NoSuchMethodException
	 * @throws ScriptException
	 */

	public static void test(ScriptEngine engine) throws ScriptException,
			NoSuchMethodException {

		// String json =
		// "{'key1':'a','son':{'dd':'dd','a':8},'ran':Math.random()},{'key3':'xor'}";
		String json = "{'key1':'a','son':[{'dd':'dd'},{'dd1':'dd1'}],'ran':Math.random()},{'key3':'xor'}";
		NativeArray json2array = json2array(engine, "[" + json + "]");
		List<Map<String, Object>> list = array2list(engine, json2array);
		System.out.println(list);

	}

	public static NativeArray json2array(ScriptEngine engine, String json)
			throws ScriptException, NoSuchMethodException {

		String script = "function hello() { return " + json + ";}";
		engine.eval(script);
		Invocable inv = (Invocable) engine;
		Object obj = inv.invokeFunction("hello");

		// System.out.println(obj);
		return (NativeArray) obj;

	}

	public static List<Map<String, Object>> array2list(ScriptEngine engine,
			NativeArray nativeArray) throws ScriptException,
			NoSuchMethodException {
		List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
		engine.put("list", list);
		engine.put("arr", nativeArray);
		String script = " 	function dosomething(){										"
				+ " 																			"
				+ " 					for (n=0; n< arr.length; n++){							"
				+ " 						var map=new Packages.java.util.HashMap();			"
				+ "							for (i in arr[n]){									"
				+ "								map.put(i,arr[n][i]);							"
				+ "							}													" + "							list.add(map);										"
				+ "						}														" + "					} 															";
		engine.eval(script);

		Invocable inv = (Invocable) engine;
		inv.invokeFunction("dosomething");
		for (Map<String, Object> map : list) {
			Set<Entry<String, Object>> entrySet = map.entrySet();
			for (Entry<String, Object> entry : entrySet) {
				Object object = entry.getValue();
				if (object instanceof NativeArray) {

					map.put(entry.getKey(), array2list(engine,
							(NativeArray) object));
				} else if (object instanceof NativeObject) {
					map.put(entry.getKey(), obj2map(engine,
							(NativeObject) object));
				}
			}

		}

		return list;

	}

	public static Map<String, Object> obj2map(ScriptEngine engine,
			Object nativeObject) throws ScriptException, NoSuchMethodException {
		Map<String, Object> map = new HashMap<String, Object>();

		engine.put("map", map);
		engine.put("obj", nativeObject);
		String script = " 	function dosomething(){											"
				+ "							for (i in obj){											"
				+ "								map.put(i,obj[i]);									"
				+ "							}														" + "					} 																";
		engine.eval(script);

		Invocable inv = (Invocable) engine;
		inv.invokeFunction("dosomething");
		return map;

	}

}

分享到:
评论
1 楼 chen4w 2011-07-04  
我在java程序中调用javaScript引擎时,jdk内置脚本引擎不能将js 的map自动识别为java的map,最后采用您文章中的obj2map思路予以解决,谢谢!

相关推荐

    Java执行JavaScript代码.pdf

    标题和描述中提到的“Java执行JavaScript代码”指向了一个特定的技术范畴,即在Java环境中执行JavaScript代码。这通常涉及到使用Java中的脚本引擎API,特别是那些支持JavaScript的实现。从提供的部分内容中可以提炼...

    Java执行JavaScript代码

    Java执行JavaScript代码是一种常见的跨语言交互场景,尤其是在服务器端应用中,例如集成第三方JavaScript库或者在Java应用中利用JavaScript的灵活性。以下将详细介绍如何在Java中执行JavaScript代码,并结合提供的...

    Java调用javaScript代码

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

    Java直接运行JS代码

    以下是一个简单的示例,展示如何使用Nashorn引擎在Java中运行JavaScript代码: ```java import javax.script.Invocable; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; public ...

    java 混淆、加密js代码

    Java混淆和加密JavaScript代码是保护Web应用程序源代码安全的重要...在Java中运行混淆和加密后的JavaScript代码,可以通过Java的脚本引擎实现。这个压缩包提供的资源可以帮助开发者实现这些功能,确保Web应用的安全。

    效率非常快的java读取javascript,附带源码和js.jar

    1. **快速执行**:Rhino是用Java实现的,因此它可以充分利用Java的性能优势,尤其是在处理大量JavaScript代码时,其执行速度较快。 2. **JavaScript到Java的互操作性**:Rhino允许JavaScript代码直接调用Java对象和...

    java-javascript-graalvm:使用GraalVM进行Java和JavaScript代码互操作性的示例项目

    该项目展示了如何在Java代码中使用GraalVM的`ScriptEngine` API来执行JavaScript代码。例如,你可以创建一个`ScriptEngineManager`实例,然后通过它获取`GraalJS`引擎,并执行JavaScript脚本。Java代码可以像这样与...

    java和javascript之间的DES加密解密

    这些文件可以直接运行,用于演示如何在Java和JavaScript之间进行DES加密解密。通过查看和理解这些代码,你可以更好地了解如何在实际项目中应用这一技术。 6. **安全注意事项**: 虽然DES在某些场景下仍可用,但它...

    java转js工具

    - 性能:由于语言特性的差异,转换后的JavaScript代码可能不如原生JavaScript代码执行效率高。 综上所述,"java转js工具"是一个重要的开发辅助工具,它帮助开发者在Java和JavaScript之间架起桥梁,使得跨平台开发...

    Java和JavaScript库进行交互

    2. **Nashorn JavaScript引擎**:Java 8引入了Nashorn JavaScript引擎,可以直接在JVM(Java虚拟机)中运行JavaScript代码。Java可以通过`javax.script`包中的接口与JavaScript交互,允许在Java程序中执行JavaScript...

    javascript代码压缩工具

    JSMinifier是一款基于Java的JavaScript代码压缩工具,它可以有效地减少JavaScript文件的体积。由于它是Java应用程序,因此在使用前需要确保你的系统已经安装了Java运行环境(JRE)。如果你还没有安装,可以从Oracle...

    java js引擎调试js代码

    Nashorn是Java 8引入的一个内置JavaScript引擎,它允许Java开发者在Java环境中执行JavaScript代码,实现了JavaScript与Java的无缝集成。Nashorn引擎基于Mozilla的Rhino引擎,但提供了更快的性能和更现代的ECMAScript...

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

    - **WebView**: Android提供了WebView组件,可以加载和执行JavaScript代码。通过`WebView.loadUrl("javascript:...")`或`WebView.addJavascriptInterface()`方法,可以让Java代码和JavaScript进行交互。 - **Rhino...

    将Java编译成JavaScript

    - **Java转JavaScript**: 这一过程涉及到的技术主要是指如何将原本基于Java语言编写的代码转换为能够在浏览器环境中运行的JavaScript代码。这项技术对于希望利用Java的强大特性和广泛的库资源来构建前端Web应用的...

    android JS与java代码相互调用

    - 一个HTML文件,内含JavaScript代码,用于调用Java接口和接收Java的回调。 - 可能还有其他辅助类或资源文件,帮助演示完整的交互流程。 这个Demo将帮助开发者理解如何在Android应用中实现在JS和Java之间进行有效...

    可互操作的Java和JavaScript AES/128/192/256加密算法代码

    这些代码可能包括JavaScript和Java两部分,分别展示了如何初始化密钥、执行加密和解密操作,并确保结果在两个环境间一致。为了确保互操作,开发者可能需要进行一些额外的步骤,比如在JavaScript中使用Base64编码将二...

    Java调用Javascript.pdf

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

    JSP中java代码与js之间的传值

    - **通过JSP脚本元素**:在JSP中,可以使用 `&lt;script&gt;` 标签直接输出JavaScript代码,将Java变量的值传递给JavaScript。例如: ```jsp var myValue = "&lt;%= javaVariable %&gt;"; ``` - **通过JSP表达式语言...

    Java/JavaScript专家门诊

    它的设计目标是“一次编写,到处运行”,这意味着Java代码可以在各种平台之间无缝移植。Java广泛应用于企业级应用开发、服务器端编程、移动应用(尤其是Android平台)、大数据处理以及云计算等领域。Java的特点包括...

Global site tag (gtag.js) - Google Analytics