SpringMVC-组件解析

一、引子

我们在上一篇文章Spring MVC-基本概念中,为读者解释了如何使用SpringMVC框架,将承接客户端请求的工作从原生的Servlet转移到我们熟知的Controller中。那么我们不禁会好奇,SpringMVC框架到底做了什么,是怎么把请求分发给Controller的呢?请读者继续阅读。

二、请求流程

SpringMVC的各个组件及执行流程如下图所示:

SpringMVC的请求流程主要包括以下步骤:

  1. 客户端发送请求被前端控制器DispatcherServlet接收;
  2. 前端控制器DispatcherServlet调用处理器映射器HandlerMapping查询处理器;
  3. 处理器映射器找到具体的处理器(可根据xml配置、注解进行查找),生成处理器对象及处理器拦截器,返回处理器执行链HandlerExecutionChain;
  4. 前端控制器调用处理器适配器HandlerAdapter执行处理器;
  5. 处理器适配器经过适配调用映射到的处理器Handler(即Controller,也叫后端控制器);
  6. 处理器执行完成后返回ModelAndView对象;
  7. 处理器适配器将ModelAndView返回给前端适配器;
  8. 前端控制器将ModelAndView传给视图解析器ViewResolver;
  9. ViewResolver解析后返回具体的View;
  10. 前端控制器根据View进行渲染视图(同时会把Model中数据填充到视图中),响应给客户端。
三、快速演示

例如,我们可以在spring-mvc.xml配置文件中声明视图解析器,设置视图的前缀与后缀:

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

    <!--扫描控制层组件-->
    <context:component-scan base-package="com.bylearning.controller"/>

    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />
    </bean>
</beans>

于是我们在Controller的代码便可改写成:

java 复制代码
import com.bylearning.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloController {

    @Autowired
    private UserService userService;

    @RequestMapping(value = "/")
    public String protal() {
        // 将逻辑视图返回
        return "index";
    }

    @RequestMapping(value = "/hello")
    public String hello() {
        System.out.println(userService);
        return "success";
    }
}

当然,此时的目录结构是:

这里我们先不去过多演示关于SpringMVC组件的自定义使用方法,重点是了解请求的执行流程,以及由@WebServlet注解演变到@Controller的过程中发生了什么,这样才能更加深刻的了解框架与技术的更迭。

此外,关于组件的另一个示例使用,我们恰巧需要在SpringMVC-响应这一篇中介绍处理器适配器中配置消息转换器,请感兴趣的读者继续阅读。

相关推荐
云闲不收2 天前
GraphQL教程
后端·状态模式·graphql
e***98574 天前
SpringMVC的工作流程
状态模式
q***08744 天前
SpringMVC的工作流程
状态模式
g***78914 天前
SpringBoot中使用TraceId进行日志追踪
spring boot·后端·状态模式
shuxiaohua6 天前
使用HttpURLConnection调用SSE采坑记录
状态模式
崎岖Qiu6 天前
状态模式与策略模式的快速区分与应用
笔记·设计模式·状态模式·策略模式·开闭原则
Jonathan Star7 天前
前端需要做单元测试吗?哪些适合做?
前端·单元测试·状态模式
一水鉴天8 天前
整体设计 全面梳理复盘 之40 M3 统摄三层 AI 的动态运营社区(Homepage)设计
架构·transformer·状态模式·公共逻辑
前端玖耀里11 天前
Vue + Axios + Node.js(Express)如何实现无感刷新Token?
状态模式
将编程培养成爱好12 天前
C++ 设计模式《外卖骑手状态系统》
c++·ui·设计模式·状态模式