Notas de estudio: Programador Dark Horse SpringMVC

Directorio de artículos

1. Información general

Resumen de notas:

  • Significado: SpringMVC: Spring MVC es un módulo en Spring Framework para crear aplicaciones web basadas en Java . SpringMVC es una tecnología de marco de capa de presentación y SpringMVC se utiliza para desarrollar funciones de capa de presentación .
  • MVC: Patrón de diseño que divide una aplicación en tres componentes principales: Modelo , Vista y Controlador .
  • Características:
    1. ligero
    2. bajo acoplamiento
    3. Altamente personalizable
    4. Fácil de probar
    5. Integrar otras tecnologías
    6. Soporte RESTful

1.1 Significado

​ Spring MVC es un módulo en Spring Framework para crear aplicaciones web basadas en Java. Proporciona un método de desarrollo basado en el patrón de diseño MVC (Modelo-Vista-Controlador) para ayudar a los desarrolladores a crear aplicaciones web flexibles y escalables.

Spring MVC procesa solicitudes web enviando solicitudes y respuestas a los procesadores correspondientes (Controladores) y presenta los resultados del procesamiento al usuario. Adopta un diseño débilmente acoplado, lo que permite a los desarrolladores separar la lógica empresarial y la interfaz de usuario de la aplicación, lo que proporciona una mejor organización y capacidad de mantenimiento del código.

imagen-20230814221014724

ilustrar:

  • SpringMVC es un marco web ligero basado en Java que implementa el modelo MVC.

  • ventaja

    • Fácil de usar y cómodo de desarrollar (en comparación con Servlet)
    • Fuerte flexibilidad
  • SpringMVC, desarrollo de Servlet que reemplaza la capa de presentación del servidor back-end

imagen-20230527102146297

ilustrar:

El método de presentación de SpringMVC es más breve que el desarrollo de Servlet

Patrón de diseño 1.2MVC

imagen-20230814102502858

MVC es un patrón de diseño de software que divide una aplicación en tres componentes principales: modelo (Modelo), vista (View) y controlador (Controller). El objetivo de este patrón es separar la lógica, los datos y la presentación de la aplicación para mejorar la capacidad de mantenimiento , la reutilización y la flexibilidad del código .

  • Modelo (modelo): el modelo representa los datos y la lógica empresarial de la aplicación . Se encarga de leer, almacenar, validar datos y manejar reglas comerciales. El modelo no interactúa directamente con la vista, sino que pasa datos a través del controlador.
  • Ver (View): La vista se encarga de mostrar los datos del modelo al usuario. Suele formar parte de la interfaz de usuario, que puede ser una página web, una interfaz gráfica, una interfaz de línea de comandos, etc. La vista recibe datos del controlador y los presenta al usuario.
  • Controlador: el controlador maneja la solicitud del usuario y actualiza el modelo y la vista en consecuencia . Recibe información del usuario (como hacer clic en un botón, enviar un formulario, etc.), llama a la lógica del modelo apropiado según la entrada para actualizar los datos y envía los datos actualizados a la vista para su visualización.

La idea central del patrón MVC es separar las diferentes partes funcionales de la aplicación, haciéndolas independientes y reemplazables. Esta separación hace que el código sea más fácil de entender , mantener y ampliar . También facilita el trabajo en equipo, ya que los desarrolladores pueden trabajar en diferentes partes del modelo, vista y controlador simultáneamente sin interferir entre sí. El patrón MVC se usa ampliamente en varios marcos y tecnologías de desarrollo de software, incluidos marcos de desarrollo web como Spring MVC, Ruby on Rails, etc.

1.3Características de SpringMVC

Spring MVC es un marco web basado en Java que forma parte del marco Spring y se utiliza para desarrollar aplicaciones web flexibles y escalables . Las siguientes son algunas características de Spring MVC:

  1. Ligero: Spring MVC adopta un modelo de desarrollo basado en POJO y no depende de ningún servidor de aplicaciones específico, por lo que es muy liviano.

  2. Acoplamiento flexible: Spring MVC está estrechamente integrado con el marco Spring y utiliza funciones de Spring como la inyección de dependencia y la programación orientada a aspectos para lograr un acoplamiento flexible entre componentes.

  3. Altamente personalizable: Spring MVC proporciona una gran cantidad de opciones de configuración e interfaces extensibles, los desarrolladores pueden personalizar y configurar varios componentes para cumplir con los requisitos de aplicaciones específicas.

  4. Fácil de probar: Spring MVC adopta el patrón de diseño MVC para separar la lógica empresarial, el procesamiento de datos y la interfaz de usuario, lo que facilita las pruebas unitarias y las pruebas de integración .

  5. Potente procesamiento de solicitudes: Spring MVC proporciona un mecanismo de procesamiento de solicitudes potente y flexible, que puede definir fácilmente el mapeo de solicitudes, la vinculación de parámetros, la validación de datos, el análisis de vistas, etc. a través de anotaciones y archivos de configuración.

  6. Ver diversidad de tecnologías: Spring MVC admite una variedad de tecnologías de visualización, incluidas JSP, Thymeleaf, Freemarker, Velocity, etc. Los desarrolladores pueden elegir la tecnología de visualización adecuada según los requisitos del proyecto.

  7. Integre otras tecnologías: Spring MVC se puede integrar perfectamente con otras tecnologías y marcos, como Spring Security para autenticación y autorización de seguridad, Spring Data para acceder a bases de datos, Spring Boot para configuración simplificada, etc.

  8. Soporte RESTful: Spring MVC proporciona un buen soporte para el desarrollo de estilo RESTful, lo que facilita la creación y administración de API de estilo RESTful.

En general, Spring MVC tiene las ventajas de flexibilidad, personalización y capacidad de prueba, lo que lo convierte en uno de los marcos preferidos para desarrollar aplicaciones web.

2. Casos de uso básicos: aplicación básica SpringMVC

Resumen de notas:

  • Pasos
    1. Importar servlet-api, spring-webmvccoordenadas de dependencia
    2. Cree una clase de controlador SpringMVC (equivalente a la funcionalidad de servlet)
    3. Crear clase de archivo de configuración
    4. Inicialice el contenedor de Servlet para cargar el entorno SpringMVC y configure las solicitudes procesadas por la tecnología SpringMVC:
      • Descripción: herede AbstractDispatcherServletInitializeresta clase, anule tres métodos abstractos y AnnotationConfigWebApplicationContextcargue el archivo del controlador SpringMVC a través de
  • principio:
    • imagen-20230814221025847
    • Consulte la siguiente sección para obtener más detalles.
  • Uso de anotaciones:
    • @Controller: configura el bean controlador central de SpringMVC
    • @RequestMapping: establece la ruta de acceso de solicitud del método del controlador actual
    • @ResponseBody: establece el contenido de respuesta del método del controlador actual al valor de retorno actual , no es necesario analizar
    • @Configuration: identifica una clase como clase de configuración Spring , generalmente utilizada con otras anotaciones para definir la información de configuración de la aplicación.
    • @ComponentScan: indique a Spring que escanee los componentes (incluidas clases, interfaces, anotaciones, etc.) en el paquete especificado y los registre como Spring Beans.

Paso 1: para utilizar la tecnología SpringMVC, primero debe importar las coordenadas SpringMVC y las coordenadas Servlet

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.2.10.RELEASE</version>
</dependency>

ilustrar:

  • Coordenadas SpringMVC, puede utilizar las funciones y características proporcionadas por Spring MVC, como procesamiento de solicitudes, enrutamiento, enlace de datos y análisis de vistas.
  • Al introducir las coordenadas de Servlet, las funciones del contenedor de Servlet se pueden integrar en el proyecto, de modo que el proyecto pueda procesar solicitudes HTTP y generar respuestas.

Paso 2: crear la clase de controlador SpringMVC (equivalente a la función Servlet)

//定义表现层控制器bean
@Controller
public class UserController {
    
    

    //设置映射路径为/save,即外部访问路径
    @RequestMapping("/save")
    //设置当前操作返回结果为指定json数据(本质上是一个字符串信息)
    @ResponseBody
    public String save() {
    
    
        System.out.println("user save ...");
        return "{'info':'springmvc'}";
    }

    //设置映射路径为/delete,即外部访问路径
    @RequestMapping("/delete")
    @ResponseBody
    public String delete() {
    
    
        System.out.println("user save ...");
        return "{'info':'springmvc'}";
    }
}

Reponer:

  1. Nombre: @Controlador

    • Tipo: anotación de clase

    • Ubicación: encima de la definición de clase del controlador SpringMVC

    • Rol: Establecer el bean controlador central de SpringMVC

    • ejemplo:

      @Controller
      public class UserController {
               
               
      }
      
      
  2. Nombre: @RequestMapping

    • Tipo: anotación de método

    • Ubicación: encima de la definición del método del controlador SpringMVC

    • Función: establecer la ruta de acceso de solicitud del método del controlador actual

    • ejemplo:

      @RequestMapping("/save")
      public void save(){
               
               
          System.out.println("user save ...");
      }
      
    • Propiedades relacionadas

      • valor (predeterminado): solicitar ruta de acceso
  3. Nombre: @ResponseBody

    • Tipo: anotación de método

    • Ubicación: encima de la definición del método del controlador SpringMVC

    • Función: establece el contenido de la respuesta del método del controlador actual como el valor de retorno actual sin analizar

    • ejemplo:

      @RequestMapping("/save")
      @ResponseBody
      public String save(){
               
               
          System.out.println("user save ...");
          return "{'info':'springmvc'}";
      }
      

Paso 3: crear una clase de archivo de configuración

//springmvc配置类,本质上还是一个spring配置类
@Configuration
@ComponentScan("love.ljtxy.controller")
public class SpringMvcConfig {
    
    
}

ilustrar:

Inicialice el entorno SpringMVC (igual que el entorno Spring) y configure SpringMVC para cargar el bean correspondiente

Aviso:

​ Aquí solo necesita cambiar la capa del controlador a un bean, sin necesidad de paquetes de escaneo de dispositivos redundantes

Paso 4: Inicialice el contenedor de Servlet para cargar el entorno SpringMVC y configurar las solicitudes procesadas por la tecnología SpringMVC

//web容器配置类
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
    
    
    //加载springmvc配置类,产生springmvc容器(本质还是spring容器)
    protected WebApplicationContext createServletApplicationContext() {
    
    
        //初始化WebApplicationContext对象
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        //加载指定配置类
        ctx.register(SpringMvcConfig.class);
        return ctx;
    }

    //设置由springmvc控制器处理的请求映射路径
    protected String[] getServletMappings() {
    
    
        return new String[]{
    
    "/"};
    }

    //加载spring配置类
    protected WebApplicationContext createRootApplicationContext() {
    
    
        return null;
    }
}

ilustrar:

Defina una clase de configuración para el inicio del contenedor de servlets y cargue la configuración de Spring en él.

3. Principio del proceso

Resumen de notas:

  1. Iniciar el proceso de inicialización del servidor
  2. Inicialización del contenedor web
  3. Inicialización del contenedor de servlets
  4. Carga de clases de configuración SpringMVC
  5. Cargue los beans correspondientes a @ComponentScan
  6. Controlar la carga de frijol de capa
  7. Procesamiento de solicitudes

imagen-20230814221054845

  1. Proceso de solicitud única

  2. Enviar solicitud

  3. distribución de solicitudes

  4. Solicitar análisis

  5. distribución del método

  6. ejecución del método

  7. Procesamiento del valor de retorno del método

  8. Uso de anotaciones:

  • @ComponentScan: escanea automáticamente las clases en el paquete especificado y sus subpaquetes para identificarlos como componentes Spring. Inyección de dependencia, cableado automático
    • excluirFilters: excluye los beans cargados en la ruta de escaneo, debe especificar la categoría (tipo) y los elementos específicos (clases)
    • includeFilters: carga el bean especificado, debe especificar la categoría (tipo) y elementos específicos (clases)

3.1 Descripción general

En el inicio de SpringMVC, el proceso se divide aproximadamente en dos tipos, uno se denomina proceso de inicialización del servidor de inicio y el otro se denomina proceso de solicitud única.

  • Iniciar el proceso de inicialización del servidor
    1. El servidor se inicia, ejecuta la clase ServletContainersInitConfig e inicializa el contenedor web.
    2. Ejecute el método createServletApplicationContext para crear el objeto WebApplicationContext
    3. Cargar SpringMvcConfig
    4. Ejecute @ComponentScan para cargar el bean correspondiente
    5. Cargue UserController, cada nombre de @RequestMapping corresponde a un método específico
    6. Ejecute el método getServletMappings y defina que todas las solicitudes pasen por SpringMVC
  • Proceso de solicitud única
    1. Enviar solicitud localhost/guardar
    2. El contenedor web encuentra que todas las solicitudes pasan por SpringMVC y entrega la solicitud a SpringMVC para su procesamiento.
    3. Analizar ruta de solicitud/guardar
    4. El método correspondiente save() se ejecuta mediante la coincidencia /save.
    5. Ejecutar guardar()
    6. Se detecta que @ResponseBody devuelve directamente el valor de retorno del método save() al solicitante como cuerpo de respuesta.

