サーブレット&JSPの基本|サーブレットが実行されるまで

書いて、保存して、リクエストする。サーブレットが動き出すまでの流れをやさしく理解しよう

サーブレットを学び始めると、WelcomeServlet.javaを書いて、Eclipseから実行して、ブラウザで結果を確認するという流れを何度も繰り返すことになります。
ただ、画面に結果が表示されるまでに、内部で何が起きているのかは最初のうちは少し見えにくいところです。

Javaのプログラムは、ソースコードを書いただけではそのまま実行されるわけではありません。サーブレットも同じで、まずコンパイルが行われ、そのあと必要に応じてインスタンス化されて実行されます。とはいえ、EclipseとTomcatを使った開発環境では、その多くを自動で行ってくれるため、開発者が毎回細かく手作業をする必要はありません。

この記事では、WelcomeServlet.javaがどのようにWelcomeServlet.classになり、さらにブラウザからのリクエストをきっかけにTomcat上で実行されるのかを順番に見ていきます。サーブレットが動くまでの流れを理解しておくと、エラーが出たときの原因もつかみやすくなり、開発の見通しもぐっとよくなります。

サーブレットが実行されるまで

サーブレットクラスは、Javaで作られたプログラムです。そのため、通常のJavaクラスと同じように、実行される前にコンパイルとインスタンス化が必要です。

サーブレットの場合、この流れは大きく分けると次の4段階になります。

段階内容
1サーブレットクラスのソースファイルを作成する
2ソースファイルをコンパイルしてクラスファイルにする
3ブラウザからサーブレットへリクエストを送る
4Tomcatがサーブレットをインスタンス化して実行する

ここで大事なのは、実際に動くのはWelcomeServlet.javaそのものではない、という点です。
実行時に使われるのは、コンパイル後に作成されたWelcomeServlet.classであり、さらにそのクラスから生成されたインスタンスです。

サーブレットクラスは作成しただけでは実行されない

WelcomeServlet.javaのようなファイルは、サーブレットクラスのソースファイルです。
これは人が読み書きするためのファイルであり、そのままTomcatが実行するわけではありません。

Javaでは、ソースファイルに書かれた内容をコンピュータが実行できる形へ変換する必要があります。その変換処理がコンパイルです。

たとえば、WelcomeServlet.javaにdoGetメソッドやHTML出力の処理を書いたとしても、その時点ではまだ準備段階です。保存してコンパイルされ、WelcomeServlet.classというクラスファイルになってはじめて、Tomcatが利用できる状態になります。

ファイル役割
WelcomeServlet.java開発者が編集するサーブレットのソースファイル
WelcomeServlet.classコンパイルによって作成される実行用のクラスファイル

この区別を意識しておくと、サーブレット開発の流れが分かりやすくなります。

図1:サーブレットが動くまでの全体の流れ

この図から分かること

サーブレットの実行は、ソースコードを書いた瞬間に始まるわけではありません。
まずWelcomeServlet.javaを作成し、それをコンパイルしてWelcomeServlet.classに変換する必要があります。

そのあと、ブラウザからリクエストが送られると、Tomcatがそのクラスをもとにインスタンスを作成し、サーブレットを実行します。
つまり、コーディング、コンパイル、リクエスト、インスタンス化という流れがつながって、はじめてブラウザへ結果が返されます。

コンパイルとは何か

コンパイルとは、Javaのソースコードを、実行可能なクラスファイルへ変換する処理のことです。

開発者が書くWelcomeServlet.javaは、人が理解しやすい形で書かれています。一方、Javaの実行環境は、そのままではソースコードを直接使えません。そこで、コンパイルを行ってWelcomeServlet.classを作成します。

サーブレットの開発では、このコンパイルが必ず必要になります。もしコンパイルが行われていなければ、Tomcatはサーブレットを実行できません。

コンパイル前とコンパイル後の違い

