Explicación súper detallada de SpringMVC

Directorio de artículos

1 Introducción a Spring MVC

1.1 modelo MVC

El nombre completo de MVC es Model View Controller y cada parte realiza sus propias funciones.

  • Modelo : modelo de datos, clase JavaBean, utilizado para la encapsulación de datos.
  • Ver : se refiere a JSP y HTML utilizados para mostrar datos a los usuarios.
  • Controlador : utilizado para recibir las solicitudes de los usuarios y el controlador de todo el proceso . Se utiliza para verificación de datos, etc.

1.2 Primavera MVC

Spring Web MVC es un marco web liviano basado en Java que implementa el tipo de patrón de diseño Web MVC basado en solicitudes y utiliza la idea del patrón arquitectónico MVC para desacoplar las responsabilidades de la capa web. al uso de El propósito del modelo y marco de solicitud-respuesta es ayudarnos a simplificar el desarrollo, y Spring Web MVC también tiene como objetivo simplificar nuestro desarrollo web diario.

Spring MVC se compone principalmente del mapeador de front-end DispatcherServlet, el mapeador de procesador HandlerMapping, el adaptador de procesador HandlAdapter, el procesador Handler, el solucionador de vistas View Resolver y el view View.

Dos núcleos:
Asignador de procesador : elige qué controlador usar para manejar la solicitud.
Resolución de vistas : elige cómo se deben representar los resultados.

2 Proceso de procesamiento de solicitudes de Spring MVC

2.1 Introducción al proceso


Paso 1: el usuario envía una solicitud al controlador de front-end (DispatcherServlet).
Paso 2: el controlador de front-end solicita al asignador del procesador HandlerMapping que busque Handler, que se puede buscar según la configuración y las anotaciones xml.
Paso 3: El asignador del procesador HandlerMapping devuelve el Handler al controlador de front-end.
Paso 4: El controlador de front-end llama al adaptador de procesador para ejecutar el Handler.
Paso 5: El adaptador de procesador ejecuta el Handler.
Paso 6: Después del Handler Cuando se completa la ejecución, devuelve ModelAndView al adaptador.
Paso 7: El adaptador del procesador devuelve ModelAndView al controlador de front-end.
ModelAndView es un objeto subyacente del marco SpringMVC, incluidos Model y View.
Paso 8: El controlador de front-end solicita el analizador de vistas para realizar el análisis de vistas
para analizar la vista real de acuerdo con el nombre de la vista lógica.
Paso 9: El solucionador de vista devuelve la vista al controlador de front-end.
Paso 10: El controlador de front-end realiza la representación de la vista
, que consiste en completar los datos del modelo (en el objeto ModelAndView) en el campo de solicitud.
Paso 11: El El controlador frontal responde al usuario con el resultado.

2.2 Introducción de componentes

1. Controlador front-end DispatcherServlet (no se requiere desarrollo de programador).
Función: Recibir solicitudes y responder a resultados, equivalente a un reenviador y una unidad central de procesamiento. Con DispatcherServlet, se reduce el acoplamiento entre otros componentes.
2. Mapeador de procesador HandlerMapping (no se requiere desarrollo de programador).
Función: HandlerMapping es responsable de encontrar el controlador o procesador de acuerdo con la URL solicitada por el usuario. SpringMVC proporciona diferentes mapeadores para implementar diferentes métodos de mapeo, como métodos de archivo de configuración, métodos de implementación de interfaz, métodos de anotación, etc.
3. Adaptador de procesador HandlerAdapter (no es necesario desarrollar un programador).
Función: ejecutar Handler de acuerdo con reglas específicas (reglas requeridas por HandlerAdapter).
4. Controlador del procesador (requiere desarrollo del programador).
Nota: Al escribir Handler, siga los requisitos de HandlerAdapter para que el adaptador pueda ejecutar correctamente Handler
5. Ver solucionador ViewResolver (no se requiere desarrollo de programador).
Función: realizar el análisis de la vista y analizarla en una vista real (vista) según el nombre de la vista lógica
6. Vista Vista (los programadores necesitan desarrollar jsp).
Nota: Ver es una interfaz y la clase de implementación admite diferentes tipos de Vista (jsp, freemarker, pdf...)

Nota: No requiere un programador para desarrollarlo y el programador debe configurarlo él mismo.
Se puede concluir que el único trabajo que debemos desarrollar es escribir Handler y escribir vistas como páginas JSP.

3 Comenzando con SpringMVC

1. Programa de introducción a SpringMVC

1.1 Estructura de ingeniería WEB

imagen.png

1.2 Crear un proyecto WEB e introducir dependencias

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.pikaqiu</groupId>
  <artifactId>SpringMVC_InitalCase</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>SpringMVC_InitalCase Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
    <spring.version>5.0.2.RELEASE</spring.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>servlet-api</artifactId>
      <version>2.5</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.0</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>

  <build>
    <finalName>SpringMVC_InitalCase</finalName>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

1.3 Configurar el controlador central (configurar DispatcherServlet)

En el archivo de configuración web.xml, el controlador central DispatcherServlet

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>

  <!--配置核心控制器DispatcherServle-->
  <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

</web-app>

1.4 Escriba el archivo de configuración de springmvc.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

    <!--开启注解扫描-->
    <context:component-scan base-package="com.pikaqiu"></context:component-scan>

    <!--视图解析器-->
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>

    <!--开启SpringMVC框架注解的支持-->
    <!--会自动注册RequestMappingHandlerMapping与RequestMappingHandlerAdapter两个Bean-->
    <mvc:annotation-driven/>
</beans>

Nota: El papel de mvc:annotation-driven/