imagen-20230814103709269

ilustrar:

El objeto creado WebApplicationContextse colocará en el ServletContext de la solicitud de Servlet grande.

3.2SpringMVC y control de carga de beans de Spring

​ Bajo el paquete com.itheima, se incluyen varios beans, como config, controlador, etc. SpringMVC solo controla el desarrollo de la capa Controlador, y Spring controla el desarrollo de las capas de configuración, servicio y dao. Sin embargo, especificar el rango de escaneo del paquete de Spring como com.itheimadebajo del paquete en este momento hará que Spring cargue por error los beans SpringMVC.

imagen-20230530073206117

ilustrar:

Excluya los beans controlados por SpringMVC al cargar los beans controlados por Spring, para resolver el problema de cómo evitar que Spring cargue incorrectamente Bea en SpringMVC debido a diferentes funciones.

Suplemento:

  • Beans relacionados con Spring MVC ( beans de capa de presentación )
  • Frijoles controlados por primavera
    • Bean empresarial (servicio)
    • Beans funcionales (DataSource, etc.)
  • Control de carga de beans relacionado con SpringMVC
    • Los paquetes correspondientes a los beans cargados por SpringMVC están todos en el paquete com.iheima.controller
  • Control de carga de frijoles relacionado con la primavera
    • Método 1: establecer el alcance de escaneo de los beans cargados por Spring en com.itheima y excluir los beans en el paquete del controlador
    • Método 2: el bean cargado por Spring establece el rango de escaneo en el rango preciso , como paquete de servicio, paquete dao, etc.
    • Método 3: no distinga entre entornos Spring y SpringMVC, cárguelos en el mismo entorno

3.3ServletContainersInitConfig.clase

/**
 * Web容器配置类
 */
public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
    
    

    /**
     * 返回Spring应用程序的根配置类
     */
    @Override
    protected Class<?>[] getRootConfigClasses() {
    
    
        return new Class[]{
    
    SpringConfig.class};
    }

    /**
     * 返回Servlet的配置类
     */
    @Override
    protected Class<?>[] getServletConfigClasses() {
    
    
        return new Class[]{
    
    SpringMvcConfig.class};
    }

    /**
     * 返回DispatcherServlet的映射路径
     */
    @Override
    protected String[] getServletMappings() {
    
    
        return new String[]{
    
    "/"};
    }
}

Aviso:

Para utilizar el método getServletConfigClasses, debe configurar el valor de retorno correspondiente SpringMvcConfig.class, que es la configuración en la capa de control.

3.4Clase SpringConfig.

@Configuration
@ComponentScan(value = "love.ljtxy",
        excludeFilters = @ComponentScan.Filter(
                type = FilterType.ANNOTATION,
                classes = Controller.class
        ))
public class SpringConfig {
    
    
}

ilustrar:

  • Nombre: @ComponentScan
  • Tipo: anotación de clase
  • Atributos
    • excluirFilters: excluye los beans cargados en la ruta de escaneo, debe especificar la categoría (tipo) y los elementos específicos (clases)
    • includeFilters: para cargar el bean especificado , debe especificar la categoría (tipo) y elementos específicos (clases)

detalle:

Debido a que esta anotación está en @ComponentScan, se puede @Filterusar directamente como una anotación interna..

3.5Clase SpringMvcConfig.

//springmvc配置类,本质上还是一个spring配置类
@Configuration
@ComponentScan("love.ljtxy.controller")
public class SpringMvcConfig {
    
    

}

ilustrar:

​ Aquí solo necesitas configurar el control SpringMVC para escanear solo controllerlos paquetes de la capa. Porque la configuración de SpringMVC reemplaza la capa de control en Spring

4. Solicitud y respuesta

Resumen de notas:

  1. Solicitar ruta de mapeo: @RequestMapping: establece la ruta de acceso de solicitud del método del controlador actual. Si está configurado, establece el prefijo de la ruta de acceso de solicitud del método del controlador actual de manera uniforme en la clase.

  2. Método de solicitud:

  • Obtener parámetros de solicitud
  • Parámetros de solicitud posterior
  1. Solicitud posterior procesamiento confuso chino
// AbstractAnnotationConfigDispatcherServletInitializer 是 Spring Framework 中的一个类,它用于配置和初始化基于注解的 Spring MVC 应用程序
public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer{
     
     
    // 配字符编码过滤器
    protected Filter[] getServletFilters() {
     
     
        CharacterEncodingFilter filter = new CharacterEncodingFilter(); //添加过滤器
        filter.setEncoding("utf-8"); //指定过滤器字符集
        return new Filter[]{
     
     filter};
    }
}
  1. Solicitar parámetros

  2. Parámetros ordinarios - mismo nombre : no requiere configuración

  3. Parámetros ordinarios con diferentes nombres : debe usar **@RequestParam para vincular las relaciones de parámetros**

  4. Parámetros POJO (punto clave): Defina parámetros formales de tipo POJO para recibir parámetros directamente sin configuración adicional . Tenga en cuenta que los nombres de atributos en la clase de entidad deben ser consistentes. ¡ Adecuado para la vinculación de parámetros de forma regular !

  5. Parámetros POJO anidados : el nombre del parámetro de solicitud es el mismo que el nombre del atributo del objeto del parámetro formal . Los parámetros del atributo POJO anidado se pueden recibir de acuerdo con la relación jerárquica del objeto.

  6. Parámetro de matriz : defina un parámetro de tipo matriz para recibir múltiples parámetros . ¡ Adecuado para la vinculación de parámetros de forma regular !

  7. La colección guarda parámetros ordinarios: @RequestParam vincula relaciones de parámetros, por ejemplo@RequestParam List<String> likes

  8. Pasar datos Json

    1. Coordenadas de importación:
    <dependency>
     <groupId>com.fasterxml.jackson.core</groupId>
     <artifactId>jackson-databind</artifactId>
     <version>2.9.0</version>
    </dependency>
    
    1. Establecer parámetros de solicitud

    2. Habilite el soporte para la conversión automática de datos json

    @Configuration
    @ComponentScan("com.itheima.controller")
    @EnableWebMvc // 在SpringMVC中需要开启Json数据自动类型转换,与SpringBoot不同
    public class SpringMvcConfig {
           
           
    }
    
  9. Pasar objetos Json : defina parámetros de tipo POJO y utilice anotaciones @RequestBodypara recibir parámetros. ¡Se utiliza al procesar datos JSON ! !

  10. Pase la matriz Json : los datos de la matriz json tienen el mismo nombre que la propiedad genérica de la colección. Defina el parámetro de tipo Lista para recibir los parámetros. ¡Se utiliza al procesar datos JSON ! !

  11. Paso de parámetro de tipo de fecha:

  • @DateTimeFormat (patrón = “aaaa - MM-dd”): establece el formato de datos de fecha y hora
  1. Explicación de la anotación:
  • @RequestParam : vincula la relación entre los parámetros de solicitud y los parámetros del método del procesador , a menudo utilizado para el procesamiento de datos entre formularios.
  • @EnableWebMvc : habilita múltiples funciones auxiliares de SpringMVC
  • @RequestBody : pasa los datos contenidos en el cuerpo de la solicitud en la solicitud a los parámetros de la solicitud . Esta anotación solo se puede usar una vez por método de procesador. Comúnmente utilizado para el procesamiento de datos entre Json.
  1. respuesta:
  • Página de respuesta: devolver “page.jsp”;
  • Datos de respuesta:
    • Datos de texto: devuelve “texto de respuesta”;
    • Datos Json: utilice **@ResponseBody** para configurar la respuesta en formato Json . La capa inferior es utilizar la interfaz del convertidor de tipos HttpMessageConverter para corresponder a diferentes clases de implementación y luego realizar la conversión.

4.1 Solicitar ruta de mapeo

@Controller
@RequestMapping("/user")
public class UserController {
    
    
    @RequestMapping("/save")
    @ResponseBody
    public String save(){
    
    
        System.out.println("user save ...");
        return "{'module':'user save'}";
    }
}

ilustrar:

Nombre: @RequestMapping

  • Tipo: anotación de clase de anotación de método

  • Ubicación: encima de la definición del método del controlador SpringMVC

  • Función: establece la ruta de acceso de solicitud del método del controlador actual. Si se establece, establece el prefijo de la ruta de acceso de solicitud del método del controlador actual de manera uniforme en la clase.

  • Atributos

    • valor (predeterminado): solicitar ruta de acceso o prefijo de ruta de acceso

4.2 Método de solicitud

1.Obtener parámetros de solicitud

imagen-20230530082533259

2.Parámetros de solicitud de publicación

imagen-20230530082552044

4.3 Procesamiento confuso chino de solicitud posterior

// AbstractAnnotationConfigDispatcherServletInitializer 是 Spring Framework 中的一个类,它用于配置和初始化基于注解的 Spring MVC 应用程序
public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer{
    
    
    // 配字符编码过滤器
    protected Filter[] getServletFilters() {
    
    
        CharacterEncodingFilter filter = new CharacterEncodingFilter(); //添加过滤器
        filter.setEncoding("utf-8"); //指定过滤器字符集
        return new Filter[]{
    
    filter};
    }
}

ilustrar:

Debe agregar un filtro en SpringMVC, al igual que en la solicitud de Servlet, debe agregar un filtro con caracteres de solicitud para la solicitud de respuesta.

detalle:

Agregue un filtro al contenedor web y especifique el juego de caracteres. El paquete Spring-web proporciona un filtro de caracteres dedicado.

Reponer:

Referencia más detallada: Análisis de AbstractAnnotationConfigDispatcherServletInitializer_Yan Demon King's Blog-CSDN Blog

4.4 Parámetros de solicitud

Los parámetros de solicitud son datos enviados por el cliente (navegador, aplicación móvil, etc.) al servidor para indicarle qué hacer o proporcionar los datos requeridos.

4.4.1 Parámetros ordinarios - mismo nombre

La dirección URL se utiliza para pasar parámetros. El nombre del parámetro de dirección es el mismo que el nombre de la variable del parámetro formal . Puede recibir los parámetros definiendo el parámetro formal.

imagen-20230530083541992

@RequestMapping("/commonParam")
@ResponseBody
public String commonParam(String name ,int age){
    
    
    System.out.println("普通参数传递 name ==> "+name);
    System.out.println("普通参数传递 age ==> "+age);
    return "{'module':'common param'}";
}

4.4.2 Parámetros comunes: diferentes nombres

El nombre del parámetro de solicitud es diferente del nombre de la variable del parámetro formal. Utilice @RequestParam para vincular la relación del parámetro.

imagen-20230530083618242

@RequestMapping("/commonParamDifferentName")
@ResponseBody
public String commonParamDifferentName(@RequestParam("name")String userName , int age){
    
    
    System.out.println("普通参数传递 userName ==> "+userName);
    System.out.println("普通参数传递 age ==> "+age);
    return "{'module':'common param different name'}";
}

detalle:

Si el nombre del parámetro de solicitud es diferente del nombre de la variable del parámetro formal, debe usar @RequestParam para vincular la relación del parámetro. Si son iguales no es necesario especificar

Reponer:

  • Nombre: @RequestParam
    • Tipo: anotación de parámetro formal
    • Posición: antes de la definición de parámetros formales del método del controlador SpringMVC
    • Función: vincular la relación entre los parámetros de solicitud y los parámetros del método del procesador
  • parámetro:
    • requerido: si es un parámetro requerido
    • defaultValue: valor predeterminado del parámetro

4.4.3 Parámetros POJO (énfasis)

El nombre del parámetro de solicitud es el mismo que el nombre de propiedad del objeto de parámetro formal. Puede recibir parámetros definiendo un parámetro de tipo POJO. Adecuado para enlace de parámetros de forma regular

imagen-20230530083936860

@RequestMapping("/pojoParam")
@ResponseBody
public String pojoParam(User user){
    
    
    System.out.println("pojo参数传递 user ==> "+user);
    return "{'module':'pojo param'}";
}

ilustrar:

​ Cuando se utiliza el paso de parámetros PoJo, el valor a pasar se puede recibir si corresponde al nombre del atributo en el objeto.

detalle:

Cuando se utilizan parámetros de PoJo para pasar parámetros, el marco SpringMVC primero obtendrá el método de construcción de acuerdo con el tipo de PoJo, primero creará el objeto y luego lo pasará de acuerdo con el método establecido de los parámetros.

4.4.4 Parámetros POJO anidados

