1. Descripción general del servlet
1. Tecnología dinámica de desarrollo de recursos web proporcionados por Sun Company. La esencia es el applet Java anterior, que requiere que este applet implementa la interfaz Servlet para que el servidor pueda llamarlo.
2. Dos pasos para desarrollar un servlet
*Experimento: inicio rápido de servlet
(1) Paso 1: Escriba un programa Java para implementar la interfaz Servlet (aquí hereda directamente la clase de implementación predeterminada GenericServlet)
paquete cn.itheeima; import java.io.*; import javax.servlet.*; public class FirstServlet extiende GenericServlet {public void Service (ServLetRequest Req, ServletResponse Res) lanza ServletException, java.io.ioexception {res.getutputSteam ().(2) Además de colocar la clase compilada con paquetes en Web-INF/classes, también debe configurar el servlet de registro web.xml de la aplicación web.
<Servlet> <Servlet-name> FirstServlet </Servlet-Name> <Servlet-Class> cn.itheima.firstservlet </servlet-class> </servlet> <ervlet-mapping> <ervlet-name> FirstServlet </ servlet-name> <url-patter-patter-pattern>/firstServlet </ url-pattern> </servlet-mapping>
3. Desarrollar servlets con myeclipse
2. Descripción detallada del servlet
1. Ciclo de vida: cuando nace una cosa y muere, lo que inevitablemente hará durante su existencia. Armarlo es el ciclo de declaración de la cosa.
2. Ciclo de vida del servlet: Generalmente, cuando se accede al servlet por primera vez, se crea un objeto en la memoria, y el método init () se llama inmediatamente después de la creación para inicializarse. Para cada solicitud, el método Servicio (REQ, Res) se utiliza para procesar la solicitud. En este momento, la información de solicitud se encapsulará con el objeto de solicitud, y el objeto de respuesta (originalmente vacío) representa el mensaje de respuesta, que se pasa al método de servicio para su uso. Cuando se procesa el método de servicio, el servidor de retorno del servidor organiza un mensaje de respuesta que se devolverá al navegador en función de la información de la respuesta. El servlet no se destruye después de completar la respuesta y permanece en la memoria y espera la próxima solicitud. Hasta que el servidor esté cerrado o se elimine la aplicación web del host virtual, el objeto Servlet se destruye y el método Destroy () se llama antes de que se destruya para hacer algo después.
3. Estructura de herencia de la interfaz de servlet
Interfaz Servlet: define el método que debe tener un servlet, y todos los servlets deben implementar esta interfaz directa o indirectamente.
|
| ---- GenericServlet: la implementación predeterminada de la interfaz Servlet, un servlet general, esta es una clase abstracta, la mayoría de los métodos se implementan de forma predeterminada, solo el método de servicio es un método abstracto que debe ser implementado por el propio heredero.
|
| ----- httpservlet: un servlet optimizado para el protocolo HTTP se hereda de la clase GenericServlet, y se implementa el método de servicio de servicio. La implementación predeterminada determina el método de solicitud de la solicitud y llama a diferentes métodos Doxxx () de acuerdo con los diferentes métodos de solicitud. Por lo general, podemos heredar directamente httpservlet
4. Cosas a tener en cuenta al registrar servlets en Web.xml
4.1 Registre un servlet usando la etiqueta <Servlet> <Servlet-Mapping>
<Servlet> <Servlet-name> FirstServlet </servlet-name> <ervlet-class> cn.itheima.firstservlet </servlet-class>
Nota: Lo que desea aquí es el nombre de clase completa de un servlet, no la ruta del archivo que contiene. Java o extensiones de clase.
</servlet> <ervlet-mapping> <servlet-name> FirstServlet </servlet-name> <url-pattern>/firstservlet </sl-Pattern> </servlet-mapping>
4.2 Un <servlet> puede corresponder a múltiples <servlet mapping>
4.3 Puede usar el personaje *Match para configurar <Serlvet Mapping>, pero tenga cuidado de que debe ser una ruta que comienza con *.do o / que termina con / *.
~ Debido a la introducción de los caracteres de la coincidencia, es posible que una ruta virtual corresponda a múltiples mapas de servlet. En este momento, cuál es el más similar al que está buscando servlet, y el nivel *.do es el más bajo.
4.4 Puede configurar el <load-on-startup> sub-label para <servlet>, especificando que el servlet está cargado con el inicio del servidor, y los valores configurados especifican el orden de inicio
Servlet> <Servlet-name> Invoker </servlet-name> <ervlet-class> org.apache.catalina.servlets.invokerservlet </servlet-class> <load-on-shartup> 2 </load-on-startup> </servlet>
4.5 Servlet predeterminado: si la ruta de acceso externo de un servlet se establece en /, el servlet es un servlet predeterminado y otros servlets no procesan las solicitudes.
~ El servlet predeterminado está configurado en conf/web.xml, y el acceso a los recursos estáticos y la salida de las páginas de error son manejados por este servlet predeterminado. Si escribimos un servlet predeterminado nosotros mismos para sobrescribir el servlet predeterminado en Web.xml de DAD, hará que los recursos web estáticos sean inaccesibles. Por lo tanto, no se recomienda la configuración.
4.6 Problemas de seguridad de hilo de servlet
4.6.1 Debido a que generalmente, un servlet tiene solo una instancia en la memoria para procesar la solicitud, cuando se envían múltiples solicitudes, múltiples subprocesos funcionarán el objeto Servlet, lo que puede conducir a problemas de seguridad de los subprocesos.
(1) Puede haber problemas de seguridad de hilos con las variables miembros de Servlvet
*Experimento: Defina una variable miembro inti = 0; Realice la operación I ++ en el método Doxxx () y la salida I valore al cliente. En este momento, los problemas de seguridad del hilo pueden ser causados por retraso.
(2) Cuando Servet opera archivos de recursos, varios subprocesos operan el mismo archivo y causan problemas de seguridad de los subprocesos
*Experimento: la solicitud viene con un parámetro, el servlet escribe el parámetro de solicitud en un archivo, luego lee el archivo e imprime el valor de lectura al cliente. Puede haber problemas de seguridad de hilos
4.6.2 Solución
(1) Use bloques de código sincrónicos para resolver el problema. La desventaja es que el bloque de código sincrónico solo puede procesar una solicitud al mismo tiempo, lo cual es muy ineficiente, por lo que el bloque de código sincrónico solo necesita contener un código central que cause problemas de seguridad de subprocesos.
(2) Implemente la interfaz SinglethreadModel para este servlet. Esta es una interfaz de etiqueta. El servlet marcado guardará un grupo de servlet en la memoria. Si llega un hilo y no hay un procesamiento de objetos de servlet en la piscina, se creará uno nuevo. Si hay servlets gratuitos en la piscina, úselos directamente. Esto realmente no resuelve problemas de seguridad de hilos. Esta interfaz ha sido abandonada.
(3) Ambas soluciones no son perfectas, así que trate de no aparecer en las variables miembros en el servlet.
3. ServletConfig
1. Objetos que representan la configuración de servlets, que se pueden configurar en <Servlet> en Web.xml
<Servlet> <Servlet-name> Demo5Servlet </Servlet-Name> <ervlet-class> cn.itheima.demo5servlet </servlet-class> <init-param> <amamname> data1 </amamname> <amam-value> value1 </amarr-value> </ithparam> </ervlet>
Luego use esto.getServletConfig () en el servlet para obtener el objeto ServletConfig. Este objeto proporciona métodos getInitParameter () y getInitParamTernames (), que pueden atravesar los elementos de configuración en la configuración.
Si no desea escribir contenido muerto en el servlet, puede configurarlo aquí.
4. ServletContext
1. El objeto que representa la aplicación web actual.
2. Utilizado como objeto de dominio, transfiera datos entre diferentes servlets, y su alcance es toda la aplicación web.
Lifecycle: cree un objeto ServletContext que represente toda la aplicación web cuando la aplicación web se carga en el contenedor. Cuando el servidor está cerrado o se elimina la aplicación web del contenedor, se destruye el objeto ServletContext.
~ Dominio: un dominio se entiende como un cuadro, donde se pueden colocar datos. Dado que un dominio se llama dominio, tiene un rango visible. Los datos en este dominio se pueden operar dentro de este rango. Tal objeto se llama objeto de dominio.
3. En Web.xml, puede configurar los parámetros de inicialización de toda la aplicación web y usar ServletContext para obtener
<cuentute-param> <amamname> param1 </param-name> <amam-value> pValue1 </amam-value> </text-param> this.getServletContext (). getInitParameter ("param1") this.getServletContext (). GetInitParameternames ()4. Reenvío entre diferentes servlets
this.getServletContext ().
Una vez completada la ejecución del método, el servicio volverá al servidor y el servidor llamará al servlet de destino, donde se recreará la solicitud y los datos de la solicitud anterior se copiarán en él.
5. Lea los archivos de recursos
5.1 Dado que la ruta relativa es el directorio iniciado por la máquina virtual Java de forma predeterminada, escribiremos directamente la ruta relativa en relación con el directorio Tomcat/bin, por lo que no podemos obtener los recursos. Si se escribe como un camino absoluto, el camino absoluto es incorrecto cuando el proyecto se publica a otro entorno.
5.2 Para resolver este problema, ServletContext proporciona este.getServletContext (). GetRealPath ("/1.Properties"), que proporciona una ruta virtual al recurso y devolverá la ruta real del recurso en el entorno actual. this.getServletContext (). GetResourceasStream ("/1.Properties"), que devuelve la ruta virtual de un recurso a la secuencia de la ruta real del recurso.
5.3 Al obtener archivos de recursos en no servicio, no se utiliza el objeto ServletContext, y solo se pueden usar cargadores de clase en este momento.
ClassLoader.getResourceasstream ("../../ 1.Properties"), este método usa el cargador de clases para cargar recursos directamente en la memoria, que tiene problemas con los retrasos de actualización, y si el archivo es demasiado grande, toma demasiada memoria.
ClassLoader.getResource ("../ 1.Properties"). getPath () Devuelve directamente la ruta real del recurso, sin el problema del retraso de actualización.
Resumir
Lo anterior es todo el contenido de este artículo sobre la discusión brevemente de la base técnica del desarrollo de servlet, y espero que sea útil para todos. Los amigos interesados pueden continuar referiéndose a este sitio:
Análisis básico de la tecnología de sesión de servlet
Además de otros temas relacionados en este sitio web, si hay alguna deficiencia, deje un mensaje para señalarlo. ¡Gracias amigos por su apoyo para este sitio!