它就相当于在 xml 中配置了:
<!-- 上面的标签相当于 如下配置-->
<!-- Begin -->
<!-- HandlerMapping --> 
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerM
apping"></bean> 
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
<!-- HandlerAdapter --> 
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerA
dapter"></bean> 
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"></bean> <bean
class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
<!-- HadnlerExceptionResolvers --> 
<bean class="org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExcept
ionResolver"></bean> 
<bean class="org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolv
er"></bean> 
<bean class="org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver"
></bean>
<!-- End -->

1.5 Escribir index.jsp y clase de controlador

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>Title</title>
  </head>
  <body>
    <h3>入门程序</h3>
    <a href="hello">入门程序</a>
  </body>
</html>

package com.pikaqiu;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @author pikaqiu
 * @description: TODO 类描述
 * @date: 2022/3/26 14:49
 **/
@Controller
public class HelloController {
    
    
	@RequestMapping(path = "/hello")
	public String sayHello(){
    
    
		System.out.println("hello SpringMVC");
		return "success";
	}
}

1.6 Cree la carpeta de páginas en el directorio WEB-INF y escriba la página de éxito de Success.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>Title</title>
  </head>
  <body>
    <h3>入门成功</h3>
  </body>
</html>

1.7 Configuración de Tomcat

imagen.png
imagen.png

1.8 Iniciar Tomcat

imagen.png

1.9 Análisis del proceso de ejecución del caso de nivel de entrada

  1. Al iniciar el servidor Tomcat, debido a que la etiqueta load-on-startup está configurada , se creará el objeto DispatcherServlet y se cargará el archivo de configuración springmvc.xml .
  2. Cuando el escaneo de anotaciones esté habilitado, se creará el objeto HelloController.
  3. Al enviar una solicitud desde index.jsp, la solicitud primero llegará al controlador central de DispatcherServlet y encontrará el método de ejecución específico de acuerdo con la anotación @RequestMapping configurada.
  4. Según el valor de retorno del método de ejecución y según el analizador de vista configurado, busque el archivo JSP con el nombre especificado en el directorio especificado.
  5. El servidor Tomcat representa la página y responde

4 Vinculación de parámetros de solicitud

4.1 Instrucciones vinculantes para parámetros de solicitud

4.1.1 Mecanismo vinculante

1️⃣ 表单提交的数据都是k=v格式的 username=haha&password=123 
2️⃣ SpringMVC的参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进行绑定的 
3️⃣ 要求:提交表单的name和参数的名称是相同的 

4.1.2 Tipos de datos admitidos

1️⃣ 基本数据类型和String类型 
2️⃣ POJO类型(包括实体类,以及关联的实体类) 
3️⃣ 数组和集合数据类型(List、map集合等)

4.2 Tipos de datos básicos y tipo String

1️⃣ 提交表单的name和参数的**名称是相同**的 
2️⃣ 严格区分大小写 
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <a href="param/testBasicParamAndString?userName=zhangsan&age=23">基本类型和String类型请求参数绑定</a>
</body>
</html>
package com.pikaqiu;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @description: TODO 类描述
 * @date: 2022/3/26 16:06
 **/
@Controller
@RequestMapping("/param")
public class ParamController {
    
    
	@RequestMapping("/testBasicParamAndString")
	public String testBasicParamAndString(String userName, Integer age){
    
    
		System.out.println("正常运行");
		System.out.println("userName: " + userName + " age: " + age);
		return "success";
	}
}

4.3 Tipo POJO (JavaBean)

1️⃣ 提交表单的name和JavaBean中的**属性名称需要一致** 
2️⃣ 如果一个JavaBean类中包含其他的引用类型,那么表单的name属性需要编写成:对象.属性 例	如: address.name 
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <form action="param/testPoJO" method="post">
        姓名:<input type="text" name="userName"><br/>
        密码:<input type="text" name="passWord"><br/>
        工资:<input type="text" name="money"><br/>
        uName:<input type="text" name="user.uName"><br/>
        uAge:<input type="text" name="user.uAge"><br/>

        <input type="submit" value="提交">
    </form>
</body>
</html>

package com.pikaqiu.controller;

import com.pikaqiu.domain.Account;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @description: TODO 类描述
 * @date: 2022/3/26 16:06
 **/
@Controller
@RequestMapping("/param")
public class ParamController {
    
    
	@RequestMapping("/testPoJO")
	public String testPOJOParam(Account account){
    
    
		System.out.println("正常运行");
		System.out.println(account);
		return "success";
	}
}

4.4 Tipos de colección

El primero:
los parámetros de solicitud del tipo de colección deben estar en POJO. El nombre del parámetro de solicitud en el formulario debe ser el mismo que el nombre de la propiedad de la colección en POJO.
Para asignar valores a elementos de la colección List, utilice subíndices.
Asigne valores a elementos de la colección Map, utilizando pares clave-valor.

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

    <form action="param/testListAndMap" method="post">
        姓名:<input type="text" name="userName"><br/>
        密码:<input type="text" name="passWord"><br/>
        工资:<input type="text" name="money"><br/>
        用户姓名:<input type="text" name="uList[0].uName"><br/>
        用户年龄:<input type="text" name="uList[0].uAge"><br/>
        用户姓名:<input type="text" name="uList[1].uName"><br/>
        用户年龄:<input type="text" name="uList[1].uAge"><br/>
        用户姓名:<input type="text" name="uMap['one'].uName"><br/>
        用户年龄:<input type="text" name="uMap['one'].uAge"><br/>
        用户姓名:<input type="text" name="uMap['two'].uName"><br/>
        用户年龄:<input type="text" name="uMap['two'].uAge"><br/>

        <input type="submit" value="提交">
    </form>

</body>
</html>

package com.pikaqiu.controller;