El nombre del parámetro de solicitud es el mismo que el nombre del atributo del objeto del parámetro formal, y los parámetros del atributo POJO anidados se pueden recibir de acuerdo con la relación jerárquica del objeto.

imagen-20230530084152345

@RequestMapping("/pojoContainPojoParam")
@ResponseBody
public String pojoContainPojoParam(User user){
    
    
    System.out.println("pojo嵌套pojo参数传递 user ==> "+user);
    return "{'module':'pojo contain pojo param'}";
}

4.4.5 Parámetros de matriz

Si el nombre del parámetro de solicitud es el mismo que el nombre del atributo del objeto de parámetro formal y hay varios parámetros de solicitud, puede recibir los parámetros definiendo un parámetro de tipo matriz.

imagen-20230530084413567

@RequestMapping("/arrayParam")
@ResponseBody
public String arrayParam(String[] likes){
    
    
    System.out.println("数组参数传递 likes ==> "+ Arrays.toString(likes));
    return "{'module':'array param'}";
}

4.4.6 La colección guarda parámetros comunes

Si el nombre del parámetro de solicitud es el mismo que el nombre del objeto de colección de parámetros formales y hay varios parámetros de solicitud, @RequestParam vincula la relación de parámetros.

imagen-20230530084449696

@RequestMapping("/listParam")
@ResponseBody
public String listParam(@RequestParam List<String> likes){
    
    
    System.out.println("集合参数传递 likes ==> "+ likes);
    return "{'module':'list param'}";
}

Aviso:

Si usa una colección para guardar parámetros comunes, el marco SpringMVC pasará esta colección como un objeto PoJo. Y la colección no tiene constructor, por lo que se informará un error.

imagen-20230530085326930

En este punto, @RequestParamdespués de agregar anotaciones, el marco SpringMVC colocará directamente los parámetros involucrados en la solicitud en la colección.

4.4.7 Casos de uso básicos: pasos para pasar datos Json

Paso 1: agregar coordenadas relacionadas con la conversión de datos json

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.9.0</version>
</dependency>

Paso 2: configurar el envío de datos json (agregue datos json en el cuerpo de la solicitud)

imagen-20230530090141109

Paso 3: habilite la compatibilidad con la conversión automática de datos json

@Configuration
@ComponentScan("com.itheima.controller")
@EnableWebMvc // 在SpringMVC中需要开启Json数据自动类型转换,与SpringBoot不同
public class SpringMvcConfig {
    
    
}

ilustrar:

La anotación @EnableWebMvc es poderosa. Esta anotación integra múltiples funciones. Aquí solo se usa una parte, es decir, la conversión automática de tipos de datos json.

Reponer:

  • Nombre: @EnableWebMvc
    • Tipo: anotación de clase de configuración
    • Ubicación: encima de la definición de clase de configuración SpringMVC
    • Función: habilitar múltiples funciones auxiliares de SpringMVC

Paso 4: configurar para recibir datos json

@RequestMapping("/listParamForJson")
@ResponseBody
public String listParamForJson(@RequestBody List<String> likes){
    
    
    System.out.println("list common(json)参数传递 list ==> "+likes);
    return "{'module':'list common for json param'}";
}

ilustrar:

Nombre: @RequestBody

  • Tipo: anotación de parámetro formal
  • Posición: antes de la definición de parámetros formales del método del controlador SpringMVC
  • Función: pasar los datos contenidos en el cuerpo de la solicitud en la solicitud a los parámetros de la solicitud. Esta anotación solo se puede usar una vez por método de procesador.

4.4.8 Pasar objetos Json (énfasis)

Los datos json tienen el mismo nombre de propiedad que el objeto de parámetro formal y los parámetros se pueden recibir definiendo el parámetro de tipo POJO. Se utiliza al procesar datos JSON.

imagen-20230530090604255

premisa:

  • Agregar coordenadas relacionadas con la conversión de datos json
  • Habilite el soporte para la conversión automática de datos json
@RequestMapping("/pojoParamForJson")
@ResponseBody
public String pojoParamForJson(@RequestBody User user){
    
    
    System.out.println("pojo(json)参数传递 user ==> "+user);
    return "{'module':'pojo for json param'}";
}

4.4.9 Pasar matriz Json

Los datos de la matriz json tienen el mismo nombre que la propiedad genérica de la colección. Defina el parámetro de tipo Lista para recibir los parámetros.

imagen-20230530090734676

@RequestMapping("/listPojoParamForJson")
@ResponseBody
public String listPojoParamForJson(@RequestBody List<User> list){
    
    
    System.out.println("list pojo(json)参数传递 list ==> "+list);
    return "{'module':'list pojo for json param'}";
}

Nota: Se requieren los siguientes requisitos previos

  • Agregar coordenadas relacionadas con la conversión de datos json
  • Habilite el soporte para la conversión automática de datos json

4.5 Paso de parámetro de tipo de fecha

  • Los datos de tipo fecha tienen diferentes formatos según los diferentes sistemas.
    • 2088-08-18
    • 2088/08/18
    • 18/08/2088
  • Al recibir parámetros formales, configure diferentes métodos de recepción según diferentes formatos de fecha
@RequestMapping("/dataParam")
@ResponseBody
public String dataParam(Date date,
                        @DateTimeFormat(pattern = "yyyy-MM-dd") Date date1,
                        @DateTimeFormat(pattern = "yyyy/MM/dd HH:mm:ss")Date date2){
    
    
    System.out.println("参数传递 date ==> "+date);
    System.out.println("参数传递 date(yyyy-MM-dd) ==> "+date1);
    System.out.println("参数传递 date(yyyy/MM/dd HH:mm:ss) ==> "+date2);
    return "{'module':'data param'}";
}

ilustrar:

  • preguntar:

    http://localhost/dataParam?date=2088/08/08&date1=2088-08-18&date2=2088/08/28 8:08:08
    

Reponer:

  • Nombre: @DateTimeFormat
    • Tipo: anotación de parámetro formal
    • Posición: frente a los parámetros del método del controlador SpringMVC
    • Función: Establecer formato de datos de fecha y hora
    • Atributos:
      • patrón: cadena de formato de fecha y hora

Nota: La función de conversión de tipo debe estar habilitada en la clase de configuración.

  • Nombre: @EnableWebMvc

  • Función: hacer coincidir el convertidor de tipo correspondiente según el tipo es una de las funciones de esta anotación

Extensión: pase los parámetros a través de anotaciones y el trabajo interno se realiza a través de la interfaz del convertidor.

  • Interfaz del convertidor

    public interface Converter<S, T> {
           
           
        @Nullable
        T convert(S var1);
    }
    
  • Solicitar datos de antigüedad del parámetro (Cadena → Entero)

  • Convertir datos json a objeto (json → POJO)

  • Conversión de formato de fecha (Cadena → Fecha)

imagen-20230530141442994

Convert tiene tantas clases de implementación para convertir tipos de datos

4.6 Respuesta

4.6.1 Descripción general

La respuesta es el mensaje que devuelve el servidor al cliente para proporcionar los datos requeridos por la solicitud o el resultado de la operación.

Categorías de respuesta:

  1. página de respuesta
  2. datos de respuesta
    • datos de texto
    • datos json

4.6.2 Página de respuesta (comprender)

@RequestMapping("/toPage")
public String toPage(){
    
    
    return "page.jsp";
}

4.6.3 Datos del texto de respuesta (comprensión)

@RequestMapping("/toText")
@ResponseBody
public String toText(){
    
    
    return "response text";
}

Reponer:

  • Nombre: @ResponseBody
    • Tipo: anotación de método
    • Ubicación: encima de la definición del método del controlador SpringMVC
    • Función: establece el valor de retorno del controlador actual como cuerpo de respuesta

Aviso:

​ Cuando utilices @ResponseBody para responder al contenido, debes agregar

4.6.4 Responder a datos Json (objetar a Json)

@RequestMapping("/toJsonPOJO")
@ResponseBody
public User toJsonPOJO(){
    
    
    User user = new User();
    user.setName("赵云");
    user.setAge(41);
    return user;
}

Reponer:

  • Interfaz HttpMessageConverter del convertidor de tipo

    public interface HttpMessageConverter<T> {
           
           
       boolean canRead(Class<?> clazz, @Nullable MediaType mediaType);
       boolean canWrite(Class<?> clazz, @Nullable MediaType mediaType);
       List<MediaType> getSupportedMediaTypes();
       T read(Class<? extends T> clazz, HttpInputMessage inputMessage)
             throws IOException, HttpMessageNotReadableException;
       void write(T t, @Nullable MediaType contentType, HttpOutputMessage outputMessage)
             throws IOException, HttpMessageNotWritableException;
    }
    

    Cuando se utiliza la anotación @ResponseBody para responder al contenido, no se convierte a través de la interfaz Converter, sino a través de una nueva interfaz HttpMessageConverter接口.

4.6.5 Respuesta a datos Json (colección de objetos a matriz Json)

@RequestMapping("/toJsonList")
@ResponseBody
public List<User> toJsonList(){
    
    
    User user1 = new User();
    user1.setName("赵云");
    user1.setAge(41);
    User user2 = new User();
    user2.setName("master 赵云");
    user2.setAge(40);
    List<User> userList = new ArrayList<User>();
    userList.add(user1);
    userList.add(user2);
    return userList;
}

5.estilo DESCANSO

Resumen de notas:

  1. Descripción general: REST (Transferencia de estado representacional) es un estilo de arquitectura de software que se centra en el estado de los recursos y la interacción entre recursos.

  2. Establecer acción de solicitud HTTP (verbo): @RequestMapping(valor = “xxx”, método = RequestMethod.POST )

  3. Establecer parámetros de solicitud (variable de ruta): @RequestMapping( valor = “/users/{id}” , método = xxxx)

  4. RESTful desarrollo rápido:

    • @RestController: establece la clase de controlador actual en estilo RESTful, que es equivalente a la función combinada de las anotaciones @Controller y @ResponseBody

      @RestController
      public class BookController {
               
               
      }
      
    • @GetMapping @PostMapping @PutMapping @DeleteMapping: establece la ruta de acceso de solicitud del método del controlador actual y la acción de solicitud

      @GetMapping("/{id}")
      public String getById(@PathVariable Integer id){
               
               }
      

5.1 Descripción general

REST (Transferencia de estado representacional) es un estilo arquitectónico de software que se utiliza para diseñar sistemas distribuidos para aplicaciones de red. Se centra principalmente en el estado de los recursos y la interacción entre recursos , que se logra mediante el uso de una interfaz unificada y varios métodos del protocolo HTTP.

  • Formulario de descripción de recursos de estilo tradicional

    http://localhost/user/getById?id=1

    http://localhost/usuario/saveUser

  • Formulario de descripción del estilo REST

    http://localhost/usuario/1

    http://localhost/usuario

ventaja:

  • Ocultar el comportamiento de acceso a los recursos. Es imposible saber qué operaciones se realizan en los recursos a través de la dirección.
  • Simplificar la escritura

Introducción al estilo REST

imagen-20230530150231874

5.2 Establecer acción de solicitud HTTP (verbo)

@RequestMapping(value = "/users", method = RequestMethod.POST)
@ResponseBody
public String save(@RequestBody User user){
    
    
    System.out.println("user save..." + user);
    return "{'module':'user save'}";
}

@RequestMapping(value = "/users" ,method = RequestMethod.PUT)
@ResponseBody
public String update(@RequestBody User user){
    
    
    System.out.println("user update..."+user);
    return "{'module':'user update'}";
}

Reponer:

  • Nombre: @RequestMapping
    • Tipo: anotación de método
    • Ubicación: encima de la definición del método del controlador SpringMVC
    • Función: establece la ruta de acceso de solicitud del método del controlador actual
    • Atributos
      • valor (predeterminado): solicitar ruta de acceso
      • método: acción de solicitud http, acción estándar (GET/POST/PUT/DELETE)

5.3 Establecer parámetros de solicitud (variables de ruta)

@RequestMapping(value = "/users/{id}" ,method = RequestMethod.DELETE)
@ResponseBody
public String delete(@PathVariable Integer id){
    
    
    System.out.println("user delete..." + id);
    return "{'module':'user delete'}";
}

Reponer:

  • Nombre: @PathVariable
    • Tipo: anotación de parámetro formal
    • Posición: antes de la definición de parámetros formales del método del controlador SpringMVC
    • Función: vincula la relación entre los parámetros de ruta y los parámetros formales del método del procesador, lo que requiere una correspondencia uno a uno entre los nombres de los parámetros de ruta y los nombres de parámetros formales.

5.4Desarrollo rápido y RESTful

Nombre: @RestController

  • Tipo: anotación de clase

  • Posición: encima de la definición de clase del controlador de desarrollo RESTful basada en SpringMVC

  • Función: establece la clase de controlador actual en estilo RESTful, que es equivalente a la función combinada de las dos anotaciones @Controller y @ResponseBody

  • ejemplo:

    @RestController
    public class BookController {
          
          
    }
    

