サーバーからJSONデータを取得する
JSONデータをファイルから直接ロードするのは、比較的簡単でしたが、実際の表示では、サーバーからダイナミックにデータを取得し、それを表示させることが多いものです。ファイルではなく、サーバーにアクセスしてデータを取得するようにするためには、どのようなやり方をすればいいか考えてみましょう。
まず、サーバー側に簡単なプログラムを設置します。ここでは、プロジェクトが配置される場所(ここでは、http://サーバー/HelloPivot/)に、「getsample.php」というPHPのスクリプトを用意することにします。ソースコードは次のようになります。
<?php
$data =<<< EOD
[
{name:"Tuyano",mail:"tuyano@mac.com",tel:"090-9999-9999"},
{name:"Hanako",mail:"hanako@flower",tel:"080-7777-6666"},
{name:"Taro",mail:"taro@yamada",tel:"03-4444-5555"},
]
EOD;
header('Content-type:text/plain; charset=utf8');
echo $data;
今回は、先ほどのJSONデータと同じものをそのままテキストデータとして返すだけのシンプルなものにしてあります。実際は、状況に応じて、出力する$dataの内容を書き換えるような形になるでしょう。
ソースコードを修正する
では、ソースコードを修正しましょう。次のようにHelloApp.javaを書き換えてください(startupメソッド以外は変更がないため省略してあります)。
package jp.tuyano.pivot;
import org.apache.pivot.collections.*;
import org.apache.pivot.serialization.JSONSerializer;
import org.apache.pivot.util.concurrent.*;
import org.apache.pivot.web.GetQuery;
import org.apache.pivot.wtk.*;
import org.apache.pivot.wtkx.WTKXSerializer;
public class HelloApp implements Application {
private Window window;
private TableView table1;
private Label msg;
@Override
public void startup(Display display, Map<String, String> map)
throws Exception {
WTKXSerializer serializer = new WTKXSerializer();
window = (Window)serializer.readObject(this, "HelloApp.wtkx");
msg = (Label)serializer.get("msg");
table1 = (TableView)serializer.get("table1");
GetQuery query = new GetQuery(【サーバー指定】, "/HelloPivot/getsample.php");
query.setSerializer(new JSONSerializer("utf-8"));
query.execute(new TaskAdapter<Object>(new TaskListener<Object>() {
@Override
public void taskExecuted(Task<Object> task) {
List<Map> data = (List<Map>)task.getResult();
table1.setTableData(data);
}
@Override
public void executeFailed(Task<Object> task) {
msg.setText(task.getFault().getMessage());
}
}));
window.open(display);
}
……略……
}

最後に、HelloAp.wtkxの<TableView>を修正しましょう。タグに記述されていた「 tableData="@jsondata.json"」という属性を削除してください。これで、JSONファイルではなく、startupメソッドで用意した処理を使って外部からデータを読み込むようになります。なお、ソースコード中の【サーバー指定】は、それぞれのサーバーに置き換えて使ってください。