状態ファイル特徴
コンパイル前WelcomeServlet.java開発者が編集するソースコード
コンパイル後WelcomeServlet.classTomcatが利用するクラスファイル

Java学習を始めたばかりだと、ソースファイルとクラスファイルの違いが少しあいまいになりやすいですが、サーブレットでもこの2つははっきり役割が分かれています。

Eclipseでは保存時に自動でコンパイルされる

通常のJava開発では、コンパイルを明示的に実行することがあります。
しかし、Eclipseを使っている場合は、ファイルを上書き保存すると自動でコンパイルが行われます。

そのため、WelcomeServlet.javaを編集したあと、わざわざ手動でコンパイルの命令を入力する必要はありません。
保存するだけで、Eclipseが自動的にWelcomeServlet.classを作成または更新してくれます。

これはサーブレット開発でも同じです。
たとえば、doGetメソッドの中身を変更してCtrl + Sで保存すると、その変更内容を反映したクラスファイルが自動的に作られます。

Eclipseでの基本的な流れ

操作Eclipse内部で行われること
WelcomeServlet.javaを編集するソースコードが変更される
上書き保存する自動コンパイルが行われる
エラーがなければWelcomeServlet.classが更新される
エラーがある場合クラスファイルが正しく作成されないことがある

この仕組みのおかげで、開発者はソースコードの作成に集中しやすくなります。

保存しても実行できないことがある理由

Eclipseが自動コンパイルをしてくれるとはいえ、保存しただけで必ず実行できるとは限りません。
ソースコードに文法エラーがあると、正しいクラスファイルが作成されないことがあります。

たとえば、セミコロンの付け忘れや、括弧の閉じ忘れ、クラス名の入力ミスなどがあると、コンパイルに失敗します。
その場合は、Tomcatが実行できるWelcomeServlet.classが用意できないため、期待した動作にならないことがあります。

コンパイルエラーがあるときに確認したいこと

確認項目内容
Javaの文法セミコロン、括弧、綴りに誤りがないか
import文必要なクラスが正しく読み込まれているか
メソッド定義doGetの宣言が正しいか
Eclipseの表示赤いエラーマークが出ていないか

保存したのにブラウザで正しく動かないときは、まずコンパイルが成功しているかを確認することが大切です。

インスタンス化とは何か

コンパイルによってWelcomeServlet.classができても、それだけではまだ実際の処理は動きません。
サーブレットを実行するには、そのクラスからインスタンスを生成する必要があります。

インスタンスとは、クラスをもとに実際に作られた実体のことです。
WelcomeServlet.classが設計図だとすると、インスタンスはその設計図をもとに作られた実際の動作対象と考えると分かりやすいでしょう。

サーブレットが実行されるとき、実際に動作するのはこのインスタンスです。

用語イメージ
クラス設計図
インスタンス設計図から作られた実体
サーブレットの実行インスタンスが処理を行う

この考え方は、通常のオブジェクト指向プログラミングと同じです。
サーブレットだから特別というわけではなく、Javaのクラスとしての基本に沿って動いています。

図2:コンパイルとインスタンス化の関係

この図から分かること

WelcomeServlet.javaは、あくまでソースコードです。
保存時にEclipseが自動コンパイルを行うことで、WelcomeServlet.classというクラスファイルが作成されます。

さらに、実際に処理を行うのはWelcomeServlet.classそのものではなく、Tomcatがそこから生成したインスタンスです。
クラスとインスタンスは同じように見えやすいですが、役割は異なります。

サーブレットの実行を理解するためには、ソースファイル、クラスファイル、インスタンスの3つを区別して考えることが大切です。

サーブレットのインスタンス化はTomcatが自動で行う

通常のJavaプログラムでは、必要に応じてnewを使ってインスタンスを生成します。
しかし、サーブレットでは開発者が自分でWelcomeServletのインスタンスを作成する必要はありません。

ブラウザからサーブレットへのリクエストが届くと、Tomcatが自動的にサーブレットをインスタンス化します。
そして、そのインスタンスを使って必要な処理を実行します。