Publicado: @GetMapping @PostMapping @PutMapping @DeleteMapping

  • Tipo: anotación de método

  • Ubicación: encima de la definición del método del controlador de desarrollo RESTful basado en SpringMVC

  • Función: establece la ruta de acceso de solicitud del método del controlador actual y la acción de solicitud, cada una correspondiente a una acción de solicitud, por ejemplo, @GetMapping corresponde a la solicitud GET

  • ejemplo:

    @GetMapping("/{id}")
    public String getById(@PathVariable Integer id){
          
          
        System.out.println("book getById..."+id);
        return "{'module':'book getById'}";
    }
    
  • Atributo: valor (predeterminado): solicitar ruta de acceso

5.5 Interacción básica entre casos y datos basada en la página RESTful

Paso cero: construir el entorno básico

imagen-20230530194836763

Paso 1: cree un controlador SpringMVC y pruebe la función de la interfaz a través de PostMan

ilustrar:

​ El mismo 基本用例-SpringMVC基础应用proceso no se mostrará aquí.

Paso 2: establecer permisos de acceso para recursos estáticos

@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
    
    
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
    
    
        //当访问/pages/????时候,走/pages目录下的内容
        registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");
        registry.addResourceHandler("/js/**").addResourceLocations("/js/");
        registry.addResourceHandler("/css/**").addResourceLocations("/css/");
        registry.addResourceHandler("/plugins/**").addResourceLocations("/plugins/");
    }
}

ilustrar:

Al acceder a recursos web, debido a que la clase ServletContainersInitConfig en el paso cero está configurada con el método getServletMappings como intercepción /y ruta, al acceder a recursos estáticos en el directorio de la aplicación web, SpringMVC interceptará la solicitud.

protected String[] getServletMappings() {
     
     
return new String[]{
     
     "/"};
}

En este punto, existen muchos métodos de procesamiento: puede crear una nueva clase, heredar WebMvcConfigurationSupport y luego anular el método addResourceHandlers para agregar controladores de recursos. Al procesar recursos, simplemente acceda /xx/**a los recursos en la ruta de acceso al /xx/directorio de recursos.

Aviso:

Cuando se configura esta solicitud, se debe cargar SpringMVC para cargar esta configuración

Paso 3: cargar la configuración de solicitud de recursos

//springmvc配置类,本质上还是一个spring配置类
@Configuration
@ComponentScan({
    
    "love.ljtxy.controller","love.ljtxy.config"})
@EnableWebMvc
public class SpringMvcConfig {
    
    

}

ilustrar:

En este punto, simplemente agregue una nueva clase de escaneo

6. Integración del MUS (énfasis)

Resumen de notas: esta sección es el tema central; consulte cada sección para obtener más detalles.

6.1 Descripción general

Resumen de notas:

  • Significado: el marco SSM es una integración de Spring, Spring MVC y Mybatis framework , y es un patrón MVC estándar . El marco SSM estándar tiene cuatro capas, a saber, capa dao (mapeador), capa de servicio, capa de controlador y capa de vista.

  • Capa de persistencia: la capa dao (mapeador) es la principal responsable del trabajo de la capa de persistencia de datos. Aquí se encapsulan algunas tareas responsables de la comunicación con la base de datos .

  • Capa empresarial: capa de servicio.La capa de servicio es la principal responsable del diseño de aplicaciones lógicas de los módulos comerciales .

  • Capa de presentación: Capa controladora (capa Handler), responsable del control de procesos específicos del módulo de negocio .

  • Capa de vista: la capa de vista, integrada principalmente con la capa de control, es la principal responsable de la presentación de la página jsp front-end .

  • Diagrama de interacción de relaciones:

    imagen-20230601092944922

El marco SSM es una integración de Spring, Spring MVC y mybatis framework y es un patrón MVC estándar. El marco SSM estándar tiene cuatro capas, a saber, capa dao (mapeador), capa de servicio, capa de controlador y capa de vista. Utilice Spring para implementar la gestión de objetos comerciales, utilice Spring MVC para ser responsable del reenvío de solicitudes y la gestión de vistas, y mybatis como motor de persistencia para objetos de datos.

1) Capa de persistencia: capa dao (mapeador)
Función: realiza principalmente el trabajo de la capa de persistencia de datos, y aquí se encapsulan algunas tareas responsables de contactar la base de datos .

  • La capa Dao primero diseña la interfaz y luego define la clase de implementación de la interfaz en el archivo de configuración de Spring.
  • Luego se puede llamar a la interfaz en el módulo para procesar el negocio de datos. (Ya no te importa qué clase es la clase de implementación de la interfaz)
  • La configuración de la fuente de datos y los parámetros relacionados con la conexión de la base de datos se configuran en el archivo de configuración de Spring.

2) Capa empresarial: Capa de servicio
Función: La capa de servicio es la principal responsable del diseño de la aplicación lógica del módulo empresarial.

  • Primero diseñe la interfaz, luego diseñe la clase real y luego configure su asociación de implementación en el archivo de configuración de Spring. (La implementación de la capa de lógica empresarial debe llamar específicamente a la interfaz Dao que ella misma ha definido). De esta manera, se puede llamar a la interfaz de Servicio en la aplicación para el procesamiento empresarial.
  • Una vez establecido el Dao, se establece la capa de servicio, y la capa de servicio debe estar debajo de la capa del controlador, porque es necesario llamar a la interfaz de la capa Dao y proporcionar la interfaz a la capa del controlador. Cada modelo tiene una interfaz de servicio y cada interfaz encapsula sus propios métodos de procesamiento empresarial.

3) Capa de presentación: Función de capa de controlador (capa de controlador)
: responsable del control de procesos específicos del módulo de negocio .

  • La configuración también se realiza en el archivo de configuración de Spring.
  • Llame a la interfaz proporcionada por la capa de Servicio para controlar el proceso de negocio.
  • Los diferentes procesos de negocios tendrán diferentes controladores. En el desarrollo específico, nuestros procesos se pueden resumir de manera abstracta y se pueden diseñar módulos de procesos de subunidades que se puedan reutilizar.

4) Función de capa de vista
: está estrechamente integrada con la capa de control y es el principal responsable de la presentación de la página jsp frontal.

6.2 Configuración de integración

Resumen de notas:

  • Paso 1: importar dependencias
  • Paso 2: crear la estructura de directorio básica
  • Paso 3: escriba la clase JdbcConfig
    • Crear DruidDataSource como fuente de datos
    • Cree DataSourceTransactionManager como administrador de transacciones
  • Paso 4: escribe la clase MyBatisConfig
    • Configure SqlSessionFactoryBean para crear instancias de SqlSessionFactory
    • Configure MapperScannerConfigurer para escanear y registrar automáticamente la interfaz Mapper de MyBatis
  • Paso 5: escriba la clase ServletConfig
    • Obtenga la clase de configuración raíz de Spring, utilizada para configurar el contenedor Spring
    • Obtenga la clase de configuración SpringMVC, utilizada para configurar el contenedor SpringMVC
    • Obtenga la ruta de mapeo de DispatcherServlet
  • Paso 6: escribe la clase SpringConfig
    • Escanear componentes y beans bajo el paquete especificado
    • Cargar el archivo de propiedades jdbc.properties
    • Importar clases de configuración JdbcConfig y MyBatisConfig
    • Transacción abierta
  • Paso 7: escriba la clase SpringMvcConfig
    • Escanee el paquete donde se encuentra el componente del controlador
    • Habilitar las funciones de Spring MVC

Por favor consulte esta sección para más detalles.

Paso 1: importar dependencias

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.2.10.RELEASE</version>
</dependency>

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.2.10.RELEASE</version>
</dependency>

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>5.2.10.RELEASE</version>
</dependency>

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.6</version>
</dependency>

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>1.3.0</version>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.47</version>
</dependency>

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.16</version>
</dependency>

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
</dependency>

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.15.0</version>
</dependency>

ilustrar:

Estas son algunas dependencias de integración SSM regulares, entre las cuales javax.servlet-api es una dependencia de interacción de solicitud de Servlet, spring-webmvc es una dependencia de reemplazo de la capa de control, mybatis y mybatis-spring son dependencias de MyBatis de integración SpringMVC, druid y spring-jdbc son Spring usado proporciona dependencias de operación de fuente de datos y jackson-core se usa para convertir datos de respuesta y datos recibidos.

Paso 2: crear la estructura de directorio básica

imagen-20230531074500917

Paso 3: escriba la clase JdbcConfig

public class JdbcConfig {
    
    
    // 注入jdbc.driver配置项的值
    @Value("${jdbc.driver}")
    private String driver;
    // 注入jdbc.url配置项的值
    @Value("${jdbc.url}")
    private String url;
    // 注入jdbc.username配置项的值
    @Value("${jdbc.username}")
    private String username;
    // 注入jdbc.password配置项的值
    @Value("${jdbc.password}")
    private String password;

    @Bean
    public DataSource dataSource() {
    
    
        // 创建DruidDataSource作为数据源
        DruidDataSource dataSource = new DruidDataSource();
        // 配置数据源的驱动类
        dataSource.setDriverClassName(driver);
        // 配置数据源的URL
        dataSource.setUrl(url);
        // 配置数据源的用户名
        dataSource.setUsername(username);
        // 配置数据源的密码
        dataSource.setPassword(password);
        return dataSource;
    }

    @Bean
    public PlatformTransactionManager transactionManager(DataSource dataSource) {
    
    
        // 创建DataSourceTransactionManager作为事务管理器
        DataSourceTransactionManager ds = new DataSourceTransactionManager();
        // 设置事务管理器使用的数据源
        ds.setDataSource(dataSource);
        return ds;
    }
}

ilustrar:

Mediante la operación de inyección anterior, los valores de atributos relacionados con la conexión de la base de datos en el archivo de configuración se pueden inyectar en los campos correspondientes. De esta manera, otros componentes que necesitan utilizar la fuente de datos pueden obtener el bean de la fuente de datos mediante la inyección de dependencia, obteniendo así la conexión de la base de datos para la operación y la gestión de transacciones.

Paso 4: escribe la clase MyBatisConfig

public class MyBatisConfig {
    
    

    /**
     * 配置SqlSessionFactoryBean,用于创建SqlSessionFactory实例
     * @param dataSource 数据源
     * @return SqlSessionFactoryBean实例
     */
    @Bean
    public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) {
    
    
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(dataSource);
        factoryBean.setTypeAliasesPackage("love.ljtxy.entity"); // 设置实体类的别名包路径
        return factoryBean;
    }

    /**
     * 配置MapperScannerConfigurer,用于自动扫描并注册MyBatis的Mapper接口
     * @return MapperScannerConfigurer实例
     */
    @Bean
    public MapperScannerConfigurer mapperScannerConfigurer() {
    
    
        MapperScannerConfigurer msc = new MapperScannerConfigurer();
        msc.setBasePackage("love.ljtxy.mapper"); // 设置Mapper接口的包路径
        return msc;
    }
}

ilustrar:

Al introducir esta clase de configuración en el archivo de configuración de Spring, se puede completar la configuración relevante de MyBatis, de modo que las aplicaciones puedan usar MyBatis fácilmente para operaciones de bases de datos.

Paso 5: escriba la clase ServletConfig

public class ServletConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
    
    

    /**
     * 获取Spring的根配置类,用于配置Spring容器
     * @return 根配置类数组
     */
    protected Class<?>[] getRootConfigClasses() {
    
    
        return new Class[]{
    
    SpringConfig.class};
    }

    /**
     * 获取SpringMVC的配置类,用于配置SpringMVC容器
     * @return SpringMVC配置类数组
     */
    protected Class<?>[] getServletConfigClasses() {
    
    
        return new Class[]{
    
    SpringMvcConfig.class};
    }

    /**
     * 获取DispatcherServlet的映射路径
     * @return 映射路径数组
     */
    protected String[] getServletMappings() {
    
    
        return new String[]{
    
    "/"};
    }
}

ilustrar:

Al cargar automáticamente la clase de configuración de Servlet cuando se inicia el contenedor web, se puede completar la inicialización y configuración de los contenedores Spring y SpringMVC, de modo que la aplicación pueda manejar las solicitudes web y realizar el procesamiento correspondiente.

Reponer:

El contenedor SpringMVC puede acceder al contenedor Spring. El contenedor Spring no puede acceder al contenedor SpringMVC. Porque el contenedor IOC de Spring se establece aquí como el contenedor principal del contenedor IOC de Spring MVC

imagen-20230602093019060

Paso 6: escribe la clase SpringConfig

