FormとActionとJSPについてのトピック
seasarのホームページのチュートリアル ,機能リファレンス に詳しく書かれているのだが、私なりにJSPとFormとActionについてのトピックをまとめて見た。
Formクラス
フォームのクラス名は最後にFormで終わるようにする。
入力フォームのJSPのパラメータが存在する場合は、入力値を受け取るために Formクラス(Formクラスを使わない場合は Actionクラス)のpublicフィールドに、同じ名前の変数を宣言する必要がある。
当然の事であるが、逆にJSPページのForm変数に無い変数を、FormクラスやActionクラスのフィールドとして宣言しても問題は無い。
入力値を受け取るためのプロパティ(publicフィールド変数)は、検証エラーになっても値を格納できるように、String型かboolean型で定義する必要がある。
フォームはデフォルトではREQUESTスコープである。
以下にFormクラスの例を示す。
package mySAStruts.form; public class YyyForm { public String name; public String departmentName; public String salary; }
Actionクラス
Actionクラスの例を下記のリストに示す。
package mySAStruts.action; import javax.annotation.Resource; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.seasar.struts.annotation.ActionForm; import org.seasar.struts.annotation.Execute; import mySAStruts.dto.YyyDto; import mySAStruts.form.YyyForm; import mySAStruts.service.YyyService; public class XxxAction { @ActionForm @Resource protected YyyForm yyyForm; @Resource protected YyyDto yyyDto; @Resource protected YyyService yyyService; @Resource protected HttpServletRequest request; @Resource protected HttpServletResponse response; @Resource protected HttpSession session; @Resource protected ServletContext application; @Execute(validator = false) public String index() { return "index.jsp"; //return "../exsample1/index.jsp"; //return "/exsample2/index.jsp"; // 既にレスポンスに出力済みの場合は、遷移先(戻り値)はnull // return null; // リダイレクトで遷移したい場合 //return "xxx.jsp?redirect=true"; // リダイレクトで遷移したい場合でパラメータが別にある場合 //return "xxx.jsp?key=value&redirect=true"; // 別のサイトに遷移したい場合 //return "https://ホスト名/アプリケーション名/パス/?redirect=true"; } // <input type="submit" name="result" value="確認"/> //@Execute(validator = true, input = "index.jsp") //@Execute(validate = "validate", input = "login.jsp") @Execute(validator = false) public String result() { //return "../exsample1/result.jsp"; return "/exsample2/result.jsp"; } // URLでリダイレクトを指定 @Execute(redirect=true, validator = false) public String index2() { return "../exsample1/"; } // <a href="edit/1">編集画面へ</a> @Execute(urlPattern = "edit/{id}") public String edit() { return "xxx.jsp"; } }
Actionクラスのクラス名がXxxActionだからと言って、Form,Dto,Serviceクラスのクラス名をXxxForm,XxxDto,XxxServiceと必ずしも同じ名前に合わせる必要は無い。
Formクラスの場合は通常はActionクラスと同じ名前に合わせる場合が多いが。他のActionとFormクラスを共通で使う場合は別のクラス名を使う事になる。
DtoとServiceはデータベースのエンテイテイと関連した名前を付ける事が多いのでActionの名前にこだわらずに名前を付ける事になる。
Form,Dto,Serviceの変数名はクラス名の先頭を小文字にした名前を付けないとエラーとなってしまう。
Servletでおなじみの、HttpServletRequest.HttpServletResponse .HttpSession ,ServletContext の変数名は、クラス名にこだわらずに自由に変更できる。
実行メソッドに対する@Executeの指定にはいろいろなパターンがありえるので、いくつかのパターンをコメントで示してある。
redirectの指定でのtrue(リダイレクト)とfalse(フォワード)の違いについては、@IT:Java TIPS -- リダイレクトとフォワードの違いを知るが参考になる。
実行メソッドのreturnで返す遷移先のパスの指定では、XxxActionの場合は「Webアプリケーションのルート/xxx/」がカレントパスとなる。
Webアプリケーションのルートからの指定や、カレントからの相対パス指定も可能である。
例えば、「Webアプリケーションのルート/exsample1/」にあるindex.jspに遷移させるには、「../exsample1/index.jsp」または「/exsample1/index.jsp」を指定して、別のActionのJSPページに遷移させる事も可能である。
共通のJSPファイルに対して、複数のアクションから遷移したい場合には有効である。
JSP
SAStrutsではカスタムタグを使うのに通常のStrutsと違って、各JSPページの先頭でtaglibを宣言せずに使う事ができる。
これは/プロジェクトルート/src/main/webapp/WEB-INF/view/common/common.jspにあらかじめ必要と思われるタブライブラリのtaglib宣言が含まれており web.xmlのinclude-preludeタグにて、common.jspを各ページのヘッダとしてインクルードするようにあらかじめ設定されているためである。
web.xmlのinclude-preludeタグについては@IT:Java TIPS -- 個別のJSPページでJSTL宣言を省略するを参照。
逆に言えば新たに使いたいタグライブラリがあるならそのタグライブラリの宣言をこのcommon.jspに追加すればどの jspファイルからも宣言なしで使う事ができる。
JSPで使えるSAStrutsのカスタムタグ,el式については下記のURLが参考になる。