menu
書いてる野郎
orebike@gmail.com
ActionFormのインスタンスをセッション管理にした場合、チェックボックスの値の送受信で変なことになる。
チェックボックスはチェックされているときはいいのだが、チェックされていないと値が送信されないことになり、 前回のリクエストで設定された値が上書きされず維持されてしまう。
大体において更新系の画面では
という流れになり最初と最後のFormインスタンスは同型になるので画面を介してFormの値自体は永続化(同値、not同一)されるようになっている。
Formをセッションで永続化するとFormインスタンスは同一になるので上書きされないならば前回のものが維持されるという動きになる。
そこでSAStrutsでは、リクエストをブラウザから受けてFormインスタンスのプロパティに値をマッピングする直前に処理を割りこませることができるようになっている。
Formクラスにreset
という名前のメソッドを追加する。
SAStrutsではこの名前でメソッドを作るとそのインスタンスにリクエストパラメータがマッピングする直前に呼び出されるようになる。
つまりここでセッションに永続化されているFormに介入し値を操作する。
public void reset(){ this.aaa = null; }
となる。マッピングされる前に全部リセットして再度値をうけとろうということだ。 もし値がないのならば(チェックが全部はずれている)その値はセットされないので、チェックが外れたのと同じことになる。
・・・しかし更新系のActionにおいてはこれは実用的ではない。
更新系のActionは
の3つの画面で構成されることが多く、当然ながら同一ActionなのでFormを共通化している。 つまり、画面を表示しようが、更新処理しようが、完了しようがresetされてしまうことになる。
更新処理の場合はリクエストが来ているので復元できるが、押し戻した場合にそのActionメソッドでもresetが呼ばれていしまい、 結局現在の値をクリアしてしまうことになる。
そこでActionメソッドにアノテーションをつけることでresetの命名規約
を無視して処理を割りこませるメソッドを指定することができる。
FormクラスのメソッドをresetではなくresetHogeとして
public void resetHoge(){ this.aaa = null; }
Actionの更新処理メソッドのExecuteアノテーションの引数でresetを設定する
@Execute(..., reset = "resetHoge")
すると、このActionメソッドへのリクエストに対してのみresetHogeメソッドが割り込むことになり、表示に対しては発生しないようになる。
これで実用的にチェックボックス外しに対応することができるようになる。