- - PR -
validatorの遷移先が同一画面の場合について
1
| 投稿者 | 投稿内容 | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-09-14 18:38
お世話になっております。
下記のような画面でstruts validatorを使用したいと考えています。 [JSP名=test.jsp] 1.DBから取得した情報をテーブル形式で表示 2.テーブルの1行につきチェックボックスを1つつける 3."削除"ボタンを押すと、チェックされたレコードをDBから削除 4.チェックを1つもつけずに"削除"ボタンを押した場合は 同じ画面上にエラーメッセージを表示する 4のActionMappingでvalidateを行うため、 ActionMappingのinput属性に"test.jsp"と記述したところ、 jspでエラーが発生しました(テーブルのデータがないため)。 そこでお尋ねしたいのですが、 エラー後の遷移先が同一画面上の場合は、 その画面に必要なデータを再度取得し、 requestなどに設定する必要があるものなのでしょうか? (web aplicationの基本的なことかもしれませんが、 よろしくお願いします。) | ||||||||||||
|
投稿日時: 2004-09-16 21:39
以前多分同じような状況だったとき、私がやった方法はこんな感じです。
・前提となる状態 a.viewActionとregisterActionがある b.viewActionで画面に必要なデータ作成->forwardでjspファイル表示->画面からsubmitでregisterAction実行->validatorで弾いた場合にはjspファイルに戻す(viewActionに戻すと入力された値が保存できないのでこうするしかない?) c.formはrequestスコープ ↑こんな感じの場合に 1.viewActionで必要な情報を取得し、formにはsetせずに、HttpSessionに格納する session.setAttribute("hogelist", hogeHogeList); 2.jsp内で1のlistをsessionから参照する。 <bean:define id="hoge" name="hogelist" scope="session" /> <html:select name="registerForm" property="companyId"> <html:optionsCollection name="hoge" value="value" label="label" /> </html:select> 3.validatorのチェックにひっかかっても一覧データ(list)が存在するのでOK。 ただこれが最適かとかStruts的にどうなのかとか、その辺は分かりません。 私も他の方法が知りたいです(あと考えつくのはcollectionの内容を全てhiddenにセットしとくとか?) | ||||||||||||
|
投稿日時: 2004-09-16 22:58
私ならActionFormのvalidate()で処理させますかね。
その前に、正常時の転送先が同じであれば、エラー表示(エラー制御)しないかもしれません。
・値が変わってもいいか(最新情報に変更されてもいいか) ・再取得(再実行)するレスポンスに問題がないか などによって変わるんじゃないんですかね。 ブラウザの設定に左右されますが、先にJavaScriptでチェックをかけて ポップアップでエラーメッセージ表示するって手もあります。 これもCommons Validatorでできたと思いますが、ちょっと不明確です。申し訳ない。 | ||||||||||||
|
投稿日時: 2004-09-17 10:52
御回答ありがとうございます。
私も「画面表示時に必要なデータをsessionに格納」というのは 考えてみたのですが、 webの経験がこともあり、それが一般的なのかどうかの判断ができかねておりました。 (お二人の回答で、ケースバイケースというのがなんとなくわかってきましたが…)
回答を参考に以下のようにまとめてみました。 エラー表示を現在の画面に反映させるには 1.sessionを使用 ・画面表示時に必要なデータをsessionに格納しておく。 ・validate処理は ActionForm.validate()で行う(Struts Validatorも使える)。 ・データの再取得は不要。 2.sessionを使用しない ・validate処理は ActionForm.validate()で行う。 ・validate()エラーの場合はデータの再取得を行う(Struts Validatorは使えない)。 ・再取得にパラメータが必要であれば、それも送信する必要有り。 1、2から判断すると Struts Validatorは、sessionを使わないとあまり使い道がない印象をもちました。
ありがとうございます。参考にさせていただきます。 | ||||||||||||
|
投稿日時: 2004-09-17 14:09
自己レスです。
2.で Struts Validatorは使えないと書きましたが、訂正を。 Validatorを使用するActionMappingで input属性にjspではなく、forwardのパスにすれば、 forward先のAction内でデータの再取得も行えるかも(未確認ですが…)。 | ||||||||||||
|
投稿日時: 2004-09-17 20:30
これも参考になるかもしれません。
<html:select>と<html:multibox>とhiddenフィールド http://d.hatena.ne.jp/nadi/20040229#1077998376 | ||||||||||||
|
投稿日時: 2004-09-17 20:53
えーっと、誤解させてしまったようで申し訳ありません。
DBアクセスAction => 一覧表示jsp => 削除Action (=> DBアクセスAction) だと仮定すると、 一覧表示 => postして削除Action の部分でエラーメッセージを出した後の話ですが、 ・再度DBアクセスして、前回と違う一覧になっていてもよい ・エラーを出す前とまったく同じ一覧でなきゃ困る の2つがあります。 上でしたらもう一度、DBアクセスActionを実行して やればいいだけです。(DBアクセスActionが5分ぐらいかかるので再実行 したくないってのなら別ですが。) 下でしたら、もう一度DBアクセスActionを実行してしまうとまずいですから、 sessionスコープに保存しておいたものを表示し直すか、input="一覧表示.jsp" としてCommons Validatorをつかうかvalidate()を使うことになります。 (両方同時にも使えます。) クライアントのブラウザの設定にもよりますがJavaScriptを使う事によって、 未チェックの状態では削除ボタンを押してもpostしない(ポップアップメッ セージを出すだけか、何も実行しないだけ)っていう選択しもあります。 この方がレスポンスが0になりますから、スマートといえばスマートです。 手を抜くならチェックがついていようといまいと削除Actionをそのまま実行し、 (0個なら0個削除しましたってことで、)何事もなかったかのように DBアクセスActionを実行させて、削除後の結果でございってのもありかなっと。
input="/hoge/一覧.jsp"とjspを指定できますが、input="/hoge/DBアクセスAction.do"とも書けます。 | ||||||||||||
|
投稿日時: 2004-09-21 09:17
上記に対する疑問が解決いたしました。 ありがとうございました。 | ||||||||||||
1
