📘 Vol.9.4：【Struts2】条件付きチェック／複数フィールド連動チェック編 〜 if文＋validate()の活用で実現する柔軟な入力バリデーション 〜

### 🧭 はじめに
前回[（Vol.9.3）](https://qiita.com/juehara-crypto/items/fd6881d2c54de07b3ae4)では、XMLによるバリデーション定義と `input` 遷移の基本パターンを紹介しました。
今回はもう一歩踏み込んで、以下のようなケースに対応する方法を解説します：

- 条件付きバリデーション（例：チェックボックスONのときだけ必須）

- 複数フィールドの連携チェック（例：パスワードと確認用パスワードの一致）

これらのチェックは、Struts2の ***Javaコード側（`validate()メソッド`）*** を活用することで柔軟に実現可能です！

---

### ✅ よくある実務シナリオとその実装方法

***1. 条件付きバリデーション（例：ある項目がONのときだけ他を必須）***

```java
@Override
public void validate() {
    if ("1".equals(isReceiveMail) && (email == null || email.isEmpty())) {
        addFieldError("email", "メールアドレスは必須です（受信希望の場合）");
    }
}
```

- 状況に応じて入力必須かどうかを制御できます。

- XMLではこうした「動的判定」が難しいため、`validate()` 側が最適。

---

### 2. 複数フィールドの連動チェック（例：パスワード確認）

```java
@Override
public void validate() {
    if (password != null && !password.equals(confirmPassword)) {
        addFieldError("confirmPassword", "パスワードが一致しません");
    }
}
```

- こちらもXMLでは不可能な処理です。

- 「単一項目ではなく、複数項目をまたぐチェック」は Java 側で対応しましょう。

---
### 💡 実際のプロジェクトでの活用例（GitHub）

🔗 LoginAction.java（GitHub） の validate 実装（[57〜76行目](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#L57-L76)）

ここでは、正規表現を含む複雑な条件を validate() 内で実装しています。

> ✅ XMLで対応できない条件は、Javaの validate() に柔軟に分担させる
＝ いわゆる “ハイブリッド運用” が実務的でおすすめです！

### 📝 補足Tips：共通化はすべき？
- `validate() `は画面ごとに個別実装されることが一般的です。

- ***BaseAction*** などで共通化しようとしても、画面によって項目名・ルールが異なるため難しいケースが多いです。

- 逆に「共通チェック」だけを別メソッド化して呼び出すスタイルはアリ。

---

### 📚 まとめ

| チェック種別    | XMLで可能  | Javaで可能 | 備考               |
| --------- | ------- | ------- | ---------------- |
| 単純な必須チェック | ◎       | ◎       | XMLがシンプル         |
| 正規表現チェック  | △（一部不可） | ◎       | regexパターンによっては不可 |
| 条件付きチェック  | ×       | ◎       | Java一択           |
| 複数フィールド連携 | ×       | ◎       | Java一択           |


---

### 🧭 次回予告：Vol.9.5
次回は、***入力チェックエラーの表示デザイン***や
***ユーザ体験を高めるための `<s:fielderror>` カスタマイズ*** について紹介予定です！

### 🔗 関連リンク

- [Vol.9.1：【Struts2】validate() メソッドの基本](https://qiita.com/juehara-crypto/items/a67976acd60430fa0da6)
- [Vol.9.2：【Struts2】入力チェックの実装編](https://qiita.com/juehara-crypto/items/44fd5012bfbc809d352a)
- [Vol.9.3：【Struts2】XMLバリデーション定義編](https://qiita.com/juehara-crypto/items/fd6881d2c54de07b3ae4)

---





## 🔎 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＆保守性を両立するハイブリッド構成 |



---