0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2025-05-24

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を実装するだけでセッションが使える!

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のリクエスト処理の大まかな流れは次の通り:

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

Interceptorの役割(一部抜粋)

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

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


🧱 BaseActionで共通処理を集約

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

例:BaseAction.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 Struts2が提供してくれる便利機能まとめ9選 導入&概要
Vol.11.2 UX改善に効く!アクション層設計と入力制御の極意(プロローグ) UX設計・アクション層総論
Vol.11.2.1 【実践編】Struts2アクション層の役割と設計パターン(Command型 / UIアクション分離など) アクション設計パターン
Vol.11.2.2 【UX重視】戻るボタン・キャンセル処理の設計手法と「戻り先管理」のスマート実装 戻り先制御とUX設計
Vol.11.2.3 【設計ノウハウ】多画面遷移時のパラメータ受け渡し・保持戦略(セッション vs hidden vs URL) パラメータ多重管理
Vol.11.2.4 【実践ガイド】ユーザー操作を考慮したアクション遷移設計(リダイレクト vs フォワードの使い分け) UX遷移設計/Result制御
Vol.11.2.5 【トラブル防止】アクション層の共通処理とメンテナブルなBaseAction設計 アクション共通化/保守性
Vol.11.3 Struts2の defaultStack とは?Interceptorの中身を詳しく追ってみる Interceptor
Vol.11.3.2 🔧 Vol.11.3.2 独自Interceptorの作り方と使い所 Struts2のカスタマイズを“実践で使えるレベル”に一歩進めよう Interceptor
Vol.11.4 入門者のための「パラメータ自動バインディング」完全理解ガイド 自動バインディング
Vol.Vol.11.4.1 入門者のための自動バインディング実践パターン集 自動バインディング
Vol.11.5 Struts2の構成理解が“実務レベル”へと進化する決定版 設定ファイル構造
Vol.11.5.1 Struts2の“画面遷移の全体像”を理解するためのマイルストーン記事 設定ファイル構造
Vol.11.6 ActionSupport の便利メソッドと国際化対応 ユーティリティ / i18n
Vol.11.7 validate() / input 戦略とUX設計 開発スタイルの違い
Vol.11.8 アノテーションベースの設定 vs XML定義の比較 開発スタイルの違い
Vol.11.9 バリデーション完全解説(XML / アノテーション) バリデーション(※Vol.8補完)
Vol.11.10 Struts2の「OGNL」ってなに?しくみと使い方をやさしく解説 式言語OGNL解説
Vol.11.11 ModelDriven インターフェースの使いどころと注意点 Model駆動開発
Vol.11.12 SessionAware と RequestAware でセッション/リクエスト管理 セッション管理
Vol.11.13 Resultタイプ完全解説(dispatcher / redirect / stream など) 遷移パターン理解
Vol.11.14 Vol.11.14 ValueStackの中身を理解する – 画面とActionの橋渡し役 Action
Vol.11.15 Interceptorチェーンを自作してみよう(ログ / 認証フィルタ) Interceptor
Vol.11.16 エラー処理と例外ハンドリングの実践パターン ハンドリング設計
Vol.11.17 Struts2でファイルアップロード機能を実装する方法 実装系Tips
Vol.11.18 非同期通信(AJAX)とStruts2の連携方法 フロント連携編
Vol.11.19 セキュリティ対策(CSRF, XSS, パラメータ偽装) セキュリティ対策
Vol.11.20 複数フォームを安全に扱う!セッション管理と動的フォームの考え方 セッション管理
Vol.11.21 Struts2でJSONを返す!REST API連携と非同期通信の基本設計 セッション管理
Vol.11.22 本番環境構成とセキュリティ設計(Apache+Tomcat+Struts2連携) 外部公開

🙌 おわりに

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

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

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


0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?