Exploración profunda de Spring MVC: creación de aplicaciones web elegantes


prefacio

Spring MVC es uno de los marcos web más populares en Java. Proporciona a los desarrolladores herramientas potentes y una arquitectura flexible para ayudar a crear aplicaciones web eficientes, escalables y fáciles de mantener. Este artículo profundizará en los conceptos centrales, los métodos de uso y las operaciones prácticas de Spring MVC.

1. ¿Qué es Spring MVC?

1.1 ¿Qué es MVC?

Antes de comprender qué es Spring MVC, primero debemos comprender qué es MVC.

MVC es la abreviatura de "Mode View Controller", que es un patrón de diseño de software que se utiliza para dividir la aplicación en tres componentes principales, a saber: Modelo (modelo), Vista (vista) y Controlador (controlador) . Cada componente tiene su propia responsabilidad única y trabajan juntos para lograr un diseño en capas y un bajo acoplamiento de la aplicación.

  • Modelo : Responsable de gestionar los datos y la lógica de negocio de la aplicación. Es independiente de la vista y del controlador, ya que proporciona una interfaz de datos para que la vista muestre datos y también puede aceptar instrucciones del controlador para actualizar el estado de los datos.

  • Ver (ver) : Responsable de mostrar datos al usuario y pasar la entrada del usuario al controlador. Generalmente es la presentación de la interfaz de usuario, como páginas HTML, controles de la interfaz de usuario, etc.

  • Controlador (controlador) : actúa como intermediario entre el modelo y la vista, maneja la solicitud del usuario y responde. Acepta entradas del usuario, actualiza el estado del modelo según la entrada y selecciona la vista adecuada para mostrar los datos actualizados.

MVC 模式的优点在于它能够是代码分离,使得应用程序更易于维护和实现. Por ejemplo, cuando necesita cambiar la apariencia de su aplicación, solo necesita cambiar la capa de vista sin afectar el modelo y la lógica del controlador. Este diseño de desacoplamiento permite a los miembros del equipo desarrollar diferentes componentes en paralelo, mejorando así la eficiencia del desarrollo.

1.2 ¿Qué es Spring MVC?

Spring MVC es un marco web en el marco Spring para crear aplicaciones web basadas en Java . Es un framework liviano, flexible y potente que utiliza el patrón de diseño MVC (Modelo-Vista-Controlador) para dividir la aplicación en tres componentes principales: Modelo (Modelo), Vista (Vista) y Controlador (Controlador) .

Específicamente, Spring MVC se define de la siguiente manera:

  1. Marco web : Spring MVC se centra en procesar solicitudes y respuestas de aplicaciones web y proporciona funciones centrales para procesar solicitudes HTTP y crear páginas web.

  2. Basado en Servlet API : Spring MVC está construido sobre Java Servlet API y utiliza un contenedor Servlet para manejar solicitudes y respuestas HTTP, por lo que puede integrarse perfectamente con contenedores web Java comunes.

  3. Patrón de diseño MVC : Spring MVC adopta el patrón de diseño MVC, que divide la aplicación en tres componentes principales, de modo que las responsabilidades de cada componente están claramente separadas, mejorando así la capacidad de mantenimiento y prueba del código.

  4. Ligero y flexible : Spring MVC es un marco liviano que no requiere configuraciones ni dependencias complejas y tiene una alta flexibilidad, lo que permite a los desarrolladores personalizar el proceso de procesamiento de solicitudes de acuerdo con necesidades específicas.

  5. Integración con Spring : Spring MVC es parte del marco Spring, por lo que se puede integrar perfectamente con otros componentes Spring (como Spring Core, Spring Boot, etc.) para disfrutar de las ricas funciones y la conveniencia del ecosistema Spring.

Spring MVC asigna solicitudes de URL a los métodos de controlador correspondientes a través del mapeo de controladores (Handler Mapping). El método del controlador procesa la solicitud y actualiza el estado del modelo, y luego selecciona la vista adecuada para mostrar los datos al usuario. También proporciona un solucionador de vistas (View Resolver), que se utiliza para asignar la vista lógica devuelta por el controlador a una tecnología de vista específica (como JSP, Thymeleaf, etc.).

En general, Spring MVC es uno de los marcos más populares en el desarrollo web Java y proporciona funciones y características ricas que permiten a los desarrolladores crear rápidamente aplicaciones web eficientes y fáciles de mantener.

2. Creación del proyecto Spring MVC.