import com.pikaqiu.domain.Account;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @description: TODO 类描述
 * @date: 2022/3/26 16:06
 **/
@Controller
@RequestMapping("/param")
public class ParamController {
    
    

	@RequestMapping("/testListAndMap")
	public String test(Account account)
	{
    
    
		System.out.println("正常运行");
		System.out.println(account);
		return "success";
	}
}

Segundo tipo:
los parámetros de solicitud recibidos son datos en formato json. Debe implementarse con la ayuda de una anotación. ( @ResponseBody )

4.5 Solución a los parámetros de solicitud confusos chinos

Solicitud de publicación: configure la clase de filtro proporcionada por Spring en web.xml

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>

  <!--配置中文乱码过滤器-->
  <filter>
    <filter-name>characterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

  <!--配置核心控制器DispatcherServle-->
  <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

</web-app>

**solicitud de obtención: Tomacat maneja las solicitudes GET y POST de manera diferente. La codificación de la solicitud GET debe cambiarse a server.xml de Tomcat ** El
archivo de configuración

se cambió a:

si la solicitud ajax aún está confusa, cambie:
useBodyEncodingForURI="true " Cambie a URIEncoding ="UTF-8"
.

4.6 Convertidor de tipo personalizado

1. Cualquier tipo de datos enviado por el formulario es todo tipo de cadena, pero el tipo entero se define en segundo plano y los datos también se pueden encapsular, lo que significa que el marco Spring realizará la conversión de tipos de datos de forma predeterminada.
2. Si desea personalizar la conversión del tipo de datos, puede implementar la interfaz del Convertidor.

4.6.1 Convertidor de tipo personalizado

package com.pikaqiu.util;

import org.springframework.core.convert.converter.Converter;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 把字符串转换为日期
 **/
public class StringToDateConverter implements Converter<String, Date> {
    
    
	@Override
	public Date convert(String source) {
    
    
		if(source == null){
    
    
			throw new RuntimeException("请您传入数据");
		}
		DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
		// 把字符串转为日期
		try {
    
    
			return df.parse(source);
		} catch (ParseException e) {
    
    
			throw new RuntimeException("数据类型转换出现错误");
		}
	}
}

4.6.2 Registre un convertidor de tipo personalizado y escriba la configuración en el archivo de configuración springmvc.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

    <!--开启注解扫描-->
    <context:component-scan base-package="com.pikaqiu"></context:component-scan>

    <!--视图解析器-->
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>

    <!--配置自定义类型转换器-->
    <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <bean class="com.pikaqiu.util.StringToDateConverter"></bean>
            </set>
        </property>
    </bean>

    <!--开启SpringMVC框架注解的支持-->
    <!--会自动注册RequestMappingHandlerMappingRequestMappingHandlerAdapter两个Bean-->
    <mvc:annotation-driven conversion-service="conversionService"/>
</beans>

4.6.3 parámetro.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

    <form action="param/testSelfConverter" method="post">
        姓名:<input type="text" name="uName"><br/>
        年龄:<input type="text" name="uAge"><br/>
        生日:<input type="text" name="birthDay"><br/>

        <input type="submit" value="提交">
    </form>

</body>
</html>

4.6.4 Clase de controlador

package com.pikaqiu.controller;

import com.pikaqiu.domain.Account;
import com.pikaqiu.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @description: TODO 类描述
 * @date: 2022/3/26 16:06
 **/
@Controller
@RequestMapping("/param")
public class ParamController {
    
    
	
	@RequestMapping("/testSelfConverter")
	public String testSelfConverter(User user)
	{
    
    
		System.out.println("正常运行");
		System.out.println(user);
		return "success";
	}
}

4.7 El controlador utiliza objetos ServletAPI nativos

Solo necesita definir los objetos HttpServletRequest y HttpServletResponse en los parámetros del método del controlador.

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
  
    <a href="param/testServlet?username=haha&password=123">Servlet原生的API</a>

</body>
</html>
package com.pikaqiu.controller;

import com.pikaqiu.domain.Account;
import com.pikaqiu.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * @description: TODO 类描述
 * @date: 2022/3/26 16:06
 **/
@Controller
@RequestMapping("/param")
public class ParamController {
    
    
	/**
	 * 使用Servlet原生的API
	 * @param
	 * @return
	 */
	@RequestMapping("/testServlet")
	public String testServlet(HttpServletRequest request, HttpServletResponse response){
    
    
		System.out.println("正常运行");
		System.out.println(request);

		HttpSession session = request.getSession();
		System.out.println(session);

		ServletContext servletContext = session.getServletContext();
		System.out.println(servletContext);

		System.out.println(response);
		return "success";
	}
}

5 anotaciones de uso común

5.1 Anotación RequestParam

1️⃣ Función: pasar el parámetro con el nombre especificado en la solicitud a la asignación de parámetros formal en el controlador
2️⃣
Valor del atributo: el nombre en el parámetro de solicitud
requerido: si este parámetro debe proporcionarse en el parámetro de solicitud, el valor predeterminado es verdadero. debe ser proporcionado

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

    <a href="param/testRequestParam?username=haha&password=123">RequestParam注解</a>

</body>
</html>
package com.pikaqiu.controller;

import com.pikaqiu.domain.Account;
import com.pikaqiu.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * @description: TODO 类描述
 * @date: 2022/3/26 16:06
 **/
@Controller
@RequestMapping("/param")
public class ParamController {
    
    
	/**
	 * @RequestParam注解
     */
	@RequestMapping("/testRequestParam")
	public String testRequestParam(@RequestParam(name = "username") String username, @RequestParam(name = "password") String password){
    
    
		System.out.println("正常运行");
		System.out.println(username);
		System.out.println(password);
		return "success";
	}
}

