当前位置: 首页 > article >正文

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 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的代码便可改写成:

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-响应这一篇中介绍处理器适配器中配置消息转换器,请感兴趣的读者继续阅读。


http://www.kler.cn/a/232718.html

相关文章:

  • 标准C++ 字符串
  • 【Golang】Channel的ring buffer实现
  • -1大于4?负数与无符号整数类型:size_t的比较问题(strlen)
  • uniapp+vue2 设置全局变量和全局方法 (兼容h5/微信小程序)
  • 网页版五子棋——对战模块(服务器端开发②)
  • C++初阶——list
  • vscode 括号 python函数括号补全
  • 【Flink】FlinkSQL的DataGen连接器(测试利器)
  • arkTS开发鸿蒙OS应用(登录页面实现,连接数据库)
  • 158基于matlab的用于分析弧齿锥齿轮啮合轨迹的程序
  • flink反压及解决思路和实操
  • (十八)springboot实战——spring securtity注解方式的授权流程源码解析
  • 如何连接ChatGPT?无需科学上网,使用官方GPT教程
  • AT_abl_d 题解
  • Java基础常见面试题总结-并发(二)
  • 淘宝镜像到期如何切换镜像及如何安装淘宝镜像
  • Git版本与分支
  • IPMI命令
  • 元宇宙虚拟数字人实训室:推动高校培养创新技术人才
  • 【每日一题】LeetCode——链表的中间结点
  • Python:批量url链接保存为PDF
  • 智能运维哪些算法?智能运维包含哪些
  • 多模态对比语言图像预训练CLIP:打破语言与视觉的界限,具备零样本能力
  • [Vue3]父子组件相互传值数据同步
  • Redis发布订阅及事务管理
  • docker常用10条容器操作命令