Spring MVC执行流程

Spring MVC介绍(一)之 Spring MVC体系结构与执行流程 Spring MVC介绍(一)之 MVC 体系结构与执行流程 Spring MVC是Spring的一个模块,包含Web MVC、Framework,Web Views,JSP等等。 其中MVC分别对应:Model,View,Controller,本质上SpirngMVC还是使用Servlet进行处理,并在其基础上进行了封装,简化了开发流程,提高易用性,并使得逻辑结构变得非常清晰。 Spring... 阅读详情

Spring MVC执行流程

Spring mvc 是控制层框架 

DispatherServlet 是一个servlet

 

请求交给dispatcherServlet 进行管理  

重写了这个doService方法

 

  protected void service(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException
    {
        String method = req.getMethod();  //判断请求方法

        if (method.equals(METHOD_GET)) {  //如果是get方法
            long lastModified = getLastModified(req);
            if (lastModified == -1) {
                // servlet doesn't support if-modified-since, no reason
                // to go through further expensive logic
                doGet(req, resp);
            } else {
                long ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);
                if (ifModifiedSince < lastModified) {
                    // If the servlet mod time is later, call doGet()
                    // Round down to the nearest second for a proper compare
                    // A ifModifiedSince of -1 will always be less
                    maybeSetLastModified(resp, lastModified);
                    doGet(req, resp);
                } else {
                    resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
                }
            }

        } else if (method.equals(METHOD_HEAD)) {
            long lastModified = getLastModified(req);
            maybeSetLastModified(resp, lastModified);
            doHead(req, resp);

        } else if (method.equals(METHOD_POST)) {
            doPost(req, resp);
            
        } else if (method.equals(METHOD_PUT)) {
            doPut(req, resp);
            
        } else if (method.equals(METHOD_DELETE)) {
            doDelete(req, resp);
            
        } else if (method.equals(METHOD_OPTIONS)) {
            doOptions(req,resp);
            
        } else if (method.equals(METHOD_TRACE)) {
            doTrace(req,resp);
            
        } else {
            //
            // Note that this means NO servlet supports whatever
            // method was requested, anywhere on this server.
            //

            String errMsg = lStrings.getString("http.method_not_implemented");
            Object[] errArgs = new Object[1];
            errArgs[0] = method;
            errMsg = MessageFormat.format(errMsg, errArgs);
            
            resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);
        }
    }
    

 

 

 流程:

1 spring mvc 任何请求先交给DispatcherServlet进行管理  

@SuppressWarnings("serial")
public class DispatcherServlet extends FrameworkServlet {

)

 

2 执行DispatcherServlet的 doService方法 交给doDispatch方法

@Override
    protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
try {
            doDispatch(request, response);
        }

