📘 Vol.9.3：【Struts2】XMLバリデーション定義編 〜 Login-validation.xmlによる入力チェックと input遷移の連携 〜

## 🧭 今回のテーマ

Struts2では `validate()` メソッド以外にも、**XMLファイルに定義する形式**でも入力チェックを実装できます。  
本記事では、以下の内容を体系的に整理します。

- XMLによるバリデーションの定義方法
- メリット／デメリットと使い分け
- `input` 遷移との連携
- 実務で使う標準バリデータ（requiredstring / int / regex など）
- `short-circuit` 属性による最適化

---

## 📦 ファイル構成と命名ルール

Struts2のXMLバリデーションファイルは、**対象Actionクラスと連動した命名規則**に従います。

[Actionクラス名]-validation.xml


たとえば、`LoginAction.java` に対応するファイルは：
```go
/src/.../login/Login-validation.xml
```

と配置される必要があります。

---

## 🛠️ 基本構文：`requiredstring` バリデータの例

```xml
<validators>
  <field name="userId">
    <field-validator type="requiredstring">
      <message>ユーザーIDを入力してください</message>
    </field-validator>
  </field>
</validators>
```

この設定により、`userId` フィールドが未入力の場合、エラーメッセージが自動的に `<s:fielderror />` タグ経由でJSPに表示されます。

---
### 🧰 よく使うバリデーター一覧
| バリデーター名          | 内容                |
| ---------------- | ----------------- |
| `requiredstring` | 空文字・未入力のチェック      |
| `int`            | 整数であるかの検証         |
| `date`           | 日付形式であるか（パターン指定可） |
| `regex`          | 正規表現で形式を検証        |
| `email`          | Email形式の検証        |

---

### ⚡ short-circuit="true" で複数バリデーターの最適化
```xml
<field-validator type="requiredstring" short-circuit="true">
  <message>ユーザーIDを入力してください</message>
</field-validator>
```

`short-circuit="true"` を指定することで、***このバリデーションがNGなら以降のチェックをスキップ*** できます。
例えば「空文字の時点で正規表現チェックは不要」といった場合に使うと処理効率が上がります。

---

### 📥 input 遷移と連携する流れ
XMLバリデーションがエラーを返すと、Struts2は自動的に `input` 結果に遷移します。
```xml
<action name="login" class="LoginAction">
  <result name="success">/userPortal.jsp</result>
  <result name="input">/login.jsp</result>
</action>
```
JSP側で `<s:fielderror />` を設置していれば、***XMLで定義されたエラーメッセージが表示される***という仕組みです。

---

### 📦 実際のプロジェクト実装例（GitHub）
🔗 Login-validation.xml（GitHub）
[👉 Login-validation.xml](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-validation.xml)

🔗 login.jsp におけるエラーメッセージ表示
[👉 login.jsp](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)
```jsp
<s:fielderror />
```
---

### 📘 今回のまとめ

| 項目             | 内容                                 |
| -------------- | ---------------------------------- |
| 記述場所           | `[Action名]-validation.xml` に配置     |
| 遷移制御           | バリデーション失敗時は `input` 結果に遷移          |
| JSP            | `<s:fielderror />` を設置してエラー表示      |
| 実務Tips         | `short-circuit="true"` で不要なチェックを回避 |
| validate()との違い | Javaコードに書かずに、宣言的にチェック可能            |

---
## 📝 補足Tips：正規表現など XML で困ったら？

実務では、XMLバリデータが期待通り動作しないケースも存在します（例：regexバリデーションで一部パターンが効かない）。

その場合は、Java側の `validate()` メソッドで柔軟に対応するのがオススメです。


### 🔽 実際の実装例（GitHub）  

👉 [LoginAction.java - L57〜L75：validate()による複雑なチェック](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-L75)

---

### 🧭 次回予告：Vol.9.4
次回は、***複数フィールドにまたがるバリデーションや条件付きチェック***など、**実務でよく出くわす「一工夫が必要なケース」** を深掘りします。

---

📗 前回記事
[📘 Vol.9.2：【Struts2】入力チェックの実装編 〜 validate() / input遷移 / fielderrorタグを使いこなす 〜](https://qiita.com/juehara-crypto/items/44fd5012bfbc809d352a)

📙 次回記事
[【Vol.9.4】](https://qiita.com/juehara-crypto/items/c82203f583b2712be395
)条件付きバリデーションと複数フィールド連動チェック編（仮）

----


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



---