Nota : En @RequestParam(name = " name ") en la clase AnnoController , el valor de name es consistente con el valor de nombre en href="anno/testRequestParam? name = jaja".

5.2 Anotación RequestBody

1️⃣ Función: se utiliza para obtener el contenido del cuerpo de la solicitud (nota: no se puede utilizar el método get )
2️⃣ Atributo
requerido: si debe haber un cuerpo de la solicitud, el valor predeterminado es verdadero

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
  <form action="param/testRequestBody" method="post">
        用户姓名:<input type="text" name="uname"><br/>
        用户年龄:<input type="text" name="uage"><br/>
        <input type="submit" value="提交">
  </form>
</body>
</html>

package com.pikaqiu.controller;

import com.pikaqiu.domain.Account;
import com.pikaqiu.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * @description: TODO 类描述
 * @date: 2022/3/26 16:06
 **/
@Controller
@RequestMapping("/param")
public class ParamController {
    
    
	/**
	 * @RequestBody注解
	 */
	@RequestMapping("/testRequestBody")
	public String testRequestBody(@RequestBody(required=false) String body){
    
    
		System.out.println("正常运行");
		System.out.println(body);
		return "success";
	}
}

5.3 Anotación PathVariable

1️⃣ Función: Tiene el marcador de posición en la URL enlazada. Por ejemplo: hay /delete/{id} en la URL, {id} es el marcador de posición
2️⃣
Valor del atributo: especifique el nombre del marcador de posición en la URL
3️⃣ URL de estilo tranquilo
① La ruta de solicitud es la misma y el fondo se puede ejecutar según diferentes métodos de solicitud Diferentes métodos
② Ventajas de la URL de estilo tranquilo:
estructura clara
, compatible con los estándares,
fácil de entender,
fácil de expandir

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <a href="param/testPathVariable/33">testPathVariable</a>
</body>
</html>
package com.pikaqiu.controller;

import com.pikaqiu.domain.Account;
import com.pikaqiu.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * @description: TODO 类描述
 * @date: 2022/3/26 16:06
 **/
@Controller
@RequestMapping("/param")
public class ParamController {
    
    
	/**
	 * @PathVariable注解
	 */
	@RequestMapping("/testPathVariable/{id}")
	public String testPathVariable(@PathVariable(name = "id") String id){
    
    
		System.out.println("正常运行");
		System.out.println(id);
		return "success";
	}
}

Nota : La identificación en ruta = "/testPathVariable/{ id }" es consistente con la identificación en @PathVariable(nombre=" id ") y href="anno/testPathVariable/ 10 ", el valor se escribe directamente sin parámetros.

5.4 Anotación RequestHeader

1️⃣ Función: obtener el valor del encabezado de solicitud especificado
2️⃣
Valor del atributo: el nombre del encabezado de solicitud

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
  
    <a href="param/testRequestHeader">testRequestHeader</a>

</body>
</html>
package com.pikaqiu.controller;

import com.pikaqiu.domain.Account;
import com.pikaqiu.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * @description: TODO 类描述
 * @date: 2022/3/26 16:06
 **/
@Controller
@RequestMapping("/param")
public class ParamController {
    
    
	/**
	 * @RequestHeader注解
	 */
	@RequestMapping("/testRequestHeader")
	public String testRequestHeader(@RequestHeader(value = "Accept") String header) {
    
    
		System.out.println("正常运行");
		System.out.println(header);
		return "success";

	}
}

5.5 Anotación CookieValue

1️⃣ Función: se utiliza para obtener el valor del nombre de la cookie especificada
2️⃣
Valor del atributo: nombre de la cookie

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

    <a href="param/testCookieValue">testCookieValue</a>

</body>
</html>
package com.pikaqiu.controller;

import com.pikaqiu.domain.Account;
import com.pikaqiu.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * @description: TODO 类描述
 * @date: 2022/3/26 16:06
 **/
@Controller
@RequestMapping("/param")
public class ParamController {
    
    
	/**
	 * @CookieValue注解
	 */
	@RequestMapping("/testCookieValue")
	public String testCookieValue(@CookieValue(value = "JSESSIONID") String header) {
    
    
		System.out.println("正常运行");
		System.out.println(header);
		return "success";
	}
}

5.6 Anotación ModelAttribute

1️⃣ Función
① Aparece en el método: indica que el método actual se ejecutará antes de que se ejecute el método del controlador.
② Aparece en el parámetro: obtiene los datos especificados y los asigna al parámetro.
2️⃣ Escenarios de aplicación
① Cuando los datos del formulario enviado no son datos completos de la entidad, asegúrese de que los datos originales de la base de datos se utilicen para los campos que no se envían.

5.6.1 Aparecer en métodos

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

    <form action="param/testModelAttribute" method="post">
        用户姓名:<input type="text" name="uName"><br/>
        用户年龄:<input type="text" name="uAge"><br/>

        <input type="submit" value="提交">
    </form>

</body>
</html>
	package com.pikaqiu.controller;

	import com.pikaqiu.domain.Account;
	import com.pikaqiu.domain.User;
	import org.springframework.stereotype.Controller;
	import org.springframework.web.bind.annotation.*;

	import javax.servlet.ServletContext;
	import javax.servlet.http.HttpServletRequest;
	import javax.servlet.http.HttpServletResponse;
	import javax.servlet.http.HttpSession;

	/**
	 * @description: TODO 类描述
	 * @date: 2022/3/26 16:06
	 **/
	@Controller
	@RequestMapping("/param")
	public class ParamController {
    
    
		/**
		 * @ModelAttribute注解
		 */
		@RequestMapping("/testModelAttribute")
		public String testModelAttribute() {
    
    
			System.out.println("testModelAttribute运行");
			return "success";

		}

		@ModelAttribute
		public void showUser(){
    
    
			System.out.println("showUser方法执行了");
		}
	}

