サーブレット&JSPの基本|MVCモデルとサーブレット・JSPの役割

サーブレットは受付、Javaクラスは処理、JSPは表示。MVCモデルでWebアプリケーションの役割分担を理解しよう

サーブレットやJSPの基本を学ぶと、フォームからデータを送信したり、リクエストパラメータを取得したり、処理結果を画面に表示したりできるようになります。

ここまで学習すると、簡単なWebアプリケーションなら自分で作れるようになってきます。ブラウザに画面が表示され、フォームから送信した内容に応じて結果が変わると、Webアプリケーション開発の楽しさも感じられるはずです。

ただし、少し複雑なWebアプリケーションを作ろうとすると、1つのサーブレットや1つのJSPだけで処理をまとめる方法には限界が出てきます。

たとえば、ショッピングサイトのようなアプリケーションでは、商品検索、カートへの追加、注文確認、会員情報の表示など、さまざまな処理が必要になります。これらをすべて1つのファイルや1つの役割に詰め込んでしまうと、どこに何が書かれているのか分かりにくくなり、修正もしづらくなります。

そこで重要になるのがMVCモデルです。

MVCモデルは、アプリケーションをモデル、ビュー、コントローラという3つの役割に分けて作る考え方です。サーブレットとJSPを組み合わせてWebアプリケーションを作るときにも、この考え方が役立ちます。

この記事では、MVCモデルとは何か、3つの役割がどのように連携するのか、そしてサーブレット、JSP、一般的なJavaクラスがそれぞれどの役割を担当するのかを解説します。

1つのファイルだけで作る方法には限界がある

これまでの学習では、1つのリクエストを1つのサーブレットクラスまたはJSPファイルで処理する形が多く出てきました。

この方法は、基本を理解するにはとても分かりやすいです。リクエストを受け取り、処理を行い、HTMLを返す流れを1つの場所で確認できるからです。

しかし、アプリケーションが大きくなると、次のような問題が出てきます。

問題内容
処理が長くなる入力チェック、計算、表示処理が同じ場所に集まりやすい
修正箇所が分かりにくい画面を直したいのか、処理を直したいのか判断しにくい
役割が混ざるJavaの処理とHTMLの表示が混在しやすい
拡張しにくい新しい機能を追加すると影響範囲が広がりやすい
分担しにくいJava担当と画面担当が同時に作業しづらい

小さな練習プログラムでは問題にならなくても、本格的なWebアプリケーションでは、役割を整理して作ることが大切になります。

サーブレットとJSPは組み合わせて使う

サーブレットクラスとJSPファイルは、どちらを使ってもWebアプリケーションの処理を実現できます。

サーブレットでもHTMLを出力できますし、JSPでもJavaの処理を書くことができます。

しかし、実際の開発では、どちらか一方だけを使うのではなく、サーブレットとJSPを組み合わせて使うのが一般的です。

サーブレットとJSPの得意なこと

技術得意なこと
サーブレットリクエストの受付、入力値の取得、処理の呼び出し、画面遷移の制御
JSPHTMLを中心とした画面表示、処理結果の表示

サーブレットはJavaクラスなので、条件分岐や例外処理、処理の振り分けなどを書きやすいです。

一方、JSPはHTMLをそのまま記述できるため、画面表示を作るのに向いています。

それぞれの得意なことを活かして組み合わせることで、読みやすく、修正しやすいWebアプリケーションを作れるようになります。

図1:サーブレットとJSPを組み合わせる考え方

この図から分かること

サーブレットとJSPは、どちらか一方だけを使うものではありません。

サーブレットはリクエストを受け取り、必要な処理を呼び出したり、次に表示する画面を決めたりする役割に向いています。JSPはHTMLを自然に書けるため、画面表示に向いています。

このように役割を分けることで、Javaの処理とHTMLの表示が混ざりにくくなります。結果として、あとから修正したり機能を追加したりしやすくなります。

