連載:Flexのクライアントサイドをオープンソースで制覇する(最終回)
Flexのフレームワーク、Cairngormで
検索アプリ完成
ダイヤモンドコンピューターサービス
SI技術部 技術推進グループ
吉田 靖宏
2006/10/13
最終回となる今回は、サンプルアプリケーションの残りの部分(サーバサイド連携部分)を作成し、サンプルアプリケーションを完成させる
前回(Flexのフレームワーク、Cairngormでサンプルアプリ)では、実際にCairngorm Frameworkを使ってアプリケーションサーバの検索・登録・更新・削除を行う簡単なサンプルアプリケーションを途中まで作成しました。最終回となる今回は、サンプルアプリケーションの残りの部分(サーバサイド連携部分)を作成し、サンプルアプリケーションを完成させます。
■BusinessDelegateの作成
それでは、サーバサイド連携部分を作成していきましょう。まず、BusinessDelegateを作成します。下のリストは、サンプルアプリケーションのBusinessDelegateであるSampleappBusinessDelegate.asです。これをcairngorm-sample/WebContent/sample/businessに作成してください。
リスト1 SampleappBusinessDelegate.as
import org.nevis.cairngorm.business.Responder; |
BusinessDelegateは、特に継承すべき親クラスや実装すべきインターフェイスはありません。BusinessDelegateでは、サーバサイドのサービスにアクセスする処理を記述します。
ここでは、各Commandに対応するsearch(検索)、regist(登録)、update(更新)、remove(削除)の4つのメソッドを実装しています。それぞれのメソッドの中では、ServiceLocatorから取得した「sampleAppService」という名前のサービス(このサンプルではRemote Object)のメソッドを呼び出しています。サービスの取得は、コンストラクタの中で行っており、取得したサービスはインスタンス変数に保持しています。
また、Flexのクラスライブラリで提供されているDelegateクラスのcreateメソッドを使用して、サーバサイドのサービス呼び出しが成功したときと失敗したときのハンドリングをCommandに委譲させています(Delegateクラスについては、Flex1.5のAPIリファレンスを参照してください)。
Commandのインスタンスは、コンストラクタの引数に渡されてくるので、サービスと同じようにインスタンス変数に保持しています。Commandのインスタンスは、Responderインターフェイスで受けていることに注意してください。
■ Servicesの作成
次にServicesを作成します。下のリストは、サンプルアプリケーションのServicesであるSampleappServices.mxmlです。これをcairngorm-sample/WebContent/sample/businessに作成してください。
リスト2 SampleappServices.mxml
<?xml version="1.0" encoding="utf-8"?> |
今回は、サーバサイドのサービスにRemote Objectを使用するので、ログインサンプルと同じように、<mx:RemoteObject>タグを使ってサービスを定義しています。idプロパティは、ServiceLocatorのgetServiceメソッドでサービスを取得する際に指定する文字列です。namedプロパティは、WEB-INF/flex/flex-config.xmlに定義するサービス名です。ここでは、idプロパティとnamedプロパティの値を同じにしていますが、ここは別々の値でも構いません。そのほかのプロパティについては、Flex1.5のAPIリファレンスまたは、Flexアプリケーション開発ガイドを参照してください。
なお、対応するflex-config.xmlは以下のようになります。<object>タグ内の<source>タグには、Remote Objectとして作成するJavaクラスの完全修飾名を、<type>タグにはstateless-classかstateful-classのいずれかを指定します。
リスト3 flex-config.xml
&<?xml version="1.0" encoding="UTF-8"?> |
StatelessとStateful Remote Objectには、クラインアントからリクエストが来るたびにインスタンスを生成・破棄するStatelessなものと、一度インスタンスを生成するとそれを保持しておいて、以後、同一クライアントからのリクエストには、そのインスタンスが応えるStatefulなものの2種類があります。 今回のサンプルでは、サービスであるJavaクラスのインスタンス変数に保持しているMapオブジェクトに対して、アプリケーションサーバの追加や更新、削除などを行うため、毎回インスタンスを生成してしまうとインスタンス変数も初期化されてしまい、登録や更新、削除などが反映されなくなってしまいます。そのため、<type>にはstateful-classを指定しています。 |
■サービス(Remote Object)の作成
続いて、サーバサイドのサービス(Remote Object)を作成します。下のリストは、サンプルアプリケーションのRemote ObjectであるSampleappService.javaです。これをcairngorm-sample/src/sample/serviceに作成してください。
リスト4 SampleappService.java
package sample.service; |
Remote Objectは、特に継承すべき親クラスや実装すべきインターフェイスはなく、POJOとして作成できます。ここでは、BusinessDelegateから呼ばれるsearch(検索)、regist(登録)、update(更新)、remove(削除)の4つのメソッドを実装しています。今回は、サンプルということで実装を簡略化するため、実際にデータベースへのアクセスは行わず、インスタンス変数のMapに対して検索・登録・更新・削除を行っています。
インスタンス変数のMapは、コンストラクタの中で初期化され、“Tomcat”“WebLogic Server”“WebSphere Application Server”の3つのアプリケーションサーバを初期データとして保持しています。登録した順番を考慮してデータグリッドに表示させるため、Mapの実装クラスにはLinkedHashMapを使用しています。
1つのアプリケーションサーバは、製品コード、製品名、ベンダ、価格、備考の5つのキーを持った1つのMapで表しています。このMapがインスタンス変数のMapに製品コードをキーにして保持されています。こちらのMapは、キーの順番を考慮する必要がないので、Mapの実装クラスにはHashMapを使用しています(価格、備考に関しては、実際の製品のものではなく、サンプル用の適当な値です)。
Mapの中にMapが入る入れ子の構造になっているので、「そんなことしないでListの中にMapを入れていけばいいんじゃないの? そうすれば、LinkedHashMapなんて使わなくても登録された順番が考慮されるし」と思った方がいるかもしれません。確かに、Listの中にMapを入れていく方が分かりやすいのですが、これだと検索するときにListの中のMapたちを全件、走査していかなければなりません。Listの要素が少ない場合は、これでもいいかもしれませんがListの要素が多くなるにつれて、検索に掛かる時間はどんどん増えてしまいます。更新や削除を行う際も、まず更新・削除対象を特定するために検索を行うので、更新や削除にも時間が掛かってしまいます。
しかし、ListではなくMapを使うと、キーでアクセスできるため、検索が速くなります。これは、データベースにおけるインデックスを使った検索に当たります。データベースでもインデックスを使わない検索は、遅くなりますがListを使うのもそれと同じことです。そのような理由から、アプリケーションサーバを保持するオブジェクトは、ListではなくMapにしています。
1/2 |
INDEX |
||
連載:Flexのクライアントサイドをオープンソースで制覇する(5) Flexのフレームワーク、Cairngormでサンプルアプリ |
||
Page1 BusinessDelegateの作成 Servicesの作成/サービス(Remote Object)の作成 |
||
Page2 サーバサイドとの連携 サンプルアプリケーションの動作確認/まとめ |
- GASで棒、円、折れ線など各種グラフを作成、変更、削除するための基本 (2017/7/12)
資料を作る際に、「グラフ」は必要不可欠な存在だ。今回は、「グラフの新規作成」「グラフの変更」「グラフの削除」について解説する - GET/POSTでフォームから送信された値をPHPで受け取る「定義済みの変数」【更新】 (2017/7/10)
HTMLのフォーム機能についておさらいし、get/postメソッドなどの内容を連想配列で格納するPHPの「定義済みの変数」の中身や、フォーム送信値の取り扱いにおける注意点について解説します【PHP 7.1含め2017年の情報に合うように更新】 - PHPのfor文&ループ脱出のbreak/スキップのcontinue【更新】 (2017/6/26)
素数判定のロジックからbreak文やcontinue文の利点と使い方を解説。for文を使ったループ処理の基本とwhile文との違い、無限ループなども併せて紹介します【PHP 7.1含め2017年の情報に合うように更新】 - Spreadsheetデータの選択、削除、挿入、コピー、移動、ソート (2017/6/12)
Spreadsheetデータの選択、挿入、削除、コピー、移動、ソートに使うメソッドの使い方などを解説する
|
|