2012-03-13 106 views
11

私はいつもJSP,Servletを使っています。 Servletで何かを変更するたびにTomcat Serverを再起動して変更を取得する必要があることを私は知っています。 JSPの変更の場合、Tomcatは再起動を必要としません。jspが変更されたときにtomcatを再起動する必要はありません

JSPページはコンパイル時にのみServletに変換されます。だから、すべての後にServlet。だから、Tomcatを再起動せずにどうやって動作しますか?

JSPページがなど

答えて

8

デフォルトでは、tomcatは開発モードで起動されるため、変更が検出されるとJSP由来のサーブレットが再コンパイルされます。 JVMが新しいクラスをどのようにロードするのかは良い質問です。おそらく、tomcatクラスローダーはそうするように設定されています。

いくつかの関連する注記:

  • 本番
  • あなたがサーブレットも同様に再ロードされていることができ
  • の開発オプションをオフにすることができます - あなたはdebug modeでJVMとTomcatを開始する必要があります。
+0

'変更が検出されたとき' - 'tomcat'は変更があったとどのように判断しますか? –

11

サーバの再起動後、最初のアクセスに似コンパイルされるときにTomcatは、JSPを実行するように要求されたときに、とJSPファイルの更新日時を比較しているので、私は例の知識を持っていますこのJSPに対応するコンパイルされたクラスの変更時刻。最新のものであれば、それを実行する前に再コンパイルします。

これは、このチェックを実行するのに時間がかかるため、本番ではオフにする必要があるオプションです。

詳細はhttp://tomcat.apache.org/tomcat-7.0-doc/jasper-howto.htmlを参照してください。

+0

はい、ただし、JVMが新しいクラスをロードする方法があるはずです。デフォルトでは表示されません。私はそれが可能な風のカスタムクラスローダーだと思う。 – Bozho

+0

@:JBありがとう.. JSPファイルの最終更新日とコンパイル済みクラスを比較して、再コンパイルするかどうかを判断することができます。 –

0

JSPだけでなく、コンテナもサーブレットクラスのリロードをサポートしています。

サーブレットをいつロードするかは、コンテナによって決まります。 A servlet can be loaded at runtime on demand。そして、JSPに来て、JSP translated to servlet can also be loaded at runtime

なぜTomcatの再起動を必要としない、あなたの質問に来ますか?

Tomcat is capable of adding/modifying classpath to Web Application classloader at runtimeです。 Tomcatはcustom Classloader implementation which allows them to add the classpaths at runtimeになります。

カスタムクラスローダーはどのように機能しますか?

サーブレット/ JSPが変更されたときに、この動作を得る1つの方法は、a new classloader is created for the Servlet/JSP with Application classloader as parent classloader . And the new classloader will load the modified class againです。