IntelliJ IDEA + jquery Easyui + MSSQLSERVER + Servlet actual combat 5, real combat 4 complementario JavaWeb servlet explicación detallada (repost)

IntelliJ IDEA + jquery Easyui + MSSQLSERVER + Servlet actual combat 5, real combat 4 complementario JavaWeb servlet explicación detallada (repost)

Actual combat 4, hablé demasiado rápido, puede ser difícil de entender para todos, así que volví este artículo.

En general, me gusta aprender sobre un punto de conocimiento detallado, basado en las notas dadas por el profesor, agregar mi propio entendimiento y algunos ejemplos, y luego escribirlo en el blog para profundizar la memoria y facilitar su búsqueda y lectura en el futuro. Pero Servlet parece ser realmente difícil, aprendí un poco difícil. Hoy vi que el monitor volvió a publicar este blog en el grupo, sentí que el análisis fue completo, así que primero lo recopilé y lo compartí con todos.

-------------------------------------------------- -------------------------------------------------- ---------

 

1. ¿Qué es un servlet?

  El proceso de procesar la solicitud y enviar la respuesta se completa con un programa llamado Servlet, y Servlet es algo derivado de la realización de páginas dinámicas. El requisito previo para comprender esto es conocer algunas cosas sobre el protocolo http y conocer el modo B / S (navegador / servidor).

  B / S: navegador / servidor. El navegador accede al servidor a través de la URL. Por ejemplo, para visitar Baidu e ingresar www.baidu.com en el navegador, el navegador mostrará la página de inicio de Baidu en este momento. Entonces, ¿cuáles son los procesos y pasos específicos? Esto buscaría las solicitudes y respuestas http del

                  

    Solicitud, respuesta: Los dos contenidos específicos deben conocerse a través del enlace proporcionado

 

En segundo lugar, la relación entre tomcat y servlet

  Tomcat es un servidor de aplicaciones web y un contenedor de Servlet / JSP. Tomcat es un contenedor de Servlet, que se encarga de procesar las solicitudes del cliente, transmitir la solicitud al Servlet y transmitir la respuesta del Servlet al cliente. Servlet es una especie de ejecución en un lenguaje Java que admite Componentes en el servidor El uso más común de Servlets es ampliar la funcionalidad de un servidor Web Java, proporcionando una alternativa CGI muy segura, portátil y fácil de usar.

  A partir de la solicitud y respuesta en el protocolo http, se puede saber que la solicitud enviada por el navegador es un texto de solicitud, y lo que recibe el navegador también debe ser un texto de respuesta. Pero en la imagen de arriba, no sé cómo cambiarlo, solo sé que la solicitud enviada por el navegador es la solicitud, y usamos respuesta para responder. Ignorando los detalles, explorémoslo ahora.

              

  ①: Tomcat recibe y analiza el texto de la solicitud http, y luego lo encapsula en un objeto de solicitud de tipo HttpServletRequest. Toda la lectura de datos del encabezado HTTP se puede consultar llamando al método correspondiente en el objeto de solicitud.

  ②: Tomcat también encapsulará la información de respuesta como un objeto de respuesta de tipo HttpServletResponse. Al establecer el atributo de respuesta, puede controlar el contenido que se enviará al navegador y luego entregar la respuesta a Tomcat, y Tomcat la cambiará al formato de texto de respuesta. Enviar al navegador

 

  La API de Java Servlet es la interfaz entre el contenedor Servlet (tomcat) y el servlet. Define varios métodos de serlvet y también define las clases de objetos que el contenedor Servlet transmite al Servlet. Las más importantes son ServletRequest y ServletResponse. Entonces, cuando escribimos un servlet, necesitamos implementar la interfaz de Servlet y operar de acuerdo con sus especificaciones.

 

