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よろしくお願いします!