@Configuration
@ComponentScan("love.ljtxy.service") // 扫描指定包下的组件和Bean
@PropertySource("classpath:jdbc.properties") // 加载jdbc.properties属性文件
@Import({
    
    JdbcConfig.class, MyBatisConfig.class}) // 导入JdbcConfig和MyBatisConfig配置类
@EnableTransactionManagement //开启事务
public class SpringConfig {
    
    
}

Aviso:

Cuando Spring usa transacciones, debe usar anotaciones @EnableTransactionManagementpara iniciar transacciones

ilustrar:

A través de estas configuraciones, el contenedor Spring puede cargar y administrar componentes y beans en la ruta del paquete especificada, y puede importar otras clases de configuración según sea necesario para lograr una configuración y ensamblaje flexibles.

Reponer:

  • @ImportLa anotación es una metaanotación en Spring Framework, que se utiliza para importar otras clases de configuración a la clase de configuración actual para combinar las funciones de múltiples clases de configuración. A través de @Importanotaciones, se pueden cargar otras clases de configuración en el contenedor Spring como definiciones de beans.
  • Las anotaciones se pueden utilizar @PropertySourcepara administrar y cargar fácilmente valores de atributos en archivos de propiedades, lo que hace que los valores de atributos en las clases de configuración sean más flexibles y configurables.

Paso 7: escriba la clase SpringMvcConfig

@Configuration
@ComponentScan("love.ljtxy.controller") // 扫描控制器组件所在的包
@EnableWebMvc // 启用Spring MVC功能
public class SpringMvcConfig {
    
    
}

ilustrar:

A través de la configuración anterior, Spring MVC puede escanear automáticamente las clases de controlador en el paquete especificado y proporcionar mapeo de solicitudes basado en anotaciones, análisis de parámetros, análisis de vistas y otras funciones, lo que hace que el desarrollo de aplicaciones web sea más conveniente y eficiente.

6.3 Desarrollo del módulo de funciones

Resumen de notas:

  • Paso 1: escribe la clase de entidad
  • Paso 2: escribir la interfaz de la capa Dao
    • @InsertLas anotaciones , @Update, @Delete, @Selectasocian declaraciones SQL con métodos.
    • La declaración SQL en la anotación utiliza marcadores de posición #{propertyName}para hacer referencia a los valores de atributo del objeto para implementar el enlace de parámetros dinámicos.
  • Paso 3: escribir la interfaz del servicio
    • En términos generales, al escribir la capa de interfaz de Servicio, necesita conocer el nombre y el significado.
    • En términos generales, al escribir una interfaz, debe devolver los resultados de la operación de este servicio.
  • Paso 4: escribir la capa de implementación de la interfaz de servicio
    • En términos generales, después de escribir la clase de implementación del Servicio, puede probar los métodos de la capa de Servicio.
  • Paso 5: probar la capa de servicio
    • @RunWithLas anotaciones se utilizan para especificar el corredor de prueba (ejecutor de prueba), lo que le dice a JUnit que use un corredor específico para ejecutar la prueba cuando se ejecuta la prueba.
    • @ContextConfigurationLas anotaciones se utilizan para especificar la información de configuración del contenedor Spring y decirle a JUnit qué configuraciones cargar antes de ejecutar la prueba.
  • Escribir la capa de presentación

Paso 1: escribe la clase de entidad

@Date
public class Book {
    
    
    private Integer id;
    private String type;
    private String name;
    private String description;
}

Paso 2: escriba la interfaz de la capa Dao

public interface BookDao {
    
    

    // 插入书籍
    @Insert("insert into tbl_book (type, name, description) values (#{type}, #{name}, #{description})")
    public void save(Book book);

    // 更新书籍
    @Update("update tbl_book set type = #{type}, name = #{name}, description = #{description} where id = #{id}")
    public void update(Book book);

    // 删除书籍
    @Delete("delete from tbl_book where id = #{id}")
    public void delete(Integer id);

    // 根据ID查询书籍
    @Select("select * from tbl_book where id = #{id}")
    public Book getById(Integer id);

    // 获取所有书籍
    @Select("select * from tbl_book")
    public List<Book> getAll();
}

ilustrar:

  • Estos métodos utilizan el método de anotación de MyBatis para especificar la declaración SQL correspondiente y asocian la declaración SQL con el método mediante anotaciones @Insert,,, . La declaración SQL en la anotación utiliza marcadores de posición para hacer referencia al valor del atributo del objeto para realizar la vinculación dinámica de parámetros.@Update@Delete@Select#{propertyName}
  • Utilice estos métodos para realizar cómodamente operaciones de bases de datos, como insertar libros, actualizar información de libros, eliminar libros, consultar libros individuales y obtener una lista de todos los libros.

Paso 3: escriba la interfaz del servicio

@Transactional
public interface BookService {
    
    

    /**
     * 保存
     *
     * @param book
     * @return
     */
    public boolean saveBookInfo(Book book);

    /**
     * 修改
     *
     * @param book
     * @return
     */
    public boolean updateBookInfo(Book book);

    /**
     * 按id删除
     *
     * @param id
     * @return
     */
    public boolean deleteBookInfo(Integer id);

    /**
     * 按id查询
     *
     * @param id
     * @return
     */
    public Book getBookInfo(Integer id);

    /**
     * 查询全部
     *
     * @return
     */
    public List<Book> getBookAllInfo();
}

Aviso:

  		当Spring使用了事务时,需要使用注解`@Transactional`来启用事务。若还需要对@Transactional做其余的配置,可以根据需求来进行决定

ilustrar:

  • En términos generales, al escribir la capa de interfaz de Servicio, necesita conocer el nombre y el significado.
  • En términos generales, al escribir una interfaz, debe devolver los resultados de la operación de este servicio.

Paso 4: escribir la capa de implementación de la interfaz de servicio

@Service
public class BookServiceImpl implements BookService {
    
    
    @Autowired
    private BookDao bookDao;

    public boolean save(Book book) {
    
    
        bookDao.save(book);
        return true;
    }

    public boolean update(Book book) {
    
    
        bookDao.update(book);
        return true;
    }

    public boolean delete(Integer id) {
    
    
        bookDao.delete(id);
        return true;
    }

    public Book getById(Integer id) {
    
    
        return bookDao.getById(id);
    }

    public List<Book> getAll() {
    
    
        return bookDao.getAll();
    }
}

ilustrar:

En términos generales, después de escribir la clase de implementación del Servicio, puede probar los métodos de la capa de Servicio.

Paso 5: probar la capa de servicio

@RunWith(SpringJUnit4ClassRunner.class) // 注解指定了运行测试的类为SpringJUnit4ClassRunner,这样就能够在测试过程中启动Spring容器。
@ContextConfiguration(classes = SpringConfig.class) //注解指定了使用哪个配置类来加载Spring容器。
public class BookServiceTest {
    
    

    @Autowired
    private BookService bookService;

    @Test
    public void testGetById(){
    
    
        // 测试根据ID获取图书信息的方法
        Book book = bookService.getById(1);
        System.out.println(book);
    }

    @Test
    public void testGetAll(){
    
    
        // 测试获取所有图书信息的方法
        List<Book> all = bookService.getAll();
        System.out.println(all);
    }
}

Reponer:

  • @RunWithLas anotaciones se utilizan para especificar el corredor de prueba (ejecutor de prueba), lo que le dice a JUnit que use un corredor específico para ejecutar la prueba cuando se ejecuta la prueba.
  • @ContextConfigurationLas anotaciones se utilizan para especificar la información de configuración del contenedor Spring y decirle a JUnit qué configuraciones cargar antes de ejecutar la prueba.

Paso 6: escribe la capa de presentación

@RestController
@RequestMapping("/books")
public class BookController {
    
    

    @Autowired
    private BookService bookService;

    @PostMapping
    public boolean save(@RequestBody Book book) {
    
    
        return bookService.save(book);
    }

    @PutMapping
    public boolean update(@RequestBody Book book) {
    
    
        return bookService.update(book);
    }

    @DeleteMapping("/{id}")
    public boolean delete(@PathVariable Integer id) {
    
    
        return bookService.delete(id);
    }

    @GetMapping("/{id}")
    public Book getById(@PathVariable Integer id) {
    
    
        return bookService.getById(id);
    }

    @GetMapping
    public List<Book> getAll() {
    
    
        return bookService.getAll();
    }
}

6.4 Encapsulación de datos de la capa de presentación

Resumen de notas:

  • Descripción general: Transferencia de datos e interacción entre el controlador (Controller) y la vista (View).

  • Paso 1: establecer la clase de resultado de retorno de datos unificados

    • El front-end recibe el formato de datos: crea la clase de modelo de resultados y encapsula los datos en el atributo de datos.
    • Formato de datos de recepción de front-end: encapsular mensajes especiales en el atributo de mensaje (msg)
    • El front-end recibe el formato de datos y encapsula los resultados de la operación en el atributo de código.
  • Paso 2: establecer el código de estado de devolución de datos unificados

    //状态码
    public class Code {
           
           
        public static final Integer SAVE_OK = 20011;
        public static final Integer DELETE_OK = 20021;
    }
    
  • Paso 3: optimizar las clases de la capa de presentación

    • Unifique el valor de retorno de cada método de controlador

​ En la capa de presentación (Capa de presentación), la encapsulación de datos se refiere a la encapsulación y conversión apropiada de los datos de solicitud y los datos de respuesta para facilitar la transferencia de datos y la interacción entre el controlador (Controlador) y la vista (Vista).

Paso 1: establecer la clase de resultado de retorno de datos unificados

@Date
public class Result {
    
    
    //描述统一格式中的数据
    private Object data;
    //描述统一格式中的编码,用于区分操作,可以简化配置0或1表示成功失败
    private Integer code;
    //描述统一格式中的消息,可选属性
    private String msg;

    public Result() {
    
    
    }

    public Result(Integer code,Object data) {
    
    
        this.data = data;
        this.code = code;
    }

    public Result(Integer code, Object data, String msg) {
    
    
        this.data = data;
        this.code = code;
        this.msg = msg;
    }
}

ilustrar:

​ Los campos en la clase Resultado no son fijos y se pueden aumentar o disminuir según sea necesario para proporcionar varios métodos de construcción para una fácil operación.

  • El front-end recibe el formato de datos: crea la clase de modelo de resultados y encapsula los datos en el atributo de datos.
  • Formato de datos de recepción de front-end: encapsular mensajes especiales en el atributo de mensaje (msg)
  • El front-end recibe el formato de datos y encapsula los resultados de la operación en el atributo de código.

Paso 2: establecer el código de estado de devolución de datos unificados

//状态码
public class Code {
    
    
    public static final Integer SAVE_OK = 20011;
    public static final Integer DELETE_OK = 20021;
    public static final Integer UPDATE_OK = 20031;
    public static final Integer GET_OK = 20041;

    public static final Integer SAVE_ERR = 20010;
    public static final Integer DELETE_ERR = 20020;
    public static final Integer UPDATE_ERR = 20030;
    public static final Integer GET_ERR = 20040;
}

Paso 3: optimizar las clases de la capa de presentación

//统一每一个控制器方法返回值
@RestController
@RequestMapping("/books")
public class BookController {
    
    

    @Autowired
    private BookService bookService;

    @PostMapping
    public Result save(@RequestBody Book book) {
    
    
        boolean flag = bookService.save(book);
        return new Result(flag ? Code.SAVE_OK:Code.SAVE_ERR,flag);
    }

    @PutMapping
    public Result update(@RequestBody Book book) {
    
    
        boolean flag = bookService.update(book);
        return new Result(flag ? Code.UPDATE_OK:Code.UPDATE_ERR,flag);
    }

    @DeleteMapping("/{id}")
    public Result delete(@PathVariable Integer id) {
    
    
        boolean flag = bookService.delete(id);
        return new Result(flag ? Code.DELETE_OK:Code.DELETE_ERR,flag);
    }

    @GetMapping("/{id}")
    public Result getById(@PathVariable Integer id) {
    
    
        Book book = bookService.getById(id);
        Integer code = book != null ? Code.GET_OK : Code.GET_ERR;
        String msg = book != null ? "" : "数据查询失败,请重试!";
        return new Result(code,book,msg);
    }

    @GetMapping
    public Result getAll() {
    
    
        List<Book> bookList = bookService.getAll();
        Integer code = bookList != null ? Code.GET_OK : Code.GET_ERR;
        String msg = bookList != null ? "" : "数据查询失败,请重试!";
        return new Result(code,bookList,msg);
    }
}

ilustrar:

En términos generales, el procesamiento de lógica de negocios se puede implementar en la capa de presentación, donde podemos configurar el procesamiento de devolución de los resultados de la operación.

6.5 Manejador de excepciones

