Directorio de artículos
- prefacio
- 1. ¿Qué es Spring MVC?
- 2. Creación del proyecto Spring MVC.
- 3. Anotación @RequestMapping
- 4. Spring MVC obtiene parámetros
- 5. @RequestPart implementa la carga de archivos
- 6. Obtenga el campo del encabezado HTTP a través de @RequestHeader
- 7. Obtención de Sesión y Cookie
- Ocho, retorno de datos de Spring MVC
- 9. Solicitar reenvío y solicitar redirección
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:
-
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.
-
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.
-
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.
-
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.
-
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 Web
dependencia 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
demo
Cree una clase de capa de control en el directorio y , TestController
cuando 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/hello
para obtener los siguientes resultados:
3. Anotación @RequestMapping
En Spring MVC, @RequestMapping
es una anotación muy importante para asignar solicitudes HTTP a métodos de procesamiento del controlador. A través de @RequestMapping
anotaciones, 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 @RequestMapping
el código fuente de la anotación, puede ver que contiene muchos atributos:
Los siguientes son @RequestMapping
atributos 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 value atributo, 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. |
@RequestMapping
La 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
@RequestMapping
Las 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, @RequestMapping
las 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/hello
y 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, @RequestMapping
todos los métodos son compatibles con anotaciones. Por supuesto, si desea admitir solo un determinado método, puede method
especificarlo 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 @GetMapping
reemplazarse 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
. @RequestParam
Podemos 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, @RequestParam
los 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 name
del 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.age
form
User
User
@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, @RequestBody
se 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 @RequestParam
de 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 :name
username=zhangsan&age=25
name
age
@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 age
se pasa un parámetro menos:
Entonces el código de estado de respuesta recibido es 400, es decir, el error de solicitud. En los @RequestParam
comentarios anteriores, podemos encontrar que hay un parámetro llamado required
, y su valor predeterminado true
significa que el parámetro es obligatorio, y si el parámetro que falta se guardará, entonces, en este momento, podemos configurar age
el 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 @PathVariable
anotaciones, 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 @PathVariable
vincular 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 @PathVariable
el 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 name
para 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
@RequestPart
Las 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-data
al servidor en formato . En Spring MVC, puede usar @RequestPart
anotaciones multipart/form-data
para 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:
-
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. -
@PostMapping("/upload")
Esta anotación indica que
uploadImg
el método se utiliza para manejar solicitudes HTTP POST y se asigna a la ruta/upload
. -
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.img
file
MultipartFile
-
Lógica de procesamiento de carga de archivos:
-
Primero, verifique
file
si está vacío y, si está vacío, devuelva el mensaje "Seleccione la imagen para cargar". -
A continuación,
isValidImageFile
se llama a un método para verificar el tipo de archivo. En el ejemplo, este método se simplifica para devolver siempretrue
. En el uso real, la verificación del tipo de archivo se puede implementar según sea necesario. -
Luego, llame
isValidFileSize
al 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 enSAVE_PATH
el directorio especificado.
-
-
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. -
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).
-
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 @RequestHeader
de 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-Type
etc. Authorization
Mediante @RequestHeader
anotaciones, 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 @RequestHeader
Obtener 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 getHeaders
método de controlador llamado y usamos @GetMapping
anotaciones para asignar ese método a /headers
la 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, HttpSession
los objetos se pueden usar para almacenar y recuperar datos en la sesión. HttpSession
El objeto representa la sesión del usuario actual y se puede obtener a través del método HttpServletRequest
del 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, /setSession
se define un método en la ruta setSession
. Cuando el usuario visita la ruta, si la sesión no se ha creado, Session
se 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
@RequestMapping
los parámetros del método anotado contienenHttpServletRequest
yHttpServletResponse
, Spring MVC pasará automáticamente el objeto actualHttpServletRequest
yHttpServletResponse
a estos parámetros del método.- Esto significa que en
@RequestMapping
el método anotado, puede declararHttpServletRequest
yHttpServletResponse
escribir 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 HttpSession
del 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 /getSession
un getSession
mé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 Session
para 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 @CookieValue
anotaciones 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 /getCookie
un getCookie
mé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 @CookieValue
anotaciones, asegúrese de que exista el nombre de cookie especificado. Si no existe, puede utilizar defaultValue
el atributo para especificar un valor predeterminado o utilizar required
el atributo para establecer si debe existir. Si required
el atributo lo es true
y 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 DataController
controlador llamado y usamos @GetMapping
anotaciones para asignar tres métodos diferentes a diferentes rutas.
-
sayHello
El método devuelve una cadena "¡Hola, mundo!". Usando@ResponseBody
anotaciones, devuelva la cadena devuelta directamente al cliente como cuerpo de respuesta. -
getNumber
El método devuelve un número entero 42. Utilice también@ResponseBody
anotaciones para devolver el número entero devuelto directamente al cliente como cuerpo de respuesta. -
getBoolean
El método devuelve un valor booleano verdadero. Las anotaciones también se utilizan@ResponseBody
para 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 PageController
controlador llamado y usamos @GetMapping
anotaciones para showPage
asignar 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.html
plantilla 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, JSONController
se define un controlador llamado y @GetMapping
se utilizan anotaciones para getUser
asignar métodos a la ruta de la solicitud GET /user
.
getUser
El método devuelve un objeto, que se convierte al formato JSON User
mediante 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-Type
encabezado 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, RequestDispatcher
se 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, ForwardController
se define un controlador llamado y @GetMapping
se utilizan anotaciones para forward
asignar métodos a la ruta de la solicitud GET /forward
.
forward
El método devuelve una cadena "forward:/index.html", que significa reenviar la solicitud a /index.html
la ruta. Spring MVC reenviará la solicitud en el lado del servidor y entregará el derecho de control al /index.html
mé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 Location
campo 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, RedirectController
se define un controlador llamado y @GetMapping
se utilizan anotaciones para redirect
asignar métodos a la ruta de la solicitud GET /redirect
.
redirect
El método devuelve una cadena "redirect:/index.html", lo que significa redirigir la solicitud a /index.html
la ruta. Spring MVC enviará una respuesta HTTP en el lado del servidor y el encabezado de respuesta contiene Location
campos que le indican al cliente que redirija a /index.html
la 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/redirect
hay 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
-
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áLocation
una nueva solicitud de acuerdo con los campos del encabezado de respuesta.
- Solicitar reenvío sí
-
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.
- Solicitud de reenvío
-
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.