📘 🔍 Vol.11.1：Struts2の自動注入とステートレスActionの仕組み（Struts2機能説明編）

Struts2を学び始めると、まず最初に戸惑うのが「**いつのまにか値が入っている**」現象ではないでしょうか？

- `setSession()` が呼ばれてないのに `session` が使える…
- `userId` プロパティにHTMLフォームの値が勝手に入ってる…
- どこで何が実行されてるのか分からない…

今回はこの“Struts2の魔法のような機能”の正体を暴きつつ、**Struts2の基本思想（ステートレス設計）と自動注入の仕組み**について、図解なしでも理解できるように丁寧に解説していきます。

---

## 🧭 本シリーズについて：Struts2「機能説明編」スタート！

このブログシリーズでは、Struts2で掲示板アプリケーションを構築していく過程を記録していますが、それに先立って、**Struts2が持つ便利な機能や基本動作**を体系的にまとめる「Struts2機能説明編」をスタートしました！

- Vol.11.0：【保存版】Struts2が提供してくれる便利機能まとめ9選（MVC/自動バインディング/OGNLなど）
- Vol.11.1：← 今回この記事（自動注入とステートレスAction）

この「機能説明編」では、Struts2の仕組みや挙動を一つひとつ分解して、初心者でも理解しやすいようにまとめていきます！

---

## 🧩 ステートレスActionって何？

Struts2では、リクエストごとに **毎回新しいActionインスタンスが生成されます。**

つまり、Actionクラスは「ステートレス」な設計になっています。

### 📌 ステートレス（Stateless）とは？

| 特徴 | 説明 |
|------|------|
| 状態を保持しない | 前のリクエストの値を持ち越さない |
| 毎回クリーンなインスタンスで実行される | 前のプロパティ値や処理状態は引き継がれない |
| マルチスレッドでも安全 | 共有状態がないのでスレッドセーフ |

---

## ⚙️ 「自動注入」って何が行われてるの？

Struts2のActionクラスは、次のような仕組みで「値が勝手に設定される」ようになっています。

### ✅ 例：SessionAwareを実装するだけでセッションが使える！

```java
public class SampleAction implements SessionAware {
    private Map<String, Object> session;

    @Override
    public void setSession(Map<String, Object> session) {
        this.session = session;
    }
}
```

---

### 🤔 でも…setSession()ってどこで呼ばれてるの？

実は、これは **Interceptor（インターセプター）** による「自動注入」の仕業です！

## 🛠 Interceptorの仕組み
Struts2のリクエスト処理の大まかな流れは次の通り：

```scss
リクエスト受信 → Actionインスタンス生成 → Interceptor群の処理 → execute() 実行 → 結果ビューへ
```

### Interceptorの役割（一部抜粋）

| Interceptor名     | 機能                                 |
| ---------------- | ---------------------------------- |
| `params`         | リクエストパラメータ → プロパティへの自動バインディング      |
| `servlet-config` | `ServletRequestAware` などのセット       |
| `session`        | `SessionAware` インタフェースに基づいてセッション注入 |
| `validation`     | 入力チェック処理                           |
| `workflow`       | エラー処理フロー制御                         |
| `token`          | 重複送信防止                             |

つまり、**Actionクラスの前処理をInterceptorが一手に引き受けてくれている**のです。

---

### 🧱 BaseActionで共通処理を集約

Struts2では、Actionクラスごとに同じような処理を書かないように、共通処理を `BaseAction(基定クラス)` にまとめるのが定石です。

### 例：BaseAction.java
```java
public class BaseAction extends ActionSupport
    implements SessionAware, ServletRequestAware {

    protected Map<String, Object> session;
    protected HttpServletRequest request;

    @Override
    public void setSession(Map<String, Object> session) {
        this.session = session;
    }

    @Override
    public void setServletRequest(HttpServletRequest request) {
        this.request = request;
    }
}
```

