Struts2プロジェクトにおける画面遷移と戻り先制御の設計パターンについて解説します。
🎯 背景と目的
業務システムでは、
- 登録処理の後に一覧画面へ戻す
- 入力エラー時にフォーム画面へ戻す
- キャンセル時に前画面へ戻す
といった 「戻り先の制御」 が非常に重要です。
Struts2では、アクションの実行結果に応じて柔軟に画面遷移を制御できます。本記事ではその基本設計パターンを整理し、実際のプロジェクトでの実装例を紹介します。
✅ 戻り値による遷移制御
Struts2ではアクションクラスの実行結果(result
)として以下のような戻り値を返すことができます。
戻り値 | 意味 | 主な用途 |
---|---|---|
success | 正常処理成功 | 一覧画面や完了画面に遷移 |
input | 入力エラー | 入力フォームに戻る |
error | 業務エラー | エラー専用画面に遷移 |
cancel | キャンセル操作 | 前画面や一覧に戻る |
📁 struts.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をセッションに保存
// PostAction.java(一部抜粋)
session.put("thread_id", thread_id);
// 投稿後、PostListAction へリダイレクトし、スレッド詳細を再取得
このようにセッションに必要な情報を保持しておくことで、投稿直後の一覧再表示や、前回の表示状態の再現が可能になります。
🏁 戻り専用アクションの設計例
戻り処理のみに責務を限定したアクションも推奨されるパターンです。
<action name="goToManagementMenu" class="com.company.bulletinboard.action.goToManagementMenuAction">
<result name="success" type="redirect">/view/ManagementMenu.jsp</result>
</action>
処理を分離することで、可読性と保守性が向上します。
✅ 本プロジェクトでの実装成果
実際のプロジェクト(GitHub: juehara-crypto / Portfolio_Bulletinboard)において、以下のようにパターンが活用されています:
-
戻り値による一覧遷移、フォーム復帰、エラー遷移
-
セッションによる戻り先(スレッドIDなど)の保持
-
戻り専用アクションによる役割分離
📌 まとめ
「戻り先制御と画面遷移の設計パターン」は、業務アプリケーションのユーザー体験を支える基礎です。Struts2の機能を活用すれば、戻り処理・入力エラー処理・キャンセル処理を一貫した設計で実現できます。
今後、処理の分岐やエラーパターンが増える場面でも、このパターンを基盤にして柔軟に拡張できます。
🙌 最後に
Struts2を用いたWebアプリケーション開発で、戻り先設計に悩まれている方の参考になれば幸いです。
ご質問やご指摘があれば、お気軽にコメントください!
📎 GitHubリポジトリ:
juehara-crypto / Portfolio_Bulletinboard
✨ シリーズまとめ(Vol.11.2.xx アクション層設計)
-
✅ Vol.11.2 UX改善に効く!アクション層設計と入力制御の極意(プロローグ) ― アクション層からはじめるStruts2の“わかりやすい画面遷移”と“操作性向上” ―
-
✅ Vol.11.2.1 アクション層の役割と設計パターン ―「ただのリクエスト受け口」から「ユースケースの橋渡し役」へ―
-
✅ Vol.11.2.2 アクションクラスの3設計スタイルと選定基準 ― 機能粒度・責務分離・保守性のバランスをどう取るか? ―
🧭 関連記事(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.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.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連携) | 外部公開 |