MVCモデルとは

MVCモデルとは、アプリケーションを3つの役割に分けて作る考え方です。

MVCは、Model、View、Controllerの頭文字を並べたものです。

日本語では、モデル、ビュー、コントローラと呼びます。

MVCモデルは、ユーザーが画面上で操作するアプリケーションを、整理して作るための代表的な構造です。Webアプリケーションでも、画面を表示し、ユーザーの操作を受け取り、処理を実行して結果を返すため、MVCモデルの考え方が役立ちます。

MVCモデルの3つの要素

要素読み方役割
Modelモデルアプリケーションの主な処理や、処理に関わるデータを担当する
Viewビューユーザーに対して画面を表示する
Controllerコントローラユーザーからの要求を受け取り、モデルやビューへ指示を出す

MVCモデルでは、それぞれの要素が担当する役割を決めます。

モデルは処理を担当します。ビューは表示を担当します。コントローラは要求を受け取り、全体の流れを制御します。

MVCモデルを身近な役割で考える

MVCモデルは、最初は少し抽象的に感じるかもしれません。

その場合は、会社の仕事分担のように考えると分かりやすいです。

MVCの要素会社でたとえると内容
コントローラ受付兼指示係依頼を受け取り、必要な部署へ指示を出す
モデル実務係実際の計算や処理を行う
ビュー表示係、案内係結果を分かりやすく見せる

たとえば、ユーザーが検索を行った場合、コントローラが検索リクエストを受け取ります。次に、モデルへ検索処理を依頼します。モデルが処理を行い、その結果をコントローラへ返します。最後に、コントローラはビューへ結果の表示を依頼します。

このように、役割を分けることで、誰が何を担当しているのかが分かりやすくなります。

MVCモデルの処理の流れ

MVCモデルでは、ユーザーの要求を受けてから結果を表示するまで、次のような流れで処理が進みます。

順番処理の流れ
1ユーザーが検索などの機能を要求する
2コントローラが要求を受け付ける
3コントローラがモデルに処理を依頼する
4モデルが処理を実行する
5コントローラがビューに結果表示を依頼する
6ビューが結果画面を表示する
7ユーザーが結果を見る

この流れでは、コントローラが全体の入口になります。

ユーザーのリクエストを受け取ったコントローラは、自分ですべての処理を行うのではなく、必要に応じてモデルに処理を依頼します。そして、処理結果をビューへ渡し、画面として表示します。

図2:MVCモデルの処理の流れ

この図から分かること

MVCモデルでは、ユーザーからの要求をコントローラが受け取り、モデルに処理を依頼し、ビューに表示を依頼します。

モデルは実際の処理を担当し、ビューは結果を画面として表示します。コントローラは、リクエストを受け付けて全体の流れを調整する役割です。

このように担当を分けることで、処理、表示、制御が混ざりにくくなります。どこを修正すればよいかが分かりやすくなり、保守や拡張がしやすくなります。

MVCモデルのメリット

MVCモデルの大きなメリットは、役割を分けることでプログラムの見通しがよくなることです。

すべての処理を1つのサーブレットや1つのJSPにまとめてしまうと、入力値の取得、計算処理、画面表示が混ざってしまいます。最初は動いていても、あとで機能を追加したときに修正が難しくなります。

MVCモデルでは、役割ごとに担当を分けるため、変更したい内容に応じて見る場所を絞りやすくなります。

役割分担によるメリット

メリット内容
修正しやすい表示だけを変えたい場合はビューを中心に確認できる
拡張しやすい新しい処理を追加するときに役割を整理しやすい
分担しやすいJava処理担当と画面作成担当で作業を分けやすい
見通しがよい処理、表示、制御の場所が分かりやすい
保守しやすい影響範囲を考えやすくなる

MVCモデルは、最初から完全に理解するのが難しい考え方です。

特に、まだ開発経験が少ない段階では、なぜここまで分ける必要があるのか実感しにくいかもしれません。

