深入Spring MVC的工作流程

news2024/11/15 7:56:06

深入Spring MVC的工作流程

在Spring MVC的面试问题中,常常被询问到的一个问题。Spring MVC的程序中,HTTP请求是如何从开始到结束被处理的。为了研究这个问题,我们将需要深入学习一下Spring MVC框架的核心过程和工作流程。

img

1. 启动请求生命周期:

  1. 用户发起请求: 整个过程始于用户通过浏览器或客户端触发一个HTTP请求到特定的URL。
  2. DispatcherServlet接收请求: 在服务器端,DispatcherServlet,是Spring MVC中的关键组件,拦截所有传入的请求,充当请求处理的中心点。

2. 控制器执行:

  1. 控制器处理请求: 控制器负责处理业务逻辑,处理传入的请求并返回相关的模型数据和视图。
  2. ModelAndView返回结果: 控制器使用ModelAndView将处理结果发送回DispatcherServlet。

3. 视图渲染:

  1. ViewResolver解析视图名称: DispatcherServlet使用ViewResolver来解析控制器返回的视图名称。
  2. 渲染视图: 确定的视图被渲染,生成用户可用的HTML或其他格式。

4. Spring MVC的工作流程

4.1 Servlet容器的作用:
  • Servlet的创建与生命周期: Servlet容器(如Tomcat)负责创建Servlet和Filter实例,并调用它们的各种生命周期方法,如init()、service()和destroy()。
  • HTTP请求处理: 对于HTTP请求,由HttpServlet处理,根据请求方法调用不同的doXXX()方法,如doGet()处理GET请求,doPost()处理POST请求。
4.2 DispatcherServlet的配置:
  • DispatcherServlet在web.xml的配置: 为启用Spring MVC,需要在web.xml中声明DispatcherServlet。它监听URL模式*,表示将所有请求映射到DispatcherServlet。
  • URL模式的重要性: 如果请求匹配DispatcherServlet的URL模式,将由Spring MVC处理,否则将由其他Servlet或Filter处理。
4.3 DispatcherServlet如何识别Controller:
  • @RequestMapping注解的使用: DispatcherServlet使用@Controller和@RequestMapping注解或Spring MVC配置文件来确定请求URL与不同控制器的映射关系。
  • 其他注解的应用: 通过使用特定的请求处理注解,如@GetMapping或@PostMapping,DispatcherServlet可以更精确地确定Controller的映射。
@Controller
@RequestMapping("/appointments")
public class AppointmentsController {
   @GetMapping
   public Map get() {
      return appointmentBook.getAppointmentsForToday();
   }

   @PostMapping
   public String add(@Valid AppointmentForm appointment, BindingResult result) {
      if (result.hasErrors()) {
         return "appointments/new";
      }
      appointmentBook.addAppointment(appointment);
      return "redirect:/appointments";
   }
}
4.4 视图的处理:
  • DispatcherServlet选择视图: 处理请求后,Controller返回逻辑视图名称和模型给DispatcherServlet。
  • ViewResolver解析视图: DispatcherServlet通过ViewResolver解析视图,直到确定实际的View来呈现输出。
  • 视图的呈现: DispatcherServlet与选定的视图(如Thymeleaf、Freemarker、JSP)联系,传递模型数据,并根据模型数据呈现输出。
4.5 返回给客户端:
  • HTTP响应返回客户端: 渲染的输出作为HTTP响应返回给客户端。
  • Filter的应用: 在返回客户端的过程中,可以经过任何配置的Filter,如Spring Security过滤器链或配置为将响应转换为JSON或XML的Filter。

5. Spring MVC的工作流程总结:

通过对Java应用程序中Spring MVC框架中HTTP请求的流程进行了解,我们总结一下其基本流程:

用户发起请求,请求首先被转发到DispatcherServlet,它是Spring MVC的前端控制器。DispatcherServlet的主要任务是统一处理用户发来的请求和响应,扮演着中央协调者的角色,有助于减少各组件之间的耦合性。

  1. DispatcherServlet处理请求:
    • DispatcherServlet接收到用户请求后,负责协调整个请求处理流程。
  2. HandlerMapping进行请求映射:
    • DispatcherServlet将请求交给HandlerMapping处理器映射器。
    • HandlerMapping解析请求,返回一个HandlerExecutionChain对象。
  3. HandlerExecutionChain包含Handler和拦截器:
    • HandlerExecutionChain包含了要执行的Handler对象和拦截器对象。
  4. HandlerAdapter适配器处理请求:
    • DispatcherServlet根据HandlerExecutionChain找到匹配的HandlerAdapter适配器。
    • HandlerAdapter适配器负责执行Handler对象,即具体的处理器,处理请求。
  5. Handler执行业务逻辑:
    • Handler处理器执行业务逻辑,通常调用业务逻辑Service中的方法。
  6. Handler处理器返回ModelAndView:
    • 处理完成后,Handler处理器返回一个ModelAndView对象,其中包含了视图名称和模型数据。
  7. DispatcherServlet发送给ViewResolver:
    • ModelAndView被DispatcherServlet发送给ViewResolver视图解析器进行解析。
  8. ViewResolver解析视图:
    • ViewResolver根据视图名称找到对应的视图类型,然后将模型数据填充到视图中。
  9. ViewResolver返回结果:
    • ViewResolver解析后返回视图,即最终渲染用户界面的视图。
  10. DispatcherServlet完成渲染:
    • DispatcherServlet负责将最终的结果返回给用户,完成整个请求处理流程。
  11. 完成的结果返回给用户:
    • 最终,完成的结果通过DispatcherServlet返回给用户,呈现在用户的浏览器或客户端上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1431053.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代码随想录算法训练营29期|day39 任务以及具体任务

