ActionFormのresetメソッド

ActionFormはstruts設定ファイルの中で設定したスコープに登録されます。したがってsessionに登録された場合には、同一セッション中の同じHTMLフォームにおいては同じActionFormインスタンスが使用される事になります。またHTMLフォームの内、チェックボックスは選択されていない状態でパラメータが送信されません。したがって以下のような不具合が発生してしまいます。
(※ scope=request であれば問題ない)


あるHTMLフォームのチェックボックスを選択し、HTTPリクエストをサーバへ送る。
チェックボックスに該当するActionFormのプロパティ(boolean型)にtrueが設定される。
再び1と同じHTMLフォームにおいて、今度はチェックボックスの選択を外して、HTTPリクエストをサーバへ送る。
ActionFormはセッションに登録されているため、2と同じインスタンスが使用される。またチェックボックスに該当するパラメータは送信されないため、該当するプロパティのsetterメソッドは呼ばれず、2で設定した値(true)がそのまま残る。
チェックボックスを使用する場合には上記のような不具合が生じるため、ActionFormにはプロパティを初期化するためのメソッド「reset」が用意されています。resetメソッドはHTTPリクエストからパラメータ値を読み取って設定する前に必ず呼ばれるものです。ActionFormで何らかの初期化をそのタイミングで行いたい場合には、resetメソッドをオーバーライドします。以下はその例です。メソッドの引数ActionMappingとHttpServletRequestは、Actionクラスのexecuteメソッドの引数と同じものです。

public class ProductForm extends ActionForm{
  private boolean discount;
  ...
  public void reset(ActionMapping mapping, HttpServletRequest request){
    discount=false;
  }
}
resetメソッドの中で初期化を行う事により、チェックボックスを使用することにより生じる不具合を防ぐ事ができます。

このブログの人気の投稿

ビルド・パスのエラーが解決されるまで、プロジェクトをビルドできません

ORCLE SQL '_' アンダースコアについて