2.1 Creación de proyectos

La creación del proyecto Spring MVC es la misma que la creación del proyecto Spring Boot, porque al crear el proyecto Spring Boot antes, siempre se introduce una Spring Webdependencia llamada. Por lo tanto, cuando se introduce esta dependencia al crear un proyecto Spring Boot, nuestro proyecto se convierte en un proyecto Spring MVC.

2.2 El primer programa Spring MVC: Hola mundo

demoCree una clase de capa de control en el directorio y , TestControllercuando se acceda a través de un navegador, aparecerá "Hola mundo" en la página:

@RestController
public class TestController {
    
    
    @RequestMapping("/hello")
    public String hello(){
    
    
        return "Hello World";
    }
}

Ejecute la clase de inicio y acceda a ella a través de un navegador http://localhost:8080/hellopara obtener los siguientes resultados:

3. Anotación @RequestMapping

En Spring MVC, @RequestMappinges una anotación muy importante para asignar solicitudes HTTP a métodos de procesamiento del controlador. A través de @RequestMappinganotaciones, podemos definir rutas URL, métodos de solicitud HTTP y parámetros de solicitud iguales a la relación de mapeo de los métodos del controlador.

3.1 Atributos comunes

Al ver @RequestMappingel código fuente de la anotación, puede ver que contiene muchos atributos:

Los siguientes son @RequestMappingatributos comunes de las anotaciones y sus descripciones:

Nombre del Atributo ilustrar
name Establezca el nombre del método del controlador para referencia en otros componentes.
value Especifica la ruta URL, que puede ser una cadena o una matriz de cadenas.
path Equivalente al valueatributo, utilizado para especificar la ruta URL, que puede ser una cadena o una matriz de cadenas.
method Especifica el método de solicitud HTTP, que puede ser un valor de enumeración RequestMethod o una matriz RequestMethod.
params Especifica la condición del parámetro de solicitud, que puede ser una cadena o una matriz de cadenas.
headers Especifica la condición del encabezado de la solicitud HTTP, que puede ser una cadena o una matriz de cadenas.
consumes Especifica el tipo de medio Content-Type de la solicitud, que puede ser una cadena o una matriz de cadenas.
produces Especifica el tipo de medio Content-Type de la respuesta, que puede ser una cadena o una matriz de cadenas.

@RequestMappingLa anotación es una metaanotación, utilizada a su vez por otras anotaciones como @GetMapping, y . Al configurar diferentes atributos, puede definir de manera flexible condiciones como el mapeo de URL de los métodos del controlador, los métodos de solicitud HTTP, los parámetros de solicitud y los encabezados de solicitud, para lograr un procesamiento de solicitudes diversificado.@PostMapping@PutMapping@DeleteMapping

3.2 Anotaciones a nivel de método y de clase

@RequestMappingLas anotaciones se pueden utilizar tanto a nivel de método como a nivel de clase.

Nivel de método:

A nivel de método, la anotación @RequestMapping se utiliza para especificar una ruta de mapeo de solicitud específica. Por ejemplo:

@Controller
public class UserController {
    
    
    // 方法级别路径为"/profile"
    // 最终请求路径为"/profile"
    @RequestMapping("/profile")
    public String userProfile() {
    
    
        // 处理方法逻辑
        return "profile";
    }
}

nivel de clase:

A nivel de clase, @RequestMappinglas anotaciones se utilizan para especificar una ruta principal común para todos los métodos de controlador en esa clase. Por ejemplo:

@Controller
@RequestMapping("/users")
public class UserController {
    
    
    // 类中所有方法的父路径为"/users"
    // 具体路径为"/users/profile"
    @RequestMapping("/profile")
    public String userProfile() {
    
    
        // 处理方法逻辑
        return "profile";
    }
}

3.3 @GetMapping, @PostMapping, @PutMapping, @DeleteMapping

Volviendo al primer programa "Hello World", podemos acceder a él a través de un navegador http://localhost:8080/helloy luego generar "Hello World" en la página.

Entonces, ¿qué método utiliza esta solicitud HTTP?


Se puede encontrar a través de la captura de paquetes del navegador que se utiliza la solicitud GET, entonces, ¿se admiten otras solicitudes?

Envíe una solicitud POST a través de Postman y descubra que el contenido devuelto también se puede obtener:

Además, envíe solicitudes de métodos PUT y DELETE y descubra que se pueden obtener los resultados, es decir, de forma predeterminada, @RequestMappingtodos los métodos son compatibles con anotaciones. Por supuesto, si desea admitir solo un determinado método, puede methodespecificarlo a través de su atributo, como especificar el método GET:


Luego, envíe una solicitud POST a través de Postman nuevamente en este momento:


Se descubre que el código de estado devuelto en este momento es 405, es decir, el método de solicitud POST no es compatible.

Para simplificar el uso de anotaciones @RequestMapping, Spring MVC proporciona anotaciones abreviadas más específicas: @GetMapping, y . Estas anotaciones corresponden a los métodos de solicitud GET, POST, PUT y DELETE de HTTP, que pueden hacer que el código sea más conciso e intuitivo.@PostMapping@PutMapping@DeleteMapping

Por ejemplo, el código anterior podría @GetMappingreemplazarse por:

@RestController
public class TestController {
    
    
    @GetMapping("/hello")
    public String hello(){
    
    
        return "Hello World";
    }
}

4. Spring MVC obtiene parámetros

En el desarrollo web, al procesar una solicitud enviada por un usuario, a menudo es necesario obtener parámetros de la solicitud para su posterior procesamiento. Spring MVC proporciona una variedad de formas de obtener parámetros, incluida la obtención de parámetros simples, la obtención de objetos, la configuración del cambio de nombre de los parámetros y la configuración de si se deben pasar parámetros, etc.

4.1 Obtener parámetros simples

4.1.1 Obtener por cadena de consulta URL

En una solicitud HTTP, la cadena de consulta es la parte del parámetro en la URL que sigue al signo de interrogación, por ejemplo: http://example.com?name=zhangsan&age=25. @RequestParamPodemos usar anotaciones para obtener los valores de los parámetros en la cadena de consulta agregando parámetros en el método del controlador .

@RestController
public class TestController {
    
    
    @GetMapping("/get")
    public String  getParam(@RequestParam String name, @RequestParam Integer age){
    
    
        return "name = " + name + ", age = " + age;
    }
}


En el caso de 查询字符串中的参数名和getParam1 , la anotación se puede omitir y Spring MVC vinculará automáticamente el valor del parámetro correspondiente en la solicitud al parámetro del método. Por ejemplo:中的参数名称一样@RequestParam

@RestController
public class TestController {
    
    
    @GetMapping("/get")
    public String  getParam(@RequestParam String name, @RequestParam Integer age){
    
    
        return "name = " + name + ", age = " + age;
    }
}

4.1.2 Pasar el formulario

Cuando se envía el formulario, @RequestParamlos valores de los parámetros en el formulario también se pueden obtener mediante anotaciones. En este momento, el método para obtener los parámetros en la cadena de consulta es básicamente el mismo que el anterior, excepto que el método HTTP se convierte en POST:

Página de formulario:

<form action="/submit" method="post">
    <input type="text" name="name">
    <input type="number" name="age">
    <input type="submit" value="提交">
</form>

Cómo conseguirlo:

@RestController
public class TestController {
    
    
    @PostMapping("/submit")
    public String submitForm(@RequestParam String name, @RequestParam Integer age){
    
    
        return "name = " + name + ", age = " + age;
    }
}

Enviar datos del formulario a través de Postman:

4.2 Obtener Objetos

Crea una clase de entidad User:

4.2.1 Pasar por múltiples parámetros

En este punto, los parámetros se pueden pasar a través de la cadena de consulta en la URL o enviar a través namedel formulario . Siempre que el nombre del parámetro pasado coincida con el nombre del parámetro en la clase, Spring MVC vinculará automáticamente los parámetros en la solicitud al objeto. medio.ageformUserUser

@RestController
public class TestController {
    
    
    @RequestMapping("/user")
    public String getUser(User user){
    
    
        return user.toString();
    }
}

Acceso a través del navegador http://localhost:8080/user?name=zhangsan&age1=25:

Por supuesto, si los nombres de los parámetros no coinciden, no se obtendrán los parámetros correspondientes:

4.2.2 Recibir objeto JSON a través de @RequestBody

Cuando el cliente envía datos en formato JSON, @RequestBodyse pueden utilizar anotaciones para vincular los datos JSON en el cuerpo de la solicitud a objetos Java.

@RestController
public class TestController {
    
    
    @RequestMapping("/user")
    public String getJsonUser(@RequestBody User user){
    
    
        return user.toString();
    }
}

Envíe el contenido en el siguiente formato JSON a través de Postman:

{
    
    
    "name": "zhangsan",
    "age": 25
}

resultado:

4.3 Establecer el cambio de nombre de los parámetros a través de @RequestParam

Cuando los parámetros de front-end y back-end no coinciden, si no lo maneja, no podrá obtener los parámetros deseados correctamente. En este momento, puede configurar el cambio de nombre @RequestParamde los parámetros a través de anotaciones.

Puede ver el código fuente en el código Java @RequestParam:

o se puede usar para realizar operaciones de cambio de nombre de parámetros. Por ejemplo, la cadena de consulta en la URL de solicitud de front-end es en este momento value, y se usa el back-end recibir y :nameusername=zhangsan&age=25nameage

@RestController
public class TestController {
    
    
    @GetMapping("/get")
    public String  getParam(@RequestParam(value = "username") String name, @RequestParam Integer age){
    
    
        return "name = " + name + ", age = " + age;
    }
}

Enviar solicitud a través del navegador:

4.4 A través de @RequestParam, establezca los parámetros obligatorios y opcionales

Por ejemplo, utilice el siguiente código para obtener los parámetros de solicitud en la URL:

@RestController
public class TestController {
    
    
    @GetMapping("/get")
    public String  getParam(@RequestParam String name, @RequestParam Integer age){
    
    
        return "name = " + name + ", age = " + age;
    }
}

En este punto, si agese pasa un parámetro menos:

Entonces el código de estado de respuesta recibido es 400, es decir, el error de solicitud. En los @RequestParamcomentarios anteriores, podemos encontrar que hay un parámetro llamado required, y su valor predeterminado truesignifica que el parámetro es obligatorio, y si el parámetro que falta se guardará, entonces, en este momento, podemos configurar ageel parámetro como opcional, de la siguiente manera Código facial:

@RestController
public class TestController {
    
    
    @GetMapping("/get")
    public String  getParam(@RequestParam String name, @RequestParam(required = false) Integer age){
    
    
        return "name = " + name + ", age = " + age;
    }
}

En este momento, cuando visite a través de un navegador, encontrará que no se informará ningún error:

4.5 Obtener los parámetros en la ruta URL a través de @PathVariable

En Spring MVC, las rutas URL generalmente contienen algunos marcadores de posición que se pueden usar para pasar parámetros. A través de @PathVariableanotaciones, los valores de los parámetros en estas rutas URL se pueden vincular a los parámetros del método, de modo que estos parámetros se puedan usar para procesar en el método del controlador.

Por ejemplo, supongamos que tenemos una ruta URL de /root/{name}/{age}, donde {name}y {age}son marcadores de posición. Podemos @PathVariablevincular el valor correspondiente a este marcador de posición al parámetro del método mediante anotaciones, de la siguiente manera:

@RestController
public class TestController {
    
    
    @RequestMapping("/root/{name}/{age}")
    public String getParam(@PathVariable String name, @PathVariable String age){
    
    
        return "name = " + name + ", age = " + age;
    }
}

Acceda a través del navegador, puede obtener los parámetros en la URL:


Además, cabe señalar que @PathVariableel nombre del parámetro de la anotación debe ser coherente con el nombre del marcador de posición en la ruta URL. Si los nombres son inconsistentes, puede utilizar @PathVariable("placeholderName")el nombre del marcador de posición especificado.

Por ejemplo, supongamos que la ruta URL es /root/{username}/{age}, pero desea usarla en el método namepara representar este parámetro, puede hacer esto:

@RestController
public class TestController {
    
    
    @RequestMapping("/root/{name}/{age}")
    public String getParam(@PathVariable(name = "username") String name, @PathVariable String age){
    
    
        return "name = " + name + ", age = " + age;
    }
}

5. @RequestPart implementa la carga de archivos

@RequestPartLas anotaciones se utilizan para implementar la carga de archivos. Es una forma de manejar la carga de archivos en Spring MVC.

Por lo general, durante el proceso de carga del archivo, el cliente envía los datos del archivo multipart/form-dataal servidor en formato . En Spring MVC, puede usar @RequestPartanotaciones multipart/form-datapara vincular la parte del archivo a los parámetros del método del controlador, a fin de realizar la carga del archivo.

Por ejemplo, ahora para implementar una función de carga de imágenes, es necesario guardar la imagen cargada en una carpeta, y cada vez que la siguiente operación de carga no pueda sobrescribir la última imagen, el código de implementación es el siguiente:

@RestController
public class TestController {
    
    
	private static final String SAVE_PATH = "C:\\Users\\Administrator\\Desktop\\image\\";

    @PostMapping("/upload")
    public Object uploadImg(@RequestPart("img") MultipartFile file) {
    
    
        if (file.isEmpty()) {
    
    
            return "请选择要上传的图片";
        }

        // 检查文件类型
        if (!isValidImageFile(file)) {
    
    
            return "只能上传图片文件";
        }

        // 检查文件大小
        if (!isValidFileSize(file)) {
    
    
            return "图片文件大小不能超过2MB";
        }

        String originalFileName = file.getOriginalFilename(); // 获取原始文件名称
        String extension = originalFileName.substring(originalFileName.lastIndexOf('.')); // 获取文件后缀
        String fileName = generateUniqueFileName(extension);

        File saveFile = new File(SAVE_PATH + fileName);

        try {
    
    
            file.transferTo(saveFile);
            return "上传成功";
        } catch (IOException e) {
    
    
            e.printStackTrace();
            return "上传失败";
        }
    }

    private boolean isValidImageFile(MultipartFile file) {
    
    
        // 实现文件类型校验,根据实际需求进行判断
        // 例如可以判断文件的后缀名是否为常见的图片格式:jpg/jpeg、png、gif等
        // return file.getContentType().startsWith("image/");
        return true; // 这里简化处理,总是返回true
    }

    private boolean isValidFileSize(MultipartFile file) {
    
    
        // 实现文件大小校验,根据实际需求进行判断
        // 例如可以判断文件的大小是否小于2MB
        return file.getSize() <= 2 * 1024 * 1024; // 2MB
    }

    private String generateUniqueFileName(String extension) {
    
    
        String fileName = UUID.randomUUID().toString() + extension;
        return fileName;
    }
}

Este código implementa una función simple de carga de archivos. El siguiente es un análisis del código:

  1. private static final String SAVE_PATH = "C:\\Users\\Administrator\\Desktop\\image\\";

    Esta es una constante que indica la ruta donde se guarda el archivo. En este ejemplo, el archivo se guardará en C:\Users\Administrator\Desktop\image\el directorio.

  2. @PostMapping("/upload")

    Esta anotación indica que uploadImgel método se utiliza para manejar solicitudes HTTP POST y se asigna a la ruta /upload.

  3. public Object uploadImg(@RequestPart("img") MultipartFile file)

    Este método se utiliza para manejar la carga de archivos. La anotación se utiliza para vincular la parte nombrada @RequestPart("img")del cuerpo de la solicitud al parámetro. Es una interfaz proporcionada por Spring Framework para procesar la carga de archivos y representa los datos del archivo cargado.imgfileMultipartFile

  4. Lógica de procesamiento de carga de archivos:

    • Primero, verifique filesi está vacío y, si está vacío, devuelva el mensaje "Seleccione la imagen para cargar".

    • A continuación, isValidImageFilese llama a un método para verificar el tipo de archivo. En el ejemplo, este método se simplifica para devolver siempre true. En el uso real, la verificación del tipo de archivo se puede implementar según sea necesario.

    • Luego, llame isValidFileSizeal método para verificar el tamaño del archivo. En el ejemplo, el tamaño del archivo no puede exceder los 2 MB (2*1024*1024 bytes).

    • Si la verificación del tipo o tamaño del archivo falla, se devolverá el mensaje de error correspondiente.

    • Finalmente, si se pasa la verificación de carga del archivo, genere un nombre de archivo único, generando UUID.randomUUID().toString()una cadena única y empalmándola en un nombre de archivo completo de acuerdo con el sufijo del archivo original. Luego guarde el archivo en SAVE_PATHel directorio especificado.

  5. private boolean isValidImageFile(MultipartFile file)

    Este es un método privado utilizado para implementar la validación del tipo de archivo. En el ejemplo, este método se simplifica para devolver siempre true. En el uso real, el tipo de archivo se puede verificar de acuerdo con las necesidades reales, como juzgar si el sufijo del archivo es un formato de imagen común: jpg/jpeg, png, gif, etc.

  6. private boolean isValidFileSize(MultipartFile file)

    Este es un método privado que se utiliza para implementar comprobaciones del tamaño de los archivos. En el ejemplo, el tamaño del archivo no puede exceder los 2 MB (2*1024*1024 bytes).

  7. private String generateUniqueFileName(String extension)

    Este es un método privado utilizado para generar nombres de archivos únicos. En el ejemplo, utilícelo para UUID.randomUUID().toString()generar una cadena única y luego concatenela en un nombre de archivo completo según la extensión del archivo.

