📘 Vol.9.2：【Struts2】入力チェックの実装編 〜 validate() / input遷移 / fielderrorタグを使いこなす 〜

> **Vol.9.1 では**「なぜ入力バリデーションが必要か？」をフレームワークに依存しない視点で整理しました。  
> **本稿では** Struts2 における代表的なバリデーション実装パターンを、実際のプロジェクトコードとあわせて解説します。

---

### ✅ 基本パターン：validate() メソッド + addFieldError()
Struts2 の Action クラスにおける入力チェックの王道パターンです。

```java
@Override
public void validate() {
    if (userId == null || userId.trim().isEmpty()) {
        addFieldError("userId", "ユーザーIDを入力してください。");
    }
    if (password == null || password.trim().isEmpty()) {
        addFieldError("password", "パスワードを入力してください。");
    }
}
```

- validate() メソッドは、Action 実行前に自動で呼ばれる。

- addFieldError(fieldName, message) によって、フィールド単位のエラーを保持。
---

### 🔁 input 遷移で入力画面に戻す
`struts.xml` に以下のような設定をすることで、バリデーションエラー時には入力画面に戻すことができます。
```xml
<action name="login" class="com.company.bulletinboard.action.login.LoginAction">
    <result name="success">/userPortal.jsp</result>
    <result name="input">/login.jsp</result>
</action>
```

- `input` は、validate() 内でエラーがあったときに返る予約語的な結果名。

- エラー時には、指定した JSP に自動遷移されます。

---

### 💬 JSP 側でのエラーメッセージ表示：<s:fielderror />

```jsp
<%@ taglib prefix="s" uri="/struts-tags" %>

<s:form action="login">
    <s:fielderror />
    <s:textfield name="userId" label="ユーザーID" />
    <s:password name="password" label="パスワード" />
    <s:submit value="ログイン" />
</s:form>
```
- `<s:fielderror />` を配置することで、`addFieldError()` で設定されたエラーが一覧で表示されます。

- 各フィールド直下に配置することで、項目ごとのエラーとしてレイアウト可能。

---

### 📦 実際のプロジェクトでの validate() 実装例はこちら 👉
- LoginAction クラスでは、実際に `validate()` と `addFieldError()` を使って入力チェックを実装。
LoginAction.java（GitHub） の validate 実装（[78〜95行目](https://github.com/juehara-crypto/Portfolio_Bulletinboard/blob/master/03.%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0/Bulletinboard/src/main/java/com/company/bulletinboard/action/login/LoginAction.java#L78-L95)）

- struts.xml では input 遷移で /login.jsp に戻る設定
struts.xml（GitHub）の実装（[30行目](https://github.com/juehara-crypto/Portfolio_Bulletinboard/blob/master/03.%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0/Bulletinboard/resources/struts.xml#L30))

- JSP 側では <s:fielderror /> を活用して、ユーザーにエラー表示を行なっています
login.jsp（GitHub）の実装 ([14行目～18行目)](https://github.com/juehara-crypto/Portfolio_Bulletinboard/blob/master/03.%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0/Bulletinboard/WebContent/login.jsp#L14-L18))

### 📝 補足：BaseAction に共通化しない理由

GitHub の [`BaseAction.java`](https://github.com/juehara-crypto/Portfolio_Bulletinboard/blob/master/03.%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0/Bulletinboard/src/main/java/com/company/bulletinboard/interceptor/BaseAction.java)  をご覧いただくとわかるように、`validate()` の共通化は行っていません。

これは以下の理由によります：
- `validate()` のチェック内容が画面（フォーム）ごとに大きく異なるため。

- 汎用化・共通化を無理に行うと、逆に各画面のロジックが複雑になりやすい。

- 実務では画面単位で明示的に `validate()` を実装する方が管理しやすいケースが多い。

---

### ✅ まとめ
| 要素                 | 内容                                     |
| ------------------ | -------------------------------------- |
| validate()         | Action 実行前に自動呼び出しされる入力チェック             |
| addFieldError()    | フィールド単位のエラー追加                          |
| input 遷移           | エラー発生時に戻る画面を struts.xml で定義            |
| \<s\:fielderror /> | JSP 側でのエラー表示タグ                         |
| 実務的運用              | 各画面の Action に validate() を個別実装する運用が現実的 |

---
👉 次回は、[Vol.9.3](https://qiita.com/juehara-crypto/items/fd6881d2c54de07b3ae4)：`xmlバリデーションファイル` を用いたチェック方法や、`型変換エラー処理（conversionErrorFieldValidator）` について掘り下げていきます！

---

***📚 前回記事： [📘 Vol.9.1：【Struts2】validate() メソッドの基本 〜 addFieldError / input遷移による入力チェックの王道パターン 〜](https://qiita.com/juehara-crypto/items/a67976acd60430fa0da6)***

🔗 記事一覧： Vol.9.x まとめページ
---

| 回   | テーマ                                         | 内容の一部紹介                              |
|------|----------------------------------------------|--------------------------------------------|
| [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＆保守性を両立するハイブリッド構成 |



---