このエントリーは JavaFX Advent Calendar 2014 の 20 日目です。
昨日は @aoetk さんの「JavaFX の WebView に文字列検索機能を付けてみる - AOEの日記」でした。
少し前に、JavaFXをキーワードに色々調べていた時、OpenDolphinなるアプリケーションを知りました。
ロゴがどことなくGlassFishに似てて、なんとなく興味を抱いた…というものなのですが(^^;
OpenDolphinのロゴ
GlassFishのロゴ
そんなOpenDolphinについて調べたことを簡単にまとめたいと思います。
step
サンプルコードは、0から7のstepに分かれていて、最初はシンプルな例から始まって、モジュール分割したり、クライアント・サーバに分けたり、と理解できるようになっていました。
Step0はOpenDolphin関係なく、簡単なJavaFXアプリが起動するかどうかのコードでした。
combinedプロジェクトをダブルクリックすると個別に表示されるのでビルドします。
自分の環境ではプロジェクトの設定でJava 5が指定されててビルドエラーになりました(^^;のでプロジェクトのプロパティでJava 7に変えてビルドしました。
(サンプルはJava 7前提のようで、Java 8にすると動かなかったです…)
で、step_0パッケージのmainを実行すると次のような表示になります。
それだけ(^^;
Step1はテキストとボタンがあって、ボタンを押すと入力内容が標準出力されるサンプル。これもJavaFXの基礎を確認、みたいな感じですね。
次のStep2から、やっとOpenDolphinを使う形になります。
実行すると、一見同じ画面なのですが、文字入力するたびに標準出力されてます。
「maki」と入力してclick meボタンを押すと、「server text field contains : maki」と出ます。
コードではClientDolphin、ServerDolphinが定義されていて、これがそれぞれクライアントとサーバを表すオブジェクトのようです。
ClientDolphin clientDolphin = config.getClientDolphin();
ServerDolphin serverDolphin = config.getServerDolphin();
で、ここでやっと最初の図にあった「モデル」がでてきます。
まずはクライアントのclientDolphinに「input」という文字列をIDにしたPrensetationModelに「text」という属性があるよ、と定義します。
PresentationModel input = clientDolphin.presentationModel("input", new ClientAttribute("text"));
で、JavaFXのInputFieldのtextプロパティと、定義したinputというPresentationModelのtextをバインドしてね、と。
JFXBinder.bind("text").of(field).to("text").of(input);
そしてサーバのserverDolphinでは、PresentationModelのinputにあるtext属性の値を受け取って標準出力する形です。
config.getServerDolphin().action("PrintText", new NamedCommandHandler() {
public void handleCommand(NamedCommand namedCommand, List<Command> commands) {
Object text = serverDolphin.getAt("input").getAt("text").getValue();
System.out.println("server text field contains: " + text);
}
});
serverDolphinからすると、クライアント側がどんな実装でどんなオブジェクトかは気にしてない所がポイントのようです。
PresentationModelのinputにあるtext属性をみてるだけで、そこにバインドするのはクライアント側の実装次第。
なるほどー。
Step3以降はこれをベースに色々と拡張していき、Step5ではモジュールを完全に分割したりしています(clientプロジェクト、serverプロジェクトがそれにあたる)
最後はserver-appでServletベースのサーバを使った、より現実的な所まで含まれているので、興味ある方は実際に1つ1つ動かしながら確認するのがいいのかなと思います。
ここまで書いてふと思ったのですが、サーバサイドはREST APIでJSONベースにリッチクライアントとやりとりするような構成と何が違うんだろうなぁ…と(^^;簡単なレベルでしかみてないので、PresentationModelを使うことの大きなメリットとか、その辺がイマイチぴんときてなかったり…。
OpenDolphinはJavaOneなどでも発表があったり、海外では結構情報ありそうですが、日本語が全然なかったので、その辺の流行り具合とかもご存じの方がいれば是非コメント頂ければと思います(>_<;
JavaFX Advent Calendar 2014 、明日は @tomo_taka01 さんです!