📘 Vol.9.7：【Struts2】入力値の保持＆初期値再表示編 〜 エラー後の入力値維持やフォーム初期化のベストプラクティス 〜

### 🧭 はじめに
フォーム入力のUXを高めるには「エラー後も入力内容が残る」ことが重要です。
Struts2ではこの機能が標準でサポートされていますが、正しく設定しないと意図しない挙動になります。
また、フォーム表示時にあらかじめ値をセットする「初期値の表示」も、実務でよく使う実装です。
本記事ではこの2つ：

- ① 入力値の保持（エラー時も再表示される）
- ② 初期値の再表示（画面表示時に値をプリセット）

をテーマに解説します！

---

### ✅ 入力値の保持 〜 Struts2の自動機能を活かす〜
### 🔁 エラー時、入力がリセットされない理由

Struts2では、`validate()` で `addFieldError()` を使って `input` に遷移すると、
フォームの `<s:textfield>`, `<s:textarea>` などは自動的に値を保持してくれます。

### ✔ JSP側の記述例：
```jsp
<s:form action="login">
  <s:textfield name="userId" label="ユーザーID" />
  <s:password name="password" label="パスワード" />
  <s:submit value="ログイン" />
</s:form>
```
### 🔁 結果
- エラー後、`LoginAction` のプロパティ`（userId, password）`の値がフォームに戻される

- 特に `<s:textfield>` や `<s:textarea>` は何も設定しなくても自動でバインドされ

---

### 🛠 注意点：リセットされてしまうケース
以下のような場合、入力値は保持されません

| パターン                                             | 説明                           |
| ------------------------------------------------ | ---------------------------- |
| `result name="success"` で別アクションに `redirect` している | セッションを介さない限り、プロパティ値は失われる     |
| `<input type="text">` のような純HTMLで書いている            | Strutsタグを使っていないため、自動バインドされない |
| Java側で `reset()` を呼んでしまっている                      | フォームが初期化されてしまう               |

---

### 🚀 初期値の再表示（画面表示時の値セット）
### 💡 prepare() メソッドの活用
Struts2の `Preparable` インターフェースを使うことで、画面表示前に初期値を設定できます。

### 🎯 LoginAction.java（例）
```java
public class LoginAction extends ActionSupport implements Preparable {
  private String userId;

  @Override
  public void prepare() {
    // 初期表示時にデフォルト値をセット
    if (userId == null) {
      userId = "guest";
    }
  }

  public String execute() {
    return SUCCESS;
  }

  // getter/setter 略
}
```

### 🔍 JSP側
```jsp
<s:textfield name="userId" label="ユーザーID" />
```

→ 初期表示で `guest` が入っている状態に！

---

### 🎯 まとめ

| 項目    | 内容                                                |
| ----- | ------------------------------------------------- |
| 入力保持  | `<s:textfield>` 等を使えば自動バインドされる（validate→input 遷移） |
| 初期値表示 | `prepare()` や `execute()` でプロパティに初期値をセット          |
| 注意点   | redirectやHTMLタグ直書きでは値が失われるので注意                    |

---

### [🧭 次回予告：Vol.9.8](https://qiita.com/juehara-crypto/items/b11017ca621d94599f72)
次回は、**「独自バリデータ（カスタムFieldValidator）の作成」**に踏み込みます！

- バリデーションのロジックを使い回したい

- XMLでも使えるようにしたい

- 複雑なチェックを綺麗に分離したい

といったケースに対応します！

---

### ✨ シリーズまとめ（Vol.9.x バリデーション編）

- [✅ Vol.9.0：入力バリデーションと型変換の世界へ](https://qiita.com/juehara-crypto/items/263e0eb599be73681b0f)

- [✅ Vol.9.1：validate()の基本と addFieldError]()

- [✅ Vol.9.2：Struts2実装編（input遷移・fielderror活用）](https://qiita.com/juehara-crypto/items/44fd5012bfbc809d352a)

- [✅ Vol.9.3：XMLバリデーション定義](https://qiita.com/juehara-crypto/items/fd6881d2c54de07b3ae4)

- [✅ Vol.9.4：条件付きチェック・複数フィールド連動チェック](https://qiita.com/juehara-crypto/items/c82203f583b2712be395)

- [✅ Vol.9.5：エラーメッセージ表示のデザインとUX](https://qiita.com/juehara-crypto/items/c44fae5980a5c9b40312)

- [✅ Vol.9.6：i18n対応・バリデーションエラーの多言語表示で保守性UP](https://qiita.com/juehara-crypto/items/de18b174f1740f9b3646)
---



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



---