okinawa

IT勉強メモ

そういえばWebアプリってどうやって起動しているんだろうか?

Javaの場合はmainメソッドが最初に動くんだよなあ、くらいの認識しかなかったので少し調べてみた。

サーブレットJava Servlet)の場合です。

起動の流れ

サーブレットコンテナとは?

まずは必要な前提知識を。

サーブレットコンテナとは、サーブレットを動かすのに必要なソフトウェア。代表的なものはTomcat

サーブレットコンテナもJavaで作られている。

mainメソッドはいつ呼び出しているのか?

Javaプログラムのエントリポイントは、public static void main(String[] args)。

どんなプログラムにも必ずあると思っていたが、他のJavaプログラムから呼び出されるなら必要ない。

Tomcatがmainメソッドを持っていて、Tomcatからサーブレットが呼び出されるのでサーブレットはmainメソッドを持っていない。

起動からの流れ(合っているか怪しい)

  1. Tomcat起動(Javaコマンド打ってmainメソッド呼び出し)
  2. Tomcatのmainメソッドが実行される
  3. サーブレットインスタンス化され、サーブレットのinitメソッド実行
  4. HTTPリクエスト待機状態に入る

この状態が、Eclipsetomcat起動した時と同じ状態だと思う。

リクエストが来たらどうなる?

  1. HTTPリクエストが来る
  2. サーブレットがGetかPOSTか判断する
  3. doGet/doPostメソッドが呼び出される

どのクラスのdoGet/doPostを呼び出すかは、web.xmlに「このURLにリクエスト来たらこのクラスを呼び出してね」と書いてある。

こういう流れで起動するから、開発者からするとdoGet/doPostがエントリーポイントのように見える。

インスタンス化とは

newして、メモリ領域に入れること。

Tomcatのmainメソッド

ここから始まる。BootStrapクラス。

public static void main(String args[]) {

        synchronized (daemonLock) {
            if (daemon == null) {
                // Don't set daemon until init() has completed
                Bootstrap bootstrap = new Bootstrap();
                try {
                    bootstrap.init();
                } catch (Throwable t) {
                    handleThrowable(t);
                    log.error("Init exception", t);
                    return;
                }
                daemon = bootstrap;
            } else {

//以下省略

github.com

参考

6.1 サーブレットの制御

いまさら聞けないサーバーサイドJava 第2回 サーブレットとJSPを使いこなすコツ | ウルシステムズ株式会社

Java Solution FAQ:サーブレットの動作原理を教えてください

Servletコンテナとは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典