A través de este código, la imagen cargada se guarda en la carpeta especificada y se agrega un identificador único al nombre del archivo, evitando el problema de sobrescritura del archivo. Al mismo tiempo, se agregan comprobaciones de tipo y tamaño de archivo para mejorar la solidez y seguridad del código. Sin embargo, la ruta de almacenamiento de archivos real, la verificación del tipo de archivo y la verificación del tamaño del archivo deben ajustarse y mejorarse aún más de acuerdo con las necesidades específicas.

Iniciar una solicitud para cargar una imagen a través de Postman:


Sube esta imagen varias veces:

6. Obtenga el campo del encabezado HTTP a través de @RequestHeader

A través @RequestHeaderde anotaciones, puede obtener el valor del campo del encabezado de la solicitud HTTP.

En Spring MVC, el encabezado de la solicitud HTTP contiene información de metadatos, como User-Agent, Content-Typeetc. AuthorizationMediante @RequestHeaderanotaciones, los valores de estos campos de encabezado de solicitud HTTP se pueden vincular a los parámetros del método del controlador, de modo que estos valores se puedan usar para procesar en el método.

El siguiente es un código de muestra que demuestra cómo utilizar @RequestHeaderObtener el valor de un campo de encabezado HTTP:

@RestController
public class TestController {
    
    
    @GetMapping("/headers")
    public String getHeaders(@RequestHeader("User-Agent") String userAgent,
                             @RequestHeader("Accept-Language") String acceptLanguage
                             ) {
    
    
        // 在方法中使用获取到的HTTP头部字段值进行处理
        // ...
        return "User-Agent: " + userAgent + "<br>" +
                "Accept-Language: " + acceptLanguage;
    }

}

En el ejemplo anterior, definimos un getHeadersmétodo de controlador llamado y usamos @GetMappinganotaciones para asignar ese método a /headersla ruta de la solicitud GET. Acceda y capture el paquete a través del navegador y descubra que el contenido obtenido es exactamente el mismo que el contenido del paquete capturado.

7. Obtención de Sesión y Cookie

7.1 Almacenamiento y adquisición de Sesión

En aplicaciones web, la sesión se utiliza para almacenar información del estado del usuario en el lado del servidor. El método para almacenar y obtener datos en Session en Spring MVC es el mismo que en Servlet.

7.1.1 Almacenamiento de sesiones

En Spring MVC, HttpSessionlos objetos se pueden usar para almacenar y recuperar datos en la sesión. HttpSessionEl objeto representa la sesión del usuario actual y se puede obtener a través del método HttpServletRequestdel objeto getSession().

@RestController
public class TestController {
    
    
    @RequestMapping("/setSession")
    public String setSession(HttpServletRequest request){
    
    
        HttpSession session = request.getSession(true);
        session.setAttribute("username", "zhangsan");
        return "session has set.";
    }
}

En el ejemplo anterior, /setSessionse define un método en la ruta setSession. Cuando el usuario visita la ruta, si la sesión no se ha creado, Sessionse almacenará un atributo llamado "nombre de usuario" y el registro cuyo valor es "zhangsan" Estar configurado.

Al capturar el paquete con Fiddle, podrá comprobar que se ha configurado correctamente Session:

Cabe resaltar que:

  • En Spring MVC, cuando @RequestMappinglos parámetros del método anotado contienen HttpServletRequesty HttpServletResponse, Spring MVC pasará automáticamente el objeto actual HttpServletRequesty HttpServletResponsea estos parámetros del método.
  • Esto significa que en @RequestMappingel método anotado, puede declarar HttpServletRequesty HttpServletResponseescribir parámetros directamente sin configuración o procesamiento adicional, y Spring MVC pasará automáticamente los objetos de solicitud y respuesta a estos parámetros.

7.2.2 Adquisición de sesión

Para obtener los datos almacenados en la sesión, puede utilizar los métodos HttpSessiondel objeto getAttribute()para obtenerlos.

@Controller
public class TestController {
    
    

    @RequestMapping("/getSession")
    public String getSession(HttpServletRequest request) {
    
    
        HttpSession session = request.getSession(false);
        String username = (String) session.getAttribute("username");
        return "Session中的username值为:" + username;
    }
}