看这个核心的方法:

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
        HttpServletRequest processedRequest = request;
        HandlerExecutionChain mappedHandler = null;
        boolean multipartRequestParsed = false;

        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);

        try {
            ModelAndView mv = null;    //返回给客户端的
            Exception dispatchException = null;

            try {
                processedRequest = checkMultipart(request);   //检查上传文件的
                multipartRequestParsed = (processedRequest != request);

                // Determine handler for the current request.
                mappedHandler = getHandler(processedRequest);  //获取到HandlerMapping  任何一个请求到这里都可以拿到一个注册信息了  哪个controller 哪个方法
                if (mappedHandler == null) {  
                    noHandlerFound(processedRequest, response);
                    return;
                }

                // Determine handler adapter for the current request.
                HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());  //适配器 主要做拦截器操作(在方法执行之前执行)

                // Process last-modified header, if supported by the handler.
                String method = request.getMethod();
                boolean isGet = "GET".equals(method);   //判断是get请求
                if (isGet || "HEAD".equals(method)) {
                    long lastModified = ha.getLastModified(request, mappedHandler.getHandler());
                    if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                        return;
                    }
                }

                if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                    return;
                }

                // Actually invoke the handler.
                mv = ha.handle(processedRequest, response, mappedHandler.getHandler());  //开始执行 执行完毕获取到当前ModeAndView

                if (asyncManager.isConcurrentHandlingStarted()) {  
                    return;
                }

                applyDefaultViewName(processedRequest, mv);
                mappedHandler.applyPostHandle(processedRequest, response, mv);
            }
            catch (Exception ex) {
                dispatchException = ex;
            }
            catch (Throwable err) {
                // As of 4.3, we're processing Errors thrown from handler methods as well,
                // making them available for @ExceptionHandler methods and other scenarios.
                dispatchException = new NestedServletException("Handler dispatch failed", err);
            }
            processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        }
        catch (Exception ex) {
            triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
        }
        catch (Throwable err) {
            triggerAfterCompletion(processedRequest, response, mappedHandler,
                    new NestedServletException("Handler processing failed", err));
        }
        finally {
            if (asyncManager.isConcurrentHandlingStarted()) {
                // Instead of postHandle and afterCompletion
                if (mappedHandler != null) {
                    mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
                }
            }
            else {
                // Clean up any resources used by a multipart request.
                if (multipartRequestParsed) {
                    cleanupMultipart(processedRequest);
                }
            }
        }
    }

 

3 doDispatch获取HandlerMapping。表示获取当前的具体的请求信息class地址和方法名称,获取到适配器

4HandlerAdapter 开始拦截 

5 执行完毕之后,获取当前ModelAndView

6 执行视图解析

 

 

 

 

 

Spring工作流程描述

      1. 用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获;

      2. DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回;

      3. DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter。(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(...)方法)

       4.  提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。 在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:

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

      数据转换:对请求消息进行数据转换。如String转换成Integer、Double等

      数据根式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等

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

      5.  Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象;

      6.  根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet ;

      7. ViewResolver 结合Model和View,来渲染视图

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


 

Spring工作流程描述

    为什么Spring只使用一个Servlet(DispatcherServlet)来处理所有请求?

     详细见J2EE设计模式-前端控制模式

    Spring为什么要结合使用HandlerMapping以及HandlerAdapter来处理Handler?

    符合面向对象中的单一职责原则,代码架构清晰,便于维护,最重要的是代码可复用性高。如HandlerAdapter可能会被用于处理多种Handler。

 

 

 

 

posted @ 2019-04-16 00:37 toov5 阅读(...) 评论(...) 编辑 收藏

【MVC、Spring MVC介绍、区别、执行流程】 (Model-View-Controller)是一种软件架构模式,其中应用程序被划分为三个部分:模型(Model)、视图(View)和控制器(Controller)。MVC框架的主要目标是将应用程序的业务逻辑(Model)与用户界面(View)分离开来,从而提高应用程序的可维护性和可扩展性。MVC框架通常使用注解来标识不同的组件(例如,@Controller、@Service、@Repository等)。,注解的原理是通过反射机制来实现的。 阅读详情

相关推荐

Mamba再封神!与YOLO结合,拿下二区!好发不卷!

相比传统的YOLO改进,Mamba是新技术,两者结合尚在蓝海阶段,可发挥空间大!更为关键的是,它在检测精度和速度方面,都让以往的YOLO模型难以望其项背!比如代表模型Mamba YOLO,便在参数减少45.5%、FLOPs减少50%的同时,精度还比YOLOv8高6.1%!这主要得益于,Mamba能够捕捉长期依赖关系,而YOLO则擅长捕捉局部特征,两者能够优势互补,且Mamba线性复杂度的特性,也有利于提高计算效率!为了让大家能够紧跟前沿发展,找到更多灵感启发,我给大家10种。

2401_88190197的博客 2506

opencv 叠加文字_EmguCV(OpenCV)实现高效显示汉字及叠加

视频处理中,往往需要在上面增加文字包括汉字英文字母数字标点等,Emgu.CV/opencv 绘图 线面文字包括中文这篇里也有相关介绍,但是这篇里根据逐像素修改rgb值的方法效率太低查了很多资料,基本上opencv叠加汉字的方法都起源于这里http://wenku.baidu.com/link?url=g1dCXwRbSpy7XUhsStRLANQRmvAXKSAa1ohrphx1R3XSZozi...

weixin_39662263的博客 838

Cortex-M TrustZone实战:从硬件隔离到安全交互的嵌入式开发指南

在嵌入式系统开发中,硬件安全隔离是构建可信执行环境(TEE)的核心技术。其原理是通过处理器硬件机制,将系统资源划分为安全与非安全域,实现内存、外设和代码的强制访问控制。这项技术的核心价值在于,它能在单一芯片上为资源受限的物联网(IoT)设备、智能传感器等提供芯片级的安全基础,无需依赖外置安全元件,从而降低BOM成本并简化设计。典型的应用场景包括保护设备密钥、实现安全启动、构建安全服务(如加密、密钥管理)以供应用程序调用。本文聚焦于Arm Cortex-M系列微控制器上的TrustZone技术实现,针对开发中

weixin_42639246的博客 300

10.RV1126-OPENCV 视频中添加时间戳

原理和之前膨胀,腐蚀一样,只不过把腐蚀流程编程putText流程。

s15335的博客 674

基础知识学习 -- qnx 系统

qnx os车载系统

求变,从思想开始 3873

Visionpro 使用CogPMAlignTool工具提取匹配轮廓点

【代码】Visionpro 使用CogPMAlignTool工具提取匹配轮廓点。

weixin_43947315的博客 2092

嵌入式SOC之通用图像处理之OSD文字信息叠加的相关实践记录

很多优秀的芯片厂商,都会提供与开发板配套的完善的软件以及完善的技术支持(FAE),突然觉得爱芯的技术支持就不错.几乎涉及到图形处理的soc都会内置一些图形处理的api,我们常见的图形处理工具有开源第三方库,但opencv交叉编译麻烦,移植在嵌入式平台上吃资源较多,所以,一般是选择使用它们内置的一些api去实现的操作.比如常见的图形处理操作有: 等等. 本次主要是实现文字信息叠加. 在爱芯平台上画框有例子提供了从 也就是从. 爱芯的git仓库中有很多例子是结合用来画框和叠加字符串的.当然这些通常对格式有要求

昊月光华的博客 2604

【雷达】基于matlab合成孔径雷达干涉测量(InSAR)时序分析【含Matlab源码 9037期】

合成孔径雷达干涉测量(InSAR)时序分析 完整代码,包运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 159

RV1126实现OSD时间戳叠加

使用OSD硬件进行时间戳添加,几乎不耗CPU,适合安防场景。若想实现占用CPU移植性强轻便,跨平台,不依赖硬件进行时间戳添加的方案,则可采用OpenCV开源库,可通过cv::Mat矩阵进行处理采集的裸数据,通过cv::putText将string时间戳字符串进行添加到cv::Mat矩阵中,完成软件层字符串叠加。第一,时间戳字符串渲染。将时间戳进行字符串处理,使用TTF库进行获取相应字体格式与大小,最后调用TTF_RenderText_Solid将时间戳字符串进行RGB格式上色,此时时间戳就是一个贴图。

2503_92745132的博客 469

SwinTransformer 改进:SSPCAB模块(2024最新改进方法)

SSPCAB(Spatial Pyramid Pooling with Channel Attention Block)是2024年提出的一种新型神经网络架构改进方法,专注于在保持高精度的同时显著降低计算复杂度和参数量。该方法通过创新的空间金字塔池化与通道注意力机制的结合,实现了网络结构的紧凑化和运算效率的大幅提升。核心创新点1. 混合空间金字塔池化(Hybrid Spatial Pyramid Pooling, HSPP)多尺度动态核池化:根据输入特征图尺寸动态调整池化核大小和步长交叉级联结构。