Tres, escribe Servlet

  En la sección anterior, ya sabemos qué es un servlet y por qué necesitamos un servlet (para lograr páginas web dinámicas en lugar de mostrar páginas web estáticas, puede consultar los detalles de Baidu), ¿la relación entre tomcat y servlet? Y otras cuestiones. Ahora escribamos un servlet manualmente.

  3.1 Escribir servlet manualmente.

    1. Cree un MyServlet para heredar de HttpServlet, reescriba los métodos doGet y doPost, es decir, vea si la solicitud es get o post, y luego use diferentes métodos de procesamiento para procesar la solicitud.

            

    2. ¿Por qué necesito configurar MyServlet en web.xml? Deje que la solicitud enviada por el navegador sepa a qué servlet alcanzar, es decir, deje que tomcat encuentre el servlet correspondiente para que lo use la solicitud encapsulada.

  Configure cuatro cosas.

                

   Después de la configuración, ¿cómo encuentra el navegador el servlet correspondiente a través de la información que configuramos?

                

  Siga los pasos, primero el navegador encuentra el patrón de URL en web.xml a través de http: // localhost: 8080 / test01 / MyServlet. Este es el primer paso. Después de que el patrón de URL coincida, encontrará el servlet del segundo paso El nombre MyServlet, si conoce el nombre, puede encontrar el tercer paso a través del nombre del servlet, y cuando llegue al tercer paso, puede conocer la ubicación del servlet. Luego, vaya a él para encontrar el método de procesamiento correspondiente para procesar.

   3. Experimente para verificar que la configuración anterior sea correcta.

       

            

  3.2, use el asistente para crear un nuevo MyServlet

    Esto es relativamente simple, web.xml no necesita ser configurado manualmente por nosotros, la herramienta directamente nos configura automáticamente

     1. Haga clic derecho en el proyecto, hay una opción para crear directamente un nuevo servlet en la nueva opción

     2. Configure la información en la clase MyServlet

      

       3. Configure la información del servlet en web.xml.

        

     4. Verifique el código y web.xml en la clase MyServle01 La configuración es la misma que la configuración manual, pero se genera mediante una interfaz gráfica que nos permite crear un servlet de manera más conveniente.

 

   3.3, explica el principio de creación de servlet en detalle

      1. ¿Cuál es el ciclo de vida de un servlet?

      2. ¿Por qué el servlet creado hereda de httpServlet en lugar de implementar directamente la interfaz de Servlet?

      3. En el ciclo de vida del servlet se puede observar que se ejecuta el método de servicio, ¿por qué solo necesitamos escribir los métodos doGet y doPost?

   ¿Todos deberíamos saber cómo configurar y usar servlet después de esta serie de preguntas? Las preguntas anteriores se responden una por una.

      1. ¿Cuál es el ciclo de vida de un servlet?

        Cuando se inicia el servidor (load-on-startup = 1 está configurado en web.xml, el valor predeterminado es 0) o cuando se solicita el servlet por primera vez, se inicializará un objeto Servlet, es decir, se ejecutará el método de inicialización init (ServletConfig conf)

        El objeto servlet para procesar todas las solicitudes de los clientes, ejecutado en el método de servicio (ServletRequest req, ServletResponse res)

        Finalmente, cuando el servidor se apaga, el objeto servlet será destruido y el método destroy () será ejecutado.

             

    2. ¿Por qué el servlet creado hereda de httpServlet en lugar de implementar directamente la interfaz de Servlet?

    3. En el ciclo de vida del servlet se puede observar que se ejecuta el método de servicio, ¿por qué solo necesitamos escribir los métodos doGet y doPost?

     Vea el código fuente, la estructura de herencia de httpServlet.

     httpServlet hereda GenericServlet. Cualquiera que sepa debería saber de inmediato, ¿cuál es el papel de GenericServlet (Generic Servlet)? Presumiblemente, el método de implementación de la interfaz Servlet simplificará los pasos de escritura del servlet. Los detalles se explican a continuación

   

     La estructura de herencia de GenericServlet implementa la interfaz Servlet y la interfaz ServletConfig,

        

     Contenido de la interfaz de servlet

      

  Desde aquí, podemos ver que los tres métodos clave del ciclo de vida de Servlet son init, service y destroy. Hay otros dos métodos, un método getServletConfig () para obtener el objeto ServletConfig, el objeto ServletConfig puede obtener información del Servlet, ServletName, ServletContext, InitParameter, InitParameterNames, puede saberlo mirando la interfaz ServletConfig

   Contenido de la interfaz ServletConfig

       

   Entre ellos, el objeto ServletContext es un objeto de contexto de servlet, que tiene muchas funciones, una vez que se obtiene el objeto ServletContext, se puede obtener la mayor parte de la información que necesitamos, como obtener la ruta del servlet y otros métodos.

   En este punto, conoce el contenido y el rol de la interfaz de Servlet En resumen, los tres métodos de ciclo de vida se utilizan para obtener ServletConfig, y ServletContext se puede obtener a través de ServletConfig. Después de que GenericServlet implementa la interfaz de Servlet, significa que podemos heredar directamente GenericServlet y podemos usar los métodos en la interfaz de Servlet que presentamos anteriormente. Puede obtener ServletConfig o ServletContext, pero eso es demasiado problema. ServletContext no se puede obtener directamente, por lo que GenericServlet implementa la interfaz ServletConfig además de la interfaz Servlet, de modo que ServletContext se puede obtener directamente.

   Explicación detallada del contenido de la clase GenericServlet

  

  Mirando la imagen de arriba, el cuadro rojo es el método que implementa las interfaces Servlet y ServletConfig. Hay 9 métodos, lo cual es normal, pero podemos encontrar que hay dos métodos init, uno con el parámetro ServletConfig y otro con o sin ¿Por qué el método de participación está diseñado así? Aquí necesita saber qué se hace, veamos qué hacen estos dos métodos respectivamente.

  init (configuración de ServletConfig)

                      

  en eso()

                      

  Una configuración de variable miembro

                      

  getServletConfig ()

                      

  A través de estos métodos para explicar juntos, primero mire el método init (ServletConfig config), porque solo init (ServletConfig config) con el objeto ServletConfig, para facilitar el uso directo del objeto ServletConfig en otros lugares, no solo limitado a init (ServletConfig config), así que cree una configuración de variable miembro privada, asígnela a config en el método init (ServletConfig config) y luego obtenga el objeto ServletConfig a través del método getServletConfig (). Esto es comprensible, pero en En init (ServletConfig config), línea 158, también se llama a un método init (), y este método init () está vacío. ¿Ha leído algo? ¿Por qué? Esta razón es para evitar una cosa. Cuando necesitamos hacer algo más en el método init, el método que pensamos es heredar GenericServlet y reescribir el método init (ServletConfig config). Esta dependencia destruirá la clase GenericServlet original El código escrito en init (ServletConfig config), es decir, la configuración de la variable miembro en la clase GenericServlet siempre será nula y no se puede asignar, porque se sobrescribe, no se ejecutará en el método init (ServletConfig config) en GenericServlet Código. Para asignar un valor, debe llamar al método init (ServletConfig config) de la clase principal en el método init (ServletConfig config) anulado, que es super. init (ServletConfig config), esto es muy inconveniente. Me temo que a veces me olvido de escribir este código, así que agrego un método init () a la clase GenericServlet. En el futuro, necesitará inicializar otros datos en el método init. Solo necesita reescribir el método init () en lugar de sobrescribir el método init (ServletConfig config). Este diseño es mucho mejor y no tiene que preocuparse por el contenido de init (ServletConfig config). No hay otros problemas.

  servicio (ServletRequest req, ServletResponse res)

                      

  Un método abstracto, que indica que el contenido no está implementado en la clase GenericServlet, entonces lo que pensamos es que debe haber una capa en él, es decir, hay una subclase heredando para implementar este método, si escribimos nuestro propio Servlet Al heredar GenericServlet, debe escribir su propio método de servicio, no es tan agotador, y podemos ver que los parámetros en el método de servicio siguen siendo ServletRequest y ServletResponse. No está vinculado a objetos relacionados con http, por lo que continuaremos buscando a continuación.

  Clase HttpServlet detallada

  Heredada la clase GenericServlet, a través de nuestra especulación anterior, la función principal de esta clase debe ser implementar varios detalles y diseño del método de servicio. Y a través del nombre de la clase, puede saber que la clase está vinculada a http.

   

  Preste atención al método service (HttpServletRequest req, HttpServletResponse resp) y al método service (ServletRequest req, ServletResponse res).

  servicio (petición de ServletRequest, res de ServletResponse)

                        

  Una cosa que se puede hacer en este método es forzar los objetos ServletRequest y ServletResponse en los objetos HttpServletRequest y HttpServletResponse. ¿Por qué es posible girar así?

  Primero, necesitamos saber qué tipo de req y res son. Al imprimir System.out.println (req), podemos saber que el tipo real de req es org.apache.catalina.connector.RequestFacade                         

