[JavaWeb] Dos configuraciones sobre la configuración del archivo Servlet Web.xml o usar la anotación @WebServlet y las reglas de configuración de urlPattern

En primer lugar, lo que debemos entender es que en la versión Servlet2.x, la configuración todavía está configurada en forma de web.xml Después de actualizar a Servlet3.x, se puede configurar basándose en anotaciones.

1. Configurar a través del archivo Web.xml

Formato de código:

    <!--注册Servlet-->
    <servlet>
    	<!--自定义,一般为类名-->
        <servlet-name></servlet-name>
        <!--servlet的类全名:package.类名-->
        <servlet-class></servlet-class>
    </servlet>
	<!--Servlet的请求路径-->
    <!--给Servlet提供(映射)一个可供客户端访问的URI-->
    <servlet-mapping>
    	<!--必须和servlet中的name相同-->
        <servlet-name></servlet-name>
        <!-- servlet的映射路径(访问serclet的名称) -->
        <url-pattern></url-pattern>
    </servlet-mapping>

Visualización de código:

inserte la descripción de la imagen aquí

Proceso de acceso:

①La ruta ingresada por el servlet a través de la barra de direcciones del navegador coincide con el valor de la etiqueta de patrón de URL en la etiqueta de mapeo de servlet.
② Use el valor de mapeo de url-pattern para encontrar el valor de servlet-name en la etiqueta de servlet-mapping y haga coincidir el valor de servlet-name en la etiqueta de servlet.
③ Después de encontrar el nombre del servlet en el servlet real a través de la relación de mapeo, busque la ruta completa en la carpeta src de la clase de servlet correspondiente en la etiqueta de clase de servlet en la etiqueta de servlet.
④Al llamar y ejecutar la clase de servlet correspondiente.
inserte la descripción de la imagen aquí

Aviso:

  • El valor de servlet-name en la etiqueta de asignación de servlet debe ser el mismo que el servlet-name en la etiqueta de servlet.
  • servlet-class es un nombre completo.
  • url-pattern es la dirección correspondiente que debe enviar la página web.

2. Use la anotación @WebServlet para configurar

La anotación es relativamente simple, solo escriba la anotación, complete el nombre y urlPatterns, name es el nombre de la clase, urlPatterns es la dirección correspondiente que debe enviar la página web, pero generalmente solo escribo urlPatterns.

Visualización de código:

import javax.servlet.annotation.WebServlet;

@WebServlet("/demo01")
public class demo01 extends HttpServlet {
    
    }

Aquí hay algunos atributos de anotación de @WebServlet:

inserte la descripción de la imagen aquí

Aviso:

  • No especifique metadata-complete="true" en el elemento raíz () del archivo Web.xml; si es metadata-complete="true" por defecto, modifique el atributo a "false".
  • Tanto el atributo value como el urlPatterns en @WebServlet se pueden usar para indicar la ruta de acceso del Servlet. Tanto value como urlPatterns están en forma de matrices, lo que significa que podemos asignar un servlet a múltiples rutas de acceso, pero value y urlPatterns no se pueden usar al mismo tiempo. Si value y urlPatterns se utilizan al mismo tiempo, el servlet no puede acceder a ellos.

extensión de configuración urlPattern

Después de escribir la clase Servlet, para poder acceder, debe configurar su ruta de acceso (urlPattern)

  • Un Servlet se puede configurar con múltiples URLPatterns
    inserte la descripción de la imagen aquí
package com.aDiao.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(urlPatterns = {
    
    "/demo04","/aDiao04"})
public class ServletDemo04 extends HttpServlet {
    
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        System.out.println("demo04 get...");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        doGet(req, resp);
    }
}

Se puede acceder a las dos direcciones "/demo04" y "/aDiao04" del código adjunto.

  • reglas de configuración de urlPattern
  1. coincidencia exacta
    inserte la descripción de la imagen aquí
package com.aDiao.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/user/demo05")
public class ServletDemo05 extends HttpServlet {
    
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        System.out.println("demo05 get...");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        doGet(req, resp);
    }
}

inserte la descripción de la imagen aquí

  1. coincidencia de directorio
    inserte la descripción de la imagen aquí
package com.aDiao.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/user/*")
public class ServletDemo06 extends HttpServlet {
    
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        System.out.println("demo06 get...");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        doGet(req, resp);
    }
}

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
Pensando:
(1) ¿Puede la ruta de acceso "/usuario" acceder al método doGet de ServletDemo06?
(2) ¿Puede la ruta de acceso "/usuario/a/b" acceder al método doGet de ServletDemo06?
(3) ¿Puede la ruta de acceso "/usuario/demo05" acceder al método doGet de ServletDemo06?
Respuesta: Sí, sí, no (el acceso es al método doGet en demo05), y podemos sacar la conclusión de que /* en /usuario/* representa cero o más niveles de directorios de acceso, y la prioridad de coincidencia exacta es mayor que el de las coincidencias de directorio.

  1. coincidencia de extensión
    inserte la descripción de la imagen aquí
package com.aDiao.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("*.demo07")
public class ServletDemo07 extends HttpServlet {
    
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        System.out.println("demo07 get...");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        doGet(req, resp);
    }
}

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
Nota:
(1) Si la configuración de la ruta no es una extensión, debe agregar / delante de la ruta, de lo contrario, se informará un error; (2
) Si la configuración de la ruta es *.do, entonces no puede agregar / en frente a *.do, de lo contrario, se informará un error.

  1. cualquier partido
    inserte la descripción de la imagen aquí
package com.aDiao.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/")
//@WebServlet("/*")
public class ServletDemo08 extends HttpServlet {
    
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        System.out.println("demo08 get...");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        doGet(req, resp);
    }
}

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
Nota: La diferencia entre / y /*:
(1) Cuando el Servlet en nuestro proyecto está configurado con "/", sobrescribirá el DefaultServlet en Tomcat, y este Servlet se usará cuando otros patrones de URL no coincidan;
( 2) Cuando "/*" está configurado en nuestro proyecto, significa que coincide con cualquier ruta de acceso;
(3) DefaultServlet se usa para procesar recursos estáticos. Si "/" está configurado, el valor predeterminado se sobrescribirá y se generará una solicitud estática. Los recursos activados no fueron al valor predeterminado, sino a la clase de servlet personalizada, lo que eventualmente provocó que los recursos estáticos fueran inaccesibles.

3. Comparemos las ventajas y desventajas de los dos

  • Configurar a través del archivo Web.xml

Ventajas: toda la información de configuración se desinstala en el archivo Web.xml y la ruta de asignación de cada ruta de clase de servlet se puede administrar de forma centralizada, lo cual es conveniente para la modificación y la búsqueda.
Desventajas: no es muy amigable para los "pacientes de cáncer perezosos", la cantidad de código es grande y engorrosa, y la legibilidad no es fuerte.

  • Configuración usando la anotación @WebServlet

Ventajas: La cantidad de código es pequeña y se puede usar directamente en la clase Servlet. Cada clase solo se enfoca en su propia lógica comercial y no interfiere entre sí.
Desventaja: Una clase se configura una por una.Si se usa una gran cantidad de anotaciones de servlet, es inconveniente buscar y modificar cuando hay demasiados archivos de clase de servlet.

Por favor, corríjame si estoy equivocado.
inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/aDiaoYa_/article/details/126511023
Recomendado
Clasificación