在Java中存储Javascript对象

时间:2011-09-24 19:06:15

标签: java javascript gwt bing-maps jsni

我有一个Java对象,其中存在由“已知文本”字符串定义的空间形状。在我的GWT UI中鼠标悬停此对象时,我的代码通过JSNI将此String传递给Javascript,后者又进行了大量解析并创建了适当的Bing Maps API形状。

这个的简化示例是地图应用程序,其中每个状态作为包含状态名称和定义其周长的字符串的对象存在。在我的UI中鼠标悬停状态名称时,将解析周边字符串并在地图上绘制代表性形状。

现在,我的代码在每次用户鼠标悬停在我的对象上时进行传递,解析和创建。我正在寻找一种方法来解析字符串并仅创建一次对象,希望在原始Java对象本身中存储完整的,已创建的Javascript对象(Bing Maps形状)。我认为,这肯定会加快速度 - 当每次用户将鼠标移动到不同的项目时,必须解析并创建几个非常详细的地图对象时,UI开始变得迟钝。

是否可以在我的Java对象中存储这种性质的Javascript对象,然后在需要时将它们带回Javascript?

在我的Java代码(GWT)中,我可以创建一个JavascriptObject,但这对于保存类似Microsoft.Maps.Polygon对象的东西是否足够?

谢谢!

2 个答案:

答案 0 :(得分:1)

为什么不在javascript中缓存它们?在Javascript中创建对象后,将其存储在以字符串为键的缓存对象中。然后,每当您收到新对象的请求时,都会检查缓存并使用预先创建的缓存(如果有)。如果没有预先创建的,则创建它并将其添加到缓存中。

如果你想预先创建一些对象,你可以让java只用一串字符串来调用javascript,它会预先填充缓存。这使得围栏的Javascript端的所有Javascript对象和围栏的所有Java对象保持不变,但仍然应该有助于提高性能。

这是伪代码中的一般想法:

var cache = {};

function createJSObject(stringArgument) {
    if (stringArgument in cache) {
        return(cache[stringArgument]);
    }
    var obj;

    // create the object here
    // ...

    // cache the object we created
    cache[stringArgument] = obj;
    return(obj);
}

答案 1 :(得分:1)

你可以在你的类中使用一个字段,或者在JavaScriptObject类型的变量中存储来自JS的任何对象。

GWT已经在几个地方做到了这一点:例如com.google.gwt.xml.client.impl.DOMItem