この仕組みのおかげで、開発者はインスタンス生成の細かな制御を意識しなくても、doGetメソッドの中身を書くことに集中できます。

サーブレット開発で自動化されること

処理誰が行うか
コンパイルEclipseが保存時に自動で行う
インスタンス化Tomcatがリクエスト時に自動で行う
サーブレットの実行Tomcatが生成したインスタンスを使って行う

サーブレット開発では、環境側が多くの準備を引き受けてくれるため、開発者は業務処理やHTML出力の実装に集中しやすくなっています。

リクエストが実行のきっかけになる

サーブレットは、保存しただけで勝手に動き始めるわけではありません。
実行のきっかけになるのは、ブラウザからのリクエストです。

たとえば、Eclipseのサーバーで実行を使ったり、ブラウザにURLを入力したりすると、Tomcatへリクエストが送られます。
そのリクエストを受けたTomcatが、対応するサーブレットを探し、必要に応じてインスタンスを生成して処理を実行します。

つまり、サーブレットの流れは次のようになります。

流れ内容
1開発者がWelcomeServlet.javaを作成する
2保存によって自動コンパイルされる
3ブラウザからURLへアクセスする
4Tomcatがリクエストを受け取る
5Tomcatがサーブレットをインスタンス化する
6サーブレットのインスタンスが処理を実行する

このように、リクエストがサーブレット実行のスタート地点になります。

手動でやらなくてよいことを整理する

サーブレット学習を始めたばかりの段階では、どこまで自分で行い、どこから環境が自動でやってくれるのかが分かりにくいことがあります。
そこで、手動で行うことと自動で行われることを整理しておきましょう。

開発者が主に行うこと

操作内容
コーディングWelcomeServlet.javaを作成、修正する
保存上書き保存して変更を反映する
実行操作ブラウザからリクエストする、またはEclipseで実行する

EclipseやTomcatが主に行うこと

自動処理内容
自動コンパイル保存時にWelcomeServlet.classを作成する
自動インスタンス化リクエスト時にサーブレットのインスタンスを生成する
実行管理インスタンスを使ってサーブレットを実行する

この役割分担が分かると、開発の全体像がかなりつかみやすくなります。

図3:ブラウザのリクエストからサーブレットが動くまで

この図から分かること

ブラウザからのリクエストが届くと、Tomcatはまず対応するサーブレットのクラスファイルを利用します。
そのうえで、必要なインスタンスを生成し、そのインスタンスに処理を実行させます。

実行が終わると、処理結果はレスポンスとしてブラウザへ返されます。
ここでも、実際に処理を担当しているのはWelcomeServlet.javaではなく、Tomcatが生成したサーブレットのインスタンスです。

この流れを理解しておくと、サーブレットは書いたらすぐそのまま動くのではなく、コンパイルとインスタンス化を経て実行されることがよく分かります。

実際に動くのはサーブレットクラスのインスタンス

最後に、もう一度いちばん大切な点を確認しておきます。
サーブレットを実行したときに実際に動くのは、アプリケーションサーバーが生成したサーブレットクラスのインスタンスです。

WelcomeServlet.javaはソースコード、WelcomeServlet.classはコンパイル後のクラスファイル、そして実際の処理担当はWelcomeServletのインスタンスです。

この違いを押さえておくと、サーブレットの実行をかなり整理して理解できます。

対象役割
WelcomeServlet.java開発者が記述するソースファイル
WelcomeServlet.classコンパイル後のクラスファイル
WelcomeServletのインスタンス実際に処理を実行する実体

サーブレット開発では、開発者は主にソースコードを書くことに集中します。
コンパイルはEclipseが、インスタンス化はTomcatが自動で行ってくれるため、複雑な準備を毎回意識しなくても開発を進められます。

その一方で、内部ではこうした流れが動いていることを知っておくと、サーブレットの仕組みがより深く理解できるようになります。