`

javaScript与java跨界传递map

阅读更多

 

JDK6内置了javaScript引擎,用以解决js和java之间的跨界调用。

对于希望开放更加灵活的定制给最终用户的java应用,这是姗姗来迟的福音。

通过在java应用中开放脚本定制给最终用户,可以实现更大程度的灵活性,例如:编写业务规则,甚至是扩充业务函数库。

在我最近编写的一个应用中,采用了上述方式,即:将后台的java编写的功能以javaScript形式发布,

并提供基础javaScript函数库给用户,允许其进行二次开发。

但在具体实施时,还是遇到些许麻烦。书写于此,供后来者借鉴。

我在后台java提供了一个对象,该对象接受HashMap参数传入并执行相应操作,形式如下:

class IDC_Snmp
...
void set(HashMap nvs){
....
}
 按照jdk说明文档,
http://java.sun.com/developer/technicalArticles/J2SE/Desktop/scripting/
编写java语句如下:
...
IDC_Snmp  idc = new IDC_Snmp();
engine.put("idc",idc);
 然后编写js语句如下
idc.set({p1:"v1",p2:"v2"});
 原本以为engine可以识别js的map类型,并自动匹配java的HashMap形参并调用相应方法,
结果跟踪调试,发现js的map类型到java方法中不能自动匹配为HashMap,而是成为NativeObject。
所以没有获得预期结果。

解决办法之一是:java中增加转换处理,自己编码将NativeObject转换为HashMap。
参考了这篇博文:
http://relive123-yahoo-com-cn.iteye.com/blog/784700
	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;
	}
 但是总觉得这种方式过于曲折,并不是jdk原生的实现。

因此用了第二种解决办法:就是在javaScript中将map先转为engine可以识别的数组形式,后台的java方法也是以数组形式出现。
相关的代码为:
java部分
class IDC_Snmp
...
void set(String[] pns,Object[]pvs){
...
}
 其中pns,pvs分别对应HashMap中多个的Name和Value。
javaScript部分
function set(pvMap){
  var pns = [];
  var pvs = [];
  for(x in pvMap){
    pns[pns.length]=x;
    pvs[pvs.length]=pvMap[x];
  }
  idc.set(pns,pvs);
}
 这个感觉好些,出问题就该打JDK的板子了!
0
1
分享到:
评论

相关推荐

    JavaScript实现Java中Map容器的方法

    JavaScript实现Java中Map容器的方法主要依赖于JavaScript对象的特性,即对象中不能有重复的属性名,这与Java中的Map功能相似。在给出的代码示例中,通过构造函数functionMap创建了一个“Map”对象,并为该对象定义了...

    JavaApplet与JavaScript

    **JavaScript 与 JavaApplet 的参数传递:** 尽管 JavaScript 和 JavaApplet 是两种不同的技术,但它们可以协同工作以创建丰富的 Web 应用程序。例如,JavaScript 可以用来设置 Applet 的参数,而 Applet 又可以使用...

    Web Applications with Javascript or Java, Volume 1-De Gruyter(2018).pdf

    volume book shows how to design and implement web applications with a model-based engineering approach, using the two most relevant technology plat- forms for web development: JavaScript and Java....

    JavaScript与Java在Web开发中的应用与区别 (1).pdf

    "JavaScript与Java在Web开发中的应用与区别" 本文主要探讨JavaScript与Java在Web开发中的应用与区别,通过对比分析,了解它们在Web开发中的角色和优势。 JavaScript简介 JavaScript是一种基于事件与对象驱动的...

    Java读取json文件,并转化为map取值

    在Java编程中,处理JSON数据是一项常见的任务,特别是在与服务器进行数据交互时。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。本教程将深入讲解...

    Java Map 遍历比较齐全的解析.docx

    在某些场景下,如果需要兼容JavaScript或者使用类似的方法,可能会使用`Object.keys(map).length`,但这是JavaScript中的写法,在Java中并不适用。 3. **Java 8及Lambda表达式遍历Map** 自Java 8开始,引入了...

    javaScript和java参考手册

    Java集合框架包括List、Set、Map等接口和实现,为处理对象数组提供了强大支持。此外,Java SE(标准版)和Java EE(企业版)还提供了丰富的API,如Swing用于桌面应用,Spring框架用于企业级开发。 对于初学者,理解...

    用javascript与java进行RSA加密与解密

    login.jsp所调用的javascript,有:RSA.jsBigInt.jsBarrett.js博文链接:https://sunxboy.iteye.com/blog/209156

    javascript加密java解密

    总之,“javascript加密java解密”的主题涉及了前端与后端的安全通信策略,通过JavaScript对数据进行加密,然后在Java环境中进行解密,以保障数据在传输过程中的安全。实际操作中,开发者需要根据具体需求选择合适的...

    Java调用javaScript代码

    4. 数据交互:Java可以将变量传递给JavaScript,并接收JavaScript的返回值。例如,你可以这样传递Java对象到JavaScript: ```java engine.put("myJavaObject", myJavaObject); ``` 然后在JavaScript代码中使用`...

    javaScript和java分别制作的锁屏

    javaScript和java分别制作的锁屏 javaScript和java分别制作的锁屏javaScript和java分别制作的锁屏 javaScript和java分别制作的锁屏

    ajax和json跟java实现List、Map直接传递

    这篇博客将深入探讨如何使用Ajax和JSON来实现与Java服务端之间List和Map的直接传递。 首先,Ajax的核心在于XMLHttpRequest对象,它允许JavaScript在不刷新整个页面的情况下与服务器进行通信。通过创建...

    JavaScript和Java的区别.rar

    在执行环境上,JavaScript主要运行在浏览器中,通过Web API与DOM进行交互,实现网页动态化。随着Node.js的出现,JavaScript也能在服务器端运行,提供了全栈开发的可能性。而Java的应用场景更为广泛,除了浏览器插件...

    基于JavaScript和Java的电影院管理系统设计源码 - MyMovie

    项目包含2138个文件,其中包括954个JavaScript文件、535个SVG文件、352个CSS文件、111个Map文件、53个TXT文件、33个Java文件、24个PNG文件、23个JPG文件和15个XML文件。此外,还有12个HTML文件。该项目旨在为电影院...

    自定义javascript的Map类

    自定义javascript的Map类,使用习惯完全依据于java的map使用习惯编写,java中map的用法基本一样,导入包即可使用

    不用第三方jar的json与object(map、list)互换java类

    本文将深入探讨如何在不依赖第三方库的情况下,实现JSON与Java对象(如Map、List)之间的互换。我们将分析标题提及的两个Java类——`jsonobject.java`和`JsonUtil.java`。 首先,`JsonUtil.java`很可能是这个功能的...

    base64,java与JavaScript实现

    ### 关于Base64编码及Java与JavaScript的实现 #### Base64简介 Base64是一种将二进制数据转换为ASCII字符串表示形式的方法。它主要用于处理非文本数据的存储和传输,例如图像、视频等多媒体文件。由于互联网传输...

Global site tag (gtag.js) - Google Analytics