サーブレット&JSPの基本|Spring FrameworkによるWebアプリ開発の基本

ServletとJSPで学んだMVCの考え方を、Springでさらに実践的に。フレームワークの骨組みに沿って、迷わず作れるWebアプリ開発へ進もう

これまで、Servlet、JSP、リクエスト、レスポンス、スコープ、MVCモデル、DAO、データベースアクセスなど、JavaでWebアプリケーションを作るための基本を学習してきました。

これらの知識を使えば、小規模なWebアプリケーションを自分で設計し、作成できるようになります。

しかし、実際の開発現場では、1人だけで作るとは限りません。

複数人で分担して作業することが多く、担当者ごとに書き方やクラスの分け方が変わってしまうことがあります。

たとえば、ある人はJSPからDAOを呼び出してしまうかもしれません。

別の人はサーブレットから直接DAOを呼び出してしまうかもしれません。

また、モデルに書くべき処理をコントローラに入れてしまったり、画面表示用のJSPに処理を書き込みすぎたりすることもあります。

せっかくMVCモデルで役割を分けようとしても、開発者ごとに作り方がばらばらになると、プログラム全体の統一感が失われます。

統一感がなくなると、後から修正しづらくなり、不具合の原因にもなります。

そこで使われるのが、フレームワークです。

フレームワークは、Webアプリケーションを作るための基本的な骨組みを用意してくれる仕組みです。

その骨組みに沿って開発することで、チーム全体で作り方をそろえやすくなります。

今回学習するSpring Frameworkは、JavaのWebアプリケーション開発で広く利用されている代表的なフレームワークです。

Springは強力な機能をたくさん持っていますが、その根本には、これまで学んできたMVCモデルの考え方があります。

ServletやJSPで学んだ知識があれば、Spring MVCの基本的な考え方も自然に理解しやすくなります。

この記事では、フレームワークとは何か、Spring Frameworkにはどのようなモジュールがあるのか、Spring MVCではMVCモデルがどのように実現されるのか、そしてSpring BootとSpring Initializrを使ってSpringプロジェクトspring_studyを作成する流れを学習します。

フレームワークとは

フレームワークとは、アプリケーションを作るための骨組みを提供してくれる仕組みです。

Webアプリケーションを一から自由に作ろうとすると、クラスの分け方、リクエストの受け取り方、画面表示の方法、データの受け渡し方などを、すべて自分たちで決める必要があります。

自由度が高いことは良い面もあります。

しかし、チーム開発では、その自由さが作り方のばらつきにつながることがあります。

作り方がばらつく例

状況起こりやすい問題
JSPからDAOを直接呼び出す画面表示とデータベース処理が混ざる
サーブレットに処理を書きすぎるコントローラが複雑になりすぎる
クラス名やパッケージ構成が人によって違うプロジェクト全体の見通しが悪くなる
画面遷移の作り方が統一されない修正時に流れを追いにくくなる
共通処理の書き方がばらばらになる同じような処理が複数箇所に重複する

フレームワークを使うと、開発者はあらかじめ用意された骨組みに沿ってプログラムを作ります。

そのため、完全に自由に作る場合と比べると、ある程度の制限があります。

しかし、この制限があることで、作り方を統一しやすくなります。

フレームワークは開発の骨組み

フレームワークを家づくりにたとえると、柱や梁などの基本構造があらかじめ用意されている状態に近いです。

開発者は、その構造に沿って部屋を作ったり、内装を整えたりしていきます。

つまり、フレームワークは、開発者が毎回迷いやすい部分をあらかじめ整えてくれます。

フレームワークが提供するもの

提供するもの内容
基本構造アプリケーション全体の作り方の土台
役割分担コントローラ、モデル、ビューなどを分けやすくする考え方
便利な機能リクエスト処理、オブジェクト管理、データベース連携など
統一された作り方チーム全体で同じ考え方に沿って開発しやすくする
品質を保つ仕組み作り方のばらつきを抑え、不具合を減らしやすくする

