SpringMVC学习:SpringMVC与SpringBoot自动配置SpringMVC

1. SpringMVC执行流程

Spring MVC 是 Spring 提供的一个基于 MVC 设计模式的轻量级 Web 开发框架,本质上相当于 Servlet.
在这里插入图片描述

  1. 用户点击某个请求路径,发起一个 HTTP request 请求,该请求会被提交到 DispatcherServlet(前端控制器)。
  2. DispatcherServlet接受到请求,将根据请求信息交给处理器映射器。
  3. 处理器映射器(HandlerMapping)根据用户的url请求查找匹配该url的Handler,并返回一个执行链。
  4. DispacherServlet再根据执行链请求处理器适配器(HandlerAdapter)。
  5. 处理器适配器调用相应的handle进行处理。
  6. 对应的handler处理完成后返回ModelAndVIew给处理器适配器。
  7. 处理器适配器将接受的ModelAndView返回给DispatcherServlet。
  8. DispatcherServlet请求视图解析器来解析视图。
  9. 视图解析器处理完后返回View对象给DispacherServlet。
  10. 最后前端控制器对View进行视图渲染(即将模型数据填充至视图中)。

MVC:
视图层(View):负责格式化数据并把它们呈现给用户,包括数据展示、用户交互、数据验证、界面设计等功能。

控制层(Controller):负责接收并转发请求,对请求进行处理后,指定视图并将响应结果发送给客户端。

数据模型层(Model):模型对象拥有最多的处理任务,是应用程序的主体部分,它负责数据逻辑(业务规则)的处理和实现数据操作(即在数据库中存取数据)。

2. Spring使用MVC

Spring MVC 是基于 Servlet 的,DispatcherServlet 是整个 Spring MVC 框架的核心,主要负责截获请求并将其分派给相应的处理器处理。所以配置 Spring MVC,首先要定义 DispatcherServlet。跟所有 Servlet 一样,用户必须在 web.xml 中进行配置。

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0">
  <!-- 部署 DispatcherServlet -->
  <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:config/springmvc-servlet.xml</param-value>
    </init-param>
    <!-- 表示容器再启动时立即加载servlet -->
    <load-on-startup>1</load-on-startup>
    <!--支持异步处理-->
    <async-supported>true</async-supported>
  </servlet>
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <!-- 处理所有URL -->
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

创建controller

@Controller
public class UserController {
    
    
    @RequestMapping(value = "/user/login")
    public String login() {
    
    
        return "login";
    }
    @RequestMapping(value = "/user/register")
    public String register() {
    
    
        return "register";
    }
}

3. SpringMVC常用注解

@Controller
控制器,处理http请求。

@RestController 复合注解
相当于@ResponseBody+@Controller合在一起的作用,RestController使用的效果是将方法返回的对象直接在浏览器上展示成json格式.

@RequestBody
通过HttpMessageConverter读取Request Body并反序列化为Object(泛指)对象

@RequestMapping
@RequestMapping 是 Spring Web 应用程序中最常被用到的注解之一。这个注解会将 HTTP 请求映射到 MVC 和 REST 控制器的处理方法上

@GetMapping用于将HTTP get请求映射到特定处理程序的方法注解
注解简写:@RequestMapping(value = “/say”,method = RequestMethod.GET)等价于:@GetMapping(value = “/say”)

@PostMapping用于将HTTP post请求映射到特定处理程序的方法注解

@PathVariable:获取url中的数据

@RequestParam:获取请求参数的值

@RequestHeader 把Request请求header部分的值绑定到方法的参数上

@CookieValue 把Request header中关于cookie的值绑定到方法的参数上

4. DispatcherServlet作用

在使用SpringBoot之后,我们表面上已经无法直接看到DispatcherServlet的使用了。

DispatcherServlet主要用作职责调度工作,本身主要用于控制流程,主要职责如下:
文件上传解析,如果请求类型是multipart将通过MultipartResolver进行文件上传解析;
通过HandlerMapping,将请求映射到处理器(返回一个HandlerExecutionChain,它包括一个处理器、多个HandlerInterceptor拦截器);
通过HandlerAdapter支持多种类型的处理器(HandlerExecutionChain中的处理器);
通过ViewResolver解析逻辑视图名到具体视图实现;
本地化解析;
渲染具体的视图等;
如果执行过程中遇到异常将交给HandlerExceptionResolver来解析。

DispatcherServlet处理流程:
当配置好DispatcherServlet后,DispatcherServlet接收到与其对应的请求之时,处理就开始了。处理流程如下:

找到WebApplicationContext并将其绑定到请求的一个属性上,以便控制器和处理链上的其它处理器能使用WebApplicationContext。默认的属性名为DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE。

将本地化解析器绑定到请求上,这样使得处理链上的处理器在处理请求(准备数据、显示视图等等)时能进行本地化处理。如果不需要本地化解析,忽略它就可以了。

将主题解析器绑定到请求上,这样视图可以决定使用哪个主题。如果你不需要主题,可以忽略它。

如果你指定了一个上传文件解析器,Spring会检查每个接收到的请求是否存在上传文件,如果是,这个请求将被封装成MultipartHttpServletRequest以便被处理链中的其它处理器使用。(Spring’s multipart (fileupload) support查看更详细的信息)

找到合适的处理器,执行和这个处理器相关的执行链(预处理器,后处理器,控制器),以便为视图准备模型数据。

如果模型数据被返回,就使用配置在WebApplicationContext中的视图解析器显示视图,否则视图不会被显示。有多种原因可以导致返回的数据模型为空,比如预处理器或后处理器可能截取了请求,这可能是出于安全原因,也可能是请求已经被处理过,没有必要再处理一次。

5. SpringBoot自动配置DispatcherServlet

SpringBoot通过@EnableAutoConfiguration实现自动装配。
在@SpringBootApplication注解里的@EnableAutoConfiguration用@Import注解导入了一AutoConfigurationImportSelector.class类,这个类的selectImports方法会扫描我们类路径下的一个spring.factories文件(里面装的是很多官方写好的自动配置类的全限定名,存放的路径是META-INF/spring.factories),然后返回这些类的名字。简单的说SpringBoot加载了各种已经写好的Config类文件,实现了这些JavaConfig配置文件的重复利用和组件化。

spring.factories文件里面有DispatcherServletAutoConfiguration,也就是说这个类会在springboot启动时被加载,DispatcherServletAutoConfiguration这个配置类从上面的注解都可以看出来:是对dispatcherServlet进行自动配置的,其中里面有个内部类:DispatcherServletRegistrationConfiguration,这个类自动生成dispatcherServlet bean对象和生成一个用于注册dispatcherServlet的bean对象DispatcherServletRegistrationBean,这个对象的作用是:外部调用能够通过其顶级父接口ServletContextInitializer的onStartup方法最终层层调用到ServletRegistrationBean中的addRegistration方法:最终将DispatcherServlet添加到tomcat上下文。

在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42774617/article/details/131838401