Análisis del código fuente de Tomcat: componente contenedor de StandardHost
El contenedor Container se utiliza para representar el contenedor de servlets en Tomcat, que es responsable de cargar y administrar servlets, procesar solicitudes ServletRequest y devolver objetos ServletResponse estándar al conector.
Componentes del contenedor
El contenedor Tomcat está funcionalmente dividido en cuatro componentes, a saber, motor, host, contexto y contenedor. Estos cuatro contenedores no están en una relación paralela, sino en una relación padre-hijo.
La interfaz del ciclo de vida define métodos de interfaz relacionados con el ciclo de vida para todos los componentes de Tomcat. Tomcat define una clase base LifecycleBase para implementar la interfaz del ciclo de vida e implementa cierta lógica pública en la clase base. Las subclases son responsables de implementar sus propios métodos de plantilla para la inicialización, inicio y detención.
Ver Diseño de arquitectura de Tomcat: ciclo de vida de los componentes Ciclo de vida
La interfaz del contenedor define los métodos de interfaz comunes para todos los componentes del contenedor en Tomcat. Tomcat define una clase base ContainerBase para implementar la interfaz del contenedor e implementa cierta lógica pública en la clase base. Tomcat implementa la interfaz del contenedor en la clase base ContainerBase.
Para obtener más información, consulte Diseño de arquitectura de Tomcat: clase base de componente de contenedor ContainerBase.
La función principal de Tomcat es implementar directorios de recursos estáticos o aplicaciones en contenedores. Los contenedores son componentes del contenedor host. Los recursos o aplicaciones estáticos están representados por componentes del contenedor Context. La llamada implementación se carga en el subcomponente del contenedor Host. Por supuesto, los hosts virtuales tienen otras funciones además de la implementación, incluida la implementación en caliente, la carga diferida, los alias, etc.
Si desea implementar el directorio de recursos estáticos en el servidor Tomcat, Tomcat proporciona una variedad de métodos de implementación
Configure en server.xml
Si lo desea to El directorio de recursos estáticos se implementa en el servidor Tomcat y Tomcat proporciona múltiples métodos de implementación. xml
ruta representa la ruta raíz del contexto, docBase representa el directorio de recursos estáticos mapeados
ruta representa la ruta raíz del contexto. p>
Configure el archivo xml en la ruta xmlBase
Cree el archivo JavaWebApp.xml. xml, xmlBase está configurado en el atributo de etiqueta Host
El nombre del archivo representa la ruta raíz del contexto y docBase representa el directorio de recursos estáticos asignados
Copie el archivo de recursos en la ruta de appBase
La ruta de appBase se define en el atributo de etiqueta Host y el nombre del archivo representa la ruta raíz del contexto.
Implemente la aplicación en el directorio appBase
appBase se define en el atributo appBase de la etiqueta Host en el archivo server.xml appBase puede completar una ruta relativa o una ruta absoluta. Si es una ruta relativa, entonces la ruta completa es CATALINA_BASE, que representa el directorio de trabajo de tomcat
El host virtual se puede configurar para implementar recursos o aplicaciones estáticas cuando se usa.
VirtualHost comprobará periódicamente si hay nuevas aplicaciones web o recursos estáticos en los directorios appBase y xmlBase, y activará una recarga de los componentes de contexto correspondientes cuando se produzca una actualización.
VirtualHost puede definir alias.
StandardHost administra los componentes contextuales del contenedor secundario, así como los componentes comunes heredados de las clases principales ContainerBase y LifecycleBase.
StandardHost implementa la interfaz de Host. Antes de comprender las funciones de StandardHost, primero debemos comprender la interfaz de Host.
La interfaz de Host.
Interfaz de host
StandardHost implementa la interfaz de host, que se utiliza para acceder a la funcionalidad de host virtual configurada en Tomcat.
StandardHost solo define la configuración de las funciones de la máquina virtual, que son implementadas por HostConfig. También es responsable de administrar el componente Contexto del contenedor secundario (azul en la imagen a continuación), así como los componentes comunes heredados del contenedor principal Base (rojo en la imagen a continuación) y LifecycleBase (amarillo en la imagen a continuación).
Todos los componentes de Tomcat pasarán por el siguiente proceso.
Tomcat utiliza Digester para analizar server.xml. Digester es una herramienta basada en eventos para convertir xml a objetos Java y es un contenedor de alto nivel para SAX. En comparación con SAX, Digester puede establecer las reglas de análisis correspondientes para cada etiqueta xml. Consulte Tecnologías relacionadas con Tomcat: Digester (II)
Tomcat llama a createStartDgester() durante la fase de inicialización del componente Catalina para crear un objeto Digester. El objeto Digester contiene las reglas para analizar server.xml y luego es. analizado a través del objeto Digester server.xml para crear una instancia de StandardHost y establecer valores para algunas de sus propiedades.
configuración server.xml
Para analizar la etiqueta
Regla CopyParentClassLoaderRule
La regla CopyParentClassLoaderRule es responsable de llamar al getParentClassLoader del objeto secundario en la parte superior de la pila para obtener la clase principal cargada y establecerla en la propiedad parentClassLoader de la parte superior. objeto de la pila
Regla LifecycleListenerRule
La regla LifecycleListenerRule es responsable de agregar un detector de ciclo de vida al objeto superior de la pila.
A continuación, la inicialización inicia el ciclo de vida de los componentes de Tomcat. Para Tomcat, todos los componentes deben implementar Lifecycle. Tomcat define una clase base LifecycleBase para implementar la interfaz Lifecycle y combinar algunas funciones públicas. en la clase base, como la conversión y el mantenimiento del estado de vida, los desencadenantes y los oyentes de los acontecimientos de la vida. Las subclases son responsables de implementar sus propios métodos de plantilla para inicialización, inicio y parada. Para evitar tener el mismo nombre que los métodos en la clase base, cambiamos el nombre de los métodos de implementación de la subclase concreta a initInternal, startInternal, etc. y agregamos Internal al final.
La clase principal StandardHost implementa métodos de plantilla de contenedor para inicialización, inicio y parada de forma predeterminada. Los contenedores de subclases se pueden ampliar anulando la implementación de la clase principal.
El resto de la implementación del ciclo de vida de StandardEngine se hereda de la clase principal ContainerBase.
Configure MemoryLeakTrackingListener para el subcontenedor agregado.
Cada componente del contenedor tiene un objeto Pipeline, que mantiene una lista de válvulas.
Aquí, cada valor representa un punto de procesamiento. Cuando se llama al método addValve, el Vaule se agregará al principio de la cadena y no hay ningún método de invocación
en el. Pipeline, por lo que cuando se procesa una solicitud, Pipeline solo necesita obtener la primera válvula en la cadena y llamar a invoke para ejecutarla. El valor actual llamará a
getNext.invoke() para activar la siguiente llamada de válvula
Cada contenedor es responsable de llamar al primero en la canalización del contenedor subordinado cuando se ejecuta el último BasicValue predeterminado. válvulas
El contenedor StandardHost tiene tres válvulas por defecto. El contenedor tiene tres válvulas de forma predeterminada, AccessLogValve (lea server.xml al compilar), StandardHostValve (al compilar y crear instancias) y ErrorReportValve (al iniciar).
Registrar registros de acceso, que es un componente común y se presentará por tema más adelante.