フレームワークを使うと、開発者は骨組みそのものを毎回考える必要が少なくなります。

その分、業務ロジックや画面の仕様など、本来集中したい部分に力を注ぎやすくなります。

フレームワークを使うメリット

フレームワークを使う大きなメリットは、開発の進め方をそろえやすくなることです。

特にチーム開発では、担当者ごとに作り方が違うと、後から読んだ人が理解しづらくなります。

Springのようなフレームワークを使うと、コントローラ、サービス、ビューなどの役割を分けやすくなり、チーム全体で同じ方向を向いて開発できます。

フレームワークを使うメリット

メリット内容
作り方を統一できるチーム内でクラスの役割や配置をそろえやすい
開発効率が上がるよく使う仕組みを自分で毎回作らなくてよい
品質を保ちやすい設計に反した実装を減らしやすい
役割分担が明確になるMVCモデルに沿った開発を進めやすい
経験差を吸収しやすい開発者ごとの書き方の差を小さくできる

フレームワークは、単に便利な道具を集めたものではありません。

開発の進め方や構造を整え、チーム全体で安定した品質を保つための仕組みでもあります。

図1:フレームワークはWebアプリ開発の骨組み

この図から分かること

フレームワークを使わずに自由に開発すると、担当者ごとに作り方がばらばらになりやすくなります。

JSPからDAOを直接呼び出したり、サーブレットに処理を書きすぎたりすると、MVCモデルの役割分担が崩れてしまいます。

フレームワークを使うと、Controller、Service、View、Modelなどの役割を整理しやすくなります。

一定の制限に従って作ることで、チーム全体の書き方をそろえやすくなり、保守しやすいWebアプリケーションを作りやすくなります。

フレームワークは編集者のような存在

フレームワークは、漫画家にとっての編集者のような存在だと考えると分かりやすいです。

漫画家が作品を作るとき、編集者は王道の構成や読者に伝わりやすい展開を提案します。

たとえば、主人公が旅に出る、ライバルと出会う、敗北する、修行する、再挑戦する、仲間が増える、というような流れです。

このような骨組みがあると、漫画家は物語全体の構成で迷いすぎず、キャラクターの魅力や具体的な場面づくりに集中できます。

Webアプリケーション開発でも同じです。

フレームワークは、アプリケーションの王道の構造を提供します。

開発者は、その構造に沿って、業務ロジックや画面、データの扱いに集中できます。

編集者とフレームワークの対応

漫画制作Webアプリケーション開発
編集者が物語の骨組みを示すフレームワークがアプリケーションの骨組みを示す
王道の展開を参考にするMVCなどの定番構造に沿って作る
漫画家は表現に集中する開発者は機能や業務ロジックに集中する
アシスタントや道具を整える便利な機能や開発支援機能を提供する
品質を保ちながら制作する統一感と品質を保ちながら開発する

フレームワークは、開発者の自由をすべて奪うものではありません。

むしろ、迷いやすい基本構造を整えることで、開発者が本来考えるべき部分に集中できるようにしてくれます。

Spring Frameworkとは

Spring Frameworkは、Javaでアプリケーションを開発するときによく利用されるフレームワークです。

特にWebアプリケーション開発では、多くのプロジェクトで使われています。

Spring Frameworkは、1つの大きな機能だけでできているわけではありません。

複数のモジュールと呼ばれる部品で構成されています。

開発するアプリケーションの内容に応じて、必要なモジュールを組み合わせて使います。

Spring Frameworkの代表的なモジュール

Spring Frameworkには、さまざまな機能を担当するモジュールがあります。

Spring Frameworkの代表的なモジュール

モジュール名説明
Spring Core必要な部品であるオブジェクトの作成や管理を自動的に行う仕組みを提供する
Spring MVCMVCパターンに基づいたWebアプリケーションを作るための機能を提供する
Spring Security認証やアクセス制限などのセキュリティ機能を提供する
Spring Dataデータベースとのやり取りを簡単にする機能を提供する
Spring AOPログ出力やトランザクション管理など、横断的な処理を扱いやすくする
Spring Transactionデータベースのトランザクション管理をしやすくする
Spring Testテスト環境を整え、JUnitなどとの連携をしやすくする

