コントロール利用の流れ
では、ソースコードを見ていきましょう。ここでは、最初にいくつかのprivateフィールドが用意されています。「Form」「TextField」「Submit」「String」といったものです。これらのうち、Stringを除いた3つが「コントロール」のクラスを保管するためのものです。これらは、それぞれフォーム、入力フィールド、送信ボタンのコントロールクラスとなります。
続いて、初期化処理です。先のサンプルではコンストラクタを使いましたが、今回はあわせて「onInit」というメソッドを使ってみました。これは、Pageインスタンスが作成されたとき最初に呼び出されるメソッドで、Pageの初期化処理を用意するのに用いられます。今回は各コントロールクラスのインスタンスを作成した後、ここで表示メッセージの初期化をしています。
さて、今回のフォーム作成の部分を見てみると、以下のようになっていますね。
form = new Form("form");
input = new TextField("input","入力:");
submit = new Submit("submit", "送信");
これらのnewしている引数などをもう少し整理すると、次のようになります。
new Form( 名前 ) new TextField( 名前 , ラベル ) new Submit( 名前 , 表示テキスト )
Formクラスは<form>タグを生成するコントロールです。これは名前だけ引数に指定しておきます。<form>タグでは、methodやactionなどといった属性がいろいろと用意されていますが、Formコントロールでは、これらの指定は不要です。
TextFieldは、<input type="text">タグによる入力フィールドを生成するコントロールです。これは名前の他、第2引数にラベルを指定しています。このラベルは、入力フィールドの左側に表示されるもので、この項目の内容を示すのに使います。
これらのフォームから送信されたときの処理は、「onPost」というメソッドで行っています。これは文字どおり、POSTでアクセスされた際に呼び出されるメソッドです。Formコントロールを使って作成されたフォームは、送信ボタンで送信するとPOSTで自身に送られるようになっているので、ここに処理を用意すればよいわけです。
ここでは、input(TextFieldインスタンス)の「getValue」を呼び出しています。これは入力されたテキストを取得するもので、これを利用してmsgフィールドに表示メッセージを設定しています。
テンプレートへの出力は?
このメッセージはどこで表示されているのでしょうか。実は、メッセージを表示する処理はありません。Apache Clickでは、Pageクラスにあるpublicフィールドは、すべて自動的にテンプレートで使えるようになります。ここではpublic String msgとして表示メッセージを保管するようにしているので、そのままテンプレートに$msgと書けばmsgの内容が出力されるのです。
これはStringなどの変数だけでなく、フォームなどのオブジェクトについても同様のことが言えます。ここではFormそのものは作成していますが、これをどこかに組み込むような作業はされていません。ただFormフィールドを用意しておくだけで、テンプレート側の$formにフォームの内容が出力されていたのです。
では、publicにせず、手作業でテンプレートに値を渡したいときはどうすればよいのでしょうか。この場合には、フィールドをpublicではなくprivateなどに戻しておき、初期化の際に次のようなメソッドを使って必要な値をPageインスタンスに追加します。
addModel( 変数名 , 値 ); addControl( 変数名 , コントロール );
コントロール類は、addControlで組み込みます。その他の一般的な変数は、addModelで組み込みます。こちらは、既に先ほどのサンプルで使いましたね。明示的に値を設定する場合に、これらのメソッドが使われます。逆にいえば、特に理由がないなら、ただ単にpublicフィールドとして値をクラスに保管しておけばいい、ということですね。
