1. Comencemos con el contenedor de servlet: el contenedor de servlet con el que todos están más familiarizados es Tomcat. ¿Cómo gestiona los servlets de contenedores de servlet?
Echemos un vistazo al modelo de contenedor de Tomcat primero:
De la figura anterior, podemos ver que el contenedor de Tomcat se divide en cuatro niveles. El contenedor que realmente administra servlets es el contenedor de contexto, y un contexto corresponde a un proyecto web
En el nivel del contenedor de Tomcat, el contenedor de contexto es un contenedor que administra directamente el envoltorio de clase Wrapper (StandardWrapper) del servlet en el contenedor, por lo que la forma en que se ejecuta el contenedor de contexto afectará directamente cómo funciona el servlet.
Aquí explicaré la clase de envoltura de Servlet: StandardWrapper. Aquí hay una pregunta, ¿por qué se debe envolver el servlet en StandardWrapper en lugar de ser un objeto Servlet directamente? Debido a que StandardWrapper es parte del contenedor Tomcat, tiene las características del contenedor, y Servlet es un estándar de desarrollo web independiente y no debe estar fuertemente acoplado en Tomcat.
Excepto para envolver el servlet en StandardWrapper y agregarlo al contexto como un subcontinante, todas las demás propiedades web.xml se analizan en el contexto, por lo que el contenedor de contexto es el contenedor de servlet que realmente ejecuta el servlet. Una aplicación web corresponde a un contenedor de contexto. Las propiedades de configuración del contenedor son especificadas por Web.xml de la aplicación, por lo que podemos entender qué rol juega Web.xml.
2. Lo siguiente describe brevemente el proyecto de trabajo de Servlet:
Cuando un servidor web interactúa con el cliente, el proceso de trabajo de servlet es:
1. Haga una solicitud al servidor web en el cliente
2. El servidor web lo envía al servlet después de recibir la solicitud
3. El contenedor de servlet genera un objeto de instancia para esto y llama al método correspondiente en la API de servlet para procesar la solicitud HTTP del cliente y luego devuelve el resultado de respuesta procesada al servidor web.
4. El servidor web envía la estructura de respuesta recibida del objeto de instancia de servlet nuevamente al cliente.
3. El ciclo de vida del servlet:
Como se muestra en la figura anterior, el ciclo de vida de un servlet se puede dividir en cuatro etapas, a saber, la clase de carga y la etapa de creación, la etapa de inicialización, la etapa de servicio y la etapa de destrucción de la instancia. La siguiente es una descripción detallada de las tareas de programación y precauciones para cada etapa.
1. Cree una instancia de servlet:
Por defecto, las instancias de servlet se crean cuando llega la primera solicitud y se reutilizan más tarde. Si algunos servlets requieren operaciones complejas que deben completarse al cargar la inicialización, como abrir archivos, inicializar las conexiones de red, etc., puede notificar al servidor que cree una instancia del servlet al comenzar. La configuración específica es la siguiente:
<Servlet> <Servlet-name> Timeservlet </servlet-name> <ervlet-class> com.allanlxf.servlet.basic.timeservlet </servlet-class> <load-on-shartup> 1 </load-on-startup> </servlet>
Cree la estructura de clase relevante del objeto Servlet:
2. Inicialización
Una vez que se crea la instancia de servlet, el servidor web llamará automáticamente el método Init (ServletConfig Config) para inicializar el servlet. La configuración del parámetro de método contiene la información de configuración del servlet, como el parámetro de inicialización, que es creado por el servidor.
I. ¿Cómo configurar los parámetros de inicialización de Servlet?
En la etiqueta de definición del servlet en web.xml, por ejemplo:
<Servlet> <Servlet-name> Timeservlet </servlet-name> <ervlet-class> com.allanlxf.servlet.basic.timeservlet </servlet-class> <it-param> <par AM-Name> User </param-name> <amam-value> nombre de usuario </amam-value> </init-param> <initparam> <amamname> Blog </param-name> <amam-value> http: //. . . </param-value> </init-param> </servlet>
Los dos parámetros de inicialización El usuario y el blog están configurados con los valores de nombre de usuario y http: //. . . , de esta manera, para modificar el nombre de usuario y la dirección de blog en el futuro, no necesita modificar el código de servlet, simplemente modificar el archivo de configuración.
II. ¿Cómo leer los parámetros de inicialización de un servlet?
ServletConfig define el siguiente método para leer la información de los parámetros de inicialización:
Cadena pública getInitParameter (nombre de cadena)
Parámetro: el nombre del parámetro de inicialización.
Devuelve: El valor del parámetro de inicialización, si no está configurado, devuelve nulo.
Número de tiempos de ejecución del método iii.init (servletConfig)
Este método se ejecuta una vez durante el ciclo de vida de un servlet.
Método IV.init (ServletConfig) y hilo
Este método se ejecuta en un solo entorno roscado, por lo que los desarrolladores no necesitan considerar los problemas de seguridad del hilo.
V.init (servletConfig) método y excepción
Durante la ejecución, este método puede lanzar una ServletException para notificar al servidor web que la instancia de servlet no ha podido inicializarse. Una vez que se lanza una ServletException, el servidor web no entregará la solicitud del cliente a la instancia de servlet para su procesamiento, pero informará la información de excepción de falla de inicialización al cliente, que se destruirá desde la memoria. Si se realiza una nueva solicitud, el servidor web creará una nueva instancia de servlet y realizará la operación de inicialización de la nueva instancia.
3. Servicio
Una vez que la instancia de servlet se crea e inicializa correctamente, el servidor puede utilizar la instancia de servlet para satisfacer la solicitud del cliente y generar una respuesta. Durante la etapa de servicio, el servidor web llamará al método del servicio (solicitud ServletRequest, respuesta de servicio de servicio) de la instancia. El objeto de solicitud y el objeto de respuesta son creados por el servidor y se pasa a la instancia de servlet. El objeto de solicitud encapsula la información enviada por el cliente al servidor, y el objeto de respuesta encapsula la información enviada por el servidor al cliente.
I. Responsabilidades del método Servicio ()
El método Service () es el método central del servlet. La lógica comercial del cliente debe ejecutarse dentro de este método. El proceso de desarrollo de un método de servicio típico es:
Analizar la solicitud del cliente-> Ejecutar la lógica comercial-> Página de respuesta de salida al cliente
Ii.service () método e hilo
Para mejorar la eficiencia, la especificación de servlet requiere que una instancia de servlet sea capaz de satisfacer múltiples solicitudes de clientes al mismo tiempo. Es decir, el método Service () se ejecuta en un entorno de múltiples subprocesos, y los desarrolladores de servlet deben garantizar la seguridad del hilo del método.
III.Service () Método y excepción
El método Service () puede lanzar ServletException e IOException durante la ejecución. Entre ellos, ServletException se puede lanzar durante el proceso de procesamiento de solicitudes de clientes, como el recurso solicitado no está disponible, la base de datos no está disponible, etc. Una vez que se lanza la excepción, el contenedor debe reciclar el objeto de solicitud e informar la información de excepción del cliente. IOException indica un error de entrada y salida. El programador no tiene que preocuparse por la excepción e informa directamente al cliente por el contenedor.
Precauciones de programación:
1) Cuando el subproceso del servidor ejecuta el método init () de la instancia de servlet, todos los subprocesos de servicio del cliente no pueden ejecutar el método de servicio () de la instancia, y ningún hilo puede ejecutar el método Destroy () de la instancia. Por lo tanto, el método init () del servlet funciona en un entorno de un solo hilo, y los desarrolladores no tienen que considerar ningún problema de seguridad del hilo.
2) Cuando el servidor recibe múltiples solicitudes del cliente, el servidor ejecutará el método Servicio () de la instancia de servlet en un subproceso de servicio del cliente separado para servir a cada cliente. En este momento, múltiples hilos ejecutarán el método Service () de la misma instancia de servlet al mismo tiempo, por lo que se deben considerar los problemas de seguridad de los subprocesos.
3) Tenga en cuenta que aunque el método Service () se ejecuta en un entorno de múltiples subprocesos, no es necesario sincronizar el método. En cambio, depende del tipo de recurso accedido por este método durante la ejecución y cómo accede a los recursos. El análisis es el siguiente:
i. Si el método Service () no accede a las variables del miembro del servlet o los recursos globales, como variables estáticas, archivos, conexiones de bases de datos, etc., solo usa los recursos propios del hilo actual, como variables temporales, solicitudes y objetos de respuesta que no apuntan a los recursos globales. Este método en sí es seguro de hilo y no requiere ningún control de sincronización.
II. Si el método Service () accede a la variable de miembro del servlet, pero la operación en la variable es una operación de solo lectura, el método en sí es seguro de subproceso y no requiere ningún control de sincronización.
iii. Si el método Service () accede a la variable de miembro del servlet y se lee y escribe la operación de la variable, generalmente se requiere una declaración de control de sincronización.
IV. Si el método Service () accede a una variable estática global, si puede haber otros hilos en el sistema que accede a la variable estática al mismo tiempo, si hay operaciones de lectura y escritura, generalmente se requiere una declaración de control de sincronización.
v. Si el método Service () accede a los recursos globales, como archivos, conexiones de bases de datos, etc., generalmente es necesario agregar declaraciones de control de sincronización.
4. Destrucción
Cuando el servidor web piensa que la instancia de servlet no es necesaria, como la recarga de la aplicación o el cierre del servidor, y no se ha accedido al servlet durante mucho tiempo. El servidor puede destruir (también desinstalado) la instancia desde la memoria. El servidor web debe asegurarse de que el método Destroy () de la instancia de servlet se llame antes de desinstalar la instancia de servlet, para reciclar los recursos solicitados por el servlet o realizar otro procesamiento importante.
El servidor web debe asegurarse de que antes de llamar al método Destroy (), todos los hilos que se ejecutan en el método Service () de la salida de instancia o esperar estos hilos por un período de tiempo. Una vez que se haya ejecutado el método Destroy (), el servidor web rechazará todas las solicitudes nuevas para la instancia de servlet. El método Destroy () sale y la instancia de servlet se puede recolectar basura.
4. Diagrama de flujo de Servlet analizando el cliente HTTP Solicitud:
1. El cliente web emite una solicitud HTTP al contenedor Servlet;
2. El contenedor de servlet analiza la solicitud HTTP web.
3. El contenedor de servlet crea un objeto httprequest, encapsulando la información de solicitud HTTP en este objeto;
4. El contenedor de servlet crea un objeto httpresponse;
5. Contenedor de servlet (si el servlet accionado no se crea en el inicio del servidor, primero cree una instancia de servlet y llame al método init () para inicializar el objeto) llame al método Servicio () del httpservlet y pase los parámetros de los objetos httprequest y httpponse como métodos de servicio al objeto httpservlet;
6. HTTPServlet llama a los métodos relevantes de HTTPRequest para obtener información de solicitud HTTP;
7. httpservlet llama a los métodos relevantes de httpponse para generar datos de respuesta;
8. El contenedor de servlet pasa el resultado de la respuesta httpservlet al cliente web.
El artículo anterior se basa en el principio de ejecución de Servlet y el ciclo de vida (análisis integral) es todo el contenido que comparto con usted. Espero que pueda darle una referencia y espero que pueda apoyar más a Wulin.com.