001 springmvc概述

一 . 概述

  springmvc作为一个当前最为流行的mvc框架,从本质的设计上讲还是延续了前端控制器模式来完成整合设计.

    但是springmvc凭借和spring的无缝连接,获得了IOC和AOP的能力,于是功能强大了很多.

  本次,我们需要从原理上说一下springmvc,然后找到一些扩展点,完成对springmvc的学习.



二 .springmvc的架构

  

在上面的图中,我们看到了整个springmvc的运行流程.

  我们发现整个流程还是比较复杂的,其实当我们在后面分析的时候,整个流程还会更加的复杂.但是现在我们不需要进行这方面的讲述.

  我们首先来看看整个流程的运行.

[1]用户向web浏览器发起请求.

[2]请求转发到前端控制器,进入了springmvc的控制流程之中.

[3]首先请求转发给{处理器映射器},返回的是一个处理器执行链,其中包括处理器和拦截器.

[4]前端控制器将这个处理器执行链转发给处理器适配器,进行真正的发放的执行,在这里就有很多的扩展点.

[5]视图渲染

我们现在只需要简单的了解这个过程就好了.



三 . 前端控制器

  springmvc的前端控制器是一个Servlet,我们首先看一下这个Servlet的基本结构.

下面是整个Springmvc的DispatcherServlet的核心方法doDispatch().我们首先分析一下流程.  

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); //通过请求,寻找对象的处理器映射器
                if (mappedHandler == null || mappedHandler.getHandler() == null) {
                    noHandlerFound(processedRequest, response);  //没有处理器映射器,就说明这个请求的地址没有注册
                    return;
                }

                // Determine handler adapter for the current request.                    //1.首先从处理器映射器之中获取处理器执行链                // 2/ 然后将处理器执行链转换为处理器适配器
                HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());

                // Process last-modified header, if supported by the handler.
                String method = request.getMethod();
                boolean isGet = "GET".equals(method);
                if (isGet || "HEAD".equals(method)) {
                    long lastModified = ha.getLastModified(request, mappedHandler.getHandler());
                    if (logger.isDebugEnabled()) {
                        logger.debug("Last-Modified value for [" + getRequestUri(request) + "] is: " + lastModified);
                    }
                    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());

                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);
                }
            }
        }
    }

从上面的代码之中,我们整体的分析了springmvc的运转流程,单从流程上讲比较简单,但是后面我们的重点就是

  寻找扩展点和原理,最终比较完成的学习完springmvc.

原文地址:https://www.cnblogs.com/trekxu/p/9114240.html

时间: 2024-10-13 15:50:30

001 springmvc概述的相关文章

SpringMVC——概述

Spring 为展现层提供的基于 MVC 设计理念的优秀的Web 框架,是目前最主流的 MVC 框架之一 Spring3.0 后全面超越 Struts2,成为最优秀的 MVC 框架 Spring MVC 通过一套 MVC 注解,让 POJO 成为处理请求的控制器,而无须实现任何接口. 支持 REST 风格的 URL 请求 采用了松散耦合可插拔组件结构,比其他 MVC 框架更具扩展性和灵活性 一.MVC :Model-View-Control 框架性质的C 层要完成的主要工作:封装web 请求为一

1.SpringMVC 概述

SpringMVC 简介 SpringMVC 也叫 Spring web mvc ,属于表现层的框架.SpringMVC 是 Spring框架的一部分,是在Spring3.0后发布的 第一个SpringMVC 程序 1.导入jar包 2.注册中央调度器 a)<load-on-startup/>  值大于等于0时,表示这个servlet随服务器启动 b)<url-pattern/>  不能写为 /*,最好也不要写为 /,建议写为 *.do的形式 c) 配置文件与名称(这里必须要设置一

SpringMVC概述

SpringMVC为展现层提供的基于MVC设计理念的优秀的WEB框架,是目前主流的MVC框架之一.Spring 3.0之后,超越Struts2成为最优秀的MVC框架. SpringMVC通过一套MVC注解,让POJO成为处理请求的控制器,而无须实现任何接口. 支持REST风格的URL请求.

一、SpringMVC 概述

SpringMVC为展现层提供的基于MVC设计理念的优秀的WEB框架,是目前主流的MVC框架之一.Spring 3.0之后,超越Struts2成为最优秀的MVC框架. SpringMVC通过一套MVC注解,让POJO成为处理请求的控制器,而无须实现任何接口. 支持REST风格的URL请求.

001.UG概述

第1章 UG概述 本章主要内容: UG产品介 UG产品的特点 UG各功能模块 1.1 UG产品介绍 Unigraphics NX软件作为UGS公司提供的产品全生命周期解决方案中面向产品开发领域的旗舰产品,为用户提供了一套集成的.全面的产品开发解决方案,用于产品设计.分析.制造,帮助用户实现产品创新,缩短产品上市时间.降低成本.提高质量.Unigraphics NX软件是构建于最新的体系结构--NX体系结构基础之上的,这是一个支持产品全生命周期管理的全新体系结构,是UGS公司同其主要客户一起设计开

一 SpringMvc概述&amp;入门

what: SpringMVC:类似Struts2的MVC框架,属于SpringFrameWork的后续产品. why: 原文地址:https://www.cnblogs.com/ltfxy/p/10415958.html

01.SpringMVC概述

springMVC架构 SpringMVC是Spring框架的一个模块,Spring和SpringMVC无需通过中间整合层进行整合.SpringMVC是基于MVC架构的WEB框架.SpringMVC框架是一个基于请求驱动的Web框架,使用了前端控制器模式来进行设计,再根据请求映射规则分发给相应的页面控制器(动作/处理器)进行处理. springMVC请求处理流程 组件说明: 1.DispatcherServlet:前端控制器.用户请求到达前端控制器,它就相当于mvc模式中的c,dispatche

SpringMVC概述(2)

1.Spring Web MVC是服务到工作者模式的实现. 前端控制器是DispatcherServlet: 应用控制器包含处理器映射和视图解析器.处理器映射器(HandlerMapping)进行处理器管理和视图解析器(View Resolver)进行视图管理: 页面控制器/动作/处理器为Controller接口(仅包含ModelAndView handleRequest(request, response) 方法)的实现(也可以是任何的POJO类): 支持本地化(Locale)解析.主题(Th

《SpringMVC从入门到放肆》一、概述

一.SpringMVC概述 View Service Dao DB Spring MVC interface interface Mysql impls impls SpringMVC也叫Spring web mvc,属于表现层框架.SpringMVC是Spring框架的一部分,是在Spring3.0后发布的. 二.第一个SpringMVC程序功能描述: 用户提交一个请求,服务器端处理器在接收到这个请求后,向客户端响应一条欢迎信息.新建项目: Eclipse:File-->New-->Web