Henry的博客 1309

am62x A53与R5F通信

AM62x是Ti的一款异构多核芯片。remoteproc驱动,硬编码(写死)了R5F/M4F固件的名字,这样驱动启动时,就会找硬件编码的固件,下面是其对应关系。值得注意的是,linux内核中的M4F remoteproc驱动启动M4F,而linux内核中的R5F remoreteproc驱动不启动R5F,相反,它attach到已经在boot阶段启动的R5F固件上。在/lib/firmware的真实固件名:,而我们生成的固件名如下所示,没有直接对应的,经确认,.out文件就是我们需要的,重命名后即可。

鹰之翔 1361

SpringMVC执行流程

DispatcherServlet 前端控制器是 SpringMVC 的核心组件之一,它接收客户端的请求并将请求分派到对应的处理器(Handler)进行处理。在接收到请求后,DispatcherServlet 会将请求 URL 传递给 HandlerMapping 映射器进行处理,并根据请求 URL 匹配对应的 HandlerExecutionChain 处理器执行链。HandlerExecutionChain 包含了一个或多个 Interceptor 拦截器和一个 Handler 处理器,拦截器可以在请求

weixin_58724261的博客 9829

RAG 提示词工程最佳实践

虽然目前网络上关于提示工程的相关资料已经多如牛毛,然而 RAG (检索增强生成) 任务中提示工程如何进行的资料相对而言却较少。不少朋友之前也热烈的讨论过 RAG 场景下提示词的运用,因此 Zen 禅与计算机程序设计艺术 特别推出 RAG 任务下的提示词实践经验系列分享。RAG 是检索增强生成(Retrieval Augmented Generation)的简称,是当前最火热的企业级LLM应用方案。

AI天才研究院 2012

Spring MVC 的执行流程以及运行原理

用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。框架最核心的组件,有了它就能减少其他组件之间的耦合度。的模型数据返回给视图,由视图负责展示。:数据模型,提供要展示的数据,因此包含数据和行为,可以认为是领域模型。:负责进行模型的展示,一般就是我们见到的用户界面,客户想看到的东西。:接收用户请求,委托给模型进行处理(状态改变),处理完毕后把返回。容器为基础,并利用容器的特性来简化它的配置,所以。的配置文件,在编辑后,不需要重新编译应用程序。是一个接口,它的实现类支持不同类型的视图。

m0_65912066的博客 1213

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Spring MVC 的核心以及执行流程

Spring MVC 的核心以及执行流程

weixin_46619605的博客 1116

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Spring MVC的执行流程

Spring MVC 是基于 Java 的 Web 框架,它是 Spring 框架的一部分,遵循 MVC (Model-View-Controller) 设计模式,用于构建 Web 应用程序。前端控制器,接收所有 HTTP 请求,负责请求的分发和响应的返回。将请求 URL 映射到具体的 Controller 方法。适配并调用不同类型的处理器,处理方法参数绑定和返回值转换。处理请求的业务逻辑,返回 ModelAndView 对象(包含视图名和模型数据)。

2301_76740633的博客 1050

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Spring MVC (什么是MVC ?MVC模式又是什么 ?SpringMVC 的执行流程)

MVC 模式,全称为 Model-View-Controller(模型-视图-控制器)模式,它是一种软件架构模式,其目标是将软件的用户界面(即前台页面)和业务逻辑分离,使代码具有更高的可扩展性、可复用性、可维护性以及灵活性。Java Web 应用的结构MVC 模式将应用程序划分成模型(Model)、视图(View)、控制器(Controller)等三层,如下图所示。MVC模式分层描述Model(模型)

or77iu_N的博客 4167

请简述Spring MVC的执行流程

