SAStruts/ActionForm/チェックボックスのチェックを外す対応

SAStruts/ActionForm/チェックボックスのチェックを外す対応

チェックボックスのチェックを外しても反映されない事象

ActionFormのインスタンスをセッション管理にした場合、チェックボックスの値の送受信で変なことになる。

チェックボックスはチェックされているときはいいのだが、チェックされていないと値が送信されないことになり、 前回のリクエストで設定された値が上書きされず維持されてしまう。

大体において更新系の画面では

  1. Formインスタンスの値
  2. 値の画面への埋め込み
  3. リクエスト送信
  4. Formインスタンスへのマッピング

という流れになり最初と最後のFormインスタンスは同型になるので画面を介してFormの値自体は永続化(同値、not同一)されるようになっている。

Formをセッションで永続化するとFormインスタンスは同一になるので上書きされないならば前回のものが維持されるという動きになる。

resetメソッドによる初期化処理を挟むことでの解決

そこでSAStrutsでは、リクエストをブラウザから受けてFormインスタンスのプロパティに値をマッピングする直前に処理を割りこませることができるようになっている。

  1. Formインスタンスの値
  2. 値の画面への埋め込み
  3. リクエスト送信
  4. Formの値を操作する処理 ←割り込む
  5. Formインスタンスへのマッピング

Formクラスにresetという名前のメソッドを追加する。 SAStrutsではこの名前でメソッドを作るとそのインスタンスにリクエストパラメータがマッピングする直前に呼び出されるようになる。

つまりここでセッションに永続化されているFormに介入し値を操作する。

public void reset(){
    this.aaa = null;
}

となる。マッピングされる前に全部リセットして再度値をうけとろうということだ。 もし値がないのならば(チェックが全部はずれている)その値はセットされないので、チェックが外れたのと同じことになる。

任意のメソッドでのreset

・・・しかし更新系の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メソッドが割り込むことになり、表示に対しては発生しないようになる。

これで実用的にチェックボックス外しに対応することができるようになる。

タグ

java/sastruts/action_form/uncheck_checkbox_problem.txt · 最終更新: 2017-09-26 18:34 by ore