Spring Coreは、Spring全体の基盤となるモジュールです。

そのため、Spring Frameworkを使うときには基本的に利用されます。

Spring MVCは、Webアプリケーション開発で特によく使われるモジュールです。

Spring Securityは、ログインやアクセス制限などのセキュリティ機能を扱うときに使います。

Spring Dataは、データベースとのやり取りを簡単にしたいときに役立ちます。

このように、Spring Frameworkは目的に応じて複数の機能を組み合わせて使う仕組みです。

モジュールを組み合わせて使う

Spring Frameworkを使って開発するといっても、すべてのモジュールを必ず使うわけではありません。

作るアプリケーションに必要な機能を選んで使います。

たとえば、Webアプリケーションを作るなら、Spring CoreとSpring MVCを使うことになります。

データベースを扱うなら、Spring Dataを組み合わせることがあります。

認証やアクセス制限が必要なら、Spring Securityを組み合わせることもあります。

モジュールの組み合わせ例

作りたいもの組み合わせ例
基本的なWebアプリケーションSpring Core、Spring MVC
データベースを使うWebアプリケーションSpring Core、Spring MVC、Spring Data
認証機能のあるWebアプリケーションSpring Core、Spring MVC、Spring Security
トランザクション管理が重要な業務システムSpring Core、Spring Transaction
テストを重視するアプリケーションSpring Core、Spring Test

このように、Spring Frameworkは必要なモジュールを組み合わせて使います。

ただし、最初からモジュール名を細かく覚えすぎる必要はありません。

入門段階では、SpringはWebアプリケーション開発を効率よく進めるための仕組みであり、その中心にMVCの考え方がある、と押さえておくと理解しやすくなります。

Spring MVCとは

Spring Frameworkの中でも、Webアプリケーション開発に使われる中心的な仕組みがSpring MVCです。

Spring MVCは、その名前のとおり、MVCモデルに基づいてWebアプリケーションを作るための機能を提供します。

これまでServletとJSPで学習してきたMVCモデルでは、次のように役割を分けていました。

ServletとJSPで学んだMVCモデル

役割担当内容
ModelJavaクラス、Logicクラス、DAOなどアプリケーションの処理やデータを担当する
ViewJSP画面表示を担当する
Controllerサーブレットリクエストを受け取り、処理の流れを制御する

Spring MVCでも、この考え方は大きく変わりません。

WebアプリケーションをModel、View、Controllerに分けて考えます。

ただし、Controllerの作り方が変わります。

これまでの学習では、開発者がサーブレットクラスを作ってコントローラとして利用していました。

Spring MVCでは、開発者が作るコントローラは通常のJavaクラスとして作成します。

その裏側では、DispatcherServletという特別なサーブレットが動いています。

DispatcherServletの役割

Spring MVCでは、開発者が作成したコントローラを直接サーブレットとして動かすのではありません。

内部では、DispatcherServletという特別なサーブレットがリクエストを受け取ります。

DispatcherServletは、受け取ったリクエストに応じて、どのコントローラを実行するかを判断します。

そして、開発者が作成したコントローラクラスを呼び出します。

DispatcherServletとコントローラ

部品役割
DispatcherServletリクエストを受け取り、適切なコントローラを呼び出す
コントローラクラス通常のJavaクラスとして作成し、処理の入口を担当する
サービスクラスアプリケーションの主な処理を担当する
ビューJSPなどを使って結果を表示する

ServletとJSPで学習したときは、LoginServletやMainServletのようなサーブレットを自分で作りました。

Spring MVCでは、リクエストを受け取る基本的な入口はDispatcherServletが担当します。

開発者は、その後に呼び出されるコントローラクラスを作成します。

