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.5.1 Struts2 `result` タイプ完全解説 _Struts2の“画面遷移の全体像”を理解するためのマイルストーン記事_

Last updated at Posted at 2025-05-28

🔰 本記事のゴール

  • result タイプとは何か?を明確に理解する
  • よく使われる result type を分類・整理して、どのようなケースで使うべきかを体系的に押さえる
  • 実際の struts.xml 上の定義例を交えて、各タイプの役割・使い所をイメージできるようにする

🔧 そもそも result タイプって?

Struts2では、Actionクラスの処理結果(戻り値)に応じて、次に表示する画面や処理の流れを struts.xml<result> 要素で定義します。

<action name="hello" class="com.example.HelloAction">
    <result name="success">/hello.jsp</result>
</action>

ここで <result> 要素には type 属性を指定することができ、これが「result タイプ」です。

<result name="success" type="dispatcher">/hello.jsp</result>

つまり、Struts2がActionの戻り値に応じて “どのように遷移すべきか” を決める重要な定義が result タイプです。


📚 代表的な result タイプ一覧

タイプ名 概要 主な用途
dispatcher サーバー内部でJSPなどにフォワードする(デフォルト) 通常の画面表示(例: /xxx.jsp
redirect クライアントにリダイレクト命令を返す(URLが変化する) 画面遷移後のリロード、PRGパターン
redirectAction 別のアクション(URL)へリダイレクト 他アクションに制御を移したい時
stream ファイルやバイナリデータを直接出力 CSV・PDF・画像などを返す場合
plainText プレーンテキストとして返す(Struts2.5以降) APIレスポンスなどの軽量出力
json JSON形式で返す(struts2-json-plugin使用時) Ajax通信やSPA向けAPI

✅ 各 result タイプの定義例と使い分け

1. dispatcher(デフォルト)

<result name="success" type="dispatcher">/result.jsp</result>

特徴: RequestDispatcher.forward() を使って内部フォワードする。リクエストスコープの値は引き継がれる。

用途:

  • 入力フォーム後の確認画面
  • バリデーション後の同画面再表示など

2. redirect

<result name="success" type="redirect">/result.jsp</result>

特徴: response.sendRedirect() を使ってクライアントにリダイレクト。セッション以外の値は引き継がれない。

用途:

  • 二重投稿防止(PRGパターン)
  • 完了画面 → 一覧画面など

3. redirectAction

<result name="success" type="redirectAction">
    <param name="actionName">list</param>
    <param name="namespace">/user</param>
</result>

特徴: アクションへのリダイレクト。名前空間やパラメータ指定も可能。

用途:

  • 登録成功後に一覧アクションへ遷移
  • 完了後にログインアクションへ戻す等

4. stream

<result name="download" type="stream">
    <param name="contentType">application/pdf</param>
    <param name="inputName">inputStream</param>
    <param name="contentDisposition">attachment;filename="sample.pdf"</param>
    <param name="bufferSize">1024</param>
</result>

用途:

  • ダウンロード用ファイル出力
  • 動的に生成した画像やPDF出力など

5. json(struts2-json-plugin)

<result type="json">
    <param name="root">user</param>
</result>

用途:

  • Ajax通信(フロントエンド → Struts2)
  • JSON APIレスポンスの返却

🧠 よくある疑問

redirectredirectAction の違いは?

特徴 redirect redirectAction
遷移先 JSPなどの静的URL Struts2のアクション名
パラメータ追加 可能 <param>で指定可
セッション使用可

dispatcher がデフォルトと知らず type を省略していた…問題ない?

問題ありませんが、意図を明確にするために type="dispatcher" を書くのがおすすめです。


📝 まとめ

  • result タイプは Struts2で「どのように画面遷移するか」を制御する重要な設定
  • dispatcher, redirect, redirectAction の使い分けは UX・バリデーション・セキュリティ設計に直結
  • streamjson などは ファイル出力・API対応で便利

👉 ここを押さえることで、Struts2の画面遷移は「ブラックボックス」ではなくなります!


📎 関連記事


🧭 関連記事(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.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連携) 外部公開

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?