🔰 本記事のゴール
-
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レスポンスの返却
🧠 よくある疑問
❓ redirect
と redirectAction
の違いは?
特徴 | redirect | redirectAction |
---|---|---|
遷移先 | JSPなどの静的URL | Struts2のアクション名 |
パラメータ追加 | 可能 |
<param> で指定可 |
セッション使用可 | ◯ | ◯ |
❓ dispatcher
がデフォルトと知らず type を省略していた…問題ない?
問題ありませんが、意図を明確にするために type="dispatcher"
を書くのがおすすめです。
📝 まとめ
- result タイプは Struts2で「どのように画面遷移するか」を制御する重要な設定
-
dispatcher
,redirect
,redirectAction
の使い分けは UX・バリデーション・セキュリティ設計に直結 -
stream
やjson
などは ファイル出力・API対応で便利
👉 ここを押さえることで、Struts2の画面遷移は「ブラックボックス」ではなくなります!
📎 関連記事
- 🧩 🧩 Vol.11.5 struts.xml 完全攻略ガイド Struts2の構成理解が“実務レベル”へと進化する決定版(←前回)
- 🧩 Vol.11.6 ActionSupport の便利メソッドと国際化対応(次回予定)
🧭 関連記事(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連携) | 外部公開 |