📘 Vol.7：Struts2 における MVC モデルの全体像

## はじめに

Struts2 は、Java を用いた Web アプリケーション開発における定番の MVC フレームワークのひとつです。

本章では、Struts2 フレームワークにおける MVC モデルの構成と、それぞれの役割・関係性を全体的に俯瞰して解説します。  
これにより、後続の「Model 偏」「View 偏」「Controller 偏」の章にスムーズに入っていけるようにすることが目的です。

---

## MVCモデルとは？

まず、MVC とは次の3つの役割にアプリケーションを分離して設計するアーキテクチャパターンのことです：

| 略称 | 役割 | 説明 |
|------|------|------|
| Model | モデル | アプリケーションの「データ」や「ビジネスロジック」を担当します。例：JavaBeans、DAOなど |
| View | ビュー | ユーザーに見える「画面」を担当します。Struts2では主にJSP + タグライブラリで構成されます |
| Controller | コントローラー | ユーザーのリクエスト処理の振り分けを行います。Struts2ではActionクラスがこの役割を担います |

- **Model**  
  データの管理や業務ロジックを担当し、データベースアクセス（DAO）やJavaBeansを含みます。

Model層では、データベースとのやりとりを担うDAOや、データ構造を保持するJavaBeansが利用されます。  
>👉 JavaBeansは、プロパティ（データ）に対してgetter/setterを使ってアクセスするシンプルなJavaオブジェクトのことです。  
例えばユーザー情報や掲示板のスレッド情報などを保持するクラスが該当します。

---

- **Controller**
Controller 層では、リクエストを受け取る Action クラスが配置されます。
>👉 Struts2 の Action クラスは POJO（Plain Old Java Object）として実装できるため、特別な継承やインターフェースの実装が不要です。これにより、柔軟でテストしやすい設計が可能になります。

※この POJO 特性は、Spring Framework などと比較される際にも Struts2 の特徴のひとつとして挙げられます。

---

## Struts2 における MVC の全体構成

Struts2 フレームワークでは、それぞれの要素が次のような形で構成され、連携しています

以下は、Struts2 における MVC モデルの処理フロー図です：

![MVCアーキテクチャ図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4091065/11a28393-976d-4541-a526-985ea9cd4f5c.png)

この図は、Struts2 における典型的なリクエスト〜レスポンスの流れを表しています。各レイヤーの責務を理解することで、今後の開発がよりスムーズになります。

---

## Struts2 のリクエスト処理フロー（簡略版）

Struts2 フレームワークでは、次のような順序でリクエストが処理されます。

1. **ユーザーがブラウザで画面を操作**
2. **Actionクラスが呼び出される（Controller）**
3. **必要に応じて Model（DAOやJavaBean）と連携してデータを取得・更新**
4. **Actionクラスが処理結果を元にどのJSPを表示するかを決定**
5. **JSP（View）がレンダリングされてユーザーにレスポンスが返る**

---

## Struts2 の特徴的なポイント

Struts2 の MVC モデルには、以下のような独自の特徴があります：

- **Controller が Action クラス単位で構成されている**  
  → 各 URL（例：`/list.action`）ごとに独立した Action クラスを設計できる。

- **View として JSP + Struts タグライブラリを使用**  
  → `s:iterator` や `s:property` などのタグで、Action から渡されたデータを簡潔に画面表示可能。

- **Model は自由度が高い（DAO + JavaBeans、サービス層など設計方針により自由）**

- **設定ファイル（`struts.xml`）によって URL と Action の対応関係を柔軟に制御できる**

---

## 補足：Struts2 と Servlet/JSP の違い

Struts2 の最大の利点は、従来の Servlet + JSP 直書きによる開発よりも、**責務が分離されて保守性が高い点**です。

| 観点 | Servlet/JSP | Struts2 |
|------|-------------|---------|
| 画面ロジック | JSP に直書き | タグライブラリでシンプルに記述 |
| リクエスト処理 | doPost/doGet に集中 | Action クラスごとに分割可能 |
| データの受け渡し | Request 属性で直接やりとり | 自動的にプロパティへマッピング（OGNL）|

---

## ▶️ 次回予告

[「Vol.7.1：Struts2 における Model（モデル）について」](https://qiita.com/juehara-crypto/items/14f7f154caf29447ae93) では、「Model（モデル）」について深掘りしていきます。

- DAO（Data Access Object）の役割とは？

- JavaBeans でどうやってデータを受け渡すのか？

- Model は Controller や View とどう連携するのか？

Struts2 における Model の実態を、実例を交えながら分かりやすく解説していきます！

---

## 🧭 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.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の活用や画面単位での分離設計、開発時の保守性向上テクニックを紹介。 |

---