📘 Vol.7.4：struts.xmlの高度な設定と実践活用（Struts2）

Struts2プロジェクトにおける`struts.xml`は、単なる画面遷移の定義ファイルにとどまらず、アプリケーション全体の振る舞いを制御する「核」とも言える存在です。

この回では、以下の内容に踏み込み、実用的な構成の理解を深めていきます。

## 🔸 本記事の内容
- `struts.xml`の構成と役割（復習）

- `<package>` の意味と用途

- `<interceptors>` と共通処理の活用

- 🔹 独自Interceptorの定義（実践では `BaseAction` に集約）

- 実際の `struts.xml` 全体例（本プロジェクトより抜粋）

---

## ✅ struts.xml の構成（おさらい）
以下は典型的な構成例です。

```xml
<struts>
    <constant name="struts.devMode" value="false" />
    <package name="default" extends="struts-default">
        <action name="login" class="com.example.LoginAction">
            <result name="success">/home.jsp</result>
            <result name="error">/error.jsp</result>
        </action>
    </package>
</struts>
```
このように、Struts2では `<package>` 配下に `<action>` をまとめ、共通の遷移制御・エラー処理などを定義していきます。


---

## 🔹` <package>` の役割
- **アクションのグループ化**
各機能単位（例：ユーザー管理、掲示板管理）でアクションをまとめることができます。

- **共通設定の継承**
extends="struts-default" により、デフォルトの設定（エラーハンドリング、バリデーションなど）を活用できます。

- **namespace指定も可能**
namespace="/admin" といった形でURLの階層構造を整理することも可能です。

---


## 🔹 `<interceptors>` と共通処理

Struts2では、アクションが呼び出される前後に **共通処理(Interceptor)** を差し込むことができます。

**例：struts-default に含まれるInterceptorスタック**

```xml
<default-interceptor-ref name="defaultStack" />
```

これにより、以下のような機能が自動的に適用されます：

- パラメータの自動バインディング

- バリデーション

- ファイルアップロード

- ログインチェック（自作可能）

---

## 🔹 独自Interceptorの定義（プロジェクトでは BaseAction で共通化）
Struts2では `<interceptor>` を自作して、以下のような機能を差し込むことができます：

- セッションユーザーの有無チェック

- 権限ロールの検査

- 処理前後の共通ログ出力

ただし、本プロジェクトでは **アクションの共通基底クラス `BaseActionクラス`  にロジックを統合** することで、Interceptorに相当する共通処理を簡潔に実装しています。

**BaseActionクラスの特徴**
- ServletRequest/Response取得

- ログインセッションの検証

- メッセージ制御（例：「キャンセルがクリックされました」など）

## 📦 実際の `struts.xml` 全体例（本プロジェクトより）

以下は、[GitHubリポジトリ](https://github.com/juehara-crypto/Portfolio_Bulletinboard/blob/master/03.%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0/Bulletinboard/resources/struts.xml) で使用している構成例からの抜粋です。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
    <constant name="struts.devMode" value="false" />
    
    <package name="default" extends="struts-default">
        <!-- ログイン -->
        <action name="login" class="com.company.bulletinboard.action.LoginAction">
            <result name="success">/view/userPortal.jsp</result>
            <result name="error">/view/error.jsp</result>
        </action>

        <!-- ログアウト -->
        <action name="logout" class="com.company.bulletinboard.action.LogoutAction">
            <result name="success">/view/LoginScreen.jsp</result>
        </action>

        <!-- 掲示板管理画面 -->
        <action name="list" class="com.company.bulletinboard.action.ListAction">
            <result name="success">/view/BulletinboardManagementScreen.jsp</result>
        </action>

        <!-- その他、キャンセル・作成・編集など多様なアクション定義 -->
    </package>
</struts>


📌 詳細全体はGitHubで閲覧可能です：  
🔗 [struts.xml を見る](https://github.com/juehara-crypto/Portfolio_Bulletinboard/blob/master/03.%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0/Bulletinboard/resources/struts.xml)

---

### ✍️ まとめ
- `struts.xml` は **アクション定義** と **画面遷移制御** の中心

- `<package>` を使って整理することで拡張性UP

- Interceptorに頼らず **BaseActionで共通処理** をまとめるアプローチも有効

---


## ▶️ 次回予告
「[📘 Vol.8.0：【Struts2】OGNL入門　〜タグライブラリを支える最重要基礎技術〜](https://qiita.com/juehara-crypto/items/9b9558d46dfa5ac75224)」

次回は以下を予定しています：

- JSP側の `<s:form>` やOGNL式の活用

- 入力チェックとエラー表示のバリデーション機構

- `fieldErrors` の利用パターン

---

ご意見・ご質問はコメントでお寄せください！✨

🔗 [Vol.7.3：struts.xml の基本構成と用途](https://qiita.com/juehara-crypto/items/54dc2e0a4d56845a1a61) もあわせてどうぞ！


---

## 🧭 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.6.1 | [BaseAction の活用例【共通基底クラスでセッション管理を簡素化】](https://qiita.com/juehara-crypto/items/f4efded5b26e39e49928) | 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マッピング、結果遷移、アクション定義の方法を丁寧に記述。初心者の詰まりやすいポイントを回避。 |


---