A Day In The Life

とあるプログラマの備忘録

なやみの尽きないチェックボックス

Struts、ActionFormのresetメソッドの話題です。

複数画面で1つのActionFormを使用していて、なおかつチェックボックス複数画面にまたがって混在する時、以下のようにするとうまくいきます。

public class SampleForm extends ValidatorForm {
 //画面1で使うチェックボックス
 private boolean check1 = false;
 //画面2で使うチェックボックス
 private boolean check2 = false;
 ...
 ...ゲッターセッター省略
 ...
 public void reset(ActionMapping mapping, HttpServletRequest request) {
  if(mapping.getPath().equals("/sampleScreen1")) {
   check1 = false
  } else if(mapping.getPath().equals("/sampleScreen2")) {
   check2 = false;
  }
 }
}

なんでこんなことしなきゃいけないかというと

フォームの送信時にコントロールに現在の値が設定されていない場合、ユーザエージェント(Webブラウザなど)はそれを送信有効なコントロールとして扱わなくてもよい。

「オン」になっているすべてのチェックボックスは送信有効となる可能性がある。
というHTMLの仕様のせいなんですね。

要するにチェックボックスがオンなっている時しかサーバにデータは送信されないわけです。

resetメソッドは画面の値がActionFormにセットされる前に呼ばれるので一旦チェックボックスの値を初期化してからチェックオンの情報だけ送信してやればうまくいく仕組みです。