首页 > 其他分享 >15、SpringMVC之常用组件及执行流程

15、SpringMVC之常用组件及执行流程

时间:2023-11-25 22:00:37浏览次数:21  
标签:15.1 DispatcherServlet 15 请求 SpringMVC 视图 Handler 组件 执行

15.1、常用组件

15.1.1、 DispatcherServlet

DispatcherServlet 是前端控制器,由框架提供,不需要工程师开发;

作用:统一处理请求和响应,整个流程控制的中心,由它调用其它组件处理用户的请求。

15.1.2、HandlerMapping

HandlerMapping 是处理器映射器,由框架提供,不需要工程师开发;

作用:根据请求的 url、method 等信息去查找 Handler(即控制器方法)。

15.1.3、Handler

Handler 是处理器(即控制器方法),需要工程师开发

作用:对匹配的用户请求进行具体处理。

15.1.4、HandlerAdapter

HandlerAdapter 是处理器适配器,由框架提供,不需要工程师开发;

作用:通过 HandlerAdapter 来调用处理器(即控制器方法)。

15.1.5、ViewResolver

ViewResolver 是视图解析器,由框架提供,不需要工程师开发;

作用:进行视图解析,得到相应的视图,例如:ThymeleafView、InternalResourceView、RedirectView。

15.1.6、View

View 是视图,,需要工程师开发

作用:将共享域中的数据通过页面展示给用户。

15.2、执行流程

  • 用户向服务器发送请求,请求被 SpringMVC 的前端控制器 DispatcherServlet 捕获;

  • DispatcherServlet 对请求 URL 进行解析,得到 URI ,判断请求 URI 对应的映射是否存在;

    • 如果请求 URI 对应的映射不存在:

      • 再判断是否配置了 mvc:default-servlet-handler :

        • 如果没配置,则控制台日志显示找不到请求对应的目标资源,客户端展示404错误;

        • 如果有配置,则访问目标资源(一般为静态资源,如:JS,CSS,HTML);若目标资源不存在,客户端也会展示404错误。

    • 如果请求 URI 对应的映射存在,则执行以下流程:

      • 根据该 URI ,调用 HandlerMapping 获得该 Handler 配置的所有相关的对象(包括Handler对象以及对应的拦截器),
        最后以 HandlerExecutionChain (处理器执行链对象)的形式返回;

      • DispatcherServlet 根据获得的 Handler ,选择一个合适的 HandlerAdapter ;

      • 如果成功获得了 HandlerAdapter ,此时将开始执行对应拦截器的 preHandler() 方法【正向】;

      • 提取 Request (请求)中的数据,填充到 Handler 的入参,开始执行 Handler(控制器方法)对用户请求进行具体处理;
        在填充 Handler 的入参过程中,根据控制器方法的配置,Spring将帮忙做一些额外的工作:

        • HttpMessageConverter(常用): 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息

        • 数据转换(常用):对请求消息进行数据转换,如将 String 转换成 Integer、Double 等

        • 数据格式化(少用):对请求消息进行数据格式化,如将字符串转换成格式化数字或格式化日期等

        • 数据验证(少用):验证数据的有效性(长度、格式等),验证结果存储到 BindingResult 或 Error 中

      • Handler 执行完成后,向 DispatcherServlet 返回一个 ModelAndView 对象;
        (此时会判断 Handler 执行是否存在异常,如果存在异常,则执行 HandlerExceptionResolver 进行异常处理)

      • 如果 Handler 执行不存在异常,则执行对应拦截器的 postHandle() 方法【逆向】,存在异常则跳过该步骤;

      • 根据返回的ModelAndView 选择一个适合的 ViewResolver 进行视图解析,根据 Model 和 View 来渲染视图;

      • 渲染视图完毕后,执行对应拦截器的 afterCompletion() 方法【逆向】;

      • 将渲染结果返回给客户端。

image

标签:15.1,DispatcherServlet,15,请求,SpringMVC,视图,Handler,组件,执行
From: https://www.cnblogs.com/Javaer1995/p/17842724.html

