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”对象,并为该对象定义了...
**JavaScript 与 JavaApplet 的参数传递:** 尽管 JavaScript 和 JavaApplet 是两种不同的技术,但它们可以协同工作以创建丰富的 Web 应用程序。例如,JavaScript 可以用来设置 Applet 的参数,而 Applet 又可以使用...
WebBrowser控件允许在MFC应用中嵌入网页浏览功能,而C++与JavaScript之间的数据交互则为这种集成提供了更丰富的可能性。本文将深入探讨如何实现C++和JavaScript之间的数据交换,并通过提供的源代码实例进行详细讲解...
"JavaScript与Java在Web开发中的应用与区别" 本文主要探讨JavaScript与Java在Web开发中的应用与区别,通过对比分析,了解它们在Web开发中的角色和优势。 JavaScript简介 JavaScript是一种基于事件与对象驱动的...
在Java编程中,处理JSON数据是一项常见的任务,特别是在与服务器进行数据交互时。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。本教程将深入讲解...
在某些场景下,如果需要兼容JavaScript或者使用类似的方法,可能会使用`Object.keys(map).length`,但这是JavaScript中的写法,在Java中并不适用。 3. **Java 8及Lambda表达式遍历Map** 自Java 8开始,引入了...
4. 数据交互:Java可以将变量传递给JavaScript,并接收JavaScript的返回值。例如,你可以这样传递Java对象到JavaScript: ```java engine.put("myJavaObject", myJavaObject); ``` 然后在JavaScript代码中使用`...
javaScript和java分别制作的锁屏 javaScript和java分别制作的锁屏javaScript和java分别制作的锁屏 javaScript和java分别制作的锁屏
本项目是一款基于JavaScript和Java构建的体育场预约管理系统源码,总计包含1065个文件。文件类型丰富,包括550个PNG图片、190个JavaScript脚本、106个JPG图片、102个CSS样式表、33个Java类文件、17个Java类库JAR文件...
本文将深入探讨如何在不依赖第三方库的情况下,实现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字符串表示形式的方法。它主要用于处理非文本数据的存储和传输,例如图像、视频等多媒体文件。由于互联网传输...
本系统是一款基于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页面中...
"基于JavaScript和Java语言的动态网页设计方法" 在本文中,我们将讨论基于JavaScript和Java语言的动态网页设计方法。该方法结合了JavaScript和Java语言的优势,提供了一种解决方案,用于提高Web页面的交互性和响应...