ActionForm
Struts 1で画面入力値を受け取り、ActionとJSPの間で値を運ぶForm Bean。
概要
ActionFormは、Struts 1で画面入力値を受け取るJavaBeanです。HTMLの入力項目名とプロパティを対応させ、Actionへまとめて渡します。
public class UserSearchForm extends ActionForm {
private String userId;
private boolean detail;
public String getUserId() { return userId; }
public void setUserId(String userId) { this.userId = userId; }
public boolean isDetail() { return detail; }
public void setDetail(boolean detail) { this.detail = detail; }
}
入力値が入る仕組み
<input type="text" name="userId">が送信されると、StrutsはsetUserId()を通して値を設定します。プロパティ名、setter、HTMLのnameが一致しているかを確認します。
requestスコープとsessionスコープ
| scope | 寿命 | 向いている場面 | 注意点 |
|---|---|---|---|
request | 1回のリクエスト | 単一画面の入力と結果 | redirectでは値を引き継げない |
session | セッションが続く間 | 複数画面にまたがる入力 | 古い値、別タブ、後始末に注意 |
sessionスコープのFormは複数リクエストで再利用されます。初期化箇所と削除箇所を確認します。
reset()
reset()は、リクエストパラメータが設定される前にFormの状態を整えるために使います。
@Override
public void reset(ActionMapping mapping, HttpServletRequest request) {
detail = false;
}
未チェックのcheckboxはパラメータ自体が送られません。sessionスコープでは、初期化しないと前回のtrueが残ることがあります。一方、無条件な初期化で複数画面に保持したい値を消さないよう注意します。
validate()
@Override
public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
ActionErrors errors = new ActionErrors();
if (userId == null || userId.isBlank()) {
errors.add("userId", new ActionMessage("errors.required", "ユーザーID"));
}
return errors;
}
エラーがある場合、通常はActionを実行せず、ActionMappingのinputへ戻ります。入力形式のエラーと、ActionやServiceで判定する業務エラーは分けて考えます。
JSPとの接続
<html:text property="userId"/>
<logic:equal name="userSearchForm" property="detail" value="true">
<p>詳細条件を表示します。</p>
</logic:equal>
Bean名は、struts-config.xmlの<form-bean name>や<action name>から特定します。
DynaActionForm
DynaActionFormでは、専用Javaクラスを作らず設定ファイルでプロパティを定義できます。Formクラスが見つからない場合はform-propertyを確認します。
調査時の確認事項
- Form Bean名と実装クラス
- requestとsessionのどちらに置かれるか
reset()で何が初期化されるかvalidate()が実行される設定か- JSPの入力項目名とsetterが一致するか
- ActionがFormの値を書き換えているか
- sessionスコープの場合、いつ削除されるか
参考文献
更新履歴
- 初版作成