なやみの尽きないチェックボックス
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にセットされる前に呼ばれるので一旦チェックボックスの値を初期化してからチェックオンの情報だけ送信してやればうまくいく仕組みです。