3.

Struts1 の ActionForm とは? validate() / reset() / DynaActionForm の使い分け

編集
この記事の要点
  • ActionFormHTTP リクエストパラメータを Java Bean に自動マッピングする Struts1 のクラス
  • setUserId(String) がフレームワーク側で自動呼出
  • validate()ActionErrors を返し、空でなければ input 属性の JSP に戻る
  • reset() はリクエストごとに呼ばれフィールドを初期化(チェックボックスは特に必要)
  • POJO を書く代わりに DynaActionForm / DynaValidatorForm で xml だけで定義可能
  • Spring MVC では @ModelAttribute + Bean Validation (@Valid) に相当

ActionForm とは

org.apache.struts.action.ActionForm は Struts1 でフォーム入力値を保持する Java Beanの基底クラスです。HTML フォームの name 属性と Bean のプロパティ名を一致させると、Struts が自動的に setter を呼んでフィールドに値を詰めてくれます。

定義の例

package com.example.form;

import org.apache.struts.action.*;
import javax.servlet.http.HttpServletRequest;

public class LoginForm extends ActionForm {
    private String userId;
    private String password;
    private boolean rememberMe;

    @Override
    public void reset(ActionMapping mapping, HttpServletRequest request) {
        // チェックボックスは送信されないと値が来ないので明示初期化
        this.rememberMe = false;
    }

    @Override
    public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
        ActionErrors errors = new ActionErrors();
        if (userId == null || userId.trim().isEmpty()) {
            errors.add("userId",
                new ActionMessage("error.userId.required"));
        }
        if (password == null || password.length() < 8) {
            errors.add("password",
                new ActionMessage("error.password.length", "8"));
        }
        return errors;
    }

    // --- getter / setter ---
    public String getUserId() { return userId; }
    public void setUserId(String v) { this.userId = v; }
    public String getPassword() { return password; }
    public void setPassword(String v) { this.password = v; }
    public boolean isRememberMe() { return rememberMe; }
    public void setRememberMe(boolean v) { this.rememberMe = v; }
}

JSP からのバインディング

<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>


  

ユーザ ID:

パスワード:

ログインを記憶

<%-- エラー表示 --%>

HTML タグの property 属性が Bean のプロパティ名(getter/setter)と一致している必要があります。

struts-config.xml での宣言


  



  
    
  

ライフサイクル

順序処理備考
1ActionForm のインスタンス取得scope = request なら毎回 new、session なら再利用
2reset(mapping, request) 呼出毎リクエスト初期化される
3setter で値設定(自動)HTTP パラメータ → Bean
4validate(mapping, request) 呼出validate="true" の場合のみ
5aエラーあり → input JSP へexecute() はスキップ
5bエラーなし → Action#execute()第 2 引数で Form 受け取り

DynaActionForm: Bean クラスを書かない方法

フォーム項目が多いと Bean を書くのが面倒。DynaActionForm は xml だけで定義できます:


  
    
    
    
    
  

Action 側でのアクセス:

public ActionForward execute(ActionMapping mapping, ActionForm form, ...) {
    DynaActionForm df = (DynaActionForm) form;
    String userId = (String)  df.get("userId");
    Integer age   = (Integer) df.get("age");
    String[] hobbies = (String[]) df.get("hobbies");
    // ...
}

DynaValidatorForm + Validator フレームワーク

DynaValidatorForm + Commons Validator なら xml で検証ルールも宣言できます:



  
    
minlength4 min0 max150

使い分け

種類用途メリットデメリット
ActionForm標準。POJO 自作IDE 補完、複雑な validate 可クラスが増える
DynaActionFormxml 宣言のみBean クラス不要get(String) でキャスト必要
DynaValidatorFormDyna + Validator検証も宣言的複雑な検証は書けない
ValidatorActionFormPOJO + Validator両方の利点標準 ActionForm より少し重い

Spring MVC との比較

// Spring MVC 版 (Struts1 ActionForm + validate に相当)
public class LoginDto {
    @NotBlank
    private String userId;
    @Size(min = 8)
    private String password;
    private boolean rememberMe;
    // getter/setter ...
}

@Controller
public class LoginController {
    @PostMapping("/login")
    public String login(@Valid @ModelAttribute LoginDto dto,
                        BindingResult br,
                        Model model) {
        if (br.hasErrors()) {
            return "login";  // input 属性に相当
        }
        // ...
        return "redirect:/home";
    }
}

FAQ

Q: チェックボックスの値が消える
A: 未チェック時はパラメータ自体が送信されません。reset()false 初期化するのが Struts1 の定型パターン。

Q: validate() が呼ばれない
A: になっているか、input 属性が指定されているか確認。

Q: 入れ子の Bean をマッピングできる?
A: html:text property="address.zip" のようにドット記法可。ただし Bean 側で getAddress().setZip() の経路が必要。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. 導入方法
  2. struts-config.xmlの説明
  3. ActionForm
  4. Action
  5. エラー一覧
  6. JSP タグ
  7. カスタムタグ(tablib)