私はいつもJSP,Servlet
を使っています。 Servlet
で何かを変更するたびにTomcat Serverを再起動して変更を取得する必要があることを私は知っています。 JSPの変更の場合、Tomcatは再起動を必要としません。jspが変更されたときにtomcatを再起動する必要はありません
JSP
ページはコンパイル時にのみServlet
に変換されます。だから、すべての後にServlet
。だから、Tomcat
を再起動せずにどうやって動作しますか?
JSPページがなど
私はいつもJSP,Servlet
を使っています。 Servlet
で何かを変更するたびにTomcat Serverを再起動して変更を取得する必要があることを私は知っています。 JSPの変更の場合、Tomcatは再起動を必要としません。jspが変更されたときにtomcatを再起動する必要はありません
JSP
ページはコンパイル時にのみServlet
に変換されます。だから、すべての後にServlet
。だから、Tomcat
を再起動せずにどうやって動作しますか?
JSPページがなど
デフォルトでは、tomcatは開発モードで起動されるため、変更が検出されるとJSP由来のサーブレットが再コンパイルされます。 JVMが新しいクラスをどのようにロードするのかは良い質問です。おそらく、tomcatクラスローダーはそうするように設定されています。
いくつかの関連する注記:
サーバの再起動後、最初のアクセスに似コンパイルされるときにTomcatは、JSPを実行するように要求されたときに、とJSPファイルの更新日時を比較しているので、私は例の知識を持っていますこのJSPに対応するコンパイルされたクラスの変更時刻。最新のものであれば、それを実行する前に再コンパイルします。
これは、このチェックを実行するのに時間がかかるため、本番ではオフにする必要があるオプションです。
詳細はhttp://tomcat.apache.org/tomcat-7.0-doc/jasper-howto.htmlを参照してください。
はい、ただし、JVMが新しいクラスをロードする方法があるはずです。デフォルトでは表示されません。私はそれが可能な風のカスタムクラスローダーだと思う。 – Bozho
@:JBありがとう.. JSPファイルの最終更新日とコンパイル済みクラスを比較して、再コンパイルするかどうかを判断することができます。 –
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
です。
'変更が検出されたとき' - 'tomcat'は変更があったとどのように判断しますか? –