この仕組みにより、開発者はサーブレットの細かい処理よりも、どのリクエストで何をするのかというアプリケーションの処理に集中しやすくなります。

図2:Spring MVCにおけるMVCモデルの実現イメージ

この図から分かること

Spring MVCでは、ブラウザから送られたリクエストをDispatcherServletが受け取ります。

DispatcherServletは、リクエストの内容に応じて、開発者が作成したコントローラを呼び出します。

コントローラは、必要な処理をサービスに依頼します。

サービスは、アプリケーションの中心となる処理を行います。

処理結果はビューに渡され、JSPなどを使って画面に表示されます。

これまでServletとJSPで学んだMVCモデルと同じ考え方を、Spring MVCではより統一された仕組みの中で実現できます。

Spring MVCのModel

Spring MVCでも、Modelの主な役割はこれまでと同じです。

Modelは、アプリケーションの主な処理と、その処理で扱うデータを担当します。

Springでは、アプリケーションの主な処理を担当するクラスをサービスと呼びます。

サービスは、ServletとJSPの学習で作成してきたLogicクラスに近い存在です。

Modelに関係するクラス

種類内容
Serviceアプリケーションの主な処理を担当する
Entityデータベースのテーブルのレコードを表す
DTOクラスや処理の間で受け渡すデータをまとめる
通常のJavaクラス処理に必要なデータや部品を表す

データベースのテーブルの1件分を表すクラスは、Entityと呼ばれます。

一方、画面や処理の間でデータを受け渡すために作るクラスは、DTOと呼ばれることがあります。

呼び方は用途によって変わりますが、共通しているのは、どちらもアプリケーション内で扱う情報をまとめるクラスだということです。

Spring MVCのView

Viewは、画面表示を担当します。

これまでの学習では、JSPを使って画面を表示してきました。

Spring MVCでも、ビューにはさまざまな技術を使うことができます。

この記事では、これまで学んできた内容を活かすために、JSPをビューとして使う前提で説明します。

Viewの役割

項目内容
役割処理結果を画面に表示する
使用する技術JSPなど
表示する内容コントローラやサービスから渡された結果
注意点画面表示に集中し、業務処理を書きすぎない

JSPは画面表示を担当します。

データベースアクセスや複雑な処理は、JSPに書くのではなく、サービスやDAOなどのモデル側に分けて考えます。

この考え方は、これまで学んできたMVCモデルと同じです。

Spring Bootとは

Spring Frameworkは便利ですが、開発を始めるために多くの設定が必要になります。

使うモジュールを選び、設定ファイルを準備し、プロジェクト構成を整える必要があります。

そこで登場するのがSpring Bootです。

Spring Bootは、Springを使ったアプリケーション開発を始めやすくするための仕組みです。

Springを道具箱にたとえるなら、Spring Bootはすぐに使えるスターターキットのようなものです。

必要な部品や設定があらかじめ整えられているため、複雑な初期設定を行わずに開発を始めやすくなります。

SpringとSpring Bootのイメージ

種類イメージ内容
Spring Framework道具箱便利な部品がたくさんあるが、選び方や設定が必要
Spring Bootスターターキットよく使う部品や設定がまとまり、すぐ始めやすい

Spring Bootでは、スターターと呼ばれる仕組みを使って、必要な機能をまとめて導入できます。

たとえば、H2 Databaseを使いたい場合、H2 Databaseのスターターを選ぶことで、手動でJDBCドライバを配置しなくても利用できるようになります。

Spring Initializrとは

Spring Bootでプロジェクトを作成するときに使うのが、Spring Initializrです。

Spring Initializrは、Springプロジェクトを作成するためのツールです。

プロジェクト名、使用するJavaのバージョン、プロジェクトの種類、利用する機能などを指定すると、必要な設定が整ったSpringプロジェクトを自動生成してくれます。

Spring Initializrで指定する主な情報

項目今回の設定
プロジェクト名spring_study
タイプMaven
Javaバージョン25
Spring Bootバージョン4.0.x
使用する機能H2 Database

