📘 Vol.11.2.3「戻り先制御と画面遷移の設計パターン」  

Struts2プロジェクトにおける画面遷移と戻り先制御の設計パターンについて解説します。

---

## 🎯 背景と目的
業務システムでは、  
- 登録処理の後に一覧画面へ戻す  
- 入力エラー時にフォーム画面へ戻す  
- キャンセル時に前画面へ戻す  
といった **「戻り先の制御」** が非常に重要です。

Struts2では、アクションの実行結果に応じて柔軟に画面遷移を制御できます。本記事ではその基本設計パターンを整理し、実際のプロジェクトでの実装例を紹介します。

---

## ✅ 戻り値による遷移制御

Struts2ではアクションクラスの実行結果（`result`）として以下のような戻り値を返すことができます。

| 戻り値   | 意味              | 主な用途                     |
|----------|-------------------|------------------------------|
| success  | 正常処理成功       | 一覧画面や完了画面に遷移     |
| input    | 入力エラー         | 入力フォームに戻る           |
| error    | 業務エラー         | エラー専用画面に遷移         |
| cancel   | キャンセル操作     | 前画面や一覧に戻る           |

---

## 📁 `struts.xml` の定義例（抜粋）

```xml
<!-- ログイン処理 -->
<action name="login" class="com.company.bulletinboard.action.login.LoginAction">
  <result name="login">/login.jsp</result>
  <result name="admin">/view/ManagementMenu.jsp</result>
  <result name="user">/view/userPortal.jsp</result>
  <result name="input">/login.jsp</result>
</action>

<!-- キャンセル処理（戻り先: list画面） -->
<action name="cancel" class="com.company.bulletinboard.action.CancelAction" method="mainProc">
  <result name="cancel" type="redirect">list</result>
  <result name="success" type="redirect">list</result>
</action>

<!-- 登録処理の後に一覧画面へ -->
<action name="InsertUser" class="com.company.bulletinboard.action.admin.user.InsertUserAction">
  <result name="success" type="redirectAction">UserManagementScreen</result>
  <result name="input">/view/CreateUserScreen.jsp</result>
</action>
```

---

### 🧠 セッションに戻り先情報を保持する
登録や投稿処理の後、**元の画面の状態を再構築する必要がある**ケースでは、セッションに戻り先の情報（例：ID）を保存するのが有効です。

***実装例：スレッドIDをセッションに保存***
```java
// PostAction.java（一部抜粋）
session.put("thread_id", thread_id);  
// 投稿後、PostListAction へリダイレクトし、スレッド詳細を再取得
```

このようにセッションに必要な情報を保持しておくことで、**投稿直後の一覧再表示**や、**前回の表示状態の再現**が可能になります。

---

### 🏁 戻り専用アクションの設計例

戻り処理のみに責務を限定したアクションも推奨されるパターンです。
```xml
<action name="goToManagementMenu" class="com.company.bulletinboard.action.goToManagementMenuAction">
  <result name="success" type="redirect">/view/ManagementMenu.jsp</result>
</action>

```

処理を分離することで、可読性と保守性が向上します。

---

### ✅ 本プロジェクトでの実装成果

実際のプロジェクト[（GitHub: juehara-crypto / Portfolio_Bulletinboard）](https://github.com/juehara-crypto/Portfolio_Bulletinboard)において、以下のようにパターンが活用されています：

- 戻り値による一覧遷移、フォーム復帰、エラー遷移

- セッションによる戻り先（スレッドIDなど）の保持

- 戻り専用アクションによる役割分離


---

### 📌 まとめ

「戻り先制御と画面遷移の設計パターン」は、業務アプリケーションのユーザー体験を支える基礎です。Struts2の機能を活用すれば、戻り処理・入力エラー処理・キャンセル処理を一貫した設計で実現できます。

今後、処理の分岐やエラーパターンが増える場面でも、このパターンを基盤にして柔軟に拡張できます。

### 🙌 最後に

Struts2を用いたWebアプリケーション開発で、戻り先設計に悩まれている方の参考になれば幸いです。

ご質問やご指摘があれば、お気軽にコメントください！

---

📎 GitHubリポジトリ：
[juehara-crypto / Portfolio_Bulletinboard](https://github.com/juehara-crypto/Portfolio_Bulletinboard)

---

### ✨ シリーズまとめ（Vol.11.2.xx アクション層設計）

- [✅ Vol.11.2 UX改善に効く！アクション層設計と入力制御の極意（プロローグ） ― アクション層からはじめるStruts2の“わかりやすい画面遷移”と“操作性向上” ―](https://qiita.com/drafts/c69962826bb29639c351/edit)

- [✅ Vol.11.2.1 アクション層の役割と設計パターン ―「ただのリクエスト受け口」から「ユースケースの橋渡し役」へ―](https://qiita.com/juehara-crypto/items/9ca115073e6f928c7f71)

- [✅ Vol.11.2.2 アクションクラスの3設計スタイルと選定基準 ― 機能粒度・責務分離・保守性のバランスをどう取るか？ ― ](https://qiita.com/juehara-crypto/items/88b7634a64b1ad564668)

- [✅ Vol.11.2.4「セッションとパラメータの使い分けと設計ポイント」](https://qiita.com/juehara-crypto/items/06162659215cca86de28)

- [✅ Vol.11.2.5【トラブル防止】アクション層の共通処理とメンテナブルなBaseAction設計 ](https://qiita.com/juehara-crypto/items/b538b50eaa9c263a31bb)




---

### 🧭 関連記事（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.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.5.1](https://qiita.com/juehara-crypto/items/df407b24101e92a02eab)     | 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連携）                             | 外部公開           |

---