2012-03-13 21 views
11

He estado usando JSP,Servlet durante bastante tiempo. Sé que siempre que cambiemos algo en Servlet necesitamos reiniciar Tomcat Server para obtener los cambios. Donde, como en el caso del cambio JSP, Tomcat no requiere reinicio.por qué tomcat no requiere reiniciar cuando se cambia jsp

Según mi conocimiento JSP la página se convierte en Servlet solo cuando se compila. Entonces, después de todo es un Servlet. Así que, ¿cómo funciona sin Tomcat reiniciar.

tengo conocimiento de casos en los que una página JSP se compila como en el primer acceso momento después de reiniciar el servidor, etc.

Respuesta

8

Porque, de forma predeterminada, tomcat se inicia en modo de desarrollo, lo que significa que los servlets derivados de JSP se vuelven a compilar cuando se detecta un cambio. Es una buena pregunta cómo carga la JVM la nueva clase, probablemente el cargador de clases tomcat esté configurado para hacerlo.

Unas pocas notas relacionadas:

  • puede desactivar la opción de desarrollo para la producción
  • puede haber vuelto a cargar los servlets, así - usted tiene que comenzar con una JVM Tomcat en debug mode.
+0

'cuando se detecta un cambio' - ¿cómo' tomcat' decide que hay un cambio? –

11

Porque cuando se le pide Tomcat para ejecutar una JSP, es compara la fecha de modificación del archivo JSP con el hora de modificación de la clase compilada correspondiente a esta JSP, y si es más reciente, vuelve a compilar sobre la marcha antes de ejecutarla.

Esta es, por cierto, una opción que se debe desactivar en producción, ya que lleva tiempo realizar esta comprobación.

Ver http://tomcat.apache.org/tomcat-7.0-doc/jasper-howto.html para más detalles.

+0

sí, pero debería haber alguna forma en que la JVM carga la nueva clase. Por defecto no lo hace. Creo que es el cargador de clases personalizado de tomcat el que lo permite. – Bozho

+0

@: JB Gracias ... Sé que compara la fecha de la última modificación del archivo JSP con la clase compilada para decidir si desea volver a compilar o no. –

0

no sólo algunos contenedores de JSP también apoyan la recarga de la clase servlet si se modifica.

Es hasta el contenedor para decidir cuándo cargar los servlets. A servlet can be loaded at runtime on demand. Y viniendo a JSP, JSP translated to servlet can also be loaded at runtime.

Viniendo a su pregunta,

Por qué Tomcat no requiere reiniciar?

Es porque Tomcat is capable of adding/modifying classpath to Web Application classloader at runtime. Tomcat tendrá su custom Classloader implementation which allows them to add the classpaths at runtime.

¿Cómo podría funcionar el cargador de clases personalizado?

Una forma de hacerlo funcionar es cuando se modifica un 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.

Cuestiones relacionadas