SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Javaで軽快に使える「軽量フレームワーク」特集

Javaで軽快に使える「軽量フレームワーク」特集
~小さなライブラリ1つで動くStripes Framework(3)

第19回

JSPの作成

 では、ページとして表示されるJSPファイルを作成しましょう。helo.jspを次のように書き換えてください。

<%@ page language="java" contentType="text/html; charset=utf8"
    pageEncoding="utf8"%>
<%@ taglib prefix="stripes"
	uri="http://stripes.sourceforge.net/stripes.tld"%>
<stripes:useActionBean var="helo" beanclass="jp.codezine.HeloActionBean" />

<stripes:layout-render name="/layout/default.jsp">
  <stripes:layout-component name="html_head">
    <title>Helo Sample</title>
  </stripes:layout-component>
  <stripes:layout-component name="contents">
    ※これは、レイアウトを使ったページの表示です。
    <div id="msg">${helo.result}</div>
    <stripes:form beanclass="jp.codezine.HeloActionBean">
      <stripes:text name="input1" />
      <stripes:submit name="submit" value="Submit" />
    </stripes:form>
    <hr>
    <ol><%
    if (helo.getMessages() != null)
      for(String msg:helo.getMessages())
        out.println("<li>" + msg+ "</li>");
    %></ol>
  </stripes:layout-component>
</stripes:layout-render>
フォームを送信するとどんどんリストに追加されていく
フォームを送信するとどんどんリストに追加されていく

 フォームから送信すると、フォームの下に新しいものから順に表示されます。ここでは、<stripes:useActionBean>タグを利用してHeloActionBeanを"helo"という変数名で利用できるようにしています。そして、

for(String msg:helo.getMessages())
  out.println("<li>" + msg+ "</li>");

 このように繰り返しを使い、getMessagesして得られたListから順にテキストを取り出して出力しています。<stripes:useActionBean>タグは前回、既に登場していますが、値はリクエストごとに消えていました。今回は、送信された値が常に保持され続けるようになっていることが分かります。

 またセッションに保管することにより、フォーム送信後も入力フィールドの値が保持されるようになっていることに気づいたことでしょう。このように「フォームに入力された値の保管」にもセッションは利用できます。

複数ハンドラへの対応

 セッションに値が保管できるようになると、保持したデータをさまざまな形で操作できるようにしたくなります。それにはデフォルト・ハンドラだけでなく、さまざまな操作に応じて処理する複数のハンドラを利用できるようにする必要があります。このための機能も、追加したプラグイン・ライブラリに用意されています。

 実際にサンプルを作りながら説明をしていきます。先ほどのhelo.jspで、<stripes:form>タグ部分を次のように修正してみます。

<stripes:form beanclass="jp.codezine.HeloActionBean">
  <stripes:text name="input1" />
  <stripes:submit name="submit" value="Submit" />
  <stripes:submit name="reset" value="Reset" />
</stripes:form>

 見れば分かるように、<stripes:submit>タグが2つになっています。1つはsubmit、もう1つはresetという名前にしてあります。これらをクリックしたとき、それぞれに対応する処理を実行させるようにしましょう。

public class HeloActionBean implements ActionBean {
  
  ……中略……
  
  @DefaultHandler
  public Resolution submit() {
    if (messages == null) messages = new ArrayList<String>();
    messages.add(0,this.input1);
    result = "「" + input1 + "」を追加しました!";
    return new RedirectResolution("/helo.jsp");
  }
  
  @HandlesEvent("reset")
  public Resolution resetMessages() {
    messages.clear();
    result = "データを初期化しました。";
    return new RedirectResolution("/helo.jsp");
  }

}
resetボタンを押すと、データが初期化され消える
resetボタンを押すと、データが初期化され消える

 今回は、メッセージの投稿とリセットの2つの機能を用意してあります。Submitでメッセージを送信し、Resetですべてのメッセージを消去します。submitメソッドは、従来と同様に@DefaultHandlerを指定してあります。そしてもう1つのreset用のイベントハンドラは、resetMessagesというメソッドとして用意されています。このメソッドでは、次のようなアノテーションが設定されています。

@HandlesEvent("reset")

 これは、そのメソッドがイベントハンドラで呼び出されるメソッドであることを示すものです。引数には、ハンドルするイベントの名前を指定します。これにより、"reset"という名前で送られたイベントをこのメソッドでハンドリングするようになります。このアノテーションを利用すれば、いくらでもハンドラ・メソッドを用意することが可能になります。

 実を言えば、@HandlesEventがなくともハンドラ・メソッドを置くことはできるのです。メソッド名をresetにしておけば、resetボタンが押されたとき、正しくメソッドが実行されるようになります。<stripes:submit>で送信すると、Stripesは同じ名前のメソッドをActionBean内から探し、見つけるとそれを実行するのです。そして見つからなければ、デフォルト・ハンドラを実行します。@HandlesEventを利用することで、自由にイベントとメソッドを結びつけることができるようになる、というわけです。

次のページ
ロングイベントの利用

この記事は参考になりましたか?

Javaで軽快に使える「軽量フレームワーク」特集連載記事一覧

もっと読む

この記事の著者

掌田 津耶乃(ショウダ ツヤノ)

三文ライター&三流プログラマ。主にビギナーに向けたプログラミング関連の執筆を中心に活動している。※現在、入門ドキュメントサイト「libro」、カード型学習サイト「CARD.tuyano.com」を公開...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/5261 2010/07/16 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー