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.14 ValueStackの中身を理解する – 画面とActionの橋渡し役

Last updated at Posted at 2025-05-29

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#request などの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連携) 外部公開

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?