En el ejemplo anterior, definimos /getSessionun getSessionmétodo debajo de la ruta. Cuando el usuario accede a la ruta, el atributo llamado "nombre de usuario" se obtendrá de la sesión y su valor se devolverá al usuario.

7.2 Obtener cookies a través de @CookieValue

Además de usarse Sessionpara almacenar información de estado del usuario, las aplicaciones web también pueden usar cookies para almacenar una pequeña cantidad de información del usuario. Spring MVC proporciona @CookieValueanotaciones para obtener el valor de Cookie.

@RestController
public class TestController {
    
    

    @GetMapping("/getCookie")
    public String getCookie(@CookieValue("username") String username) {
    
    
        return "Cookie中的username值为:" + username;
    }
}

En el ejemplo anterior, definimos /getCookieun getCookiemétodo bajo la ruta, cuando el usuario visita la ruta, obtenemos el valor llamado "nombre de usuario" de la cookie y se lo devolvemos al usuario.

Tenga en cuenta que cuando utilice @CookieValueanotaciones, asegúrese de que exista el nombre de cookie especificado. Si no existe, puede utilizar defaultValueel atributo para especificar un valor predeterminado o utilizar requiredel atributo para establecer si debe existir. Si requiredel atributo lo es truey la cookie no existe, se generará una excepción.

Ocho, retorno de datos de Spring MVC

8.1 Contenido de los datos de devolución

En Spring MVC, los métodos del controlador pueden devolver diferentes tipos de contenido de datos. Estos contenidos de datos se pueden devolver al cliente como respuesta.

@Controller
public class DataController {
    
    

    // 返回字符串
    @GetMapping("/hello")
    @ResponseBody
    public String sayHello() {
    
    
        return "Hello, World!";
    }

    // 返回数字
    @GetMapping("/number")
    @ResponseBody
    public int getNumber() {
    
    
        return 42;
    }

    // 返回布尔值
    @GetMapping("/boolean")
    @ResponseBody
    public boolean getBoolean() {
    
    
        return true;
    }
}

En el ejemplo anterior, definimos un DataControllercontrolador llamado y usamos @GetMappinganotaciones para asignar tres métodos diferentes a diferentes rutas.

  • sayHelloEl método devuelve una cadena "¡Hola, mundo!". Usando @ResponseBodyanotaciones, devuelva la cadena devuelta directamente al cliente como cuerpo de respuesta.

  • getNumberEl método devuelve un número entero 42. Utilice también @ResponseBodyanotaciones para devolver el número entero devuelto directamente al cliente como cuerpo de respuesta.

  • getBooleanEl método devuelve un valor booleano verdadero. Las anotaciones también se utilizan @ResponseBodypara devolver el valor booleano devuelto directamente al cliente como cuerpo de respuesta.

8.2 Regresar a la página estática

Además de devolver contenido de datos, Spring MVC también admite la devolución de páginas estáticas. Normalmente se utiliza para devolver páginas HTML u otros recursos estáticos.

@Controller
public class PageController {
    
    
    @GetMapping("/index")
    public String showPage() {
    
    
        return "/index.html";
    }
}

En el ejemplo anterior, definimos un PageControllercontrolador llamado y usamos @GetMappinganotaciones para showPageasignar métodos a la ruta de la solicitud GET /index. En este ejemplo, el nombre lógico de la vista devuelta es "índice" y Spring MVC buscará la index.htmlplantilla HTML nombrada y la devolverá al cliente.

8.3 Devolver objeto JSON

En Spring MVC, también se pueden devolver datos en formato JSON, que generalmente se usa para proporcionar interfaces API.

@Controller
public class JSONController {
    
    

    @GetMapping("/user")
    @ResponseBody
    public User getUser() {
    
    
        User user = new User("zhangsan", 30);
        return user;
    }
}

En el ejemplo anterior, JSONControllerse define un controlador llamado y @GetMappingse utilizan anotaciones para getUserasignar métodos a la ruta de la solicitud GET /user.

getUserEl método devuelve un objeto, que se convierte al formato JSON Usermediante anotaciones y se devuelve directamente al cliente como cuerpo de respuesta.@ResponseBody

En aplicaciones prácticas, también puede ser necesario introducir una biblioteca de serialización JSON (como Jackson) para convertir objetos Java al formato JSON. Pero Spring MVC convertirá automáticamente el valor de retorno al formato JSON y establecerá el Content-Typeencabezado correcto para que el cliente pueda analizar correctamente los datos JSON devueltos.

