✅ 本章の目的
Struts2ベースのアクション設計において、全アクションで共通する処理(セッション管理やリクエストオブジェクトの受け渡しなど)を 共通基底クラス(BaseAction
)にまとめることで、保守性と再利用性の高い設計を実現します。
本プロジェクトで実際に使用している BaseAction.java
は以下の GitHub リポジトリで確認できます:
🛠️ BaseActionの設計方針
- 全アクションで共通する処理を
BaseAction
に集約 - セッションとリクエスト情報の受け取りを標準化
- 各アクションは
mainProc()
をオーバーライドしてメイン処理を実装
📄 BaseActionの実装(完全版)
package com.company.bulletinboard.interceptor;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.SessionAware;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.opensymphony.xwork2.ActionSupport;
/**
* アクションの基底クラス
*/
public abstract class BaseAction extends ActionSupport implements ServletRequestAware, SessionAware {
private static final long serialVersionUID = 1L;
protected Map<String, Object> session;
protected HttpServletRequest request;
protected static final Logger logger = LoggerFactory.getLogger(BaseAction.class);
/**
* セッション情報を設定
*/
@Override
public void setSession(Map<String, Object> session) {
this.session = session;
}
/**
* リクエスト情報を設定
*/
@Override
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
/**
* 各アクションで実装するメイン処理
*/
public abstract String mainProc() throws Exception;
/**
* Struts2の標準実行メソッド。mainProcを呼び出す
*/
@Override
public String execute() throws Exception {
return mainProc();
}
}
✅ 各アクションの継承実装例:PostAction
実際のアクションは 'BaseAction' を継承し、'mainProc()' を実装する形で作成します。
public class PostAction extends BaseAction implements SessionAware {
private static final long serialVersionUID = 1L;
@Override
public String mainProc() throws Exception {
logger.info("PostAction: mainProc() start");
Integer threadId = (Integer) session.get("thread_id");
// 投稿処理ロジック
// PostDaoなどを用いてDBに書き込み処理を行う
logger.info("PostAction: mainProc() end");
return SUCCESS;
}
}
🎯 こうするメリット
項目 | 内容 |
---|---|
✅ 保守性 | セッションやリクエストの設定処理を一元管理。変更に強い設計。 |
✅ コードの簡素化 | 各アクションはビジネスロジックに専念でき、記述量を削減。 |
✅ バグ回避 | セッション操作やリクエスト取得の書き忘れ・重複実装を防止。 |
✅ 統一的な実行構造 |
mainProc() 統一により、開発者間でのコードの読みやすさ・保守性向上。 |
💡 補足:SessionAware / ServletRequestAwareとは?
インタフェース名 | 役割 |
---|---|
SessionAware |
Struts2がセッションMapを自動的に注入してくれる。 |
ServletRequestAware |
HttpServletRequest を自動注入してくれる。 |
→ これらを使うことで、session.get(...)
や request.getParameter(...)
が簡単に使えるようになります。
✨ シリーズまとめ(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.3 | 【設計ノウハウ】多画面遷移時のパラメータ受け渡し・保持戦略(セッション vs hidden vs URL) | パラメータ多重管理 |
Vol.11.2.4 | 【実践ガイド】ユーザー操作を考慮したアクション遷移設計(リダイレクト vs フォワードの使い分け) | UX遷移設計/Result制御 |
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連携) | 外部公開 |