次は、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)