EclipseでEcho Struts

次は、Hello Strutsの一歩先をゆくEcho Strutsです。

ここでは、あまりEclipseの機能が使われていませんので、 Strutsを知ってる人、興味のない人は、読み飛ばしてくださいませ。

内容は、HTMLのFORMにメッセージを入れてリクエストを送り、 次の画面にそのメッセージを表示するというものです。 ここでは、新たにActionFormクラスというものを作成します。 Struts上で、HTMLのFORMの値が自動的にActionFormに代入されます。

Echo Strutsでは、以下のファイルを作成、編集します。
EchoForm.java ActionFormクラス
EchoAction.java Actionクラス
echo1.jsp 遷移元のJSP
echo2.jsp 遷移先のJSP
struts-config.xml 設定ファイル
プロジェクトはHello Strutsで使ったものを使います。

JSPの作成

遷移元画面(echo1.jsp)と遷移先画面(echo2.jsp)を作成します。

echo1.jsp

<html>
<body>

<h2>echo1</h2>

<form action="echo.do">
<input type="text" name="message">
<input type="submit">
</form>

</body>
</html>

echo2.jsp

<html>
<body>

<h2>echo2</h2>

<%= request.getAttribute("message") %>

</body>
</html>
request.getAttribute()は気にかかりますが、 とりあえず、ここでは簡単のため、こうしときます。

EchoFormクラスの作成

まず、hoge.EchoFormというクラスを作ります。 このクラスはorg.apache.struts.action.ActionFormを継承させます。 また、messageというprivateフィールドを作成します。
package hoge;

import org.apache.struts.action.ActionForm;

public class EchoForm extends ActionForm{

  private String message;

}

次に、messageフィールドのセッタとゲッタを作成します。 例によって、Eclipseの機能を使ってみましょう。

クラスの中で、右クリック->ソース->GetterおよびSetterの生成 を選択します。 messageにチェックを入れ、OKします。 セッタ、ゲッタが自動生成されましたね。

EchoActionクラスの作成

Eclipseを駆使して?、以下のEchoActionクラスを作成します。
package hoge;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

public class EchoAction extends Action{

  /**
   * @see org.apache.struts.action.Action#perform(ActionMapping, ActionForm, HttpServletRequest, HttpServletResponse)
   */
  public ActionForward perform(
    ActionMapping mapping,
    ActionForm form,
    HttpServletRequest request,
    HttpServletResponse response)
    throws IOException, ServletException {

    //EchoFormからメッセージを取得
    EchoForm echoForm = (EchoForm)form;
    String message = echoForm.getMessage();
    System.out.println("message=" + message);

    //遷移先のJSPに渡すメッセージをrequestに埋める
    request.setAttribute("message", message);

    return mapping.findForward("hoge");
  }
}

ここで注目すべきは、
request.getParameter("message");
でなく、echoFormから値を取得しているところです。

EchoForm echoForm = (EchoForm)form;
のキャストに違和感もありますが、 そんなものだと思ってください。

struts-config.xmlの編集

EchoFormクラスに名前をつけ宣言します。 <form-beans>のタグの中(下)に以下の記述をします。 例によって、元々あるlogonFormをコピーして値を書き換えて可。
    <form-bean      name="echoForm"

                    type="hoge.EchoForm"/>

EchoActionクラスの宣言を行います。 <action-mappings>タグの中(下)に以下の記述をします。

    <action    path="/echo"

               name="echoForm"

               type="hoge.EchoAction">

      <forward name="hoge" path="/echo2.jsp"/>

    </action>
nameにはechoFormを指定します。ここで、指定することで、 EchoActionのperformメソッドにEchoFormオブジェクトが引数で渡されるわけです。

再起動

では、Tomcatを再起動、、、をいちいち行うのは面倒なので、 Strutsのリロード機能を使います。ブラウザで、

http://localhost:8080/struts-test01/admin/reload.do

にアクセスします。これにより、struts-config.xmlの情報が更新されます。

実行

ブラウザで、

http://localhost:8080/struts-test01/echo1.jsp

にアクセスします。

テキストフィールドに適当な文字(日本語不可)を入れ、 ボタンを押します。

EchoActionが呼ばれ、コンソールにメッセージが出力された、 echo2.jspが表示され、入力した文字も表示されましたね。

Echo Strutsまとめ

ここでは、ActionFormクラスが登場しました。

FORMのリクエスト→Strutsくん→EchoForm

というふうに、普通ならrequest.getParameter(...)するところを Strutsくんが自動的にEchoFormクラスの入れ物に入れなおしていることが、 わかりますね。

「HTMLのFORMデータをサーバー側で取得する処理」というのは、 よくお目にかかる処理です。 こういう同じような共通処理をイチイチ毎回行わず、 Strutsくんが先に代表して処理して、Actionクラスの方では、 入れ替えた入れものからデータを取得するわけです。

ここでは、単にFROMデータをActionFormに詰め替えるだけでしたが、 入力チェックや、入力チェックでエラーがあった場合に前の画面にもどって、 エラーメッセージを表示する、といったよくある処理が、 Strutsフレームワークで用意されています。

このようなよくある同じような作業をStrutsくんが提供してくれることで、 Strutsを使う人は、作業が楽になるし、間違い(バグ)が少なくなります。

日本語メッセージを使うにはどうする、とかカスタムタグも使いたい、 とかいう人はこのへんをご覧ください。

(2002/10/3)


もどる