MessageComponentを修正する(リンクを隠す)

「返信」や「削除」のリンクを表示しないで、純粋にメッセージの中身だけを表示したい場合があります。 そのために、これらのリンクを表示する、しないのバインディングを作っておきます。 MessageComponent.html(抜粋) <td align="right" nowrap> <span jwcid="showConditional"> <span jwcid="resActionLink">返信</span> <span jwcid="deleteActionLink">削除</span> </span> </td> MessageComponent.jw…

削除機能を仕上げる

DeletePageはこれで完成しましたが、このページを呼び出すためにMessageComponentも修正する必要があります。 今まで「返信」のリンクがあった隣に、「削除」というリンクを表示します。 MessageComponent.html(抜粋) <td align="right" nowrap> <span jwcid="resActionLink">返信</span> <span jwcid="deleteActionLink">削除</span> </td> 削除を追加しました。 Me…

削除機能を実装する

削除するには、削除用パスワードとの照合を行います。 削除ページ(DeletePage)を作る事からはじめますが、メッセージの表示などは今まで作ったコンポーネントを使い回しましょう。 DeletePageには、削除対象のメッセージオブジェクトをバインドします。 Dele…

削除機能を実装するために

Cayenneにおいて、データベースからデータを削除する事は非常に簡単です。 ただし、リレーションを張っている場合は注意する必要があります・・・って、これはリレーショナルデータベースを扱っていたら当たり前な事なんですけどね。実際に削除するためには…

TestPageを仕上げる

最後に、今まで作った二つのコンポーネントを使用するように、TestPageを変更したいと思います。 TestPage.html <html> <head><title>TestPage</title></head> <body> <span jwcid="submitComponent"/> <hr/> <div align="center"> <span jwcid="messageListComponent"/> </div> </body> </html> 今までメッセージのリストのループを記述していた部分がなくなり、と記述するだけになりました。 TestPage.page

MessageWithChildrenComponentを実装する

このコンポーネントはHTMLから見るのが分かりやすいかもしれません。 MessageWithChildrenComponent.html <table width="100%" border="1"> <tr> <td align="center"> <span jwcid="parentMessage"/> <span jwcid="childrenLoop"> <table> <tr> <td width="50"> <br/> </td> <td> <span jwcid="childMessage"/> </td> </tr> </table> </span> </td> </tr> …</table>

MessageListComponentを実装する

このコンポーネントには、親メッセージのリストをもつ必要があります。 また、MessageWitchChildrenComponentをループする必要があるために、リスト一つ一つのオブジェクトを保持するプロパティも必要になります。 MessageListComponent.jwc

TestPage.javaを改造する

getAllMessagesメソッドに2行追加して、親メッセージのみをフェッチするように変更します。 TestPage.java public List getAllMessages() { SelectQuery query = new SelectQuery("Message"); query.setLoggingLevel(Level.WARN); query.addOrdering("submit…

レスを表示するコンポーネントを作る

レスを表示するために、以下のようなものを考えました。 すんません・・わかりにくくて・・・まず、順に説明していきます。 TestPageがもつ、getAllMessagesメソッドでは、今は否応無しに全てのメッセージオブジェクトのリストをフェッチしますが、親メッセ…

MessageComponentとResPageの変更

このコンポーネントは返信機能を持っています。ここがネックでほとんどを変更せざるを得ませんでした・・ 返信機能はどのようになるのか、やってみたいと思います。修正前のソースはこんな感じでした。 MessageComponent.java(抜粋) public void resAction…

SubmitComponentの変更

ここでは、サブミットすべきMessageオブジェクトをVisitで保存しているcurrentMessageを使用する事にします。 SubmitComponentの持っているsubmitMessageプロパティを削除し、getSubmitMessageとsetSubmitMessageはvisitのcurrentMessageを参照するように変…

TestPageの変更

ここでは、getAllMessagesメソッド涼罎DataContextを生成してますので、visitから取得するように変更します。 TestPage.java package bbs.view; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFacto…

Visitの実装(その2)

Visitには、もう一つのプロパティを持たせる事にします。 それは、現在扱っているMessageオブジェクトという意味で、currentMessageというプロパティを追加します。 Visit.java public class Visit implements Serializable { private DataContext dataConte…

Visitの実装(その1)

Tapestryでは、通常のServlet APIを意識する必要が無いようになっています。 Tapestryでセッション情報を保持するのはVisitオブジェクトです。これは特定の形式を持つ必要は無いのですが、通常はJavaBeansの様にプロパティとアクセッサメソッドを持っていて…

恥を忍んでステートフルに改造する

ステートフルにする・・・それはつまり、セッションを使用するという事です。 このセッションの中に、そのユーザーに割り当てられたCayenneのDataContextを保存しておく事にします。 WebObjectsでいうところのEOEditingContextはCayenneのDataContextと同様…

ステートレスの夢、破れる・・・

掲示板なんだから、ステートレスで行きたい・・・というのは、Tapestry的には問題ありません。 気をつけなければならない点はいくつかありますが、ステートレスである必要のあるアプリケーション自体、それほど複雑にもならないでしょうから、それほど深刻に…

SubmitComponentを改良する

さて、問題解決にはどうしたら良いかと言うことです。SubmitComponentはpageBeginRenderメソッドでsubmitMessage変数を初期化します。この初期化自体はMessageオブジェクトのインスタンスを作るだけです。 SubmitComponent.java(抜粋) public void pageBeg…

ResPageを作る

返信ページには入力フォームと親メッセージが表示されているものとします。 これらはすでにコンポーネントとして作っていますので、新たに用意するものは特にありません。 ResPage.html <html> <head><title>ResPage</title></head> <body> <div align="center"> <span jwcid="messageComponent"/> </div> <hr/> <span jwcid="submitComponent"/> </body> </html> ページの上に引用元のメッセージが表示され(message…

返信機能をWebアプリケーションに組み込む準備

さてさて、Webアプリケーションの方の実装に移りたいと思います。 前に作ったMessageComponentに未実装のresActionというメソッドが残っていました。 ここに返信機能を実装する事にします。手順としては以下のような事を想定します。 「返信」がクリックされ…

返信機能をCayenneで表現すると

メッセージを投稿する所まで出来上がりましたので、次に返信を付ける機能を加えてみたいと思います。 メッセージに対して返信することを実現するためには、MessageオブジェクトのtoChildrenリレーションに返信Messageオブジェクトを加えてあげるという事で実…

投稿機能を付ける

メッセージのリスト表示が出来たので、次に投稿機能を付けてみましょう。例によって、コンポーネント化します。 投稿コンポーネントはSubmitComponentとして作り、それをTestPageに貼付けてみます。 SubmitComponentの構成ファイルは以下のようになりました…

MessageオブジェクトをTapestryで表示する(その4)

次に、MessageComponentを使用する、TestPageページを作ってみましょう。TestPageのHTMLはこんな感じになりました。 TestPage.html <html> <head><title>TestPage</title></head> <body> <span jwcid="messageLoop"> <span jwcid="messageComponent"/> </span> </body> </html> コンポーネント化をしたために、非常にシンプルです。TestPage.pageはこんな感じになりました。 TestPage.p…

MessageオブジェクトをTapestryで表示する(その3)

では、その1で示したモデル図に従って、MessageComponentを内包したTestPageを作ってみたいと思います。まずは、MessageComponentです。 このコンポーネントはMessageオブジェクトを一つもっている必要があります。 MessageComponent.java(Tapestry) /** *…

MessageオブジェクトをTapestryで表示する(その2)

Tapestryでは、PageとComponentと明確に別れています・・とは言っても、ファイル構成が一部異なるだけで、Javaクラス的にはどちらもAbstractComponentを継承したものになっています・・・たぶん・・・この辺まだ理解が足りてないので、嘘言ってるかもしれま…

MessageオブジェクトをTapestryで表示する(その1)

WebObjectsでは、当たり前のようにコンポーネント化をします。 この辺はWebObjectsでは非常に強力で、便利なコンポーネントも数多く用意されています。 Tapestryでも同じように、できるだけコンポーネント化を進めてみる事に挑戦してみます。まずは、試しにM…

Cayenneの簡単なテスト

では、Messageオブジェクトが出来上がったので、Cayenneのコーディングをやってみます。 WebObjectsのEOFに似ている事がよく分かると思います。まずは、新規のMessageオブジェクトをインサートしてみます。 インサートのサンプル(Cayenne) public void tes…

CayenneのDataObject定義

これから作ろうとするものは簡単な掲示板です。 投稿されたメッセージを時間順に表示し、返信もできるようにしてみます。まずは、データをどのように定義するかと言う事で、最初にやる事はDataObjectを定義する所から始まります。DataObjectとはEOFで言う所…

導入

ようやくめどがついたので、ぼちぼち書きはじめよっかなと思います。 まず、なぜこんな事を調べはじめたかをぼちぼちと。日頃はWebObjectsでWebアプリを作る仕事をしてます。 なぜWebObjectsか?? それは、悲しいかな、我々みたいな弱小ディベロッパー(し…

CayenneとTapestryでBBSづくり(独り言)

空いた時間を見つけてぽちぽち作ってみているが、なるべくコンポーネントの使い回しみたいな事やろうとしていて、はまっている(涙) ネックはステートレスなアプリを作るのと、コンポーネントの使い回しは結構相反するようなところがあって・・・しかもCaye…

オンライン出版、成功の鍵は「PDFファイルでのタイムリーな刊行」

http://hotwired.goo.ne.jp/news/news/business/story/20040823105.html オンライン出版を行っているTidBITSのお話。(昔はお世話になりました) 日本では小額決裁システムがネックか? 米アドビシステム社が開発したPDFフォーマットには数々のデジタル著作…