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 小时前
优雅分页:Spring Boot 中 Pageable 参数的自动提取与全局复用实践
状态模式
PPPPickup10 小时前
easymall----管理后端分类展示
状态模式
前端不太难13 小时前
HarmonyOS 游戏运行态的完整状态机图
游戏·状态模式·harmonyos
前端不太难2 天前
HarmonyOS 为何用 Ability 约束游戏?
游戏·状态模式·harmonyos
新缸中之脑2 天前
5个AI设计的音乐 UI 比较
人工智能·ui·状态模式
前端不太难2 天前
游戏在 HarmonyOS 上如何“活”?
游戏·状态模式·harmonyos
浮游本尊2 天前
React 18.x 学习计划 - 第十三天:部署与DevOps实践
学习·react.js·状态模式
Vv1997_3 天前
JavaWeb后端全局异常处理
状态模式
小郎君。3 天前
PDF-知识图谱全流程前后端实现【工具已实现,搭建前后端pipline】
pdf·状态模式·知识图谱
前端不太难3 天前
HarmonyOS PC 焦点系统的正确建模方式
华为·状态模式·harmonyos