タイトル倉橋浩一、じつはWebObjectsで飯食ってます》掲示板を機能アップして複数の掲示板に対応(3)コーディングと実行カテゴリーWebObjects, 倉橋浩一、じつはWebObjectsで飯食っています
作成日2001/10/30 17:21:10作成者新居雅行
□コーディングを行う
さて、コーディングです。ここではコードの説明だけにしますので、ソースコードは以下のアドレスからダウンロードしてください。

 http://mdonline.jp/figs/01/0032/SimpleBoard.sit

―――コンストラクタ Main:
このコンポーネントの中で使用するフラグ類を初期化しておきます。また、refetch()を呼び出して、掲示板display groupにデータベースからデータを読み込んでいます。これはWOBuilderのdisplay group optionでも設定することができますが、ここではあえてプログラム中で実行しています。

―――actionMessageList:
前回使用したものは次のページを生成しただけでしたが、今回は

1.次のページを生成する
2.クリックされたBoardを生成したページに渡す

という処理を追加しました。また、これに関連して、MessageListPage.javaにはboardを受け取るためのメソッド(setBoard)を追加し、

 

MessageListPage.woでdgMessageを開いて、次の図ように設定しました。これは、BoardからMessageへのto manyリレーションを利用して、選択したボードに含まれるメッセージのみを表示するための設定です。

 

MessageListPage.javaのsetBoardでは、受け取ったboardをsetMasterObjectによって、to manyリレーションの親となるオブジェクトを指定し、fetchしています。display group optionパネルで"fetch on load"のチェックを外したのは、ここ(setBoard)でfetchしているからです。

―――actionDelete:
ここでは、削除パネル?を有効にするためにdeletingをonにして、削除しようとするboardを選択しています。削除パネルはdeletingとバインドされたWOConditionalによってon/offされますので、deletingはプログラマが明示的に管理してやる必要があります。

―――actionEnterPass:
パスワード欄に入力した文字列とデータベースの"password"に記録されている文字列とが一致している場合のみ、現在選択されているboardを削除し、これをデータベースに反映させます。その後で削除パネルを閉じるためにdeletingをfalseにしています。

―――actionPassCancel:
削除パネルを閉じるためにdeletingをfalseにし、念のためにデータベースへの変更を破棄しています。削除処理で実際に削除を行うのはactionEnterPassが呼び出されてからなので、ここが呼ばれたときには変更されていないはずなのですが、後で仕様が変わった時などの予防のために入れておきます。

―――actionSearch:
検索キーワードが入力されたら、検索文字列の前後に"*"を付けて「検索文字列がどこかに含まれる」という条件を作り、ソート条件とともにEOFetchSpecificationを作ります。EOFetchSpecificationは、その名の通り条件を記述するオブジェクトで、この他にも多彩な機能があります。そして、この条件に基づいてデータベースからデータを取り込みます。ここではobjectsWithFetchSpecificationを使っていますが、これはオーバーヘッドが少なく無駄なレコードを取り込むこともありません。

―――hasResult:
actionSearchで検索を実行しますが、条件に合致するレコードがあった場合にはtrueを返します。これを使って、検索結果がある時だけ一覧表を表示するようにしています。

―――inserting:
現在、掲示板を追加するための処理をしている最中か否かを返す関数です。実際には、「挿入中のレコードがあればtrueを返す」という処理になっていますが、このアプリケーションでは一度に一つの掲示板しか追加できないようにしていますので、これでも問題ないわけです。

―――actionInsert:
deletingをoffにしてもし開いていれば削除パネルを強制的に閉じ、念のためデータベースへの変更を破棄してから、insert()で新しいレコードを追加します。

―――actionSaveInsertion:
新規に追加したレコードにちゃんとデータが入力されていることを確認した上で、掲示板を作成した日時を記録します。その上で、データベースに変更を保存してから、念のためにrefetchを呼び出します。ここではupdatedDisplayedObjects()だけでも十分なことが多いのですが、同時にアクセスしている他のユーザが掲示板を追加しているかもしれませんので、それを反映させるためにfetch()も実行しています。エラー処理はごく単純なもので、エラー内容を標準出力に表示するだけです。

―――actionCancelInserting:
actionInsertで追加しようとしたレコードをキャンセルしています。ここでもrefetch()を呼び出していますが、これはactionSaveInsertionと同じ理由です。

―――refetch:
データベースからデータをfetchし、display groupに設定されたソート順を反映させます。あえてprivateにしてありますが、こうすると他のクラスから呼び出すことができなくなり、WOBuilderにも表示されなくなります。今回のアプリケーションのような小規模なものでは特に必要ないのですが、大規模になってくるとWOBuilderに関数や変数がびっしりと表示され、なかなか目的のものがみつからない、なんてことも多々あります。ので、外から呼び出す必要のないものにはprivateを設定して隠してしまうことで、作業しやすくします。

□掲示板アプリケーションを実行
では、とりあえずbuild&runしてみます。最初の起動状態がこれです。まだ何も登録されていないので、非常に素っ気ない状態ですね(実は登録しても、寂しい画面ですが)。

 

次に、「(新規登録)」をクリックしてみます。掲示板登録パネルが出てきました。

 

掲示板名などを入力して「登録」をクリックすると、掲示板名が登録され、一覧表にあらわれるとともに、掲示板登録パネルが消えます。「登録」のかわりに「キャンセル」をクリックしても、パネルは消えます。これは、Main.javaのpublic boolean inserting()ではediting contextに挿入中の(かつデータベースに書き込まれていない)eoがある時だけtrueを返し、これによって掲示板登録パネルを囲ったWOConditionalで制御しているからです。

 

ここで掲示板名をクリックするとメッセージ一覧画面に変わります。が、何も登録していないので、当然何も出てきません。ので、適当なメッセージを入力してから掲示板一覧に戻り、もう一つ掲示板を登録してから、その掲示板にもメッセージを登録します。で、掲示板一覧からそれぞれの掲示板名をクリックすると、めでたくその掲示板に属するメッセージだけが表示されます。

さらに、キーワードを入力して「検索」ボタンをクリックすると、そのキーワードが含まれる掲示板が一覧表示されました。

 

削除をしてみます。「削除」をクリックすると削除パネルが現れます。

 

パスワードを入力して「削除」ボタンをクリックすると、掲示板名一覧表から消えます。
(続く)
[倉橋浩一/テクニカル・ピット]
関連リンクWebObjectsのページ