resultado de la operación:
imagen.png

5.6.2 Ejemplo de escenario de aplicación basada en mapas: método modificado ModelAttribute con valor de retorno

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

    <form action="param/testModelAttribute" method="post">
        用户姓名:<input type="text" name="uName"><br/>
        用户年龄:<input type="text" name="uAge"><br/>

        <input type="submit" value="提交">
    </form>

</body>
</html>
	package com.pikaqiu.controller;

	import com.pikaqiu.domain.Account;
	import com.pikaqiu.domain.User;
	import org.springframework.stereotype.Controller;
	import org.springframework.web.bind.annotation.*;

	import javax.servlet.ServletContext;
	import javax.servlet.http.HttpServletRequest;
	import javax.servlet.http.HttpServletResponse;
	import javax.servlet.http.HttpSession;
	import java.util.Date;

	/**
	 * @description: TODO 类描述
	 * @date: 2022/3/26 16:06
	 **/
	@Controller
	@RequestMapping("/param")
	public class ParamController {
    
    
		/**
		 * @ModelAttribute注解
		 */
		@RequestMapping("/testModelAttribute")
		public String testModelAttribute(User user) {
    
    
			System.out.println("testModelAttribute运行");
			System.out.println(user);
			return "success";

		}


		/**
		 * 该方法会先执行
		 */
		@ModelAttribute
		public User showUser(String uName){
    
    
			System.out.println("showUser方法执行了");
			// 通过用户查询数据库(模拟)
			User user = new User();
			user.setuName(uName);
			user.setuAge(23);
			user.setBirthDay(new Date());
			return user;
		}

	}

resultado:
imagen.png

5.6.3 Ejemplo de escenario de aplicación basada en mapas: método de modificación ModelAttribute sin valor de retorno

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

    <form action="param/testModelAttribute" method="post">
        用户姓名:<input type="text" name="uName"><br/>
        用户年龄:<input type="text" name="uAge"><br/>

        <input type="submit" value="提交">
    </form>

</body>
</html>
	package com.pikaqiu.controller;

	import com.pikaqiu.domain.Account;
	import com.pikaqiu.domain.User;
	import org.springframework.stereotype.Controller;
	import org.springframework.web.bind.annotation.*;

	import javax.servlet.ServletContext;
	import javax.servlet.http.HttpServletRequest;
	import javax.servlet.http.HttpServletResponse;
	import javax.servlet.http.HttpSession;
	import java.util.Date;
	import java.util.Map;

	/**
	 * @description: TODO 类描述
	 * @date: 2022/3/26 16:06
	 **/
	@Controller
	@RequestMapping("/param")
	@SessionAttributes()
	public class ParamController {
    
    
		/**
		 * @ModelAttribute注解
		 */
		@RequestMapping("/testModelAttribute")
		public String testModelAttribute(@ModelAttribute("user") User user) {
    
    
			System.out.println("testModelAttribute运行");
			System.out.println(user);
			return "success";

		}

		/**
		 * 该方法会先执行
		 */
		@ModelAttribute
		public void showUser(String uName, Map<String, User> map){
    
    
			System.out.println("showUser方法执行了");
			// 通过用户查询数据库(模拟)
			User user = new User();
			user.setuName(uName);
			user.setuAge(23);
			user.setBirthDay(new Date());
			map.put("user", user);
		}
	}

imagen.png

5.7 Anotación de atributos de sesión

1️⃣ Función:
se utiliza para compartir parámetros entre múltiples ejecuciones de métodos de controlador.
2️⃣ Atributos:
valor: se usa para especificar el nombre del atributo que se almacenará.
tipo: se usa para especificar el tipo de datos que se almacenará.
Sin anotación @SessionAttributes

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h3>入门成功</h3>

    ${requestScope.name}
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

    <a href="param/testSessionAttributes">testSessionAttributes</a>
    <br>

</body>
</html>
	package com.pikaqiu.controller;

	import com.pikaqiu.domain.Account;
	import com.pikaqiu.domain.User;
	import org.springframework.stereotype.Controller;
	import org.springframework.ui.Model;
	import org.springframework.web.bind.annotation.*;

	import javax.servlet.ServletContext;
	import javax.servlet.http.HttpServletRequest;
	import javax.servlet.http.HttpServletResponse;
	import javax.servlet.http.HttpSession;
	import java.util.Date;
	import java.util.Map;

	/**
	 * @description: TODO 类描述
	 * @date: 2022/3/26 16:06
	 **/
	@Controller
	@RequestMapping("/param")
	public class ParamController {
    
    
		/**
		 * @SessionAttributes注解
		 */
		@RequestMapping("/testSessionAttributes")
		public String testSessionAttributes(Model model) {
    
    
			System.out.println("正常运行");
			//  底层会存储到request域对象中
			model.addAttribute("name", "zhangsan");
			return "success";
		}
	}

Anotación @SessionAttributes

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h3>入门成功</h3>

    ${requestScope.name}
    ${sessionScope}
</body>
</html>
	package com.pikaqiu.controller;

	import com.pikaqiu.domain.Account;
	import com.pikaqiu.domain.User;
	import org.springframework.stereotype.Controller;
	import org.springframework.ui.Model;
	import org.springframework.web.bind.annotation.*;

	import javax.servlet.ServletContext;
	import javax.servlet.http.HttpServletRequest;
	import javax.servlet.http.HttpServletResponse;
	import javax.servlet.http.HttpSession;
	import java.util.Date;
	import java.util.Map;

	/**
	 * @description: TODO 类描述
	 * @date: 2022/3/26 16:06
	 **/
	@Controller
	@RequestMapping("/param")
	@SessionAttributes(value = {
    
    "name"}) // 把name=zhangsan存入到session域中
	public class ParamController {
    
    
		/**
		 * @SessionAttributes注解
		 */
		@RequestMapping("/testSessionAttributes")
		public String testSessionAttributes(Model model) {
    
    
			System.out.println("正常运行");
			//  底层会存储到request域对象中
			model.addAttribute("name", "zhangsan");
			return "success";
		}
	}