第九章 动态规划part02 62.不同路径 /*** 1. 确定dp数组下标含义 dp[i][j] 到每一个坐标可能的路径种类* 2. 递推公式 dp[i][j] dp[i-1][j] dp[i][j-1]* 3. 初始化 dp[i][0]1 dp[0][i]1 初始化横竖就可* 4. 遍历顺序 一行一行遍历* 5. 推导结果 。。。。。。。。** param m* p…

Windows内存管理 - 虚拟内存地址概念(Virtual Memory Address)

虽然可以寻址4GB的内存,而在PC里往往没有如此多的真实物理内存。操作系统和硬件(这里指的是CPU中的内存管理单元MMU)为使用者提供了虚拟内存的概念。Windows的所有程序(包括Ring0层和Ring3层的程序)可以操作的都是虚拟…

GPT3.5\GPT4系列计算完整prompt token数的官方方法

前言: ChatGPT如何计算token数?https://wtl4it.blog.csdn.net/article/details/135116493?spm1001.2014.3001.5502https://wtl4it.blog.csdn.net/article/details/135116493?spm1001.2014.3001.5502 GPT3.5\GPT4系列计算完整prompt token数的官方方法&#xff1…

航母编队反无人机蜂群作战能力需求分析

源自:指挥控制与仿真 作者:樊辉锦、巫银花、毕月、苏泽亚 “人工智能技术与咨询” 发布 声明:公众号转载的文章及图片出于非商业性的教育和科研目的供大家参考和探讨,并不意味着支持其观点或证实其内容的真实性。版权归原作者所有&#xff…

01 JDK的安装

JDK的安装 1 JDK的安装:参考: 1 JDK的安装: 说到Java,永远都有一个绕不开的话题,就是JDK(Java Development Kit)。JDK 是整个Java的核心,包括了Java运行环境,Java工具和Java基础的类库。安装JD…

来了来了,5000个红包封面免费领

今年公众号很慷慨,给长期运营的作者免费发放了6w个红包封面,感谢公众号平台。 往年还是自己花钱找别人设计,平台审核通过后才能正常发放给大家,自从AI绘画工具问世后,自己也能设计了。 下面的两个封面都是我用AI工具St…

05、全文检索 -- Solr -- Solr 全文检索之图形界面的文档管理(文档的添加、删除,如何通过关键字等参数查询文档)

目录 Solr 全文检索之文档管理添加文档使用 JSON 添加文档:使用 XML 添加文档: 删除文档使用 JSON 删除文档:使用 XML 删除文档: 查询文档查询文档的详细参数fq(Filter Query):过滤sort:排序sta…

隧道穿透:常规反弹、加密反弹

目录 1、常规反弹 (1)Windows正向连接shell (2)Windows反向连接shell (3)Linux正向连接shell (2)利用Linux自带bash反弹Shell 2、加密反弹 1、常规反弹 假设在内网环境中发现…

寒假 day2

1、请编程实现单向循环链表的头插&#xff0c;头删、尾插、尾删 #include<stdio.h> #include<string.h> #include<stdlib.h> enum{FALSE-1,SUCCESS}; typedef int datatype; //定义节点结构体 //节点&#xff1a;数据域、指针域 typedef struct Node {//数…

机器学习系列——(九)决策树

简介 决策树作为机器学习的一种经典算法&#xff0c;在数据挖掘、分类和回归等任务中广泛应用。本文将详细介绍机器学习中的决策树算法&#xff0c;包括其原理、构建过程和应用场景。 原理 决策树是一种基于树状结构的监督学习算法&#xff0c;它通过构建一棵树来对数据进行分…

leetcode刷题(剑指offer)138.随机链表的复制

138.随机链表的复制 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成&#xff0c;其中每个新节点的值都设为其对应的原…

【Linux网络编程一】网络基础1(网络框架)

【Linux网络编程一】网络基础1&#xff08;网络框架&#xff09; 一.什么是协议1.通信问题2.协议本质3.网络协议标准 二.协议分层1.为什么协议要分层2.如何具体的分层 三.操作系统OS与网络协议栈的关系1.核心点&#xff1a;网络通信贯穿协议栈 四.局域网中通信的基本原理1.封装…

使用 IntelliJ IDEA 配合 Docker 对 Weblogic 中间件进行远程调试

使用idea对jar包远程调试&#xff1a; 打开一个springboot的项目进行远程调试设置&#xff1a; 运行&#xff1a; 其实我不太明白远程调试的意义&#xff0c;本地直接debug不好嘛。。。 点击debug的按钮&#xff0c;打断点测试&#xff1a; 跑到断点处&#xff1a; 远程de…

JDK17中的密封类sealed和permits使用指南:什么是Java中的sealed和permits?

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

MYSQL——MySQL8.3无法启动

在新电脑上装了个MySQL&#xff0c;但是无法使用net start mysql启动&#xff0c;很是纳闷&#xff0c;使用mysqld --console去查看报错&#xff0c;也是没报错的&#xff0c;但是奇怪的是&#xff0c;我输入完这个mysqld --console之后&#xff0c;就等于启动了mysql了&#x…

一步步成为React全栈大师:从环境搭建到应用部署

文章目录 第一步&#xff1a;环境搭建第二步&#xff1a;了解React基础第三步&#xff1a;组件与路由第四步&#xff1a;状态管理第五步&#xff1a;接口与数据交互第六步&#xff1a;样式与布局第七步&#xff1a;测试第八步&#xff1a;构建与部署《深入浅出React开发指南》内…

系统架构20 - 统一建模语言UML(上)

统一建模语言 组成要素事物关系 在目前的软件开发方法中&#xff0c;面向对象的方法占据着主导地位。面向对象方法的主导地位也决定着软件开发过程模型化技术的发展&#xff0c;面向对象的建模技术方法也就成为主导的方法。 公认的面向对象建模语言出现于20世纪70年代中期。从1…

快速上手AI代码生成:CodeGeeX

1. VSCode等IDE插件直接搜到 CodeGeeX 就可以安装&#xff0c;装上之后&#xff0c;会看到左侧出现了&#xff1a; 2. 登陆以后&#xff0c;在代码区域就可以直接用了。 3. 官网功能说明文档&#xff08;非常简洁清晰&#xff09;&#xff1a; https://zhipu-ai.feishu.cn/wik…

文心一言 VS 讯飞星火 VS chatgpt (193)-- 算法导论14.3 1题

一、用go语言&#xff0c;写出作用于区间树的结点且在 〇(1) 时间内更新 max 属性的过程 LEFT-ROTATE 的伪代码。 文心一言&#xff1a; 以下是一个简单的LEFT-ROTATE的伪代码&#xff0c;它对一个二叉搜索树进行左旋转操作。这个操作的作用是更新节点的max属性&#xff0c;使…

css3动画的三种实现方式

目录 一、是什么二、实现方式transition 实现渐变动画transform 转变动画animation 实现自定义动画 三、总结参考文献 一、是什么 CSS动画&#xff08;CSS Animations&#xff09;是为层叠样式表建议的允许可扩展标记语言&#xff08;XML&#xff09;元素使用CSS的动画的模块 …