Código fuente en Tomcat.

                        

                          

  De la figura, podemos saber que la estructura de herencia de req: RequestFacade, httpServletRequest, ServletRequest, sabemos que req en sí es ServletRequest, luego, desde la perspectiva de la estructura de herencia, también se puede considerar como HttpServletRequest o ServletRequest, por lo que se ve obligado a ser HttpRequest Sí, si no lo entiende, permítame darle un ejemplo, ArrayList, List, Object, Object obj = new ArrayList (); List list = new ArrayList (); Un objeto ArrayList puede considerarse como un objeto List o como un Objeto Objeto, ¿se puede llamar obj un objeto List ahora? La respuesta es sí, porque obj es un objeto ArrayList. Como es un objeto ArrayList, se puede considerar como un objeto List. De la misma manera, RequestFacade corresponde a ArrayList, httpServleRequest corresponde a List y ServletRequest corresponde a Object.

  Después de convertir a los objetos httpServletRequest y HttpServletResponse, llame al método de servicio (HttpServletRequest req, HttpServletResponse resp).

  servicio (HttpServletRequest req, HttpServletResponse resp)

  Este método es para determinar el método de solicitud proveniente del navegador, cada método de procesamiento es diferente, usualmente usamos get, post, y la forma en que procesamos puede tener mucho contenido, por lo que en este método, Los otros cinco métodos de solicitud, como get y post, se extraen en un solo método, y luego, cuando necesitamos escribir un servlet, podemos anular directamente el método doGet o doPost en lugar de anular el método de servicio, que es más específico. Así que aquí volvemos a la situación en la que escribimos el servlet anterior, heredando httpServlet, y siempre que reescribamos dos métodos, uno doGet y otro doPost, el método de servicio realmente llamará a uno de estos dos métodos (consulte el método de solicitud). Entonces responde a la pregunta 3 que hicimos al principio.  

                     