今天我给大家介绍一下SpringMVC的详细执行流程。我把SpringMVC的执行流程划分为三个阶段,配置阶段、初始化阶段和运行阶段。 我整理了一张完整的执行流程图,需要高清图的小伙伴可以私信我。下面详细介绍每个阶段的执行细节。 1、第一阶段:配置阶段 配置阶段,主要是完成对xml配置和注解配置。 具体步骤如下: 首先,从web.xml开始,配置DispatcherServlet的url匹配规则和Spring主配置文件的加载路径 然...

Tom弹架构 4924

Spring Mvc的执行流程

核心的中央分发器,负责协调整个请求处理流程。: 处理器映射器。负责根据请求信息(如 URL)查找能够处理该请求的处理器(Handler),通常是一个中的方法。: 处理器适配器。通过来实际调用Handler方法。这样做的好处是,无需关心Handler的具体形式(例如,可以是实现了某个接口的类,也可以是注解了的方法),会“适配”并执行它。Handler: 处理器,请求的实际处理者。在现代 Spring MVC 中,通常就是注解的类中的等注解的方法。

weixin_66703336的博客 754

Spring MVC 执行流程详解

下面的执行流程图很好地描述了 Spring MVC 的执行流程,从请求发起到最后返回数据。接下来,我将全面、深入地讲解 Spring MVC 的执行流程。Spring MVC 是一个典型的基于 MVC 设计模式的框架,它用于开发 Java Web 应用程序。在 Spring MVC 中,每个请求都要经历一系列的步骤,从客户端请求到服务器返回响应。

开源AI 专属 UI——papyrai-ui。《千界明彻录》(故事形式构建元思维)——胡说小说。更多思辨内容在公众号。 1835

Spring MVC 执行流程概述

客户端发起请求:客户端(如浏览器)向服务器发送一个HTTP请求。DispatcherServlet 接收请求:Spring MVC的前端控制器接收到客户端的请求,并将其转发给适当的处理器。HandlerMapping 查找处理器通过查找与请求URL匹配的处理器(Controller)。Controller 处理请求:找到对应的处理器(Controller)后,将请求交给它处理。返回模型和视图:Controller处理完请求后,会返回一个包含模型数据(Model)和视图(View)的对象(通常是。

ShiYueMemo37329的博客 986

介绍一下Spring MVC的执行流程

Spring MVC 通过。

tschen的博客 867

Spring MVC的执行流程图解

一、执行流程图解 二、步骤说明 ● 用户发送请求至前端控制器 ● 前端控制器收到请求,调用处理器映射器 ● 处理器映射器根据请求url查找处理器,返回给前端控制器 ● 前端控制器通过处理器适配器调用处理器 ● 执行处理器 ● 执行完成返回ModelAndView ● 处理器适配器将执行结果返回前端控制器 ● 前端控制器调用视图解析器 ● 视图解析器返回具体View ● 前端控制器对View进行渲染视图 ● 前端控制器响应用户 三、组件说明 ● DispatcherServlet:前端控制器 ​用户请求到达

weixin_44356300的博客 2079

【Spring MVC】Spring MVC的执行流程与源码分析

史上最全的Spring MVC执行流程源码解析,爆肝一个月带你彻底搞懂Spring MVC的底层原理。学习Spring MVC源码看这一篇就够了。

小七的博客 2108

spring mvc流程_Spring MVC介绍之 Spring MVC 执行流程解析

点关注,不迷路;持续更新Java相关技术及资讯!!!公众号:Java大型网站架构(有免费学习资料)一、MVC组件执行流程回顾一下MVC的体系结构与组件执行流程,如下图:dispatcherServlet -> handlermapping ->基于url查找handler -> handlerAdapter-> 基于handler找到adapter -> 由adapt...

weixin_39625586的博客 63
上一篇: Spring AOP源码分析
下一篇: SpringBoot的自动配置原理
Art&Code
博客等级 码龄7年 77粉丝 554原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值