チェックした状態を初期値にしてcheckboxやmultiboxを使う方法

Strutsを使っていてよく問題になることとして、を使う際にチェックした状態をデフォルトにすることができないというのがあります。

これは

  1. ブラウザはチェックされたものしかリクエストパラメータとして送信しない
  2. Strutsはパラメータにない場合はActionFormの値は書き換えない
  3. そのため、ページ表示時にチェックを入れていると、ユーザがすべてのチェックを外した場合にパラメータが送信されず、ActionForm内でチェックされた状態が残る

ということが原因です。


なので、必ずresetメソッドでチェックを外した状態にしましょうとよく言われますが…。
でも、実はたった3行書き加えるだけでチェックをつけた状態でページを表示できるようになります。


それが、これ。

if(request.getParameter("multi") == null){
    multi = null;
}


これをActionFormのvalidateメソッドに挿入するだけ。

public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
    if(request.getParameter("multi") == null){
        multi = null;
    }
    return super.validate(mapping, request);
}

(ここでは、html:multiboxの値を入れるプロパティ名を"multi"としています)


ちなみに、validatorのrequiredルールもこれでばっちり動きます。



追記:
html:multibox を使う場合は、null ではなく、new String[0] の方が便利です。
この場合でも、required ルールが使えます。
(required は、NULL/空文字/空配列を Invalid と判定します)

これだけ簡単なことなのに、なぜStrutsではやってくれないのか。

Strutsはそのプロパティがどのように出力されているかを知らないからです。
で出力されればブラウザからのリクエストで値が返ってきますが、ならば返ってきません。
そのために、ブラウザからのリクエストに含まれていないプロパティは、nullにするのではなく、何もしないという方針をとっています。


それがmultiboxやcheckboxではあだになっているわけです。
そこで、自分で「リクエストで返ってこなかったら、チェックされていない状態である」という判断を加えることにより、この問題を解決できます。



ただ、この解決策・・・ネットで探してもでてきませんでした(汗)
まったくの我流です。


どこかに落とし穴があるかもしれないので、自己責任でお願いいたします(^−^)