Spring Bootバージョンでは、4.0.xを選びます。

ただし、バージョン名の後ろにSNAPSHOT、M1、M2、RC1、RC2などが付いているものは選ばないようにします。

これらは正式版ではなく、開発途中や候補版として扱われる場合があるため、学習では安定したものを選ぶのが分かりやすいです。

Springプロジェクトを作成する

Springを使って開発する場合、これまで作成してきた動的Webプロジェクトではなく、Spring専用のプロジェクトを作成します。

この記事では、このプロジェクトをSpringプロジェクトと呼びます。

Eclipseでは、Springスターター・プロジェクトを使って作成します。

Springプロジェクト作成の流れ

手順操作
1ファイルメニューを開く
2新規を選択する
3Spring スターター・プロジェクトを選択する
4プロジェクト名にspring_studyを入力する
5タイプでMavenを選択する
6Javaバージョンで25を選択する
7次へをクリックする
8Spring Bootバージョンで4.0.xを選択する
9使用頻度高からH2 Databaseを選択する
10完了をクリックする
11パッケージ・エクスプローラーにspring_studyが追加されたことを確認する

H2 Databaseを選択しておくと、H2 DatabaseのJDBCドライバを手動で配置しなくても、プロジェクト内で利用できるようになります。

これまでの動的Webプロジェクトでは、WEB-INF/libにJARファイルを配置する作業を行っていました。

Spring Bootでは、スターターによって必要な依存関係をまとめて扱えるため、準備の手間が少なくなります。

Spring プロジェクトの作成方法

「ファイル」メニュー→「新規」→「Spring スターター・プロジェクト(Spring initialzr)」を選択します。

プロジェクト名(半角英数)を「名前」に入力し、以下の開発環境に関する設定を選択し、「次へ」をクリックします。

-プロジェクト名: spring_study
- タイプ: Maven
 - Javaバージョン: 25

Spring Bootのバージョンと、「使用頻度高」でプロジェクトに組み込む機能(スタータ)を選択し、「完了」をクリックします。

- Spring Bootバージョン: 4.1.x
※バージョンの後ろにSNAPSHOT、M1、M2、RC1、RC2といった英字がついているものは選択しない。
   - 使用頻度高: H2 Databaseを選択(H2 DatabaseのJDBCドライバを手動で配置しなくても、プロジェクト内で利用できるようになります)

パッケージ・エクスプローラーにSpringプロジェクトが追加されていることを確認します。
クリックして展開すると下図のような構成になっています。

図3:Spring Initializrでspring_studyプロジェクトを作成する流れ

この図から分かること

Spring Bootでは、Spring Initializrを使ってSpringプロジェクトを作成します。

プロジェクト名、タイプ、Javaバージョン、Spring Bootバージョン、使用する機能を指定すると、必要な設定が整ったプロジェクトが作成されます。

今回のプロジェクト名はspring_studyです。

タイプはMaven、Javaバージョンは25、Spring Bootバージョンは4.0.xを選びます。

使用する機能としてH2 Databaseを選ぶことで、H2 Databaseをプロジェクト内で利用できる状態にできます。

Springプロジェクトの構成

Springプロジェクトを作成すると、パッケージ・エクスプローラーにspring_studyプロジェクトが追加されます。

プロジェクトを開くと、src/main/javaの中にベースパッケージが作成されています。

今回のサンプルでは、ベースパッケージ名をcom.example.demoとします。

このベースパッケージの中に、controllerやmodelなどのサブパッケージを作成して、役割ごとにクラスを配置します。

Springプロジェクトのパッケージ構成例

src/main/java
└─ com.example.demo
   ├─ controller
   │  └─ コントローラクラス
   └─ model
      └─ サービスクラス

controllerパッケージには、リクエストを受け取るコントローラクラスを配置します。

modelパッケージには、アプリケーションの処理を担当するサービスクラスや、データを表すクラスを配置します。

