シリーズJavaの画面表示のつづきです。今、Strutsを具体的な例をあげてやってます。手順は、以下のとおりです。
1.画面遷移を考える。
2.(別にやんなくてもいいけど)それを以下のように図にしておくと、あとで楽です
3.画面のJSPを作成します
4.Strutsタグをいれて、JSPを修正します
5.画面に対応するActionFormを作ります
6.Submitでサーバーで処理するところに対応する、Actionを作ります
7.struts-config.xmlを設定します
8.モデルを作って、Actionから呼び出します
前回5まできたので、今回は「Submitでサーバーで処理するところに対応する、Actionを作ります」です。
■Actionでやること
まず、Actionでやることですが、これは、以下のことです。
・入力データを取得する
・モデルとなるメソッドを呼び出す
・次画面のデータをセットしてフォワードする
以下、その方法を書きます。
●入力データを取得する
まず、入力データがあるということは、入力してもらった画面があるはずで、
その画面は、前回のActionForm作成により、ActionFormを継承したクラスができているはずです。
で、そのクラスをキャストして、画面のクラスを取得します。
inputForm inputform = (inputForm)form; |
そしたら、モデルで使う値を取得します。
ActionFormを作ったときに、getterをつくってるはずなので、それを使いましょう。
String nyuryoku = inputform.getNyuryoku(); |
●モデルとなるメソッドを呼び出す
これは、普通に呼び出して、返り値を取得します。
// モデル呼び出し Shori1 shori1 = new Shori1(); String kekka = shori1.rituKeisan(nyuryoku); |
●次画面のデータをセットしてフォワードする
モデルの値に応じて、次画面を書き出すわけですが、それには、
・まず、次画面のActionFormを生成して
(次画面が、入力画面と同じActionFormなら、生成しないで、それを使いまわしてOKです)
kekkaForm kekkaform = new kekkaForm(); |
・値を設定して(setterを使いましょう)
kekkaform.setRitu(kekka); |
・それをsetAtributeします
このとき、Atributeの名前は、bean:writeタグ等のnameになります。
request.setAttribute("kekkaForm",kekkaform); |
・そしたら、フォワードします
といっても、いままでみたいに、
getServletContext().getRequestDispatcher("/jsp/index.jsp").forward(request,response);
とやるのではなくて!!以下のように書きます。
return map.findForward("success"); |
ここで、successとか名前をおくっていますが、この名前は、前に書いた図のところに描いたものです(図を描いていないなら適当に決めてください)。
この名前と、呼び出すファイルの関係は、後の工程である「7.struts-config.xmlを設定します」で行います。
●クラスとメソッドについて
クラスは、以下のものをインポートし
import javax.servlet.http.*;
import org.apache.struts.action.*;
以下のような感じで、executeメソッドをつくって、その中に、上記のものを書きます。
package pac1; import javax.servlet.http.*; import org.apache.struts.action.*; public final class ShoriCtrl extends Action { public ActionForward execute (ActionMapping map, ActionForm form, HttpServletRequest request, HttpServletResponse response) { // ここに上記処理を書く } } |
●具体例
ここまでをまとめて、今回の具体例に沿って書くと、こんなかんじになります。
package pac1; import javax.servlet.http.*; import org.apache.struts.action.*; public final class ShoriCtrl extends Action { public ActionForward execute (ActionMapping map, ActionForm form, HttpServletRequest request, HttpServletResponse response) { // データの入力 inputForm inputform = (inputForm)form; String nyuryoku = inputform.getNyuryoku(); // モデル呼び出し Shori1 shori1 = new Shori1(); String kekka = shori1.rituKeisan(nyuryoku); // エラー時の出力 if ( kekka == null ) { errorForm errorform = new errorForm(); errorform.setMsg("NO DATA!"); request.setAttribute("errorForm",errorform); return map.findForward("error"); } else if ( kekka.equals("NO DATA!") == true) { errorForm errorform = new errorForm(); errorform.setMsg("NO DATA!"); request.setAttribute("errorForm",errorform); return map.findForward("error"); } // 正常時の処理 kekkaForm kekkaform = new kekkaForm(); kekkaform.setRitu(kekka); request.setAttribute("kekkaForm",kekkaform); return map.findForward("success"); } } |
■注意点その他
●Action入力画面について
今回のActionは、error.jsp,input.jsp2つの画面から入力されていますが、どちらも、inputFormクラスを使って、入力データを処理しています。
このように、入力のActionFormは1つですので、いくつかの画面から入力して、同じActionに行く場合、どの画面も同じActionFormが使えるように、入出力項目は、同じ名前にしないとまずいです。
(input.jspで文字入力のところのプロパティをnyuryokuにしてるのに、error.jspでinputDataにするのは、まずい)
●モデルができるまえに
ActionFormは、画面が決まれば自動的に作れますし、Actionも、上記のように遷移が決まれば、モデル呼び出し以外はつくれます。
そこで、モデルを呼び出さないで、(モデル部分のダミーモジュールを作ってもOK!)とりあえず作ってしまい、画面だけは確認するっていうのもありというか、テストファーストなら、そうすべきなのかな。。
ということで、Actionまで終わったので、
このシリーズの次回は、「7.struts-config.xmlを設定します」です。