La anotación @SessionAttributes implementa la obtención y eliminación de objetos en el dominio de la sesión.

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h3>入门成功</h3>

    ${requestScope.name}
    ${sessionScope}
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

    <a href="param/testSessionAttributes">testSessionAttributes</a>
    <br>
    <a href="param/getSessionAttributes">getSessionAttributes</a>
    <br>
    <a href="param/delSessionAttributes">delSessionAttributes</a>

</body>
</html>
	package com.pikaqiu.controller;

	import com.pikaqiu.domain.Account;
	import com.pikaqiu.domain.User;
	import org.springframework.stereotype.Controller;
	import org.springframework.ui.Model;
	import org.springframework.web.bind.annotation.*;

	import javax.servlet.ServletContext;
	import javax.servlet.http.HttpServletRequest;
	import javax.servlet.http.HttpServletResponse;
	import javax.servlet.http.HttpSession;
	import java.util.Date;
	import java.util.Map;

	/**
	 * @description: TODO 类描述
	 * @date: 2022/3/26 16:06
	 **/
	@Controller
	@RequestMapping("/param")
	@SessionAttributes(value = {
    
    "name"}) // 把name=zhangsan存入到session域中
	public class ParamController {
    
    
		/**
		 * @SessionAttributes注解
		 */
		@RequestMapping("/testSessionAttributes")
		public String testSessionAttributes(Model model) {
    
    
			System.out.println("正常运行");
			//  底层会存储到request域对象中
			model.addAttribute("name", "zhangsan");
			return "success";
		}
         /**
		 * Session域获取值
		 * @param modelMap
		 * @return
		 */
		@RequestMapping(path = "/getSessionAttributes")
		public String getSessionAttributes(ModelMap modelMap){
    
    
			System.out.println("getSessionAttributes....");
			String msg = (String)modelMap.get("name");
			System.out.println(msg);
			return "success";
		}

		/**
		 * Session域清除
		 * @param status
		 * @return
		 */
		@RequestMapping(path = "/delSessionAttributes")
		public String delSessionAttributes(SessionStatus status){
    
    
			System.out.println("delSessionAttributes....");
			status.setComplete();
			return "success";
		}
	}

6 Datos de respuesta y vistas de resultados

6.1 Clasificación del valor de retorno

6.1.1 Cadena de retorno

El método Controlador devuelve una cadena que especifica el nombre de la vista lógica, que se resuelve en la dirección de la vista física según el solucionador de vistas.

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <a href="returnValue/testString">testString</a>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h3>入门成功</h3>

    ${user.uName}
    ${user.birthDay}
</body>
</html>
package com.pikaqiu.controller;

import com.pikaqiu.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.Date;

/**
 * @description: TODO 类描述
 * @date: 2022/3/26 21:00
 **/
@Controller
@RequestMapping("/returnValue")
public class ReturnValueController {
    
    
	@RequestMapping("/testString")
	public String testString(Model model){
    
    
		System.out.println("testString方法执行了");
		// 模拟从数据库中查询user对象
		User user = new User();
		user.setuName("haha");
		user.setuAge(23);
		user.setBirthDay(new Date());
        //  底层会存储到request域对象中
		model.addAttribute("user", user);
		return "success";
	}
}

6.1.2 El valor de retorno es nulo

① 如果控制器的方法返回值编写成void,执行程序报404的异常,默认查找JSP页面没有找到。 
		默认会跳转到@RequestMapping(value="/initUpdate") initUpdate的页面。 
② 可以使用请求转发或者重定向跳转到指定的页面

Solicitar reenvío, redirección y respuestas directas

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <a href="returnValue/testVoid">testVoid</a>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h3>请求转发</h3>
</body>
</html>
package com.pikaqiu.controller;

import com.pikaqiu.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.Date;

/**
 * @description: TODO 类描述
 * @date: 2022/3/26 21:00
 **/
@Controller
@RequestMapping("/returnValue")
public class ReturnValueController {
    
    
	/**
	 * 请求转发
	 */
	@RequestMapping("/testVoid")
	public void testVoid(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
		System.out.println("testVoid方法执行了");
		// 1. 请求转发
		//request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request, response);
		// 2. 重定向
		//response.sendRedirect(request.getContextPath() + "/response.jsp");

		// 设置中文乱码
		response.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=UTF-8");

		// 3. 直接会进行响应
		response.getWriter().print("你好");
		return;
	}
}

6.1.3 El valor de retorno es un objeto ModelAndView

El objeto ModelAndView es un objeto proporcionado por Spring y puede usarse para ajustar vistas JSP específicas.

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <a href="returnValue/testModelAndView">testModelAndView</a>
</body>
</html>

package com.pikaqiu.controller;

import com.pikaqiu.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Date;

/**
 * @description: TODO 类描述
 * @date: 2022/3/26 21:00
 **/
@Controller
@RequestMapping("/returnValue")
public class ReturnValueController {
    
    
	/**
	 * 返回值是 ModelAndView
	 */
	@RequestMapping("/testModelAndView")
	public ModelAndView testModelAndView(){
    
    
		System.out.println("testModelAndView方法执行了");
		// 创建ModelAndView对象
		ModelAndView modelAndView = new ModelAndView();
		// 模拟从数据库中查询User对象
		User user = new User();
		user.setuName("haha");
		user.setuAge(23);
		user.setBirthDay(new Date());
		// 把user对象存储到mv对象中,也会把user对象存入到request对象
		modelAndView.addObject("user", user);
		// 跳转到哪个页面
		modelAndView.setViewName("success");
		return modelAndView;
	}
}

