次は、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 | 設定ファイル |
遷移元画面(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()は気にかかりますが、 とりあえず、ここでは簡単のため、こうしときます。
package hoge; import org.apache.struts.action.ActionForm; public class EchoForm extends ActionForm{ private String message; }
次に、messageフィールドのセッタとゲッタを作成します。 例によって、Eclipseの機能を使ってみましょう。
クラスの中で、右クリック->ソース->GetterおよびSetterの生成 を選択します。 messageにチェックを入れ、OKします。 セッタ、ゲッタが自動生成されましたね。
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;
のキャストに違和感もありますが、
そんなものだと思ってください。
<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が表示され、入力した文字も表示されましたね。
ここでは、ActionFormクラスが登場しました。
FORMのリクエスト→Strutsくん→EchoForm
というふうに、普通ならrequest.getParameter(...)するところを Strutsくんが自動的にEchoFormクラスの入れ物に入れなおしていることが、 わかりますね。
「HTMLのFORMデータをサーバー側で取得する処理」というのは、 よくお目にかかる処理です。 こういう同じような共通処理をイチイチ毎回行わず、 Strutsくんが先に代表して処理して、Actionクラスの方では、 入れ替えた入れものからデータを取得するわけです。
ここでは、単にFROMデータをActionFormに詰め替えるだけでしたが、 入力チェックや、入力チェックでエラーがあった場合に前の画面にもどって、 エラーメッセージを表示する、といったよくある処理が、 Strutsフレームワークで用意されています。
このようなよくある同じような作業をStrutsくんが提供してくれることで、 Strutsを使う人は、作業が楽になるし、間違い(バグ)が少なくなります。
日本語メッセージを使うにはどうする、とかカスタムタグも使いたい、
とかいう人はこのへんをご覧ください。
(2002/10/3)