Cuatro, algunos objetos clave. ServletConfig, ServletContext, solicitud, respuesta

   Explique las cuatro categorías principales, objeto ServletConfig, objeto ServletContext, objeto de solicitud, objeto de respuesta

Objeto ServletConfig

   Método de obtención: getServletConfig (); 

   Función: como se mencionó anteriormente, se pueden obtener cuatro cosas,

   

    getServletName (); // Obtiene el nombre del servlet, que es el nombre del servlet que configuramos en web.xml

    getServletContext (); // Obtenga el objeto ServletContext, la función del objeto se explica a continuación

    getInitParameter (String); // Obtiene el valor del parámetro de inicialización en el servlet. Preste atención a la distinción entre los parámetros de inicialización globales. Esto obtiene solo los parámetros de inicialización bajo el servlet

        

     getInitParameterNames (); // Obtener los nombres de todos los parámetros de inicialización en el Servlet, es decir, el valor de la clave. Puede encontrar el valor de cada parámetro de inicialización a través del valor de la clave. Tenga en cuenta que se devuelve el tipo de enumeración

                

                

 

  Nota: En el proceso de código fuente que analizamos anteriormente, sabemos que, de hecho, no necesita obtener ServletConfig primero, y luego puede usar sus métodos directamente para obtener varios parámetros, como ServletConfig (). GetServletName () que usamos anteriormente; Se puede escribir directamente como getServletName (); en lugar de obtener ServletConfig (); primero. La razón es que GenericServlet ya nos ha ayudado a obtener estos datos, solo necesitamos obtenerlos directamente.

 

    Objeto ServletContext

     Métodos de obtención: getServletContext (); 、 getServletConfig (). GetServletContext (); // La diferencia entre estos dos métodos de adquisición es la misma que la explicación anterior. El primero es tomarlo directamente. GetServletConfig () se ha utilizado para nosotros en GenericServlet. getServletContext (); obtuvo ServletContext. Solo necesitamos obtenerlo directamente. El segundo tipo es equivalente a obtenerlo nosotros mismos. Las dos lecturas son iguales.

     Función: Tomcat crea una instancia de ServletContext para cada proyecto web, tomcat se crea al inicio, se destruye cuando el servidor se apaga, comparte datos en un proyecto web, administra los recursos del proyecto web, configura información pública para toda la web, etc. En términos simples, Solo un proyecto web, hay una instancia de ServletContext, y cada Servlet puede acceder a él.

     1. Comparta datos en proyectos web, getAttribute (nombre de cadena), setAttribute (nombre de cadena, objeto obj), removeAttribute (nombre de cadena)

      setAttribute (String name, Object obj) almacena contenido dentro del alcance del proyecto web, para que todos los servlets del proyecto web puedan acceder

      getAttribute (String name) Obtenga el contenido especificando el nombre

      removeAttribute (String name) elimina el contenido especificando el nombre   

        

          

         

     2. El parámetro de inicialización de todo el proyecto web // Este es el parámetro de inicialización global, y el valor de inicialización se puede obtener en cada Servlet

      getInitPatameter (String name) // Obtenga el valor de inicialización especificando el nombre

      getInitParameterNames () // Obtiene el tipo de enumeración

         web.xml configura la inicialización de todo el proyecto web

       

       

       

       3. Obtén recursos para proyectos web

       3.1 Obtenga la ruta del recurso especificado en el proyecto web: getServletContext (). GetRealPath ("/ WEB-INF / web.xml")

       

                    

       3.2 Obtenga el contenido del recurso especificado en el proyecto web y devuelva el flujo de entrada de bytes. InputStream getResourceAsStream (ruta java.lang.String)

      Conocimientos previos: necesidad de comprender el flujo. Si no lo sabe, puede consultar el artículo sobre el resumen de la transmisión de IO

                    

       Parte de la captura de pantalla de salida

                    

 

            4. getResourcePaths (java.lang.String path) especifica todos los contenidos bajo la ruta.

                    

   

                    

     5 Existen muchos otros métodos. Solo estos se utilizan temporalmente. Si necesita utilizarlo más tarde, consulte el código fuente y la API.

      objeto de solicitud

       Sabemos que la solicitud es un objeto que encapsula el texto de la solicitud, por lo que todo el contenido del texto de la solicitud, el encabezado de la solicitud, el cuerpo de la solicitud y la línea de la solicitud se pueden obtener a través de la solicitud.

                

     1. Obtenga el contenido de la línea de solicitud.

    

        

        

     2 Obtener el encabezado de la solicitud

       Baidu aleatoriamente una cosa, y luego verifique el encabezado de la solicitud, incluido el siguiente contenido, para comprender un poco.

                

        String getHeader (java.lang.String name) Obtiene el contenido del encabezado especificado String 【】

                  

                  

                long getDateHeader (java.lang.String name) Obtiene el contenido del encabezado especificado Fecha

                int getIntHeader (java.lang.String name) obtiene el contenido del encabezado especificado int

                Enumeración getHeaders (java.lang.String name) obtiene todo el contenido del nombre especificado

            3 Adquisición del cuerpo de la solicitud-adquisición de los parámetros de la solicitud

               Hay dos tipos, una solicitud de obtención y una solicitud de publicación.

               Obtenga los parámetros de la solicitud: http: // localhost: 8080 / test01 / MyServlet? Username = jack & password = 1234

               publicar 请求 参数: <método de formulario = "publicación"> <tipo de entrada = "texto" nombre = "nombre de usuario">

                String request.getParameter (String) Obtiene el nombre especificado, un valor de parámetro de solicitud.

                String [] request.getParameterValues ​​(String) Obtiene el nombre especificado y todos los valores de los parámetros de solicitud. Por ejemplo: casilla de verificación, seleccionar, etc.

                Asigne <String, String []> request.getParameterMap () para obtener todos los parámetros de la solicitud  

    

            4 reenvío de solicitudes

                request.getRequestDispatcher (String path) .forward (request, response); // ruta: la página a ser redirigida después del reenvío, aquí independientemente de si comienza con "/", comienza con la raíz del proyecto web, porque se trata de un reenvío de solicitud, solicitud El reenvío solo está limitado al uso bajo el mismo proyecto web, por lo que aquí siempre se ha iniciado desde la raíz del proyecto web,

                raíz del proyecto web:

                    Desarrollo: G: \ Workspaces \ test01 \ WebRoot \ ..

                    Tiempo de ejecución: D: \ java \ tomcat \ apache-tomcat-7.0.53 \ webapps \ test01 \ ..

                 Raíz del sitio web:

                    Tiempo de ejecución: D: \ java \ tomcat \ apache-tomcat-7.0.53 \ webapps \ ..

                Se puede ver desde aquí que la raíz del proyecto web comienza desde el nombre del proyecto web, por lo que cuando solicitamos el reenvío, solo necesitamos escribir la ruta a la que se debe acceder después del nombre del proyecto.

                Características: La url en el navegador no cambiará, es decir, el navegador no sabe lo que ha hecho el servidor. El servidor nos ayuda a saltar a la página y la página reenviada puede continuar usando la solicitud original porque es la solicitud original. Por tanto, se pueden seguir obteniendo los atributos del campo de solicitud.

                

      objeto de respuesta

          

        Un método de uso común: response.setHeader (java.lang.String name, java.lang.String value) Establece el encabezado especificado, que generalmente se usa.

             Por ejemplo: la configuración se actualiza automáticamente cada 3 segundos,

              response.setHeader ("Actualizar", 3);

              

              

              De esta manera, puede ver la cantidad de segundos en el tiempo actual y encontrará que la página se actualizará automáticamente cada tres segundos.

        La más importante de ellas es la redirección. Otras operaciones se encapsulan en el objeto de respuesta. El foco está en la redirección.

          Redirigir (salto de página)

            Método 1: solución manual

                response.setStatus (302); // El código de estado 302 representa la redirección

                response.setHeader ("ubicación", "http://www.baidu.com");

            Método 2: utilice el encapsulado a través de response.sendRedirect ("http://www.baidu.com");

          Características: el servidor le dice al navegador que salte a la página a la que el navegador salta activamente. El navegador lo sabe y la URL en la barra de direcciones del navegador cambiará. El navegador reinicia una solicitud a otra página, por lo que La solicitud se reinicia, lo que es diferente del reenvío de solicitudes.

            Nota: response.sendRedirect (ruta); //

            El primer tipo: response.sendRedirect ("/ test01 / MyServlet01"); // Usó "/" al principio, lo que indica que comienza desde la raíz del sitio web, por lo que debe escribir test01 / MyServlet01

            El segundo tipo: response.sendRedirect ("MyServlet01"); // No comienza con "/", lo que indica que comienza desde la raíz del proyecto web, por lo que no es necesario escribir test01.

            La redirección no tiene limitaciones. Puede redirigir cualquier ruta en un proyecto web, o puede acceder a rutas en otros proyectos web, y usar "/" para distinguirla. Si usa "/" al principio, significa que quiero Se reinicia el posicionamiento. En lugar de visitar el proyecto web en este momento, escriba el nombre del proyecto usted mismo. Si no comienza con "/", entonces sabe que está accediendo al servlet en el proyecto web en este momento y puede omitir el nombre del proyecto. Así es como se distingue.

 

 

Cinco, resumen

      Este capítulo es largo, pero aclara muchos puntos de conocimiento.

          1. ¿Qué es un servlet? ¿Cómo escribir un servlet?

          2. Analicé parte del código fuente del servlet, y aprendí algunos de los ingeniosos diseños. Por ejemplo, el ciclo de vida del servlet se puede ver al escribir el servlet, pero bajo su diseño, solo nos enfocamos en los métodos doGet y doPost. ¿Por qué se puede hacer esto? ¿Qué? Se puede conocer por el código fuente.

          3. El ciclo de vida del servlet, configuración web.xml

          4. Explicación detallada del objeto ServletConfig, el objeto ServletContext, el objeto de solicitud y el objeto de respuesta en el servlet. Incluidos algunos de los métodos más utilizados.

          5. El próximo artículo explicará cómo resolver el confuso problema chino de solicitud y respuesta.

            

Supongo que te gusta

Origin blog.csdn.net/fanxiaoduo1/article/details/106587043
Recomendado
Clasificación