これを継承するだけで、どのActionでもセッションやリクエストが自動注入されます。

---

### 🎯 まとめ：Struts2の“魔法”をちゃんと理解しよう！

| 理解のポイント              | 内容                              |
| -------------------- | ------------------------------- |
| Actionはステートレス        | 毎回クリーンな状態で生成される                 |
| 自動注入はInterceptorの仕組み | セッションやリクエスト、パラメータなどを自動でセットしてくれる |
| BaseActionで効率化       | 継承によって共通処理を一元化できる               |

---

---

---

### 🧭 関連記事（Vol.11.xxxシリーズ）
| 連番           | タイトル                                                  | 内容分類              |
| ------------ | ----------------------------------------------------- | ----------------- |
| [Vol.11.0](https://qiita.com/juehara-crypto/items/a0cc66893cb499a6e23a)     | Struts2が提供してくれる便利機能まとめ9選                              | 導入＆概要             |
| [Vol.11.2](https://qiita.com/juehara-crypto/items/c69962826bb29639c351) | **UX改善に効く！アクション層設計と入力制御の極意（プロローグ）**                   | UX設計・アクション層総論     |
| [Vol.11.2.1](https://qiita.com/juehara-crypto/items/9ca115073e6f928c7f71)   | 【実践編】Struts2アクション層の役割と設計パターン（Command型 / UIアクション分離など）  | アクション設計パターン       |
| [Vol.11.2.2](https://qiita.com/juehara-crypto/items/88b7634a64b1ad564668)   | 【UX重視】戻るボタン・キャンセル処理の設計手法と「戻り先管理」のスマート実装               | 戻り先制御とUX設計        |
| [Vol.11.2.3](https://qiita.com/juehara-crypto/items/c5165c92a4366fd1962b)   | 【設計ノウハウ】多画面遷移時のパラメータ受け渡し・保持戦略（セッション vs hidden vs URL） | パラメータ多重管理         |
| [Vol.11.2.4](https://qiita.com/juehara-crypto/items/06162659215cca86de28)   | 【実践ガイド】ユーザー操作を考慮したアクション遷移設計（リダイレクト vs フォワードの使い分け）     | UX遷移設計／Result制御   |
| [Vol.11.2.5](https://qiita.com/juehara-crypto/items/b538b50eaa9c263a31bb)   | 【トラブル防止】アクション層の共通処理とメンテナブルなBaseAction設計               | アクション共通化／保守性      |
| [Vol.11.3](https://qiita.com/juehara-crypto/items/913de7c942a9242201e8)     | Struts2の defaultStack とは？Interceptorの中身を詳しく追ってみる      | Interceptor       |
| [Vol.11.3.2](https://qiita.com/juehara-crypto/items/ede8d3c2a9b147f6161e)     | 🔧 Vol.11.3.2 独自Interceptorの作り方と使い所 _Struts2のカスタマイズを“実践で使えるレベル”に一歩進めよう_     | Interceptor       |
| [Vol.11.4](https://qiita.com/juehara-crypto/items/253142d13fe5f604610f)     | 入門者のための「パラメータ自動バインディング」完全理解ガイド                        | 自動バインディング         |
| [Vol.Vol.11.4.1](https://qiita.com/juehara-crypto/items/4fd8ed2a8be317f6e1bd)     | 入門者のための自動バインディング実践パターン集                        | 自動バインディング         |
| [Vol.11.5](https://qiita.com/juehara-crypto/items/6ef7a87a54163d81a9ba)     | Struts2の構成理解が“実務レベル”へと進化する決定版         | 設定ファイル構造          |
| [Vol.11.5.1](https://qiita.com/juehara-crypto/items/df407b24101e92a02eab)     | Struts2の“画面遷移の全体像”を理解するためのマイルストーン記事         | 設定ファイル構造          |
| [Vol.11.6](https://qiita.com/juehara-crypto/items/bfbdc2203acac7ba3f19)     | ActionSupport の便利メソッドと国際化対応                           | ユーティリティ / i18n    |
| [Vol.11.7](https://qiita.com/juehara-crypto/items/ed8f0977c23ee8c8b959)     | validate() / input 戦略とUX設計                            | 開発スタイルの違い    
| [Vol.11.8](https://qiita.com/juehara-crypto/items/bb2b23612c22fa9bf50b)     | アノテーションベースの設定 vs XML定義の比較                             | 開発スタイルの違い         |
| [Vol.11.9](https://qiita.com/juehara-crypto/items/6163ad6c9308cc8dda6d)     | バリデーション完全解説（XML / アノテーション）                            | バリデーション（※Vol.8補完） |
| [Vol.11.10](https://qiita.com/juehara-crypto/items/207cb3d7f0a889c54df9)     | Struts2の「OGNL」ってなに？しくみと使い方をやさしく解説                     | 式言語OGNL解説         |
| [Vol.11.11](https://qiita.com/juehara-crypto/items/c313ea56f97984756c05)    | ModelDriven インターフェースの使いどころと注意点                        | Model駆動開発         |
| [Vol.11.12](https://qiita.com/juehara-crypto/items/de7a17d53e53d6466f17)    | SessionAware と RequestAware でセッション/リクエスト管理            | セッション管理           |
| [Vol.11.13](https://qiita.com/juehara-crypto/items/539bd5bae75a8e154753)    | Resultタイプ完全解説（dispatcher / redirect / stream など）      | 遷移パターン理解          |
| [Vol.11.14](https://qiita.com/juehara-crypto/items/142d9aa2c623c5eb70bc)    | Vol.11.14 ValueStackの中身を理解する – 画面とActionの橋渡し役                 | Action            |
| [Vol.11.15](https://qiita.com/juehara-crypto/items/84f024816d0cf2212cb6)    | Interceptorチェーンを自作してみよう（ログ / 認証フィルタ）                 | Interceptor            |
| [Vol.11.16](https://qiita.com/juehara-crypto/items/ff3ad75f9ee45fcd0f8f)    | エラー処理と例外ハンドリングの実践パターン                                 | ハンドリング設計          |
| [Vol.11.17](https://qiita.com/juehara-crypto/items/0d8d5101ff39b34b4704)    | Struts2でファイルアップロード機能を実装する方法                           | 実装系Tips           |
| [Vol.11.18](https://qiita.com/juehara-crypto/items/d93c8d9cee719997c068)    | 非同期通信（AJAX）とStruts2の連携方法                              | フロント連携編           |
| [Vol.11.19](https://qiita.com/juehara-crypto/items/dd6cf06d3100c9204d1f)    | セキュリティ対策（CSRF, XSS, パラメータ偽装）                              | セキュリティ対策           |
| [Vol.11.20](https://qiita.com/juehara-crypto/items/9442d9f4705f1c6c4da1)    | 複数フォームを安全に扱う！セッション管理と動的フォームの考え方                              | セッション管理           |
| [Vol.11.21](https://qiita.com/juehara-crypto/items/78eb217727b7c97f228a)    | Struts2でJSONを返す！REST API連携と非同期通信の基本設計                              | セッション管理           |
| [Vol.11.22](https://qiita.com/juehara-crypto/items/424155ee0e567a36b9a1)    | 本番環境構成とセキュリティ設計（Apache+Tomcat+Struts2連携）                             | 外部公開           |

---

### 🙌 おわりに
Struts2は古いフレームワークと思われがちですが、基本設計は非常に堅牢で、学ぶ価値のある技術です。

今回の記事で少しでも「なるほど！」「モヤモヤが晴れた！」と思っていただけたなら嬉しいです。

次回以降もStruts2の奥深い機能を掘り下げていきますので、ぜひフォロー＆LGTMよろしくお願いします！

---