Resumen de notas:

  • Descripción general: el controlador de excepciones (Exception Handler) es un mecanismo para detectar y manejar excepciones que ocurren en la aplicación .
  • Proceso de integración:
    • Paso 1: crear una nueva clase de manejo de excepciones
      • @RestControllerAdviceEs una anotación para el manejo de excepciones globales. Puede detectar y manejar excepciones en toda la aplicación y devolver los resultados del procesamiento al cliente en un formato unificado.
      • @ExceptionHandler(Exception.class)Las anotaciones se utilizan para identificar un método de manejo de excepciones y especificar el tipo de excepción que se detectará y manejará. Aquí, detecta Exceptionuna excepción de tipo.
  • Explicación de la anotación:
    • @RestControllerAdvice: es una anotación para el manejo de excepciones globales . Mejorar las clases de controlador desarrolladas en estilo Rest
    • @ExceptionHandler: establece el plan de manejo para la excepción especificada . La función es equivalente al método del controlador. Después de que ocurre una excepción, la ejecución del controlador original finaliza y se transfiere a la ejecución del método actual.

​El controlador de excepciones es un mecanismo para detectar y manejar excepciones que ocurren en las aplicaciones. En las aplicaciones web Java, los controladores de excepciones generalmente se usan para capturar excepciones que ocurren en el controlador (Controlador) y manejarlas y responder adecuadamente según sea necesario.

Las ubicaciones comunes y los desencadenantes comunes de fenómenos anormales son los siguientes:

  • Excepción lanzada dentro del marco: causada por uso ilegal
  • Excepción lanzada por la capa de datos: causada por una falla del servidor externo (por ejemplo: tiempo de espera de acceso al servidor)
  • Excepciones generadas por la capa empresarial: causadas por errores de escritura de la lógica empresarial (por ejemplo: atravesar operaciones de escritura empresarial, lo que genera excepciones de índice, etc.)
  • Excepciones generadas por la capa de presentación: causadas por la recopilación de datos, la verificación y otras reglas (por ejemplo: excepciones causadas por tipos de datos que no coinciden)
  • Excepción lanzada por la clase de herramienta: causada por la escritura imprecisa de la clase de herramienta y no ser lo suficientemente robusta (por ejemplo: la conexión que necesita liberarse no se ha liberado durante mucho tiempo, etc.)

Paso 1: crear una nueva clase de manejo de excepciones

En el paquete del controlador, cree una nueva clase ProjectExceptionAdvice

@RestControllerAdvice
public class ProjectExceptionAdvice {
    
    

    /**
     * 全局异常处理方法
     * @param ex 异常对象
     * @return 自定义的结果对象
     */
    @ExceptionHandler(Exception.class)
    public Result doException(Exception ex){
    
    
        return new Result(666,null);
    }
}

ilustrar:

  • @RestControllerAdviceEs una anotación para el manejo de excepciones globales. Puede detectar y manejar excepciones en toda la aplicación y devolver los resultados del procesamiento al cliente en un formato unificado.
  • @ExceptionHandler(Exception.class)La anotación se utiliza para identificar un método de manejo de excepciones, especificando el tipo de excepción que se detectará y manejará. Aquí, detecta Exceptionuna excepción de tipo.

Reponer:

  • Nombre:@RestControllerAdvice

    • Tipo: anotación de clase

    • Posición: encima de la definición de clase de mejora del controlador para el desarrollo RESTful

    • Función: Mejorar la clase de controlador desarrollada en estilo Rest.

    • ejemplo:

      @RestControllerAdvice
      public class ProjectExceptionAdvice {
               
               }
      
    • ilustrar:

      • Esta anotación viene con la anotación @ResponseBody y la anotación @Component, que tienen funciones correspondientes.
  • Nombre:@ExceptionHandler

    • Tipo: anotación de método

    • Ubicación: encima del método del controlador dedicado al manejo de excepciones.

    • Función: establece el plan de procesamiento para la excepción especificada . La función es equivalente al método del controlador. Después de que ocurre una excepción, la ejecución del controlador original finaliza y se transfiere al método actual para su ejecución.

    • ejemplo:

      @RestControllerAdvice
      public class ProjectExceptionAdvice {
               
               
          @ExceptionHandler(Exception.class)
          public Result doException(Exception ex){
               
               
              return new Result(666,null);
          }
      
    • Este tipo de método puede crear múltiples métodos para manejar las excepciones correspondientes según las diferentes excepciones manejadas.

6.6 Manejo de excepciones del proyecto

Resumen de notas:

  • Descripción general: el manejo de excepciones del proyecto se refiere a un mecanismo para capturar, manejar y proporcionar comentarios sobre diversas situaciones anormales durante el proceso de desarrollo .
  • Solución:
    • BusinessException: causada por operaciones irregulares del usuario
    • SystemException: excepción de operación de código esperada
    • Otras excepciones (Exception): excepciones inesperadas
  • Pasos
    • Paso 1: personalizar las excepciones a nivel del sistema del proyecto
      • Heredar la clase de excepción de tiempo de ejecución RuntimeException
      • Implemente métodos de construcción basados ​​​​en negocios, por ejemplo: SystemException (código entero, mensaje de cadena), SystemException (código entero, mensaje de cadena, causa arrojable)
    • Paso 2: personalizar las excepciones a nivel empresarial del proyecto
      • Heredar la clase de excepción de tiempo de ejecución RuntimeException
      • Implemente métodos de construcción basados ​​​​en negocios, por ejemplo: BusinessException (código entero, mensaje de cadena) 、 BusinessException (código entero, mensaje de cadena, causa arrojable)
    • Paso 3: personalizar la codificación de excepciones (adición continua)
    • Paso 4: desencadenar una excepción personalizada
    • Paso 5: Interceptar y manejar excepciones (puntos clave)
      • Defina el plan de manejo de excepciones del proyecto y use @ExceptionHandleresta anotación para manejar excepciones

El manejo de excepciones del proyecto se refiere a un mecanismo para capturar, procesar y dar retroalimentación sobre diversas situaciones anormales durante el proceso de desarrollo. El propósito del manejo de excepciones es garantizar la estabilidad y confiabilidad del sistema para brindar una buena experiencia de usuario.

Plan de manejo de excepciones del proyecto

  • Excepción empresarial
    • Envíe los mensajes correspondientes a los usuarios para recordarles las operaciones estandarizadas.
  • Excepción del sistema
    • Enviar mensajes fijos a los usuarios para apaciguarlos.
    • Enviar mensajes específicos al personal de operación y mantenimiento para recordar el mantenimiento.
    • Inicio sesión
  • Otras excepciones (Excepción)
    • Enviar mensajes fijos a los usuarios para apaciguarlos.
    • Enviar mensajes específicos a los programadores para recordar el mantenimiento (dentro del alcance esperado)
    • Inicio sesión

Paso 1: personalizar las excepciones a nivel del sistema del proyecto

//自定义异常处理器,用于封装异常信息,对异常进行分类
public class SystemException extends RuntimeException{
    
    
    private Integer code;

    public Integer getCode() {
    
    
        return code;
    }

    public void setCode(Integer code) {
    
    
        this.code = code;
    }

    public SystemException(Integer code, String message) {
    
    
        super(message);
        this.code = code;
    }

    // Throwable为异常报错的对象
    public SystemException(Integer code, String message, Throwable cause) {
    
    
        super(message, cause);
        this.code = code;
    }
}

ilustrar:

  • Las excepciones a nivel del sistema pueden deberse a errores causados ​​por errores de los programadores.
  • Para las variables miembro code, solo necesita implementar el método de código Set. Cuando lo uses más tarde, solo necesitas obtener el Código de este objeto.

Paso 2: personalizar las excepciones a nivel empresarial del proyecto

//自定义异常处理器,用于封装异常信息,对异常进行分类
public class BusinessException extends RuntimeException{
    
    
    private Integer code;

    public Integer getCode() {
    
    
        return code;
    }

    public void setCode(Integer code) {
    
    
        this.code = code;
    }

    public BusinessException(Integer code, String message) {
    
    
        super(message);
        this.code = code;
    }

    // Throwable为异常报错的对象
    public BusinessException(Integer code, String message, Throwable cause) {
    
    
        super(message, cause);
        this.code = code;
    }
}

ilustrar:

  • Las excepciones a nivel del sistema pueden deberse a problemas del sistema operativo o fallas en la conexión de la base de datos.

Paso 3: personalizar la codificación de excepciones (adición continua)

public static final Integer SYSTEM_ERR = 50001;
public static final Integer SYSTEM_TIMEOUT_ERR = 50002;
public static final Integer SYSTEM_UNKNOW_ERR = 59999;

public static final Integer BUSINESS_ERR = 60002;

Paso 4: activar una excepción personalizada

imagen-20230531135942393

ilustrar:

​ A través de simulación, solo la clasificación y lanzamiento de excepciones.

Paso 5: Interceptar y manejar excepciones

//@RestControllerAdvice用于标识当前类为REST风格对应的异常处理器
@RestControllerAdvice
public class ProjectExceptionAdvice {
    
    
    // 用于处理用户操作不当而导致的异常
    @ExceptionHandler(BusinessException.class)
    public Result doBusinessException(BusinessException ex){
    
    
        return new Result(ex.getCode(),null,ex.getMessage());
    }

    //@ExceptionHandler用于设置当前处理器类对应的异常类型
    @ExceptionHandler(SystemException.class)
    public Result doSystemException(SystemException ex){
    
    
        //记录日志
        //发送消息给运维
        //发送邮件给开发人员,ex对象发送给开发人员
        return new Result(ex.getCode(),null,ex.getMessage());
    }

    //除了自定义的异常处理器,保留对Exception类型的异常处理,用于处理非预期的异常
    @ExceptionHandler(Exception.class)
    public Result doOtherException(Exception ex){
    
    
        //记录日志
        //发送消息给运维
        //发送邮件给开发人员,ex对象发送给开发人员
        return new Result(Code.SYSTEM_UNKNOW_ERR,null,"系统繁忙,请稍后再试!");
    }
}

Paso 6: Comparación de los efectos del controlador de excepciones

imagen-20230531140236636

ilustrar:

Se puede ver que cuando el acceso a los recursos es normal y anormal, el sistema de software puede realizar indicaciones precisas.

7. interceptor

Resumen de notas:

  1. Descripción general:
  • Definición: Interceptor (Interceptor) es una tecnología comúnmente utilizada en el desarrollo web, que se utiliza para interceptar y procesar solicitudes durante el procesamiento de solicitudes.

  • Función: ejecutar el código preestablecido antes y después de la llamada al método especificado y evitar la ejecución del método original

  • La diferencia entre interceptores y filtros:

    • Diferentes pertenencias
    • El contenido del bloque es diferente
    • ……

    imagen-20230814122356401

  1. Caso de uso básico:
  • Paso 1: declarar el Bean del interceptor e implementar la interfaz HandlerInterceptor (nota: escanear y cargar el bean)
  • Paso 2: definir la clase de configuración
    • Método 1: definir una clase de configuración, heredar de WebMvcConfigurationSupport e implementar el método addInterceptor (nota: escanear y cargar la configuración)
    • Método 2: implementar la interfaz estándar webMvcConfigurer para simplificar el desarrollo (nota: fuerte intrusión)
  • Reponer:
    • Configurar el mapeo de recursos estáticos: addResourceHandlers, addResourceLocations
    • Configurar interceptores para recursos dinámicos: addInterceptors, addPathPatterns
  1. Parámetros del interceptor:
  • Preprocesamiento: parte del procesamiento se realiza antes de la interceptación de la solicitud.
  • Postprocesamiento: parte del procesamiento se realiza después de la interceptación de la solicitud.
  1. Flujo de trabajo del interceptor:
  • Interceptor: procesamiento de interceptor único

    imagen-20230531144547904

  • Cadena de interceptación: procesamiento de múltiples interceptores

    imagen-20230531154459978

7.1 Descripción general

7.1.1 Definición

​Interceptor es una tecnología comúnmente utilizada en el desarrollo web, que se utiliza para interceptar y procesar solicitudes durante el procesamiento de solicitudes. El interceptor puede realizar alguna lógica personalizada antes o después de que la solicitud ingrese al controlador para su procesamiento, como registro, verificación de permisos, preprocesamiento de parámetros de solicitud, etc.

imagen-20230603105043433

7.1.2 Función

Ejecute código preestablecido antes y después de la llamada al método especificado y evite la ejecución del método original. Las funciones son las siguientes:

  1. Verificación de permisos: los interceptores se pueden utilizar para verificar los permisos del usuario, como verificar si el usuario ha iniciado sesión, tiene permiso para realizar una operación, etc. Si la verificación del permiso falla, puede interrumpir la solicitud o realizar el procesamiento correspondiente.
  2. Registro: el interceptor se puede utilizar para registrar la información de registro de la solicitud, incluida la URL solicitada, los parámetros de la solicitud, el tiempo de la solicitud, etc., para facilitar el análisis estadístico posterior, la resolución de problemas y otros trabajos.
  3. Preprocesamiento de parámetros de solicitud: el interceptor puede preprocesar los parámetros de la solicitud antes de que la solicitud ingrese al controlador, como verificar, formatear y cifrar los parámetros para garantizar la exactitud y seguridad de los parámetros.
  4. Manejo de excepciones: los interceptores se pueden usar para capturar excepciones lanzadas en el controlador y realizar un manejo de excepciones unificado, como devolver una página de mensaje de error unificada, registrar registros de excepciones, etc.
  5. Procesamiento de respuesta de solicitud: el interceptor puede procesar la respuesta una vez que se completa el procesamiento de la solicitud, como configurar la información del encabezado de la respuesta, modificar el contenido de la respuesta, etc.
  6. Control de caché: los interceptores se pueden utilizar para controlar la estrategia de almacenamiento en caché de la respuesta, como configurar el tiempo de caché de la respuesta, verificar la validez del caché, etc.

Normalmente, en el desarrollo real, los interceptores se suelen utilizar para los permisos de Token.

7.1.3 La diferencia entre interceptores y filtros

Interceptor y Filter son componentes que se utilizan para procesar solicitudes en el desarrollo web, pero tienen las siguientes diferencias:

  1. El alcance de la aplicación es diferente: el interceptor es para el marco Spring MVC , es una interceptación basada en métodos y solo puede interceptar el método de procesamiento de solicitudes en el controlador. El filtro está definido por la especificación de Servlet, se basa en la interceptación de patrones de URL y puede interceptar todas las solicitudes, incluidos los recursos estáticos y las solicitudes de Servlet.

  2. El orden de ejecución es diferente: el interceptor se ejecuta antes o después del procesador (Controlador) y puede preprocesar o posprocesar la solicitud. Los filtros se ejecutan antes o después de que la solicitud ingrese al contenedor de servlet y pueden filtrar, modificar o empaquetar la solicitud.

  3. Diferentes funciones : los interceptores se utilizan principalmente para procesar la lógica empresarial de las solicitudes , como verificación de permisos, registro, manejo de excepciones, etc. Los filtros se utilizan principalmente para filtrar y modificar solicitudes , como conversión de codificación de caracteres, empaquetado de solicitudes, procesamiento de parámetros de solicitud, etc.

  4. El método de configuración es diferente: la configuración del interceptor se realiza en el archivo de configuración de Spring MVC , y las reglas de coincidencia de secuencia y ruta del interceptor deben configurarse manualmente. La configuración del filtro se realiza en el archivo web.xml y la ruta de interceptación y el orden del filtro se especifican configurando el patrón de URL.

  5. Propiedad diferente : Filter pertenece a la tecnología Servlet , Interceptor pertenece a la tecnología SpringMVC

  6. El contenido de la interceptación es diferente: Filter mejora todos los accesos e Interceptor solo mejora el acceso a springMVC.

imagen-20230603105732011

En términos generales, los interceptores son más flexibles y refinados, adecuados para procesar la lógica empresarial, y los filtros son más generales, adecuados para filtrar y modificar solicitudes. Al usarlo, puede seleccionar interceptores o filtros según las necesidades específicas para implementar las funciones correspondientes.

7.2 Implementación básica del interceptor de casos de uso

Paso 1: definir el interceptor

  • Declarar el Bean interceptor e implementar la interfaz HandlerInterceptor

Aviso:

Escanee y cargue beans, recuerde agregar @Componentanotaciones

@Component //拦截器
//定义拦截器类,实现HandlerInterceptor接口
//注意当前类必须受Spring容器控制
public class ProjectInterceptor implements HandlerInterceptor {
    
    
    @Override
    //原始方法调用前执行的内容
    //返回值类型可以拦截控制的执行,true放行,false终止
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    
    
        System.out.println("preHandle..."+contentType);
        return true;
    }

    @Override
    //原始方法调用后执行的内容
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    
    
        System.out.println("postHandle...");
    }

    @Override
    //原始方法调用完成后执行的内容
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    
    
        System.out.println("afterCompletion...");
    }
}

