Struts2 における BaseAction
クラスの導入は、コードの共通化と保守性の向上に大きく寄与します。
ここでは、BaseActionクラス を活用しない場合と活用した場合の違いを比較しながら、実践的な活用例を解説します。
✅ BaseActionクラス を活用しない場合
📌 特徴
- 各アクションクラスで
HttpSession
やHttpServletRequest
を個別に取得・管理する必要がある - セッションやリクエストパラメータの扱いが 重複・煩雑化 しやすい
✍️ 例:BaseActionクラス を使わずにセッションを扱う場合
public class SampleAction implements SessionAware {
private Map<String, Object> session;
@Override
public void setSession(Map<String, Object> session) {
this.session = session;
}
public String execute() {
String userId = (String) session.get("user_id");
System.out.println("User ID: " + userId);
return "success";
}
}
⚠️ 問題点
-
SessionAware を 毎回実装 しなければならない
-
セッションキーの取得処理が 各クラスに分散
-
リクエスト処理も同様に ServletRequestAware を実装する必要がある
✅ BaseActionクラス を活用した場合
📌 特徴
BaseActionクラス が SessionAware, ServletRequestAware を実装しており、すべての子クラスで 共通的にセッション/リクエストを利用可能
各アクションクラスでは ビジネスロジックに集中 できる
✍️ BaseActionクラス の例
public abstract class BaseAction extends ActionSupport
implements SessionAware, ServletRequestAware {
protected Map<String, Object> session;
protected HttpServletRequest request;
@Override
public void setSession(Map<String, Object> session) {
this.session = session;
}
@Override
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
public abstract String mainProc();
@Override
public String execute() throws Exception {
return mainProc();
}
}
✍️ SampleAction の例
public class SampleAction extends BaseAction {
@Override
public String mainProc() {
String userId = (String) session.get("user_id");
System.out.println("User ID: " + userId);
return "success";
}
}
✅ メリット
-
session や request の取得処理が BaseAction に集中
-
コードの重複を排除し、保守性向上
-
各クラスでは mainProc() にビジネス処理だけを書けば良い
💡 Struts2 における SessionAware の必要性
Struts2 では、セッションを自動的にアクションに注入する仕組みはありません。
そのため、以下のように明示的に SessionAware インターフェースを実装しない限り、セッションは取得できません。
public interface SessionAware {
void setSession(Map<String, Object> session);
}
この仕様により、セッションを使うすべてのアクションクラスで SessionAware を実装する必要があります。
しかし、BaseActionクラス で一括実装しておくことで、この問題を回避できます。
✅ まとめ
項目 | BaseAction なし | BaseAction あり |
---|---|---|
セッション取得 | 各クラスで毎回実装 | BaseAction で共通化 |
リクエスト取得 | 同上 | 同上 |
重複コード | 多くなる | 減る |
保守性 | 低い | 高い |
責務分離 | 難しい | 実現しやすい |
BaseActionクラス を活用しつつ、Struts2 の仕様を理解しておくことで、
より効率的でメンテナンス性の高い Web アプリケーション開発が実現できます!
📝 次回(Vol.7)
📘 Vol.7:Struts2 における MVC モデルの全体像
🧭 Vol.1〜7 関連リンク
回 | タイトル | 主な内容 |
---|---|---|
Vol.1 | プログラミングとの再会 – 「画面ありき」で変わった学び方 | プログラミング再入門と、画面駆動の学習法というユニークなアプローチの紹介。最初に「画面」から考えることでモチベーションを継続。 |
Vol.2 | 画面駆動設計に基づく設計書の具体例:画面フローからUI設計・処理定義まで | 実際に描いた画面遷移図・UI設計・処理定義書を公開し、画面中心の設計手法を解説。 |
Vol.3 | 詳細設計編:ER図で見るデータ構造と実装の土台 | 実装前提で設計された ER図(Entity Relationship 図) をもとに、データ構造と整合性を設計。 |
Vol.4 | Struts2とMavenの基礎と設定ファイルの役割 | Struts2の構成とMavenでの管理、web.xml や pom.xml の役割を丁寧に解説。 |
Vol.5 | 環境構築編:掲示板アプリケーションの実行準備 | TomcatとEclipseでの動作環境構築。 |
Vol.6 | BaseActionクラスの詳細解説【Struts2の要】 | すべてのアクションに共通する基底クラス BaseAction を定義し、ログ出力や共通処理を集約。 |
Vol.7 | Struts2 における MVC モデルの全体像 | Model-View-Controller の各要素が Struts2 でどう分担されるかを体系的に解説。 |
Vol.7.1 | Struts2 における Model(モデル)について | JavaBeansベースのModelクラス(User, Thread, Post など)設計とその役割を明確化。 |
Vol.7.2 | Struts2 における Controller(コントローラ)の責務 | Actionクラスを軸に、入力処理・分岐処理・画面遷移の中核を担うControllerの実装指針を提示。 |
Vol.7.3 | Struts2 における struts.xml の書き方と役割 | URLマッピング、結果遷移、アクション定義の方法を丁寧に記述。初心者の詰まりやすいポイントを回避。 |
Vol.7.4 | struts.xmlの高度な設定と実践活用(Struts2) | namespaceの活用や画面単位での分離設計、開発時の保守性向上テクニックを紹介。 |