タイトル倉橋浩一のWebObjects Practice》再利用可能なコンポーネントで“台紙に埋め込む”(1)カテゴリーWebObjects, 倉橋浩一のWebObjects Practice
作成日2001/10/31 16:56:35作成者新居雅行
【MDOnline読者様限定コンテンツ】

さて、WebObjects Practiceの第三回です。今回は、前回お送りするはずだったコンポーネント再利用について、ご説明します。

□概要と機能
コンポーネント再利用は、共通する要素などをコンポーネントとして作り、それを他のコンポーネントに貼付けることによって(この記事では「台紙コンポーネント」と呼ぶことにします)、実現します。再利用されるコンポーネント(「埋め込みコンポーネント」と呼びます)は、台紙コンポーネントからhtmlページを生成する時に展開され、一つのhtmlページとしてブラウザに返されます。

まず、WOBuilderを立ち上げて、空のコンポーネントを作ってみてください。WOBuilderのView切り替えボタンをクリックしてSource Viewでソースを表示させると、〜までのタグが表示されます。View切り替えボタンで"Layout View"に戻してからInspectorを見ると、"Full Document"と表示されたプルダウンメニューがあります。これを"Partial Document"に切り替えると「これを実行すると、BODYとその外側のタグは全部消してしまいますが、いいんですかい?」というダイアログが現れます。ここでContinueをクリックしてから再度Source Viewに切り替えると、すべてのタグがきれいさっぱり消えています。埋め込みコンポーネントとして使用するためには、必ず"Full Document"から"Partial Document"に切り替えて、台紙に貼付けた際に邪魔になるタグを消してやる必要があります。

埋め込みコンポーネントといえども、普通のコンポーネントと同様に、WOComponentをスーパークラスとするインプリメントクラスを持ちます。すなわち、LoginBox.woというコンポーネントには、LoginBox.javaが必要です。Login.javaを書く場合でも、特に普通のコンポーネントと違いはありません。actionメソッドを呼び出したり、アクセサメソッドを使ったりして、実装します。

このようにして作った埋め込みコンポーネントは、WOBuilder上で普通のエレメントと同様に扱うことができます。Add Custom WebObjectsアイコン(右端にある星印のようなアイコン)をクリックするとパネルが開きますので、WebObject class to use:に埋め込みコンポーネントとして使用するクラス名(先ほどの例では、LoginBox)を入力し、OKをクリックします。これで、埋め込みコンポーネントが台紙の上に配置されました。なお、埋め込みコンポーネントを台紙の上で使用する場合、台紙の上で「右寄せ」「センタリング」「左寄せ」などを設定してもWOBuilderでの表示には反映されません。ですが、実行結果にはちゃんと設定が反映されていますので、ご安心?ください。

なお、普通のエレメントと同様に扱うことができる、と書きましたが、足りないものがありますよね。そうです、普通のダイナミック・エレメントは、Attributeとして定数やkeyを設定することができますが、埋め込みコンポーネントをクリックしてもInspectorウインドウはからっぽです。でも、大丈夫、ご安心ください....ちゃんとAttributeを設定することができます。WOBuilder上で埋め込みコンポーネントを開いたら、アイコン列の下段、左から2番目にあるジグソーパズルのピースのようなアイコン"Show API Editor"をクリックしてください。"API Editor"が開きます。ここでは、Attributeの名前と、必須か否か、どのような値をセットすべきか、を設定することができます。例えば、"needPassword"という名前のAttributeを作ってbooleanの値を設定したい場合には、プラスマイナスアイコンから"Add binding"を選んで、Nameに"needPassword"を入力しValue Setとして"YES/NO"を設定します。ここで一旦OKをクリックして埋め込みコンポーネントを保存し、台紙コンポーネントを開いてその上に貼付けた埋め込みコンポーネントをクリックしてからInspectorを見ると、Attributeに"needPassword"が登録されているのがわかると思います。もう一度、埋め込みコンポーネントに戻って再度API Editorを開き、RequiedをcheckしてOKし保存してみると、今度は台紙の上のInspectorで"needAttribute"が必須をあらわす赤い字になります。このようにして、埋め込みコンポーネントと、台紙コンポーネントとの間でやりとりするためのAPIを設定してやることができます。なお、埋め込みコンポーネント側でAPIとして設定したNameは、埋め込みコンポーネントのインプリメントクラスの上でメンバかアクセサメソッドとして定義されている必要がありますので、注意しましょう。

また、API Editorでは、例えばWORepetitionなどのように複数のAttributeの組み合わせをチェックできるように設定することもできます。が、WebObjectsにしてはイマイチこなれていないというか、わかりにくい仕様になっています。ので、埋め込みコンポーネントを作る場合には、ここで悩まなければならないような複雑なAPI仕様にするよりも、極力シンプルなものにして仕様に合わないものは新しく作る、ぐらいの気持ちでつき合った方が、かえって生産性が高くなると思います。

以上が埋め込みコンポーネントに関する一般的なオペレーションです。次に、これをどのようにして活かすのかを見てみます。

□埋め込みコンポーネントの使い道
どんな時にコンポーネントを再利用するのでしょうか。

(1) 繰り返し使用する部品を作る
一番簡単な例としてメニューバーがあります。例えば10本程度Entityを持つ、データベースメンテナンスのためのアプリケーションを作っていて、ページ間をスムーズに移行するために全ページの最上部にメニューバーを設けたいとします。そのままですと、全部のコンポーネントにWOHyperlinkとアクション関数をcopy & pasteで貼付けてまわることになってしまいます。ですが、埋め込みコンポーネントを使えば、一つメニューバーを作った後は、これを各ページに配置するだけで共通のメニューバーを実装することができます。Entityが追加になったり、この部分のデザインが変更になった時、埋め込みコンポーネントならそれだけをいじれば済みます。埋め込みコンポーネントには、普通のコンポーネントとまったく同様にして使うことができますので、例えば会社のロゴを埋め込んだり、全ページにショッピングカートの簡易表示をしたり、ユーザへの注意を喚起するメッセージをデータベースから読み込んで自動的に表示させたり、というような「高機能な」部品を作ることができます。

私の会社には、このような埋め込みコンポーネントのストックが1000個ほどあります。まぁ、さすがに1000個もあるとさがすのが面倒でよく使うのはせいぜい50個程度なのですが....ID/PASSWORDでのログインとか、データベースからの自動メッセージ表示とか、カレンダー表示などの決まりきった処理は、これらを使いまわすことであっという間に実現することができてしまいます。

そのせいか、最近の私はどんどんコーディングする機会が減ってきています。これは生産性が上がるだけでなく、ミスをおかす機会も減るということです。活用しない手はありません。
(続く)
[倉橋浩一/テクニカル・ピット]
関連リンクWebObjectsのページ