📘 Vol.9.1：【Struts2】validate() メソッドの基本 〜 addFieldError / input遷移による入力チェックの王道パターン 〜

👉 [📘 Vol.9.0：Struts2 入力バリデーションと型変換の世界へ 〜 実務で求められる「正しい値を正しく処理する力」を徹底攻略 〜 の続編です。](https://qiita.com/juehara-crypto/items/263e0eb599be73681b0f)
---

### ✅ 本記事の目的
Struts2 の入力チェック処理の中でも最も基本的かつ汎用的な `validate()` メソッド。
本記事では、***実務でも頻出する「ログインフォーム」「新規登録フォーム」などを例に、***
このメソッドの使い方やエラーの出し方、JSPへの反映までを丁寧に解説します。

---

### 📌 1. validate() メソッドとは？

Struts2 の Action クラスに定義することで、リクエスト受信時に自動的に呼び出される***入力検証用メソッド***です。

```java
@Override
public void validate() {
    if (username == null || username.isEmpty()) {
        addFieldError("username", "ユーザー名は必須です");
    }
    if (password == null || password.length() < 6) {
        addFieldError("password", "パスワードは6文字以上で入力してください");
    }
}
```
- addFieldError(String fieldName, String message)
→ フィールドごとのエラーメッセージを設定

- addActionError(String message)
→ 全体メッセージ（システム的な警告や一括エラーなど）に使用

---

### 📌 2. エラー時の挙動：input に戻る
バリデーションでエラーが検出されると、自動的に `input` リザルトへ遷移します。

```xml
<action name="login" class="com.example.LoginAction" method="execute">
  <result name="success">/userPortal.jsp</result>
  <result name="input">/login.jsp</result>
</action>
```

この設計により、「バリデーション失敗 → 元のフォームへ戻って再入力」という自然な導線が可能になります。

---

### 📌 3. JSP側でのエラーメッセージ表示（`<s:fielderror>`）
バリデーションエラーを画面に表示するには、以下のように `s:fielderror` を使います：

```jsp
<s:form action="login" method="post">
  <s:fielderror />
  <s:textfield name="username" label="ユーザー名" />
  <s:password name="password" label="パスワード" />
  <s:submit value="ログイン" />
</s:form>
```

- s:fielderror をフォームの上部に配置することで、エラーが一覧表示されます。

- フィールド単位で <s:fielderror fieldName="username" /> のように制御も可能。

---

### 💡 実務での使用例
### ✅ ログインフォームの入力チェック
- ユーザー名：空でない

- パスワード：6文字以上

```java
@Override
public void validate() {
    if (username == null || username.trim().isEmpty()) {
        addFieldError("username", "ユーザー名を入力してください");
    }
    if (password == null || password.length() < 6) {
        addFieldError("password", "パスワードは6文字以上必要です");
    }
}
```

### 🧭 実務Tips：バリデーション失敗でも入力値を保持するには？
Struts2では、失敗して`input`に戻っても、フィールドに設定された値が自動的に保持されるため、再入力の手間が省けます。これはOGNLとプロパティ設定の恩恵です。

---

### 🔚 まとめ
| 項目              | 説明                          |
| --------------- | --------------------------- |
| `validate()`    | Actionクラス内で定義する入力検証用メソッド    |
| `addFieldError` | フィールドごとのエラー登録               |
| `input` 遷移      | バリデーション失敗時の戻り先              |
| JSP表示           | `<s:fielderror>` タグで一括表示が可能 |

----

### 🔜 次回予告
[📘 Vol.9.2](https://qiita.com/juehara-crypto/items/44fd5012bfbc809d352a)：Struts2実装編として、`validate()` メソッドによる入力チェック、および `input` 遷移や `<s:fielderror>` の使い方などを中心に、Struts2ならではの流れを実務目線で整理した手法をご紹介します。

---

## 📚 関連シリーズの復習（おすすめ）

- 🔙 [🌟 Vol.8.16〜8.17 総まとめ：Struts2 出力最適化＆拡張編（一覧表示・共通部品化・カスタムタグ）](https://qiita.com/juehara-crypto/items/c13bd0474f71efc7cd28)  

- 🔙 [🌟 Vol.8.18〜8.20 総まとめ：Struts2 テンプレート最適化・UI共通化設計編（共通レイアウト構築と動的UI出し分け）](https://qiita.com/juehara-crypto/items/d01303875f78a1c5282f)  
　→ 表示の基礎とUI共通化の構成がまだの方はこちらから！

- 📘 [Vol.9.0：Struts2 入力バリデーションと型変換の世界へ 〜 実務で求められる「正しい値を正しく処理する力」を徹底攻略 〜](https://qiita.com/juehara-crypto/items/263e0eb599be73681b0f)
---

## 🔎 Vol.9系で扱うトピック

| 回   | テーマ                                         | 内容の一部紹介                              |
|------|----------------------------------------------|--------------------------------------------|
| [9.1](https://qiita.com/juehara-crypto/items/a67976acd60430fa0da6)  | `validate()`メソッドの基本                    | Struts2標準の入力チェック基礎              |
| [9.2](https://qiita.com/juehara-crypto/items/44fd5012bfbc809d352a)  | `@Validations` アノテーション活用             | 宣言的バリデーション設計                   |
| [9.3](https://qiita.com/juehara-crypto/items/fd6881d2c54de07b3ae4)  | `validation.xml` 外部定義でのバリデーション   | 大規模PJでのメンテナンス性                 |
| [9.4](https://qiita.com/juehara-crypto/items/c82203f583b2712be395)  | `conversion.properties` と型変換              | 日付/数値/Enum変換の実務対応               |
| [9.5](https://qiita.com/juehara-crypto/items/c44fae5980a5c9b40312)  | 入力エラー時のメッセージ制御                  | `addFieldError()` / メッセージキー運用     |
| [9.6](https://qiita.com/juehara-crypto/items/de18b174f1740f9b3646)  | バリデーション共通化                         | 共通部品によるDRY設計                      |
| [9.7](https://qiita.com/juehara-crypto/items/793e85ad47b981d6fbae)  | サーバサイドとクライアントサイドの協調        | jQueryやHTML5との併用戦略                  |
| [9.8](https://qiita.com/juehara-crypto/items/b11017ca621d94599f72)  | 実務シナリオでのバリデーション総仕上げ       | 会員登録/投稿処理などの実例適用           |
| [9.9](https://qiita.com/juehara-crypto/items/6df87d22d07818df5166)  | バリデーション処理の単体テスト編       | validate()／独自バリデータ／input遷移の検証を網羅的に |
| [9.10](https://qiita.com/juehara-crypto/items/6c042593898aa598cba4)  | エラー表示のUIデザイン編        | 視認性・操作性を高める実践テクニック |
| [9.11](https://qiita.com/juehara-crypto/items/7d33c9cd812b37153c12)  | Ajax×バリデーション連携編        | クライアント×サーバーで UX＆保守性を両立するハイブリッド構成 |

---