タイトル【MacWIRE配信予定】倉橋浩一、じつはWebObjectsで飯食ってます》掲示板にコメント機能を追加してを仕上げる(1)カテゴリーWebObjects, 倉橋浩一、じつはWebObjectsで飯食っています
作成日2001/12/1 14:44:7作成者新居雅行
―――最終回
ずいぶん長く引っ張ってしまいましたが、今回がWebObjectsによる電子掲示板の最終回です。残っているコメント機能を片付けてしまいましょう。

えー、前回の記事で、「あれから8か月」などと書いてしまいましたが、実はあの部分を書いたのは9月でして....それからさらに2か月経ってしまったんですね...申し訳ありませぬ。商売柄、あちこちのWebObjectsサイトを拝見させていただいているのですが、時々、この連載の電子掲示板をベースにしたアプリケーションをお見かけすることがあります。ここで作っているのは電子掲示板なんですけども、画面のデザインやタイトルを変えたり、フィールドを増やしたりすれば、スケジュール帳や顧客問合せページ、ニュースリリースページなどに応用することもできます。今回追加するコメント機能と、それを実現するためのコンポーネント再利用技術は、他のツールと比べても格段に簡単に利用できて、かつ非常に有用なものです。皆さんのお役に立てば幸いです。

―――その前に....
前回リリースしたバージョンにバグがありました。えー、メッセージ一覧から削除を選んで、メッセージ画面で「一覧に戻る」を選ぶと、メッセージ一覧に戻っても何も表示されなくなってしまうという現象です。これは、MessagePage.javaのlsetMessageForDeleteが呼び出されたときに、boardの設定を忘れていたのが原因です。同様にMessageListPageから呼び出されるsetNewMessageでは

board = (EOEnterpriseObject)newMessage.valurForKey("board");

という処理が入っているのですが。というわけで、setMessageForDelete(EOEnterpriseObject value)の最後、newMessage = value;の次に、

board = (EOEnterpriseObject)newMessage.valueForKey("board");

を追加してやります。

いやはや....。

―――概要
コメントとは、一つのメッセージに対して書かれたメッセージです。一つのメッセージは複数のコメントを持つことができます。コメントもまたメッセージですから、コメントがさらに複数のコメントを持つこともできます。
一つのレコードから他のレコードを指す、あるいは一つのレコードが複数のレコードを指すのは、まさにリレーションです。前者がto one、後者がto manyリレーションと呼ばれます。説明が前後してしまいましたが、前回作った「掲示板(Board)が複数のメッセージ(Message)を持っている」というのも、まさにこの構造です。
WebObjectsのデータベース環境は非常に柔軟なので、自分自身に対してリレーションを張ることもできます。今回のメッセージ―》コメントの構造はまさにこの特性を利用しています。

コンピュータ技術(より正確には数学)の世界には、昔から「再帰」というテクニックがあります。例えば、樹木のように「幹が枝にわかれ、枝がさらに細い枝にわかれていて、細い枝はさらに細い枝にわかれていて....」というような構造を定義する場合に、「枝は複数の"子"枝に分かれている」という定義をしてあとは自分自身を参照していくことで全体を表現してしまおう、というものです。
今回は、これをWebObjectsのGUI上で使ってみました。実は、WebObjectsで使ってみるのは初めてだったのですが、やってみたらうまく行ったので、ちょっと感動してます^^;。

―――再帰のための準備
再帰を使うためには、一つのメッセージ表示のための部分が、他のメッセージ表示部分を所持する、という構造を用意する必要があります。通常であれば、一つのメッセージを表示するためにWOStringを並べて、その下にメッセージのto manyリレーションであるcommentsをlistにバインドしたWORepetitonを用意し、その中でまたメッセージを表示する、というのが一般的だと思います。ただ、この場合、階層が1つか二つならいいですが、何階層あるかわからないような場合に対応できません。そこで前述の再帰を使って、一つのメッセージとそのコメントを表示するコンポーネントを作ります。ここで、コメント表示部分に、コンポーネント自分自身を埋め込むのがミソです。
これにはコンポーネント再利用と呼ばれるテクニックを用います。WebObjectsには、プログラマが定義したコンポーネントをあたかも既成のエレメントのようにして他のコンポーネントに埋め込むことができる、という機能があります。ので、一つのメッセージを表示するためのOneMessageBoxというコンポーネントを作り、メッセージの内容を表示するTABLE一つと、その下にcommentsを表示するためのWORepetitionを設け、WORepetitionの内側にOneMessageBoxを配置します。

では、実際にやってみましょう。まず、ProjectBuilder上でWOComponentsグループを選び、cmd+Nで新しいコンポーネントを作り、OneMessageBoxとします。前回まで新しいコンポーネントを作る場合には、名前を「〜Page」にしていましたが、ここでは「Box」にしています。これは、これが埋め込みコンポーネントであることを明示するために私が使っているルールで、他の名前でももちろん構いません。
次に、WOBuilderでOneMessageBox.woを開きます。Page Inspectorを見ると、まん中へんのポップアップメニューに"Full Document"とありますが、これを"Partial Document"に切り替えてください。すると、次のようなダイアログが出ます。

 

「部分コンポーネントに切り替えると、BODYとその外側のタグを全部消しちまいますぜ。もしそういうタグのどれかを消したいだけだったら、Source Viewモードで直接編集した方がいいです。続けますか?これはundoできないですよ」てな意味ですが、そもそもそのためにPartial Documentに切り替えたのですから、"Continue"をクリックします。すると画面が灰色になります。これは背景色の設定が無効になったことによるものです。
(続く)
[倉橋浩一/テクニカル・ピット]
関連リンクWebObjectsのページ