参考:Using GWT for JSON Mashups
Java Native Interface(JNI)を利用したJavascript直接記述部がポイントでしょうか♪.
pg/net/y30/client/TwitterFactory.javaprotected HashMap<Integer, Object> callbacks = new HashMap<Integer, Object>();
protected HashMap<String, Element> scriptTags = new HashMap<String, Element>();
public void requestTwitter(String name, int count) {
String gdata = "http://twitter.com/statuses/user_timeline/" + name
+ ".json?count=" + count + "&callback=";
String callbackName = reserveCallback();
setup(this, callbackName);
addScript(callbackName, gdata + callbackName);
}
public native static void setup(TwitterFactory g, String callback)
/*-{
$wnd[callback] = function(someData) {
g.@pg.net.y30.client.TwitterFactory::handle(Lcom/google/gwt/core/client/JavaScriptObject;)(someData);
}
}-*/;
public String reserveCallback() {
while (true) {
if (!callbacks.containsKey(new Integer(curIndex))) {
callbacks.put(new Integer(curIndex), null);
return "myCallBack" + curIndex++;
}
}
}
public void addScript(String uniqueId, String url) {
Element e = DOM.createElement("script");
DOM.setElementProperty(e, "language", "JavaScript");
DOM.setElementProperty(e, "src", url);
scriptTags.put(uniqueId, e);
DOM.appendChild(RootPanel.get().getElement(), e);
}
public void handle(JavaScriptObject jso) {
JSONObject json = new JSONObject(jso); // This is an array of twitter's json objects.
JSONValue val;
int i = 0;
while ((val = json.get((new Integer(i++)).toString())) != null) {
JSONObject obj = val.isObject(); // This is a twitter's json object.
Window.alert(obj.toString());
}
}
- requestTwitter
- スタート♪.urlを作成後,callback関数を用意して関数を用意して, script要素でtwitterへjsonを要求.
- setup
- reserveCallbackで作成したcallback関数(名)をjavascriptの関数として登録.
- reserveCallback
- ユニークなcallback関数名を作成.(ユニークでなくてはいけないのかしら?)
- addScript
- callback関数の形でjsonオブジェクトを返してもらうリクエストをscript要素として追加する.
- handle
- callback関数の処理の実態.setupの中で記述してあるのは(赤色)これ.
GWTFusenで利用しています.
0 件のコメント:
コメントを投稿