- PR -

validatorの遷移先が同一画面の場合について

1
投稿者投稿内容
tawara
会議室デビュー日: 2004/09/14
投稿数: 4
投稿日時: 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/08/21
投稿数: 3
投稿日時: 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にセットしとくとか?)

aa
ぬし
会議室デビュー日: 2004/01/08
投稿数: 299
投稿日時: 2004-09-16 22:58
私ならActionFormのvalidate()で処理させますかね。
その前に、正常時の転送先が同じであれば、エラー表示(エラー制御)しないかもしれません。

引用:

エラー後の遷移先が同一画面上の場合は、
その画面に必要なデータを再度取得し、
requestなどに設定する必要があるものなのでしょうか?


・値が変わってもいいか(最新情報に変更されてもいいか)
・再取得(再実行)するレスポンスに問題がないか
などによって変わるんじゃないんですかね。

ブラウザの設定に左右されますが、先にJavaScriptでチェックをかけて
ポップアップでエラーメッセージ表示するって手もあります。
これもCommons Validatorでできたと思いますが、ちょっと不明確です。申し訳ない。

tawara
会議室デビュー日: 2004/09/14
投稿数: 4
投稿日時: 2004-09-17 10:52
御回答ありがとうございます。

引用:

1.viewActionで必要な情報を取得し、formにはsetせずに、HttpSessionに格納する



私も「画面表示時に必要なデータをsessionに格納」というのは
考えてみたのですが、
webの経験がこともあり、それが一般的なのかどうかの判断ができかねておりました。
(お二人の回答で、ケースバイケースというのがなんとなくわかってきましたが…)

引用:

私ならActionFormのvalidate()で処理させますかね。
その前に、正常時の転送先が同じであれば、エラー表示(エラー制御)しないかもしれません。

引用:
--------------------------------------------------------------------------------


エラー後の遷移先が同一画面上の場合は、
その画面に必要なデータを再度取得し、
requestなどに設定する必要があるものなのでしょうか?

--------------------------------------------------------------------------------


・値が変わってもいいか(最新情報に変更されてもいいか)
・再取得(再実行)するレスポンスに問題がないか
などによって変わるんじゃないんですかね。




回答を参考に以下のようにまとめてみました。

エラー表示を現在の画面に反映させるには
1.sessionを使用
・画面表示時に必要なデータをsessionに格納しておく。
・validate処理は ActionForm.validate()で行う(Struts Validatorも使える)。
・データの再取得は不要。

2.sessionを使用しない
・validate処理は ActionForm.validate()で行う。
・validate()エラーの場合はデータの再取得を行う(Struts Validatorは使えない)。
・再取得にパラメータが必要であれば、それも送信する必要有り。

1、2から判断すると
Struts Validatorは、sessionを使わないとあまり使い道がない印象をもちました。

引用:

ブラウザの設定に左右されますが、先にJavaScriptでチェックをかけて
ポップアップでエラーメッセージ表示するって手もあります。
これもCommons Validatorでできたと思いますが、ちょっと不明確です。申し訳ない。



ありがとうございます。参考にさせていただきます。
tawara
会議室デビュー日: 2004/09/14
投稿数: 4
投稿日時: 2004-09-17 14:09
自己レスです。

引用:

エラー表示を現在の画面に反映させるには
1.sessionを使用
・画面表示時に必要なデータをsessionに格納しておく。
・validate処理は ActionForm.validate()で行う(Struts Validatorも使える)。
・データの再取得は不要。

2.sessionを使用しない
・validate処理は ActionForm.validate()で行う。
・validate()エラーの場合はデータの再取得を行う(Struts Validatorは使えない)。
・再取得にパラメータが必要であれば、それも送信する必要有り。




2.で Struts Validatorは使えないと書きましたが、訂正を。
Validatorを使用するActionMappingで
input属性にjspではなく、forwardのパスにすれば、
forward先のAction内でデータの再取得も行えるかも(未確認ですが…)。
未記入
会議室デビュー日: 2004/08/21
投稿数: 3
投稿日時: 2004-09-17 20:30
これも参考になるかもしれません。


<html:select>と<html:multibox>とhiddenフィールド
http://d.hatena.ne.jp/nadi/20040229#1077998376
aa
ぬし
会議室デビュー日: 2004/01/08
投稿数: 299
投稿日時: 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属性にjspではなく、forwardのパスにすれば、
forward先のAction内でデータの再取得も行えるかも(未確認ですが…)。


input="/hoge/一覧.jsp"とjspを指定できますが、input="/hoge/DBアクセスAction.do"とも書けます。


tawara
会議室デビュー日: 2004/09/14
投稿数: 4
投稿日時: 2004-09-21 09:17
引用:

・再度DBアクセスして、前回と違う一覧になっていてもよい
・エラーを出す前とまったく同じ一覧でなきゃ困る

の2つがあります。

上でしたらもう一度、DBアクセスActionを実行して
やればいいだけです。(DBアクセスActionが5分ぐらいかかるので再実行
したくないってのなら別ですが。)

下でしたら、もう一度DBアクセスActionを実行してしまうとまずいですから、
sessionスコープに保存しておいたものを表示し直すか、input="一覧表示.jsp"
としてCommons Validatorをつかうかvalidate()を使うことになります。
(両方同時にも使えます。)



引用:

そこでお尋ねしたいのですが、
エラー後の遷移先が同一画面上の場合は、
その画面に必要なデータを再度取得し、
requestなどに設定する必要があるものなのでしょうか?
(web aplicationの基本的なことかもしれませんが、
よろしくお願いします。)



上記に対する疑問が解決いたしました。
ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)