2012-03-13 13 views
11

Używam już od pewnego czasu JSP,Servlet. Wiem, że ilekroć zmieniamy cokolwiek w Servlet, musimy zrestartować serwer Tomcat, aby uzyskać zmiany. Gdzie tak jak w przypadku zmiany JSP, tomcat nie wymaga restartu.dlaczego tomcat nie wymaga restartu, gdy jsp jest zmieniany

Zgodnie z moją wiedzą strona JSP zostaje przekonwertowana na Servlet tylko po skompilowaniu. Tak więc, po wszystkim jest to Servlet. To samo, jak to działa bez restartu Tomcat.

mam wiedzę o przypadkach, gdy strona JSP pobiera skompilowany jak przy pierwszym dostępie czasu po restarcie serwera itp

Odpowiedz

8

Ponieważ domyślnie tomcat jest uruchamiany w trybie programowania, co oznacza, że ​​serwlety pochodne JSP są rekompilowane po wykryciu zmiany. To dobre pytanie, w jaki sposób JVM ładuje nową klasę - prawdopodobnie program ładujący klasy tomcat jest tak skonfigurowany.

Kilka pokrewnych Uwagi:

  • można wyłączyć opcję rozwoju dla produkcji
  • można mieć serwlety zostały przeładowane, jak również - trzeba zacząć tomcat z JVM w debug mode.
+0

"po wykryciu zmiany" - jak "tomcat" decyduje o zmianie? –

11

Bo gdy Tomcat jest proszony o wykonanie JSP, to porównuje datę modyfikacji pliku JSP z czas modyfikacji skompilowanej klasy odpowiadającej temu JSP, a jeśli jest nowszy, to rekompiluje on w locie przed wykonaniem.

To jest BTW opcja, która powinna być wyłączona w produkcji, ponieważ wykonanie tego testu zabiera trochę czasu.

Aby uzyskać szczegółowe informacje, patrz http://tomcat.apache.org/tomcat-7.0-doc/jasper-howto.html.

+0

tak, ale powinien istnieć jakiś sposób, w jaki JVM ładuje nową klasę. Domyślnie tak nie jest. Myślę, że jest to niestandardowy moduł ładujący klasy tomcat, który na to pozwala. – Bozho

+0

@: JB Dzięki .. Wiem, że porównuje datę ostatniej modyfikacji pliku JSP ze skompilowaną klasą, aby zdecydować, czy przekompilować, czy nie. –

0

Nie tylko niektóre pojemniki JSP również wspierać przeładunku klasy serwletu jeśli jest on modyfikowany.

Do kontenera należy decyzja, kiedy załadować serwlety. A servlet can be loaded at runtime on demand. I przyjście na JSP, JSP translated to servlet can also be loaded at runtime.

Jadąc do twojego pytania,

Dlaczego Tomcat nie wymaga ponownego uruchomienia komputera?

To dlatego, że Tomcat is capable of adding/modifying classpath to Web Application classloader at runtime. Tomcat będzie miał ich custom Classloader implementation which allows them to add the classpaths at runtime.

Jak działa niestandardowy moduł ładujący klasy?

Jednym ze sposobów uzyskania tego działa, gdy zmodyfikowano serwlet/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.

Powiązane problemy