SpringMVC(三):SpringMVC执行流程

来源: 腾讯云 时间:2022-12-27 11:16:17

SpringMVC执行流程

一、DispatcherServlet:前端控制器

用户请求到达前端控制器,它就相当于 mvc 模式中的 c,dispatcherServlet 是整个流程控制的中心,由 它调用其它组件处理用户的请求,dispatcherServlet 的存在降低了组件之间的耦合性。


【资料图】

二、HandlerMapping:处理器映射器

HandlerMapping 负责根据用户请求找到 Handler 即处理器,SpringMVC 提供了不同的映射器实现不同的 映射方式,例如:配置文件方式,实现接口方式,注解方式等。

三、Handler:处理器 (自己定义的Controller处理单元)

它就是我们开发中要编写的具体业务控制器。由 DispatcherServlet 把用户请求转发到 Handler。由 Handler 对具体的用户请求进行处理。

四、HandlAdapter:处理器适配器

通过 HandlerAdapter 对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行

五、View Resolver:视图解析器

View Resolver 负责将处理结果生成 View 视图,View Resolver 首先根据逻辑视图名解析成物理视图名 即具体的页面地址,再生成 View 视图对象,最后对 View 进行渲染将处理结果通过页面展示给用户。

六、View:视图

SpringMVC 框架提供了很多的 View 视图类型的支持,包括:jstlView、freemarkerView、pdfView等。我们最常用的视图就是 jsp。 一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开 发具体的页面。

七、说明

在 SpringMVC 的各个组件中,处理器映射器、处理器适配器、视图解析器称为 SpringMVC 的三大组件。

使 用 自动加载 RequestMappingHandlerMapping (处理映射器) 和 RequestMappingHandlerAdapter ( 处 理 适 配 器 ) , 可 用 在 SpringMVC.xml 配 置 文 件 中 使 用 替代注解处理器和适配器的配置。

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {        HttpServletRequest processedRequest = request;        HandlerExecutionChain mappedHandler = null;        boolean multipartRequestParsed = false;        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);        try {            try {                ModelAndView mv = null;                Object dispatchException = null;                try {                    processedRequest = this.checkMultipart(request);                    multipartRequestParsed = processedRequest != request;                    mappedHandler = this.getHandler(processedRequest);                    if (mappedHandler == null) {                        this.noHandlerFound(processedRequest, response);                        return;                    }                    HandlerAdapter ha = this.getHandlerAdapter(mappedHandler.getHandler());                    String method = request.getMethod();                    boolean isGet = "GET".equals(method);                    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;                    }                    mv = ha.handle(processedRequest, response, mappedHandler.getHandler());                    if (asyncManager.isConcurrentHandlingStarted()) {                        return;                    }                    this.applyDefaultViewName(processedRequest, mv);                    mappedHandler.applyPostHandle(processedRequest, response, mv);                } catch (Exception var20) {                    dispatchException = var20;                } catch (Throwable var21) {                    dispatchException = new NestedServletException("Handler dispatch failed", var21);                }                this.processDispatchResult(processedRequest, response, mappedHandler, mv, (Exception)dispatchException);            } catch (Exception var22) {                this.triggerAfterCompletion(processedRequest, response, mappedHandler, var22);            } catch (Throwable var23) {                this.triggerAfterCompletion(processedRequest, response, mappedHandler, new NestedServletException("Handler processing failed", var23));            }        } finally {            if (asyncManager.isConcurrentHandlingStarted()) {                if (mappedHandler != null) {                    mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);                }            } else if (multipartRequestParsed) {                this.cleanupMultipart(processedRequest);            }        }    }    private void applyDefaultViewName(HttpServletRequest request, @Nullable ModelAndView mv) throws Exception {        if (mv != null && !mv.hasView()) {            String defaultViewName = this.getDefaultViewName(request);            if (defaultViewName != null) {                mv.setViewName(defaultViewName);            }        }    }

HandlerMapping的实现类的作用

实现类RequestMappingHandlerMapping,它会处理@RequestMapping 注解,并将其注册到请求映射表中。

HandlerAdapter的实现类的作用

实现类RequestMappingHandlerAdapter,则是处理请求的适配器,确定调用哪个类的哪个方法,并且构造方法参数,返回值。

当配置了mvc:annotation-driven/后,Spring就知道了我们启用注解驱动。然后Spring通过context:component-scan/标签的配置,会自动为我们将扫描到的@Component,@Controller,@Service,@Repository等注解标记的组件注册到工厂中,来处理我们的请求,这个时候接收返回json数据、参数验证、统一异常等功能。

                                                                                

上一篇:

下一篇:

X 关闭

热门推荐

进京8周年 84.08亿立方米“南水”惠京城

2022-12-27   北京青年报官网

哈电阀门以科技创新显示强者风范|微速讯

2022-12-27   中国产业经济信息网

点赞逆行者:危险在前 逆行不惧

2022-12-27   中华人民共和国应急管理部

喜糖盒图片(喜糖价格)

2022-12-27   万能网

套包被(套包外资费)

2022-12-27   万能网

北京至石家庄60分钟可达 天天速看料

2022-12-27   北京青年报官网

宠幸的意思是什么(宠幸)

2022-12-26   万能网

中非稻米价值链合作,共促全球粮食安全 头条焦点

2022-12-26   中国网·中国发展门户网

光芒演员表(光芒之池)

2022-12-26   万能网

北京多条地铁线路今起再缩发车间隔!

2022-12-26   北京青年报官网

小学大班化的危害|看热讯

2022-12-26   万能网

如何查询考体育成绩

2022-12-26   万能网

全球首架C919今天开启100小时验证飞行

2022-12-26   央视新闻客户端

北京推出首批6个微度假目的地品牌

2022-12-26   北京商报官方账号

北汽集团:复工复产加速跑全力冲刺收官战

2022-12-26   中国产业经济信息网

青年湖小学打造“小而美”学校

2022-12-26   北京青年报官网

天然冰场 乐享冬趣 环球今日讯

2022-12-26   北京青年报官网

青青菩提树(qqp)

2022-12-25   万能网

这个周末,熟悉的北京又回来了!

2022-12-25   北京日报客户端

斐的拼音(斐的拼音)

2022-12-25   万能网

首钢园∙六工汇开启迎新年活动

2022-12-25   北京青年报官网

老孔雀开屏(老孔雀开屏)

2022-12-25   万能网

大鳄龟(daegu)

2022-12-25   万能网

qq空间(qq客栈)

2022-12-25   万能网

北京买房:理清思路,购房建议692

2022-12-25   章哥说买房

上投先锋(上投先锋)

2022-12-25   万能网

疫情下的医院,如何运转?

2022-12-25   中国青年网

Copyright   2015-2022 中国行业信息网版权所有  备案号:   联系邮箱:29 59 11 57 8@qq.com