ilustrar:

En términos generales, los interceptores se utilizan para el procesamiento de la capa de presentación, por lo que los interceptores se colocan en el paquete del Controlador.

Paso 2: definir la clase de configuración

Método 1: definir la clase de configuración, heredar WebMvcConfigurationSupporte implementar el método addInterceptor (nota: escanear para cargar la configuración)

@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
    
    
    @Autowired
    private ProjectInterceptor projectInterceptor;

    /**
     * 配置静态资源映射
     */
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
    
    
        registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");
    }

    /**
     * 配置动态资源的拦截器
     */
    @Override
    protected void addInterceptors(InterceptorRegistry registry) {
    
    
        registry.addInterceptor(projectInterceptor).addPathPatterns("/books","/books/*");
    }
}

ilustrar:

  • A través de la configuración anterior, se logra el acceso a recursos estáticos y la configuración del interceptor para la ruta especificada.
  • Agregue un interceptor y establezca la ruta de acceso interceptada. Se pueden configurar varias rutas a través de parámetros variables

Método 2: implementar interfaces estándar webMvcConfigurerpara simplificar el desarrollo (nota: más intrusivo)

@Configuration
@ComponentScan({
    
    "com.itheima.controller"})
@EnableWebMvc
//实现WebMvcConfigurer接口可以简化开发,但具有一定的侵入性
public class SpringMvcConfig implements WebMvcConfigurer {
    
    
    @Autowired
    private ProjectInterceptor projectInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
    
    
        //配置多拦截器
        registry.addInterceptor(projectInterceptor).addPathPatterns("/books","/books/*");
    }
}

ilustrar:

Al implementar la interfaz WebMvcConfigurer, también se puede lograr el efecto de heredar la clase de configuración WebMvcConfigurationSupport para lograr la interceptación de recursos.

Aviso:

La implementación del interceptor mediante la implementación de la interfaz WebMvcConfigurer es muy intrusiva.

7.3 Parámetros del interceptor

7.3.1 Preprocesamiento

El preprocesamiento es un procesamiento realizado antes de la interceptación de la solicitud.

@Component
//定义拦截器类,实现HandlerInterceptor接口
//注意当前类必须受Spring容器控制
public class ProjectInterceptor implements HandlerInterceptor {
    
    
    @Override
    //原始方法调用前执行的内容
    //返回值类型可以拦截控制的执行,true放行,false终止
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    
    
        String contentType = request.getHeader("Content-Type");
        HandlerMethod hm = (HandlerMethod)handler;
        System.out.println("preHandle..."+contentType);
        return true;
    }
}

ilustrar:

La información en el encabezado de la solicitud se puede obtener de la solicitud y se puede extraer para facilitar la operación.

Reponer:

  • parámetro:
    • solicitud: solicitar objeto
    • respuesta: objeto de respuesta
    • controlador: el objeto controlador llamado es esencialmente un objeto de método, que vuelve a empaquetar el objeto Método en tecnología de reflexión.
  • valor de retorno
    • El valor de retorno es falso y el procesador interceptado no se ejecutará.

7.3.2 Postprocesamiento

public void postHandle(HttpServletRequest request,
                       HttpservletResponse response,
                       object handler,
                       ModelAndview modelAndView) throws Exception {
    
    
    System.out.println( "postHandle..." );
}

Reponer:

modelAndView: si se completa la ejecución del procesador y se devuelve el resultado, los datos y la información de la página correspondientes se pueden leer y ajustar.

7.4 Flujo de trabajo del interceptor (puntos clave)

7.4.1Proceso básico

imagen-20230531144547904

ilustrar:

  • Cuando no hay interceptor, la solicitud pasa a través de la capa de presentación sin ninguna interceptación.
  • Cuando hay un interceptor, la solicitud se interpretará como interceptar y procesar el contenido ejecutado antes de llamar al método original, el contenido ejecutado después de llamar al método original y el contenido ejecutado después de llamar al método original.
  • Si la respuesta es Verdadera después del procesamiento de la interceptación, significa que la solicitud se libera; si la respuesta es Falsa, significa que el contenido de la solicitud se intercepta.

7.4.2 Cadena de interceptación

imagen-20230531154459978

ilustrar:

  • Si el tercer interceptor devuelve False, solo se ejecutarán los postprocesadores de la primera y segunda intercepciones.
  • Si el segundo interceptor devuelve False, solo se ejecutará el posprocesador de la primera interceptación.
  • Si el primer interceptor devuelve False, ninguno de los postprocesadores interceptados se ejecutará.

8. Proceso de ejecución

Resumen de notas:

Esta sección es más complicada, podemos consultar notas externas para aprender: notas de springmvc (Shang Silicon Valley)_No se puede escribir 314 blog-CSDN blog

8.1 Componentes comunes de SpringMVC

  • DispatcherServlet : DispatcherServlet es el controlador front-end del marco Spring MVC . Es responsable de recibir todas las solicitudes HTTP y distribuirlas al procesador correspondiente para su procesamiento. DispatcherServlet es el componente central del marco Spring MVC, que distribuye todos los aspectos del proceso de procesamiento de solicitudes.
  • HandlerMapping : HandlerMapping es una implementación del mapeador de procesador, que se asigna a un procesador específico (Controlador) de acuerdo con la ruta URL solicitada y determina el procesador correspondiente a la solicitud . HandlerMapping se puede configurar de acuerdo con diferentes estrategias de mapeo, como basado en rutas URL, basado en anotaciones, etc.
  • Handler : Handler significa procesador , también llamado Controlador . Es el ejecutor específico de la lógica empresarial, responsable de procesar las solicitudes y devolver los resultados del procesamiento. En Spring MVC, Handler puede ser una clase POJO ordinaria que maneja solicitudes a través de métodos.
  • HandlerAdapter : HandlerAdapter es un adaptador de procesador , que se utiliza para ejecutar el método del procesador y adaptar los parámetros de la solicitud para que pueda procesar correctamente la solicitud. HandlerAdapter selecciona el adaptador apropiado para ejecutar el método del procesador según el tipo de procesador y el tipo de parámetro del método de procesamiento.
  • ViewResolver : ViewResolver es un solucionador de vistas que presenta los resultados del procesamiento en la vista final. Analiza objetos de vista específicos según el nombre de vista lógica devuelto por el procesador, como ThymeleafView, InternalResourceView, RedirectView, etc. ViewResolver es responsable de pasar los datos del modelo a la vista y, en última instancia, presentarlos al usuario.
  • Ver : Ver significa ver , que es responsable de mostrar los resultados finales del procesamiento al usuario. Las vistas pueden ser páginas HTML, datos JSON, documentos XML, etc. En Spring MVC, la vista generalmente la representa el motor de plantillas y los datos del modelo se completan en la plantilla para generar la vista final.

imagen-20230602102312053

Estos componentes trabajan juntos para completar el procesamiento de solicitudes y la generación de respuestas. DispatcherServlet actúa como un controlador de front-end para recibir solicitudes, HandlerMapping determina el procesador correspondiente a la solicitud, HandlerAdapter ejecuta el método del procesador, ViewResolver analiza la vista y View es responsable de la representación final. Este flujo de procesamiento es el mecanismo central en el marco Spring MVC. Al configurar y combinar estos componentes, se pueden implementar de manera flexible diferentes procesamientos de solicitudes y lógicas de representación de vistas.

8.2Proceso de inicialización de DispatcherServlet

DispatcherServlet es esencialmente un Servlet, por lo que naturalmente sigue el ciclo de vida del Servlet. Macroscópicamente, es el ciclo de vida del Servlet para la programación.

imagen-20230602094211246

ilustrar:

1. La clase GenericServlet implementará la interfaz de Servicio y anulará el método Init.

imagen-20230602112204665

ilustrar:

  • Debido a que Servler es una interfaz, la clase GenericServlet implementará la interfaz de Servicio y anulará el método Init.
  • Debido a que la clase HttpServlet tiene una relación de herencia con GenericServlet, los dos métodos init de la clase GenericServlet permanecerán en la clase HttpServlet.

2. La clase HttpServlet no anula el método init en la clase GenericServlet

imagen-20230602112719365

ilustrar:

Aunque la clase HttpServlet hereda la clase GenericServlet, no anula el método init en la clase GenericServlet.

3. La clase HttpServletBean anula el método init en la clase GenericServlet y llama al método initServletBean.

imagen-20230602112804189

ilustrar:

La clase HttpServletBean anula el método init en la clase GenericServlet

imagen-20230602113308369

ilustrar:

En el método init, la clase HttpServletBean llama a un método importante, el método initServletBean, para inicializar el ServletBean.

4. La clase FrameworkServler anula el método initServletBean en la clase HttpServletBean

imagen-20230602113741285

ilustrar:

La clase FrameworkServler llama al método de inicialización del contenedor SpringMVC IOC this.initWebApplicationContext();en el método initServletBean;