9. Solicitar reenvío y solicitar redirección

9.1 Solicitud de reenvío

El reenvío de solicitudes se refiere a reenviar una solicitud de un Servlet a otro Servlet o página JSP. El proceso de reenvío se completa en el lado del servidor y el navegador del cliente no lo percibe. En Spring MVC, RequestDispatcherse pueden utilizar objetos para implementar el reenvío de solicitudes.

@Controller
public class ForwardController {
    
    

    @GetMapping("/forward")
    public String forward() {
    
    
        // 实现请求转发到 /index.html路径
        return "forward:/index.html";
    }
}

En el ejemplo anterior, ForwardControllerse define un controlador llamado y @GetMappingse utilizan anotaciones para forwardasignar métodos a la ruta de la solicitud GET /forward.

forwardEl método devuelve una cadena "forward:/index.html", que significa reenviar la solicitud a /index.htmlla ruta. Spring MVC reenviará la solicitud en el lado del servidor y entregará el derecho de control al /index.htmlmétodo del procesador correspondiente a la ruta.

Accede a la dirección a través de un navegador http://localhost:8080/forward:

9.2 solicitar redirección de redirección

La redirección de solicitudes significa que después de recibir una solicitud, el servidor envía una respuesta HTTP, el encabezado de la respuesta contiene un Locationcampo y el cliente reenvía una nueva solicitud basada en el contenido de este campo. Por lo tanto 请求重定向涉及两次请求和响应过程,客户端感知到的是两次请求的结果,.

@Controller
public class RedirectController {
    
    

    @GetMapping("/redirect")
    public String redirect() {
    
    
        // 实现请求重定向到 /index.html路径
        return "redirect:/index.html";
    }
}

En el ejemplo anterior, RedirectControllerse define un controlador llamado y @GetMappingse utilizan anotaciones para redirectasignar métodos a la ruta de la solicitud GET /redirect.

redirectEl método devuelve una cadena "redirect:/index.html", lo que significa redirigir la solicitud a /index.htmlla ruta. Spring MVC enviará una respuesta HTTP en el lado del servidor y el encabezado de respuesta contiene Locationcampos que le indican al cliente que redirija a /index.htmlla ruta.

Accede a la dirección a través de un navegador http://localhost:8080/redirect:

finalmente salta a ella http://localhost:8080/index.html.

Puede ver los detalles a través de la captura de Fiddle:


Se puede encontrar que http://localhost:8080/redirecthay dos resultados de solicitud al final de la solicitud.

Al realizar la solicitud /redirect, el servidor le indicará al navegador que solicite /index.html:

9.3 La diferencia entre reenviar y redireccionar

  1. Fase de ejecución:

    • Solicitar reenvío sí 在服务器端完成的,客户端浏览器不感知. La solicitud se reenvía de un Servlet a otro Servlet o página JSP y todo el proceso se realiza dentro del servidor.
    • Solicitar redirección 涉及两次请求和响应过程. Después de que el cliente reciba la respuesta a la primera solicitud, enviará Locationuna nueva solicitud de acuerdo con los campos del encabezado de respuesta.
  2. Cambios en la barra de direcciones:

    • Solicitud de reenvío 不会改变El contenido de la barra de direcciones del navegador, la URL de la solicitud original todavía está en la barra de direcciones.
    • Solicitar redirección 会改变El contenido de la barra de direcciones del navegador y la URL redirigida se mostrarán en la barra de direcciones.
  3. Solicitar paso de atributo:

    • El reenvío de solicitudes puede compartir los atributos de la solicitud durante el proceso de reenvío, y el servlet antes del reenvío puede establecer los atributos de la solicitud en los valores requeridos por el servlet o la página JSP reenviada.
    • La redirección de solicitudes no puede compartir directamente los atributos de la solicitud entre dos solicitudes, porque las dos solicitudes son independientes.

La elección de utilizar el reenvío de solicitudes o la redirección de solicitudes depende de las necesidades específicas. El reenvío de solicitudes es aplicable a situaciones como implementar saltos de página y compartir atributos de solicitud dentro del servidor. La redirección de solicitudes es adecuada para situaciones en las que necesita modificar la barra de direcciones del navegador, evitar el envío repetido de formularios y actualizar la página.

Supongo que te gusta

Origin blog.csdn.net/qq_61635026/article/details/132144269
Recomendado
Clasificación