それでも、本格的なWebアプリケーションでは役割分担が大切になるため、まずは形として覚えていくことが大切です。

WebアプリケーションでのMVCの担当

サーブレットとJSPを使ったWebアプリケーションでは、MVCモデルの役割を次のように対応させて考えます。

MVCの要素Webアプリケーションで担当するもの主な役割
コントローラサーブレットクラスリクエストを受け取り、処理の実行や画面表示を指示する
モデル一般的なJavaクラスアプリケーションの主な処理やデータを担当する
ビューJSPファイルHTMLとして結果画面を表示する

この対応は、サーブレットとJSPを組み合わせて開発するときの基本パターンです。

リクエストを受けるのはサーブレットクラス、処理を担うのは一般的なJavaクラス、レスポンスの画面表示を担当するのはJSPファイル、と考えると整理しやすくなります。

コントローラはサーブレットクラスが担当する

コントローラは、ユーザーからの要求を受け取る役割です。

Webアプリケーションでは、ブラウザから送られてくるリクエストを最初に受け取り、必要な処理を呼び出し、次にどの画面を表示するかを決めます。

この役割には、サーブレットクラスが向いています。

サーブレットクラスはJavaを中心に書くため、次のような処理を行いやすいです。

コントローラで行う処理内容
リクエストの受付ブラウザから送られた要求を受け取る
パラメータの取得request.getParameterなどで入力値を取得する
処理の呼び出しモデルに必要な処理を依頼する
遷移先の判断成功画面や失敗画面など、表示先を決める
例外処理問題が起きたときの対応を行う

JSPファイルでもリクエストを受け取ることはできますが、複雑な制御や例外処理を多く書くには向いていません。

そのため、MVCモデルではサーブレットクラスがコントローラを担当します。

モデルは一般的なJavaクラスが担当する

モデルは、アプリケーションの主な処理や、処理に関わるデータを担当します。

たとえば、検索処理、計算処理、登録内容の管理、処理結果の保持などがモデルの役割です。

Webアプリケーションでは、モデルを一般的なJavaクラスとして作成します。

ここでいう一般的なJavaクラスとは、HttpServletRequestやHttpServletResponseのようなWebアプリケーション専用のクラスやインタフェースに依存しないクラスのことです。

モデルを一般的なJavaクラスにする理由

理由内容
処理を分離できるWeb画面とは別に、処理の中身を整理できる
再利用しやすい同じ処理を別の場所でも使いやすい
分担しやすいWebアプリケーションに詳しくない人でも処理部分を担当しやすい
テストしやすい画面やリクエストに依存しない処理として確認しやすい

モデルは、Web画面に直接表示する役割ではありません。ユーザーの要求に応えるための処理やデータを担当する部分です。

この役割をサーブレットやJSPから分けておくことで、アプリケーション全体の構造が分かりやすくなります。

ビューはJSPファイルが担当する

ビューは、ユーザーに対して画面を表示する役割です。

Webアプリケーションでは、処理結果をHTMLとして表示する必要があります。この画面表示にはJSPファイルが向いています。

JSPファイルはHTMLをそのまま書けるため、画面の構造を作りやすいです。サーブレットクラスでもHTMLを出力できますが、out.printlnを大量に書く必要があり、画面が複雑になるほど読みづらくなります。

JSPがビューに向いている理由

理由内容
HTMLをそのまま書ける画面の構造が分かりやすい
表示内容を確認しやすいブラウザに出る形をイメージしやすい
画面担当者が扱いやすいJava中心のサーブレットより画面作成に向いている
表示処理に集中できるコントローラやモデルの処理と分けやすい

ビューは、処理の結果をユーザーに見せるための担当です。

サーブレットが制御を行い、モデルが処理を行い、JSPが表示を行う。この分担が、サーブレットとJSPを使ったMVCモデルの基本になります。