6.2 Reenvío y redirección proporcionados por el marco SpringMVC

6.2.1 reenvío de solicitud de reenvío

Después de que el método del controlador proporciona un valor de retorno de tipo String, el valor predeterminado es reenviar la solicitud . También se puede escribir de la siguiente manera:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <a href="returnValue/testForward">testForward</a>
</body>
</html>
package com.pikaqiu.controller;

import com.pikaqiu.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Date;

/**
 * @description: TODO 类描述
 * @date: 2022/3/26 21:00
 **/
@Controller
@RequestMapping("/returnValue")
public class ReturnValueController {
    
    
	@RequestMapping("/testForward")
	public String testForward(){
    
    
		System.out.println("testForward方法执行了");
		// 请求转发
		return "forward:/WEB-INF/pages/success.jsp";
	}
}

6.2.2 redireccionamiento redireccionamiento

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <a href="returnValue/testRedirect">testRedirect</a>
</body>
</html>
package com.pikaqiu.controller;

import com.pikaqiu.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Date;

/**
 * @description: TODO 类描述
 * @date: 2022/3/26 21:00
 **/
@Controller
@RequestMapping("/returnValue")
public class ReturnValueController {
    
    
	@RequestMapping("/testRedirect")
	public String testRedirect(){
    
    
		System.out.println("testRedirect方法执行了");
		// 重定向
		return "redirect:/response.jsp";
	}
}

6.3 ResponseBody responde a datos json

DispatcherServlet interceptará todos los recursos, lo que genera el problema de que los recursos estáticos (img, css, js) también serán interceptados y no podrán usarse. Para resolver el problema, debe configurar los recursos estáticos para que no se intercepten y agregue la siguiente configuración al archivo de configuración springmvc.xml.

  • mvc: la configuración de la etiqueta de recursos no filtra
  • El elemento de ubicación representa todos los archivos del paquete en el directorio de la aplicación web.
  • El elemento de mapeo representa todas las rutas de solicitud que comienzan con /static, como /static/a o /static/a/b
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

    <!--开启注解扫描-->
    <context:component-scan base-package="com.pikaqiu"></context:component-scan>

    <!--视图解析器-->
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>

    <!--配置自定义类型转换器-->
    <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <bean class="com.pikaqiu.util.StringToDateConverter"></bean>
            </set>
        </property>
    </bean>

    <!--前端控制器,哪些静态资源不拦截-->
    <mvc:resources mapping="/css/**" location="/css/"/>
    <mvc:resources mapping="/images/**" location="/images/"/>
    <mvc:resources mapping="/js/**" location="/js/" />

    <!--开启SpringMVC框架注解的支持-->
    <!--会自动注册RequestMappingHandlerMapping与RequestMappingHandlerAdapter两个Bean-->
    <mvc:annotation-driven conversion-service="conversionService"/>
</beans>

La anotación @RequestBody se utiliza para convertir el objeto devuelto por el método del Controlador en datos en un formato específico a través de la interfaz HttpMessageConverter, como json, xml, etc., y responder al cliente a través de Respuesta.

  • Utilice @RequestBody para obtener datos del cuerpo de la solicitud
  • Utilice la anotación @RequestBody para convertir una cadena json en un objeto JavaBean
  • Utilice la anotación @ResponseBody para convertir el objeto JavaBean en una cadena json y responder directamente
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <script src="js/jquery.min.js"></script>
    <script>
        //页面加载,绑定单击事件
        $(function () {
      
      
            $("#btn").click(function(){
      
      
                // alert("hello btn");
                // 发送ajax请求
                $.ajax({
      
      
                    // 编写json格式,设置属性和值
                    url:"user/testAjax",
                    contentType:"application/json;charset=UTF-8",
                    data:'{"username":"hehe", "password":"123", "age":"30"}',
                    dataType:"json",
                    type:"post",
                    success:function (data) {
      
      
                        // data服务器端响应的json的数据,进行解析
                        alert(data);
                        alert(data.username);
                        alert(data.password);
                    }
                })
            });
        });
     </script>
</head>
<body>
        <button id="btn">发送ajax的请求</button>
</body>
</html>

En el proceso de conversión de cadenas json y objetos JavaBean, debe utilizar el paquete jackson jar.

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.9.0</version>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-core</artifactId>
  <version>2.9.0</version>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-annotations</artifactId>
  <version>2.9.0</version>
</dependency>
package com.pikaqiu.controller;

import com.pikaqiu.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Date;

/**
 * @description: TODO 类描述
 * @date: 2022/3/26 21:00
 **/
@Controller
@RequestMapping("/returnValue")
public class ReturnValueController {
    
    
	/**
	 * 模拟异步请求响应
	 */
	public @ResponseBody User testAjax(@RequestBody User user){
    
    
		System.out.println("testAjax方法执行了");
		// 客户端发送ajax请求,传的是json字符串,后端把json字符串封装到user对象中
		System.out.println(user);
		// 做响应后,模拟查询数据库
		user.setuName("lisi");
		user.setuAge(66);
		// 作响应,@ResponseBody会将user对象转成json格式
		return user;
	}
}

7 SpringMVC implementa la carga de archivos

7.1 Requisitos previos necesarios para cargar archivos

  • El valor enctype del formulario debe ser: multipart/form-data

    (El valor predeterminado es: application/x-www-form-urlencoded) enctype: es el tipo de cuerpo de solicitud del formulario

  • El valor del atributo del método debe ser Publicar.

  • Proporcionar un campo de selección de archivos

