我一直在使用JSP,Servlet
已經有一段時間了。我知道,只要我們在Servlet
中更改了任何內容,我們就需要重新啓動Tomcat服務器以獲取更改。在JSP更改的情況下,tomcat不需要重新啓動。爲什麼tomcat在jsp變更時不需要重啓
根據我的知識JSP
只有在編譯時纔將頁面轉換爲Servlet
。因此,畢竟它的一個Servlet
。所以,它是如何工作,而不需要Tomcat
重新啓動。
我的案件時認識一個JSP頁面被服務器重新啓動後第一次訪問編譯像等
我一直在使用JSP,Servlet
已經有一段時間了。我知道,只要我們在Servlet
中更改了任何內容,我們就需要重新啓動Tomcat服務器以獲取更改。在JSP更改的情況下,tomcat不需要重新啓動。爲什麼tomcat在jsp變更時不需要重啓
根據我的知識JSP
只有在編譯時纔將頁面轉換爲Servlet
。因此,畢竟它的一個Servlet
。所以,它是如何工作,而不需要Tomcat
重新啓動。
我的案件時認識一個JSP頁面被服務器重新啓動後第一次訪問編譯像等
因爲默認情況下,tomcat以開發模式啓動,這意味着在檢測到更改時重新編譯JSP衍生的servlet。這是一個很好的問題,JVM如何加載新類 - 可能是tomcat classloader被配置爲這樣做。
一些相關的注意事項:
因爲當Tomcat要求執行JSP,是比較與JSP文件的修改日期與此JSP相對應的已編譯類的修改時間,如果更新,則會在執行它之前即時重新編譯。
這是BTW應該在生產中關閉的選項,因爲執行此檢查需要時間。
查看http://tomcat.apache.org/tomcat-7.0-doc/jasper-howto.html瞭解詳情。
是的,但應該有一些JVM加載新類的方法。默認情況下它沒有。我認爲這是允許它的tomcat的自定義類加載器。 – Bozho 2012-03-13 09:57:48
@:JB謝謝..我知道它比較了JSP文件的最後修改日期和編譯後的類,以決定是否重新編譯。 – 2012-03-13 11:41:14
不只是JSP的一些容器也支持重新加載servlet類如果它被修改。
由容器決定何時加載servlet。 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
。雄貓將擁有他們的custom Classloader implementation which allows them to add the classpaths at runtime
。
自定義類加載器如何工作?
一個方法得到這個工作是當Servlet/JSP被修改時,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如何決定有變化? – 2016-09-13 08:36:01