🧩 Vol.11.5.1 Struts2 `result` タイプ完全解説 _Struts2の“画面遷移の全体像”を理解するためのマイルストーン記事_

## 🔰 本記事のゴール

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

---

## 🔧 そもそも result タイプって？

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

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

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

```xml
<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`（デフォルト）

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

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

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

### 2. `redirect`

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

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

**用途**:
- 二重投稿防止（PRGパターン）
- 完了画面 → 一覧画面など

### 3. `redirectAction`

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

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

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

### 4. `stream`

```xml
<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）

```xml
<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の構成理解が“実務レベル”へと進化する決定版_](https://qiita.com/juehara-crypto/items/6ef7a87a54163d81a9ba)（←前回）
- 🧩 Vol.11.6 ActionSupport の便利メソッドと国際化対応（次回予定）


---

### 🧭 関連記事（Vol.11.xxxシリーズ）
| 連番           | タイトル                                                  | 内容分類              |
| ------------ | ----------------------------------------------------- | ----------------- |
| [Vol.11.0](https://qiita.com/juehara-crypto/items/a0cc66893cb499a6e23a)     | Struts2が提供してくれる便利機能まとめ9選                              | 導入＆概要             |
| [Vol.11.1](https://qiita.com/juehara-crypto/items/0a584da537059dd43a7c)     | 自動注入とステートレスActionの仕組み                                 | フレームワーク内部理解       |
| [Vol.11.2](https://qiita.com/juehara-crypto/items/c69962826bb29639c351) | **UX改善に効く！アクション層設計と入力制御の極意（プロローグ）**                   | UX設計・アクション層総論     |
| [Vol.11.2.1](https://qiita.com/juehara-crypto/items/9ca115073e6f928c7f71)   | 【実践編】Struts2アクション層の役割と設計パターン（Command型 / UIアクション分離など）  | アクション設計パターン       |
| [Vol.11.2.2](https://qiita.com/juehara-crypto/items/88b7634a64b1ad564668)   | 【UX重視】戻るボタン・キャンセル処理の設計手法と「戻り先管理」のスマート実装               | 戻り先制御とUX設計        |
| [Vol.11.2.3](https://qiita.com/juehara-crypto/items/c5165c92a4366fd1962b)   | 【設計ノウハウ】多画面遷移時のパラメータ受け渡し・保持戦略（セッション vs hidden vs URL） | パラメータ多重管理         |
| [Vol.11.2.4](https://qiita.com/juehara-crypto/items/06162659215cca86de28)   | 【実践ガイド】ユーザー操作を考慮したアクション遷移設計（リダイレクト vs フォワードの使い分け）     | UX遷移設計／Result制御   |
| [Vol.11.2.5](https://qiita.com/juehara-crypto/items/b538b50eaa9c263a31bb)   | 【トラブル防止】アクション層の共通処理とメンテナブルなBaseAction設計               | アクション共通化／保守性      |
| [Vol.11.3](https://qiita.com/juehara-crypto/items/913de7c942a9242201e8)     | Struts2の defaultStack とは？Interceptorの中身を詳しく追ってみる      | Interceptor       |
| [Vol.11.3.2](https://qiita.com/juehara-crypto/items/ede8d3c2a9b147f6161e)     | 🔧 Vol.11.3.2 独自Interceptorの作り方と使い所 _Struts2のカスタマイズを“実践で使えるレベル”に一歩進めよう_     | Interceptor       |
| [Vol.11.4](https://qiita.com/juehara-crypto/items/253142d13fe5f604610f)     | 入門者のための「パラメータ自動バインディング」完全理解ガイド                        | 自動バインディング         |
| [Vol.Vol.11.4.1](https://qiita.com/juehara-crypto/items/4fd8ed2a8be317f6e1bd)     | 入門者のための自動バインディング実践パターン集                        | 自動バインディング         |
| [Vol.11.5](https://qiita.com/juehara-crypto/items/6ef7a87a54163d81a9ba)     | Struts2の構成理解が“実務レベル”へと進化する決定版         | 設定ファイル構造          |
| [Vol.11.6](https://qiita.com/juehara-crypto/items/bfbdc2203acac7ba3f19)     | ActionSupport の便利メソッドと国際化対応                           | ユーティリティ / i18n    |
| [Vol.11.7](https://qiita.com/juehara-crypto/items/ed8f0977c23ee8c8b959)     | validate() / input 戦略とUX設計                            | 開発スタイルの違い    
| [Vol.11.8](https://qiita.com/juehara-crypto/items/bb2b23612c22fa9bf50b)     | アノテーションベースの設定 vs XML定義の比較                             | 開発スタイルの違い         |
| [Vol.11.9](https://qiita.com/juehara-crypto/items/6163ad6c9308cc8dda6d)     | バリデーション完全解説（XML / アノテーション）                            | バリデーション（※Vol.8補完） |
| [Vol.11.10](https://qiita.com/juehara-crypto/items/207cb3d7f0a889c54df9)     | Struts2の「OGNL」ってなに？しくみと使い方をやさしく解説                     | 式言語OGNL解説         |
| [Vol.11.11](https://qiita.com/juehara-crypto/items/c313ea56f97984756c05)    | ModelDriven インターフェースの使いどころと注意点                        | Model駆動開発         |
| [Vol.11.12](https://qiita.com/juehara-crypto/items/de7a17d53e53d6466f17)    | SessionAware と RequestAware でセッション/リクエスト管理            | セッション管理           |
| [Vol.11.13](https://qiita.com/juehara-crypto/items/539bd5bae75a8e154753)    | Resultタイプ完全解説（dispatcher / redirect / stream など）      | 遷移パターン理解          |
| [Vol.11.14](https://qiita.com/juehara-crypto/items/142d9aa2c623c5eb70bc)    | Vol.11.14 ValueStackの中身を理解する – 画面とActionの橋渡し役                 | Action            |
| [Vol.11.15](https://qiita.com/juehara-crypto/items/84f024816d0cf2212cb6)    | Interceptorチェーンを自作してみよう（ログ / 認証フィルタ）                 | Interceptor            |
| [Vol.11.16](https://qiita.com/juehara-crypto/items/ff3ad75f9ee45fcd0f8f)    | エラー処理と例外ハンドリングの実践パターン                                 | ハンドリング設計          |
| [Vol.11.17](https://qiita.com/juehara-crypto/items/0d8d5101ff39b34b4704)    | Struts2でファイルアップロード機能を実装する方法                           | 実装系Tips           |
| [Vol.11.18](https://qiita.com/juehara-crypto/items/d93c8d9cee719997c068)    | 非同期通信（AJAX）とStruts2の連携方法                              | フロント連携編           |
| [Vol.11.19](https://qiita.com/juehara-crypto/items/dd6cf06d3100c9204d1f)    | セキュリティ対策（CSRF, XSS, パラメータ偽装）                              | セキュリティ対策           |
| [Vol.11.20](https://qiita.com/juehara-crypto/items/9442d9f4705f1c6c4da1)    | 複数フォームを安全に扱う！セッション管理と動的フォームの考え方                              | セッション管理           |
| [Vol.11.21](https://qiita.com/juehara-crypto/items/78eb217727b7c97f228a)    | Struts2でJSONを返す！REST API連携と非同期通信の基本設計                              | セッション管理           |
| [Vol.11.22](https://qiita.com/juehara-crypto/items/424155ee0e567a36b9a1)    | 本番環境構成とセキュリティ設計（Apache+Tomcat+Struts2連携）                             | 外部公開           |

---