このように、Springプロジェクトでも役割ごとにパッケージを分けて整理します。

ベースパッケージとは

Springプロジェクトを作成するときには、パッケージ名を指定します。

このパッケージは、ベースパッケージと呼ばれます。

ベースパッケージは、Springアプリケーションの中心になるパッケージです。

開発者は、このベースパッケージの中にサブパッケージを作り、クラスを配置していきます。

ベースパッケージ内に作る主なパッケージ

パッケージ役割
com.example.demo.controllerコントローラクラスを配置する
com.example.demo.modelサービスクラスやデータを表すクラスを配置する

ServletとJSPの学習では、servletパッケージやmodelパッケージを作成していました。

Springでも、役割ごとにパッケージを分ける考え方は同じです。

違いは、Springプロジェクトではベースパッケージの下にサブパッケージを作っていく点です。

動的Webプロジェクトとの違い

これまでの学習では、動的Webプロジェクトを作成し、ServletとJSPを使ってWebアプリケーションを作ってきました。

Springを使う場合は、Spring専用のプロジェクトを作成します。

動的WebプロジェクトとSpringプロジェクトの違い

項目動的WebプロジェクトSpringプロジェクト
主な作成方法Eclipseの動的Webプロジェクトとして作成するSpring Initializrで作成する
コントローラサーブレットクラスとして作成する通常のJavaクラスとして作成する
リクエスト受付開発者が作ったサーブレットが受け取るDispatcherServletが受け取り、コントローラを呼び出す
依存関係JARをWEB-INF/libに配置する場合があるスターターでまとめて設定しやすい
代表的な構成servlet、model、dao、WEB-INF/jspなどcom.example.demo配下のcontroller、modelなど

Springプロジェクトでは、開発者がすべてのサーブレットを直接作るのではありません。

DispatcherServletが中心になり、開発者が作成したコントローラクラスを呼び出します。

ただし、MVCモデルの考え方は変わりません。

コントローラ、モデル、ビューの役割を分ける点は、これまで学んできた内容とつながっています。

Springで学習を進めるときの見方

Spring Frameworkは多くの機能を持つため、最初は難しく見えるかもしれません。

しかし、最初からすべてのモジュールや仕組みを細かく理解しようとする必要はありません。

まずは、これまで学んだMVCモデルと対応させて考えると分かりやすくなります。

Springを理解するための対応表

これまでの学習Springでの考え方
サーブレットDispatcherServletとコントローラクラス
LogicクラスServiceクラス
JavaBeansEntityやDTO
JSPViewとしてのJSP
動的WebプロジェクトSpringプロジェクト
JDBCドライバの手動配置スターターによる依存関係の準備

Springは、これまで学んだことを否定するものではありません。

むしろ、ServletとJSPで学んだMVCモデルを、より統一された形で実践しやすくするための仕組みです。

ここまでで押さえたいこと

Spring Frameworkは、JavaのWebアプリケーション開発で広く利用されるフレームワークです。

フレームワークは、アプリケーション開発の骨組みを提供し、作り方を統一しやすくします。

Spring Frameworkには、Spring Core、Spring MVC、Spring Security、Spring Data、Spring AOP、Spring Transaction、Spring Testなどのモジュールがあります。

Webアプリケーション開発では、特にSpring MVCが重要です。

Spring MVCでは、DispatcherServletがリクエストを受け取り、開発者が作成したコントローラを呼び出します。

ModelはサービスやEntity、DTOなどとして作成します。

ViewにはJSPなどを使えます。

Spring Bootを使うと、Springの複雑な初期設定を少なくし、開発を始めやすくなります。

Spring Initializrを使えば、spring_studyのようなSpringプロジェクトを作成できます。

これまで作成してきた動的Webプロジェクトとは違い、SpringではSpring専用のプロジェクトを作成します。

ただし、MVCモデルの考え方は共通しています。

ServletとJSPで学んだ内容を土台にして、Spring FrameworkによるWebアプリケーション開発へ進んでいきましょう。