Struts2の根幹をなすValueStackの仕組みと動作を、初心者にもわかりやすく図解&コード付きで徹底解説します。
✅ 1. ValueStackとは何か?
ValueStack(バリュースタック) とは、Struts2において
「ActionとView(JSP)間のデータバインディングを行う中心的な仕組み」です。
Struts2はリクエストを受け取ると、対象のActionクラスを作成し、
そのインスタンスをValueStackに push します。
✅ 2. ValueStackの構造とイメージ
┌───────────────────────────────┐
│ ValueStack │
│ ┌────────────┐ │
│ │ ModelDriven │ ← push() │
│ ├────────────┤ │
│ │ Action本体 │ ← push() │
│ ├────────────┤ │
│ │ MapやBeans │ ← paramsなど │
│ └────────────┘ │
└───────────────────────────────┘
-
Stack(スタック)構造になっており、上から順番にプロパティを検索します。
-
これがOGNL式評価(例:
user.name
)時の検索対象になります。
✅ 3. 具体例:JSPからプロパティを取得する流れ
例)JSPで以下のように記述した場合:
<s:property value="user.name" />
この user.name
はどのようにして解決されるのでしょう?
Struts2の内部的な流れ:
-
1.
ValueStack
のトップからuser
というプロパティを検索。 -
2.見つかれば
.name
を取得して評価。 -
3.なければ次のオブジェクトへ…という形で下方向に探索。
✅ 4. push() される主なオブジェクト
オブジェクト | 解説 |
---|---|
Model(ModelDriven) | モデル駆動開発をしていると pushされる |
Actionインスタンス | 通常のActionクラスが push される |
リクエストスコープ等 | Struts2の params などがMap形式で push |
✅ 5. 実際のコードで確認してみよう
Actionクラス(例)
public class HelloAction extends ActionSupport {
private String message = "こんにちは、Struts2!";
public String getMessage() {
return message;
}
public String execute() {
return SUCCESS;
}
}
JSP側
<s:property value="message" />
このような記述は、Struts2のタグライブラリが OGNL を使って getMessage()
を評価しているということになります。
→ その「評価対象」になっているのが、ValueStack です。
✅ 6. ValueStackとModelDrivenの関係
public class UserAction extends ActionSupport implements ModelDriven<User> {
private User user = new User();
public User getModel() {
return user;
}
}
-
ModelDrivenインターフェースを使うと、userインスタンスがValueStackの最上位にpushされます。
-
つまり
user.name
ではなく、JSP側では単にname
と書くだけで済むようになります。
<s:property value="name" />
✅ 7. ValueStackの便利Tips
🌟 ViewからMapのように扱える!
<s:property value="#session.user.name" />
<s:property value="#request.someAttr" />
#session
や #reques
t などのOGNL組み込みオブジェクトも
ValueStack上に存在し、Map形式でアクセスできます。
✅ 8. よくあるトラブルと対策
問題 | 原因 | 対処法 |
---|---|---|
JSPで値が表示されない | ValueStackにそのプロパティがない | ActionやModelのgetterを確認する |
複数のオブジェクトに同じプロパティ名がある | 下にあるオブジェクトのプロパティが無視される | push順を見直す、ModelDrivenを検討 |
✅ 9. まとめ:ValueStackはStruts2の「中枢神経」
-
Struts2の画面表示やバインディングの中核は ValueStack。
-
push()
されたオブジェクトを 上から順にOGNL
で評価。 -
ModelDriven
を使えば、モデルを最上位に置けて便利。 -
#session
や#request
などもValueStackからアクセス可能。
✅ 次回予告
次回は、ついに実装系上級編へ!
Vol.11.15:Interceptorチェーンを自作してみよう(ログ / 認証フィルタ)
Struts2独自の「Interceptor」で、共通処理(ログ記録やログインチェック)を自作します。
現場で役立つ!応用的な設計力が身につきますよ。
🧭 関連記事(Vol.11.xxxシリーズ)
連番 | タイトル | 内容分類 |
---|---|---|
Vol.11.0 | Struts2が提供してくれる便利機能まとめ9選 | 導入&概要 |
Vol.11.1 | 自動注入とステートレスActionの仕組み | フレームワーク内部理解 |
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.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連携) | 外部公開 |