有个框架,本身已经提供了一些 Ajax 访问的代码。如果要自己重新写,不仅
要走 GWT RPC这样的东西,而且服务端的已有框架完全没法利用。所以,想
用 jsni 来把这部分 Ajax 代码引入进来。
第一步,如何把其他js include进来?
办法有两个。一个是在 Html里面,用
<script type="text/javascript" language="javascript" src="/xxx.js"></script>
另外一种,我更喜欢的是放在 .gwt.xml里面,在 module的定义下面,
<script src="/xxx.js"/>
这样别人要用我的module,也不怕忘了引用这个外部的xxx.js。
第二步,如何获取其他js里面的变量?
一开始很傻,发现xxx.js里面的变量总是访问不到。看了文档才知道,
在jsni里面,只有两个变量可以直接用, $wnd和 $doc,其他js里面定义的变量,
都要通过 $wnd.xxx 这样才能获取到。
第三步,如何把 jsni 里面获取到的对象,返回到java里面?
用 ajax 获取到的对象,要把它转换为一个包含了 Record的 RecordList。
也就是说要在 JavaScriptObject 和 java 对象之间变来变去的。我的做法
如下所示:
public static native RecordList loadData() /*-{
var myAjax = new $wnd.Ajax("...");
...
var size = myAjax.getValue( "root/data/page/size");
var array = @com.smartgwt.client.util.JSOHelper::createJavaScriptArray()();
var i = 0;
for ( i=1; i<=size; i++) {
var obj = {};
obj["name"]=myAjax.getValue( "root/data/tpictures[" + i +"]/name");
var record = @com.smartgwt.client.data.Record::getOrCreateRef(Lcom/google/gwt/core/client/JavaScriptObject;)(obj);
array.add( record.@com.smartgwt.client.core.DataClass::getJsObj()());
}
return @com.smartgwt.client.data.RecordList::getOrCreateRef(Lcom/google/gwt/core/client/JavaScriptObject;)(array);
}-*/;