5. En la clase FrameworkServler, se llamará al método initWebApplicationContext.

imagen-20230602114621108

ilustrar:

Porque cuando este método se ejecuta por primera vez, el WebApplicationContext creado está vacío, por lo que this.createWebApplicationContext(rootContext); se llamará a este método para crear el WebApplicationContext.

5.1 En la clase FrameworkServler, llame al método createWebApplicationContext para crear un WebApplicationContext

imagen-20230602114841908

imagen-20230602191454335

ilustrar:

Llame al método wac.setParent(parent); en la clase FrameworkServler para configurar el contenedor Spring IOC como el contenedor principal de Spring MVC

5.2 En la clase FrameworkServler, llame a los métodos this.onRefresh(wac) y this.getServletContext().setAttribute(attrName, wac);

imagen-20230602192539137

ilustrar:

  • Llamar al método this.onRefresh (wac) ejecutará el método OnRefresh en la subclase DispatcherServlet para inicializar la estrategia.

    imagen-20230602193255953

  • Llame a este método.getServletContext().setAttribute(attrName, wac); para compartir el objeto webApplicationContext en el dominio de la aplicación

6. En la clase DispatcherServler, se anulará el método onRefresh en la clase FrameworkServler.

imagen-20230602193437015

imagen-20230602193510752

ilustrar:

Los distintos contenedores inicializados en el interior se cargan en realidad cuando se inicializa DispatcherServlet.

8.3Proceso del servicio DispatcherServlet

1. La clase GenericServlet implementará la interfaz de Servicio y heredará este método de Servicio.

imagen-20230602194934369

ilustrar:

En la clase GenericServlet, el método de servicio en la interfaz de Servicio no se anula, sino que se hereda directamente.

2. En la clase HttpServlet, se reescribe el método Servicio en la clase GenericServlet.

imagen-20230602195300896

ilustrar:

​ En el método Servicio de la clase HttpServlet, los objetos ServletRequest y ServletResponse se convierten en subclases HttpServletRequest y HttpServletRequest, objetos HttpServletResponse

3. En el método de servicio de la clase HttpServlet, distribuya la solicitud.

imagen-20230602195750111

ilustrar:

Se ejecutan diferentes métodos correspondientes a diferentes funciones.

4. En HttpServletBean, el método de servicio en la clase HttpServlet y el método que comienza con do no se reescriben.

imagen-20230602195928441

ilustrar:

En la clase HttpServlet, el método de servicio en la clase HttpServlet y el método que comienza con do no se reescriben.

5. En la clase FramesServlet, el método this.processRequest de esta clase se ejecutará de todos modos

imagen-20230602200359274

ilustrar:

El método super.service (solicitud, respuesta) ejecutará el método de servicio en HttpServlet en lugar de la clase HttpServiceBean, porque no hay ningún método de servicio implementado en la clase HttpServiceBean.

imagen-20230602200529945

ilustrar:

Un método importante doService se implementa en el método ProcessRequest en la clase FramesServlet.

imagen-20230602200606022

ilustrar:

En el método doService de la clase FramesServlet, se descubre que doService es un método de clase abstracto. Por lo tanto, necesitamos ver cómo implementar este método en una subclase de la clase FramesServlet.

6. En la clase DispatcherServlet, el método this.doDispatch(solicitud, respuesta); eventualmente se ejecutará para procesar el servicio.

imagen-20230602201202436

8.4El proceso de llamada del componente DisPatcheServlet para procesar la solicitud

1. En la clase DispatcherServlet, asigne valores a la cadena de ejecución del procesamiento mediante mappedHandler = this.getHandler(processedRequest);

imagen-20230603100700034

ilustrar:

  • En la línea 472 HandlerExecutionChain mappedHandler = null;, mappedHandler se denomina cadena de ejecución, incluidos los métodos del controlador (procesadores), las colecciones de interceptores y los índices de interceptores.

    imagen-20230603101356041

imagen-20230603101506491

ilustrar:

  • HandlerAdapter se utiliza para llamar a los métodos del controlador.

    imagen-20230603101557702

imagen-20230603101946004

ilustrar:

El método ha.handle se utiliza en el adaptador para procesar los tipos de parámetros, solicitar encabezados y solicitar cookies del método de solicitud.

imagen-20230603102443189

ilustrar:

Se puede encontrar que en el método doDispatch de la clase DispatcherServler, no existe ningún método para representar la vista. De hecho, el método this.processDispatchResult es un método utilizado para procesar los pasos posteriores, en este método la vista se procesará posteriormente.

8.5 Proceso de ejecución (comprensión)

Para ser agregado……

Gasolinera de conocimiento (puntos clave)

1.La diferencia entre @RequestBody y @RequestParam

  • la diferencia
    • @RequestParam se utiliza para recibir parámetros de dirección URL y parámetros de formulario [aplicación/x-www-form-urlencoded]
    • @RequestBody se utiliza para recibir datos json [aplicación/json]
  • solicitud
    • En desarrollos posteriores, se envían principalmente datos en formato json y @RequestBody se usa ampliamente.
    • Si envía datos en formato que no sea json, utilice @RequestParam para recibir los parámetros de la solicitud.

2. En Idea, abra el diagrama de herencia de relación de clases.

Tecla de acceso directo: Ctrl+H

imagen-20230530141253472

3.@RequestBody @RequestParam @PathVariable diferencia

  • la diferencia
    • @RequestParam se utiliza para recibir parámetros de dirección URL o parámetros de formulario.
    • @RequestBody se utiliza para recibir datos json
    • @PathVariable se usa para recibir parámetros de ruta, use {nombre de parámetro} para describir los parámetros de ruta
  • solicitud
    • En desarrollos posteriores, al enviar más de 1 parámetro de solicitud, el formato json es el principal y @RequestBody se usa ampliamente.
    • Si envía datos en formato que no sea json, utilice @RequestParam para recibir los parámetros de la solicitud.
    • Utilice RESTful para el desarrollo. Cuando la cantidad de parámetros es pequeña, como 1, puede usar @PathVariable para recibir la variable de ruta de solicitud, que generalmente se usa para pasar el valor de identificación.

4. La diferencia entre @RestControllerAdvice y @ControllerAdvice

@RestControllerAdvicey @ControllerAdviceson anotaciones utilizadas para el manejo global de excepciones y el enlace de datos globales en Spring MVC. Sus diferencias son las siguientes:

  1. @RestControllerAdviceEs una anotación combinada de @ControllerAdvicey @ResponseBody, que representa un potenciador del controlador para el manejo global de excepciones y el enlace de datos globales, y que devuelve los resultados al cliente en formato JSON.
  2. @ControllerAdvicees un potenciador de controlador para el manejo global de excepciones y enlace de datos global, que se puede aplicar a todas las clases de controlador anotadas con @Controllero .@RestController
  3. Las clases que usan anotaciones pueden usar y anotaciones @RestControllerAdviceen métodos para implementar el manejo global de excepciones, el enlace @ExceptionHandlerde datos y el preprocesamiento.@InitBinder@ModelAttribute
  4. Las clases que usan anotaciones pueden usar y anotaciones @ControllerAdviceen métodos para implementar el manejo global de excepciones, el enlace @ExceptionHandlerde datos y el preprocesamiento. Pero los resultados devueltos deben convertirse al formato JSON mediante anotaciones u otros métodos.@InitBinder@ModelAttribute@ResponseBody

En resumen, la principal diferencia es el formato de los resultados devueltos. @RestControllerAdviceLos resultados devueltos por la clase anotada se devolverán directamente al cliente en formato JSON, mientras que @ControllerAdvicela clase anotada necesita utilizar @ResponseBodyanotaciones u otros métodos para convertir los resultados al formato JSON y devolverlos al cliente.

5.SpringMVC admite rutas estilo hormiga

? : representa cualquier carácter individual

*: representa 0 o más caracteres

**: Indica uno o más niveles de directorios

Nota: Al usar , solo puedes usar el método // xxx

6.La relación entre Modelo, Mapa, ModelMap y ModelAndView

imagen-20230601084245953

7.AbstractAnnotationConfigDispatcherServletInitializer y AbstractDispatcherServletInitializer

AbstractAnnotationConfigDispatcherServletInitializery AbstractDispatcherServletInitializerson clases abstractas en Spring MVC que se utilizan para configurar e inicializar DispatcherServlet.

  1. AbstractAnnotationConfigDispatcherServletInitializer:
    • AbstractAnnotationConfigDispatcherServletInitializerEs una clase abstracta, heredada de AbstractDispatcherServletInitializer.
    • Esta clase se utiliza para configurar e inicializar DispatcherServlet según la configuración de Java.
    • Al heredar esta clase e implementar sus métodos abstractos, puede configurar clases relacionadas con RootConfig y ServletConfig, así como rutas de mapeo de Servlet, etc.
    • Se utiliza AnnotationConfigWebApplicationContextpara cargar la clase de configuración y asociarla con DispatcherServlet.
  2. AbstractDispatcherServletInitializer:
    • AbstractDispatcherServletInitializerEs una clase abstracta y WebApplicationInitializerla clase de implementación de la interfaz.
    • Esta clase se utiliza para configurar e inicializar DispatcherServlet según la configuración XML tradicional.
    • Se puede utilizar para crear y registrar DispatcherServlet y configurar la ruta de mapeo de Servlet, etc.
    • Al heredar esta clase e implementar los métodos abstractos en ella, puede configurar las rutas de los archivos de configuración XML relevantes de RootConfig y ServletConfig.

Resumen: AbstractAnnotationConfigDispatcherServletInitializerla clase abstracta de DispatcherServlet se configura e inicializa según la configuración de Java, AbstractDispatcherServletInitializerpero clase abstracta de DispatcherServlet se configura e inicializa según la configuración XML tradicional. Proporcionan diferentes formas de configurar e inicializar DispatcherServlet, lo que permite a los desarrolladores elegir el método apropiado según sus preferencias y necesidades del proyecto.

8. Anotación @RequestHeader (énfasis)

@RequestHeaderLas anotaciones se utilizan para vincular valores en los encabezados de solicitud a los parámetros del método. Se puede utilizar para obtener el valor de un encabezado de solicitud específico u obtener el valor de todos los encabezados de solicitud. Esta anotación se puede aplicar a parámetros de métodos, métodos y métodos de controlador de nivel de clase.

  • Obtener el valor de un encabezado de solicitud específico
@GetMapping("/example")
public void exampleMethod(@RequestHeader("User-Agent") String userAgent) {
    
    
    // 处理方法逻辑
}
  • Obtenga los valores de todos los encabezados de solicitud
@GetMapping("/init2")
public void init2(@RequestHeader Map<String, String> headerMap) {
    
    
    
    // 使用Map接收所有的请求头
    System.out.println(headerMap);
    // js中使用header名为addressList,使用map接收后需要使用addresslist
    System.out.println(headerMap.get("addresslist"));  
    
}

9. Anotación @CookieValue (énfasis)

@CookieValueLas anotaciones se utilizan para vincular valores en Cookie a parámetros de método. Se puede utilizar para obtener el valor de una cookie específica o para obtener el valor de todas las cookies. Esta anotación se puede aplicar a parámetros de métodos, métodos y métodos de controlador de nivel de clase.

  • Obtener el valor de un encabezado de solicitud específico
@GetMapping("/example")
public void exampleMethod(@CookieValue("sessionId") String sessionId) {
    
    
    // 处理方法逻辑
}
  • Obtenga los valores de todos los encabezados de solicitud
@GetMapping("/example")
public void exampleMethod(@CookieValue Map<String, String> cookies) {
    
    
    // 处理方法逻辑
    for (Map.Entry<String, String> entry : cookies.entrySet()) {
    
    
        String cookieName = entry.getKey();
        String cookieValue = entry.getValue();
        // 处理每个Cookie的逻辑
    }
}

10.El contenedor HttpServlet responde al proceso de solicitud del cliente web

1) El cliente web envía una solicitud Http al contenedor de servlet;

2) El contenedor de servlet analiza la solicitud HTTP del cliente web;

3) El contenedor de servlet crea un objeto HttpRequest y encapsula la información de la solicitud Http en este objeto;

4) El contenedor de Servlet crea un objeto HttpResponse;

5) El contenedor de servlet llama al método de servicio de HttpServlet, en este método se determinará si se ejecuta doGet o doPost según el método de la solicitud, y los objetos HttpRequest y HttpResponse se pasan al objeto HttpServlet como parámetros del método de servicio;

6) HttpServlet llama a métodos relacionados de HttpRequest para obtener información de solicitud HTTP;

7) HttpServlet llama a métodos relacionados de HttpResponse para generar datos de respuesta;

8) El contenedor de servlet envía el resultado de la respuesta de HttpServlet al cliente web.

Supongo que te gusta

Origin blog.csdn.net/D_boj/article/details/132287050
Recomendado
Clasificación