📘 Vol.6.1 BaseActionクラスの活用例【共通基底クラスでセッション管理を簡素化】

Struts2 における `BaseAction` クラスの導入は、コードの共通化と保守性の向上に大きく寄与します。  
ここでは、**BaseActionクラス を活用しない場合**と**活用した場合**の違いを比較しながら、実践的な活用例を解説します。

---

## ✅ BaseActionクラス を活用しない場合

### 📌 特徴
- 各アクションクラスで `HttpSession` や `HttpServletRequest` を個別に取得・管理する必要がある
- セッションやリクエストパラメータの扱いが **重複・煩雑化** しやすい

### ✍️ 例：BaseActionクラス を使わずにセッションを扱う場合

```java
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クラス の例

```java
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 の例

```java
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 インターフェースを実装しない限り、セッションは取得できません。

```java
public interface SessionAware {
    void setSession(Map<String, Object> session);
}
```

この仕様により、セッションを使うすべてのアクションクラスで SessionAware を実装する必要があります。
しかし、BaseActionクラス で一括実装しておくことで、この問題を回避できます。

---

## ✅ まとめ

| 項目      | BaseAction なし | BaseAction あり   |
| ------- | ------------- | --------------- |
| セッション取得 | 各クラスで毎回実装     | BaseAction で共通化 |
| リクエスト取得 | 同上            | 同上              |
| 重複コード   | 多くなる          | 減る              |
| 保守性     | 低い            | 高い              |
| 責務分離    | 難しい           | 実現しやすい          |
---
BaseActionクラス を活用しつつ、Struts2 の仕様を理解しておくことで、
より効率的でメンテナンス性の高い Web アプリケーション開発が実現できます！

---
📝 **次回（Vol.7）**
 [📘 Vol.7：Struts2 における MVC モデルの全体像](https://qiita.com/juehara-crypto/items/761c0b13ed1a5f896bba)


---

## 🧭 Vol.1〜7 関連リンク

| 回 | タイトル | 主な内容 |
|----|----------|-----------|
| Vol.1 | [プログラミングとの再会 – 「画面ありき」で変わった学び方](https://qiita.com/juehara-crypto/items/2fcc53d765dcc25a4fa3) | プログラミング再入門と、**画面駆動の学習法**というユニークなアプローチの紹介。最初に「画面」から考えることでモチベーションを継続。 |
| Vol.2 | [画面駆動設計に基づく設計書の具体例：画面フローからUI設計・処理定義まで](https://qiita.com/juehara-crypto/items/c1fd34b3031b13160f27) | 実際に描いた**画面遷移図・UI設計・処理定義書**を公開し、画面中心の設計手法を解説。 |
| Vol.3 | [詳細設計編：ER図で見るデータ構造と実装の土台](https://qiita.com/juehara-crypto/items/6e6431954dc99ea59054) | 実装前提で設計された **ER図（Entity Relationship 図）** をもとに、データ構造と整合性を設計。 |
| Vol.4 | [Struts2とMavenの基礎と設定ファイルの役割](https://qiita.com/juehara-crypto/items/e37fa1879ae996bee73e) | Struts2の構成とMavenでの管理、`web.xml` や `pom.xml` の役割を丁寧に解説。 |
| Vol.5 | [環境構築編：掲示板アプリケーションの実行準備](https://qiita.com/juehara-crypto/items/7010ae45d35174d3a3a6) | TomcatとEclipseでの動作環境構築。 |
| Vol.6 | [BaseActionクラスの詳細解説【Struts2の要】](https://qiita.com/juehara-crypto/items/a5f244a5f58597f33d06) | すべてのアクションに共通する基底クラス **BaseAction** を定義し、ログ出力や共通処理を集約。 |
| Vol.7 | [Struts2 における MVC モデルの全体像](https://qiita.com/juehara-crypto/items/761c0b13ed1a5f896bba) | Model-View-Controller の各要素が Struts2 でどう分担されるかを体系的に解説。 |
| Vol.7.1 | [Struts2 における Model（モデル）について](https://qiita.com/juehara-crypto/items/14f7f154caf29447ae93) | JavaBeansベースのModelクラス（User, Thread, Post など）設計とその役割を明確化。 |
| Vol.7.2 | [Struts2 における Controller（コントローラ）の責務](https://qiita.com/juehara-crypto/items/06b4f9296a296db8f4ba) | Actionクラスを軸に、入力処理・分岐処理・画面遷移の中核を担うControllerの実装指針を提示。 |
| Vol.7.3 | [Struts2 における struts.xml の書き方と役割](https://qiita.com/juehara-crypto/items/54dc2e0a4d56845a1a61) | URLマッピング、結果遷移、アクション定義の方法を丁寧に記述。初心者の詰まりやすいポイントを回避。 |
| Vol.7.4 | [struts.xmlの高度な設定と実践活用（Struts2）](https://qiita.com/juehara-crypto/items/bf03adbd840c8f4e2044) | namespaceの活用や画面単位での分離設計、開発時の保守性向上テクニックを紹介。 |

---