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。
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的板子了!
分享到:
相关推荐
标题中的"map(java).rar_ map ja_MAP JAVA_java map_java系统_map"暗示了这是一个与Java编程语言相关的项目,特别是涉及到地图(Map)的实现。在Java中,`Map`是一个接口,它定义了键值对的数据结构,允许我们通过键...
JavaScript实现Java中Map容器的方法主要依赖于JavaScript对象的特性,即对象中不能有重复的属性名,这与Java中的Map功能相似。在给出的代码示例中,通过构造函数functionMap创建了一个“Map”对象,并为该对象定义了...
WebBrowser控件允许在MFC应用中嵌入网页浏览功能,而C++与JavaScript之间的数据交互则为这种集成提供了更丰富的可能性。本文将深入探讨如何实现C++和JavaScript之间的数据交换,并通过提供的源代码实例进行详细讲解...
在Java编程中,处理JSON数据是一项常见的任务,特别是在与服务器进行数据交互时。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。本教程将深入讲解...
在某些场景下,如果需要兼容JavaScript或者使用类似的方法,可能会使用`Object.keys(map).length`,但这是JavaScript中的写法,在Java中并不适用。 3. **Java 8及Lambda表达式遍历Map** 自Java 8开始,引入了...
总之,“javascript加密java解密”的主题涉及了前端与后端的安全通信策略,通过JavaScript对数据进行加密,然后在Java环境中进行解密,以保障数据在传输过程中的安全。实际操作中,开发者需要根据具体需求选择合适的...
这篇博客将深入探讨如何使用Ajax和JSON来实现与Java服务端之间List和Map的直接传递。 首先,Ajax的核心在于XMLHttpRequest对象,它允许JavaScript在不刷新整个页面的情况下与服务器进行通信。通过创建...
本文将深入探讨如何在不依赖第三方库的情况下,实现JSON与Java对象(如Map、List)之间的互换。我们将分析标题提及的两个Java类——`jsonobject.java`和`JsonUtil.java`。 首先,`JsonUtil.java`很可能是这个功能的...
在Java编程中,将对象转换成JSON(JavaScript Object Notation)...通过以上步骤,你可以有效地在Java后端与JavaScript前端之间传递List和Map对象。了解并熟练掌握这些技巧,对于构建前后端数据交换的应用至关重要。
### 关于Base64编码及Java与JavaScript的实现 #### Base64简介 Base64是一种将二进制数据转换为ASCII字符串表示形式的方法。它主要用于处理非文本数据的存储和传输,例如图像、视频等多媒体文件。由于互联网传输...
总共有727个文件组成,其中包含370个Java源文件、109个JavaScript文件、62个HTML文件、74个PNG图片文件、29个XML文件、23个BTL文件、14个CSS文件、9个map文件、7个json文件、3个md文件。该系统综合运用HTML、CSS和...
本系统是一款基于JavaScript、Java和CSS的Java_web豪车租车信息管理系统源码,总计包含334个文件,其中包括176个JavaScript文件、80个Java文件、33个JSP文件、16个CSS文件、11个JPG文件、5个PNG文件、4个MAP文件、1...
总的来说,JavaScript工具库在跨界开发中扮演着核心角色,它们提供了强大的功能和便利性,同时也带来了一些挑战。开发者需要不断学习和掌握新的工具库,以应对日益复杂的开发需求,并通过优化和调整,确保项目的高效...
在进行Web开发时,尤其是使用JSP技术开发动态网站时,我们常常需要处理服务器端Java变量与客户端JavaScript变量之间的数据交互问题。JSP(JavaServer Pages)是一种用于开发动态网页的技术,它允许我们在HTML页面中...
在IT行业中,Java和JavaScript是两种非常重要的编程语言,它们分别在服务器端和客户端领域有着广泛的应用。然而,有时候我们可能需要在Java程序中执行JavaScript代码,这通常是出于跨语言交互或者利用JavaScript的...
engine.put("javaMap", javaMap); // 在JavaScript中访问Java对象 engine.eval("console.log(javaMap.key1);"); // 输出:value1 ``` ### 7. 安全性与限制 在生产环境中,直接运行不受信任的JavaScript代码可能会...
js模仿java的Map集合,实现功能。size()方法,put()方法,remove()方法等