相关文章

  • 15-有参转录组实战1-批量质控-fastp
     #本教程部分参考B站15天入门生物信息教程,在开启以下教程前,请务必看看我前面两个教程,Linux系统上安装R语言(https://www.bilibili.com/read/cv24718269)和下载好转录组(https://www.bilibili.com/read/cv24719254)。#1,我们对上次下载的转录组进行实战分析,首先进行质量控制,使用fast......
  • 零代码AppLink平台触发事件组件
    AppLink平台组件组成AppLink平台组件分成三个板块触发事件组件、基础组件和数据连接器触发组件下有三个组件,分别是Webhook、定时器、高级Webhook,那他们在AppLink平台里的原理、触发动作以及怎么使用呢?接下来为大家演示下。Webhook是什么?Webhook是AppLink的内置组件之一,其工作原......
  • Educational Codeforces Round 158 补题(A~D)
    A.思路找出最大耗油的路程即可ac代码#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;consti64inf=8e18;typedefpair<int,int>pii;voidsolve(){intn,x;cin>>n>>x;std::vector<int>v(n);f......
  • 83rd 2023/11/15 NOIP Day-2
    早上回学校参加国标了,晚上继续停课训练思考了今天上午其他学校人打的模拟赛,T3是很有意思的网络流建图T1是一道贪心策略题,思路认真推之下应该能够想出老师讲了面对比赛应有的态度,是的,应该全力以赴面对这场难得的机会再补一下短板吧,DP、贪心和网络流建图(虽说不一定用得上),但万无......
  • Educational Codeforces Round 158 (Rated for Div. 2)
    A.LineTrip题意是:有n个加油点,人要来回两趟,问你最少要多少油?usingnamespacestd;inta[100];voidsolve(){ intn,m; cin>>n>>m; for(inti=1;i<=n;i++)cin>>a[i]; intans=a[1]; for(inti=2;i<=n;i++){ ans=max(ans,a[i]-a[i-1]); } ans=max(ans,2*(m-......
  • kubelet监控资源组件cAdvisor
    为什么kubelet引入cAdvisor1无法提供节点粒度资源数据。2dockerstats只能查看容器当前资源占用情况,无法查看历史数据。3没有可视化页面。部署cAdvisor容器并访问页面dockerrun-itd\--rm\--volume=/:/rootfs:ro\--volume=/var/run:/var/run:rw\--volume=/var/lib/......
  • Educational Codeforces Round 158 (Rated for Div. 2) A-C
    A大致题意:有一条长度为x的直线公路,最开始你位于0号点并且此时你的油箱装满了油,公路有n个加油站,当你经过加油站的时候你可以在加油站加满油,每走一个单位需要花费1升油量,起始位置和终点没有加油站,请问你的油箱容量至少为多少升才可以够你跑一个来回。解题思路:我们的路径大致是......
  • [Codeforces] CF1506C Epic Transformation
    EpicTransformation-洛谷算是今天的题目里边思维难度最高的一道了,但是代码真的简单的要死题意你有一个长度为 \(n\) 的序列 \(a\),你可以对其进行下列操作:选择 \(i,j\) 满足 \(*a_i\neqa_j*\) 然后删除 \(*a_i,a_j*\) 两个数。求序列 a 经过若干次操作后最少......
  • Oracle DBA遇到的top150个问题
    作为OracleDBA(数据库管理员),以下是更多常见的Oracle数据库管理中可能遇到的150个问题案例:数据库备份和恢复失败数据库性能下降数据库连接问题长时间运行的查询和死锁数据库服务器崩溃或宕机数据库空间不足数据库日志文件过大数据库表空间损坏数据库安全漏洞数据库版本升......
  • React 组件之状态
    没有什么是不可能的,只是需要找到正确的方法。1.什么是状态?状态就是组件内部特有数据的载体(组件数据挂载方式),改变数据页面就会刷新,由组件自己设置和更改,也就是说由组件自己产生、维护,使用状态的目的就是为了在不同的状态下使组件的显示不同(自己管理),这在React中称为:条件渲染......