7.2 Método tradicional de carga de archivos

Importar el paquete jar del archivo

<dependency>
  <groupId>commons-fileupload</groupId>
  <artifactId>commons-fileupload</artifactId>
  <version>1.3.1</version>
</dependency>
<dependency>
  <groupId>commons-io</groupId>
  <artifactId>commons-io</artifactId>
  <version>2.4</version>
</dependency>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
        <h3>文件上传</h3>

        <form action="user/testFileUpload" method="post" enctype="multipart/form-data">
            选择文件:<input type="file" name="upload" /><br/>
            <input type="submit" value="上传"/>
        </form>
</body>
</html>
package com.pikaqiu.controller;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.util.List;
import java.util.UUID;

/**
 * @description: TODO 类描述
 * @date: 2022/3/27 16:21
 **/
@Controller
@RequestMapping("/file")
public class FileUploadController {
    
    
	@RequestMapping("/testFileUpload")
	public String testFileUpload(HttpServletRequest request) throws Exception {
    
    
		System.out.println("文件上传");
		// 使用功能fileupload组件完成文件上传
		// 上传的位置
		String path = request.getSession().getServletContext().getRealPath("/uploads/");
		File file = new File(path);
		if(!file.exists()){
    
    
			// 创建该文件夹
			file.mkdirs();
		}
		// 实现步骤
		// 1、创建DiskFileItemFactory对象,设置缓冲区大小和临时文件目录
		// 2、使用DiskFileItemFactory 对象创建ServletFileUpload对象,并设置上传文件的大小限制。
		// 3、调用ServletFileUpload.parseRequest方法解析request对象,得到一个保存了所有上传内容的List对象。
		// 4、对list进行迭代,每迭代一个FileItem对象,调用其isFormField方法判断是否是上传文件
		//    True 为普通表单字段,则调用getFieldName、getString方法得到字段名和字段值
		//    False 为上传文件

		// 解析request对象,获取上传文件项
		DiskFileItemFactory factory = new DiskFileItemFactory();
		// 创建一个上传工具,指定使用缓存区与临时文件存储位置
		ServletFileUpload upload = new ServletFileUpload(factory);
		// 解析request
		// 它是用于解析request对象,得到所有上传项.每一个FileItem就相当于一个上传项
		List<FileItem> fileItems = upload.parseRequest(request);
		// 遍历
		for(FileItem item:fileItems){
    
    
			// 进行判断,当前item是否是上传文件对象
			if(item.isFormField()){
    
    
				// true,说明是普通表单相
			}else{
    
    
				// 说明是上传文件项
				// 获取上传文件的名称
				String filename = item.getName();
				// 把文件的名称设置为唯一值,uuid
				String uuid = UUID.randomUUID().toString().replace("-", "");
				filename = uuid + "_" + filename;
				// 完成文件上传
				item.write(new File(path, filename));
				item.delete();
			}
		}
		return "success";
	}
}

7.3 Carga de archivos del método tradicional SpringMVC

El marco SpringMVC proporciona el objeto MultipartFile, que representa el archivo cargado. El nombre de la variable debe ser el mismo que el atributo de nombre de la etiqueta del archivo del formulario.

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h3>文件上传</h3>
    <form action="file/testFileUploadBySpringMVC" method="post" enctype="multipart/form-data">
        选择文件:<input type="file" name="upload"><br/>
        <input type="submit" value="上传">
    </form>
</body>
</html>

Objeto analizador de archivos de configuración en springmvc.xml

<!-- 配置文件解析器对象,要求id名称必须是multipartResolver -->
<bean id="multipartResolver"  class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="maxUploadSize" value="10485760"/>
</bean>

Nota: el nombre de identificación debe ser multipartResolver , seleccione el archivo: consistente con la carga en la carga de MultipartFile

package com.pikaqiu.controller;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.UUID;

/**
 * @description: TODO 类描述
 * @date: 2022/3/27 16:21
 **/
@Controller
@RequestMapping("/file")
public class FileUploadController {
    
    
	/**
	 * SpringMVC文件上传
	 */
	@RequestMapping("/testFileUploadBySpringMVC")
	public String testFileUploadBySpringMVC(HttpServletRequest request, MultipartFile upload) throws Exception {
    
    
		System.out.println("springMVC文件上传");
		// 使用功能fileupload组件完成文件上传
		// 上传的位置
		String path = request.getSession().getServletContext().getRealPath("/uploads/");
		// System.out.println(path);
		// 判断,该路径是否存在
		File file = new File(path);
		if(!file.exists()){
    
    
			// 创建该文件夹
			file.mkdirs();
		}
		// 获取到上传文件的名称
		String fileName = upload.getOriginalFilename();
		String uuid = UUID.randomUUID().toString().replace("-", "");
		// 把文件的名称唯一化
		fileName = uuid + "-" + fileName;
		// 完成文件上传
		upload.transferTo(new File(path, fileName));
		return "success";
	}
}

7.4 Carga de archivos entre servidores SpringMVC

Importe los paquetes jar necesarios para el desarrollo.

<dependency>
  <groupId>com.sun.jersey</groupId>
  <artifactId>jersey-core</artifactId>
  <version>1.18.1</version>
</dependency>
<dependency>
  <groupId>com.sun.jersey</groupId>
  <artifactId>jersey-client</artifactId>
  <version>1.18.1</version>
</dependency>

referencia:

  1. https://www.cnblogs.com/ysocean/p/7375405.html
  2. https://tyshawnlee.blog.csdn.net/article/details/79169148

Supongo que te gusta

Origin blog.csdn.net/hansome_hong/article/details/131322184
Recomendado
Clasificación