Beanクラスを作成する
では、このフォームを管理するBeanクラスを作成しましょう。先ほど、<stripes:form>タグでbeanclass="jp.codezine.HeloActionBean"と指定したので、jp.codezine.HeloActionBeanというクラスとして定義する必要があります。
package jp.codezine; import java.io.StringReader; import java.util.List; import net.sourceforge.stripes.action.*; public class HeloActionBean implements ActionBean { private ActionBeanContext context; private String input1; private String result; public String getInput1() { return input1; } public void setInput1(String input1) { this.input1 = input1; } public String getResult() { return result; } public void setResult(String result) { this.result = result; } @Override public ActionBeanContext getContext() { return this.context; } @Override public void setContext(ActionBeanContext context) { this.context = context; } @DefaultHandler public Resolution submit() { this.result = "こんにちは、" + this.input1 + "さん!"; return new ForwardResolution("/helo.jsp"); } }
これで完成です。実際にhelo.jspにアクセスし、フォームを送信してみましょう。Result:部分にメッセージが表示されます。1つのページで、フォームと送信後の表示を兼ねているわけです。
ActionBeanとWebページとの関係
このBeanクラスのように、JSPのページと連携して働くBeanは「アクションビーン(ActionBean)」と呼ばれます。これは、net.sourceforge.stripes.actionパッケージの「ActionBean」というインターフェースを継承して作成されます。これはActionBeanContextクラスの「context」というプロパティが必須となっているほか、必要に応じてプロパティ(フィールドとアクセサ・メソッド)やメソッドが用意されます。
ActionBeanでは、用意したBean内の要素と、Webページに用意された要素とが連動して動いています。ではHeloActionBeanクラスに用意されているものがどう機能しているのか見てみましょう。
1)フィールドとページの要素
HeloActionBeanには、input1とresultという2つのフィールドが用意されています。これらは、いずれもWebページ(helo.jsp)から利用するためのものです。input1は、フォームの<stripes:text name="input1"/>の値が格納されます。Stripesのタグを使って用意されたフォームのコントロール類は、ActionBeanクラスにある同名のフィールドに自動的に値が保管されるのです。
もう1つのresultは、helo.jsp側では${actionBean.result}として使われています。生成されたActionBeanクラスのインスタンスは、JSP側では「actionBean」という名前で用意されます。このresultプロパティを取得すればよいのです。
2)送信時の処理
フォームを送信した時の処理は、「submit」というメソッドとして用意しています。これは次のように定義されています。
@DefaultHandler public Resolution submit() {……略……}
フォームが送られると、@DefaultHandlerというアノテーションが設定されたメソッドが呼び出されます。アノテーションさえ指定してあれば、メソッド名などは変更してもかまいません。このメソッドでは、「Resolution」というクラスのインスタンスが返値となっています。これは、ActionBeanが呼び出された後に実行されるレスポンスを定義するものです。
ここでは、まずtext1の値を使って表示するメッセージを作成しresultに設定します。それから、「ForwardResolution」というクラスのインスタンスを作成し、returnしています。このForwardResolutionはResolutionのサブクラスで、引数に指定したアドレスにフォワードするためのものです。これにより、submit処理が終了した後、再びhelo.jspにフォワードされるようになるのです。
JSPとActionBeanの内容を見れば分かることですが、両者のつながりは、ただJSP側でbeanclassを指定し、ActionBeanのResolutionでJSPにフォワードする、というだけしかありません。フレームワークの多くは、こうしたビューとコントローラーの連携に関し、非常にしっかりとした定義がされているものです。設定ファイルに記述をしたり、あらかじめ決められた命名ルールに従ってクラスやメソッドを作成しますが、Stripesではそうした拘束は何もありません。ただ「ActionBeanインターフェースを実装する」というだけで、実に自由な設計を行うことができます。