図3:サーブレット・Javaクラス・JSPの役割分担

この図から分かること

サーブレットとJSPを使ったWebアプリケーションでは、MVCモデルの役割を具体的なファイルやクラスに対応させて考えます。

コントローラはサーブレットクラスが担当します。リクエストを受け取り、必要な処理を呼び出し、どの画面を表示するかを決めます。

モデルは一般的なJavaクラスが担当します。アプリケーションの主な処理やデータを扱います。

ビューはJSPファイルが担当します。処理結果をHTMLとしてユーザーに表示します。

この3つを分けることで、Webアプリケーションの構造が整理され、保守や拡張がしやすくなります。

サーブレットだけで作る場合の難しさ

サーブレットクラスだけでも、リクエストを受け取り、処理を行い、HTMLを出力することはできます。

しかし、HTMLを出力するにはout.printlnを何度も書く必要があります。画面が複雑になると、Javaコードの中にHTML文字列が大量に並び、読みにくくなります。

サーブレットだけで画面を作る場合

困りやすい点内容
HTMLが読みにくいout.printlnが多くなる
画面修正が大変HTMLの一部を直すだけでもJavaコードを探す必要がある
デザイン担当が扱いにくいJavaの知識が必要になりやすい
処理と表示が混ざる制御処理とHTML出力が同じ場所に集まりやすい

そのため、画面表示はJSPに任せるほうが自然です。

サーブレットは制御を担当し、JSPは表示を担当する。この分担が、Webアプリケーションを作りやすくする基本になります。

JSPだけで作る場合の難しさ

JSPファイルだけでも、リクエストパラメータを取得したり、Javaの処理を書いたりできます。

しかし、JSPに複雑な処理をたくさん書くと、HTMLとJavaコードが混ざりすぎて、逆に読みにくくなります。

JSPだけで処理まで行う場合

困りやすい点内容
Java処理が増える画面の中に複雑な処理が混ざる
役割が分かりにくい表示担当なのか処理担当なのか曖昧になる
修正しづらい画面修正と処理修正が同じファイルに集中する
見通しが悪くなるHTMLの中に条件分岐や例外処理が増えやすい

JSPはHTMLを表示するのが得意ですが、複雑な制御や処理をまとめる場所としては向いていません。

そのため、処理の受付や制御はサーブレットへ、主な処理はJavaクラスへ、表示はJSPへ分ける考え方が重要になります。

最初は形から覚えてよい

MVCモデルは、開発経験が少ない段階では少し難しく感じるかもしれません。

なぜ3つに分ける必要があるのか、なぜサーブレットとJSPを組み合わせるのか、最初はすぐに実感できないこともあります。

それでも、まずは次の基本パターンを覚えておくとよいでしょう。

MVCモデルとWebアプリケーションの基本パターン

役割担当
リクエストを受けるサーブレットクラス
主な処理を行う一般的なJavaクラス
レスポンス画面を表示するJSPファイル

この形は、サーブレットとJSPを使ったWebアプリケーション開発の基本的な考え方になります。

最初は完全に理解できなくても問題ありません。実際にいくつかのプログラムをMVCモデルに沿って作っていくうちに、役割を分ける便利さが少しずつ見えてきます。

これから意識したい黄金パターン

これから本格的なWebアプリケーションを作っていくときは、次の流れを意識すると理解しやすくなります。

流れ担当
ユーザーがリクエストするブラウザ
リクエストを受け取るサーブレットクラス
必要な処理を行う一般的なJavaクラス
表示する画面を作るJSPファイル
ユーザーが結果を見るブラウザ

サーブレットは受付と制御、Javaクラスは処理、JSPは表示。この3つの役割分担を、まずは基本形として覚えておきましょう。

MVCモデルは、複雑なWebアプリケーションを作るための土台になります。これから先の学習では、この基本形に沿ったプログラムを見ながら、少しずつMVCモデルに慣れていくことが大切です。