Spring的模型-视图-控制器(MVC)框架是围绕一个DispatcherServlet来设计的,这个Servlet会把请求分发给各个处理器,并支持可配置的处理器映射、视图渲染、本地化、时区与主题渲染等,甚至还能支持文件上传。 写在前面 温故而知新,今天一块儿来复习一下spring mvc的内容吧。 spring mvc简介与运行原理 Spring的模型-视图-控制器(MVC)框架是围绕一个DispatcherServlet来设计的,这个Servlet会把请求分发给各个处理器,并支持可配置的处理器映射、视图渲染、本地化、时区与主题渲染等,甚至还能支持文件上传。html
(1) Http请求:客户端请求提交到DispatcherServlet。 (2) 寻找处理器:由DispatcherServlet控制器查询一个或多个HandlerMapping,找处处理请求的Controller。 (3) 调用处理器:DispatcherServlet将请求提交到Controller。 (4)(5)调用业务处理和返回结果:Controller调用业务逻辑处理后,返回ModelAndView。 (6)(7)处理视图映射并返回模型: DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图。 (8) Http响应:视图负责将结果显示到客户端。 主要注解前端
ContextLoaderListener 在讲ContextLoaderListener以前,首先来了解一下web.xml的做用: 一个web中能够没有web.xml文件,也就是说,web.xml文件并非web工程必须的。web.xml文件是用来初始化配置信息:好比Welcome页面、servlet、servlet-mapping、filter、listener、启动加载级别等。当你的web工程没用到这些时,你能够不用web.xml文件来配置你的Application。 当要启动某个web项目时,服务器软件或容器如(tomcat)会第一步加载项目中的web.xml文件,经过其中的各类配置来启动项目,只有其中配置的各项均无误时,项目才能正确启动。web.xml有多项标签,在其加载的过程当中顺序依次为:context-param >> listener >> fileter >> servlet。(同类多个节点以出现顺序依次加载)java
而spring mvc启动过程大体分为两个过程: ContextLoaderListener初始化,实例化IoC容器,并将此容器实例注册到ServletContext中。 DispatcherServlet初始化。程序员
其中ContextLoaderListener监听器它实现了ServletContextListener这个接口,在web.xml配置这个监听器,启动容器时,就会默认执行它实现的方法。在ContextLoaderListener中关联了ContextLoader这个类,因此整个加载配置过程由ContextLoader来完成。 ContextLoaderListener在web.xml中的配置:web
ServletContextListener 接口有两个方法:contextInitialized,contextDestroyed DispatcherServlet Spring MVC框架,与其余不少web的MVC框架同样:请求驱动;全部设计都围绕着一个中央Servlet来展开,它负责把全部请求分发到控制器;同时提供其余web应用开发所须要的功能。不过Spring的中央处理器,DispatcherServlet,能作的比这更多。 下图展现了Spring Web MVC的DispatcherServlet处理请求的工做流。熟悉设计模式的朋友会发现,DispatcherServlet应用的其实就是一个“前端控制器”的设计模式(其余不少优秀的web框架也都使用了这个设计模式)。 流程图:面试
在web.xml中的配置:spring
其中 load-on-startup:表示启动容器时初始化该Servlet; url-pattern:表示哪些请求交给Spring Web MVC处理, “/” 是用来定义默认servlet映射的。也能够如“*.html”表示拦截全部以html为扩展名的请求。 在Spring MVC中,每一个DispatcherServlet都持有一个本身的上下文对象WebApplicationContext,它又继承了根(root)WebApplicationContext对象中已经定义的全部bean。这些继承的bean能够在具体的Servlet实例中被重载,在每一个Servlet实例中你也能够定义其scope下的新bean。 WebApplicationContext继承自ApplicationContext,它提供了一些web应用常常须要用到的特性。它与普通的ApplicationContext不一样的地方在于,它支持主题的解析,而且知道它关联到的是哪一个servlet(它持有一个该ServletContext的引用)设计模式
spring mvc同时提供了不少特殊的注解,用于处理请求和渲染视图等。DispatcherServlet初始化的过程当中会默认使用这些特殊bean进行配置。若是你想指定使用哪一个特定的bean,你能够在web应用上下文WebApplicationContext中简单地配置它们。tomcat
其中,经常使用的ViewResolver的配置。以jsp做为视图为例服务器
配置上传文件限制MultipartResolver
applicationContext.xml中的标签
文件上传 前面说到DispatcherServlet中有个特殊的Bean叫MultipartResolver,可用于限制文件的上传大小等。当解析器MultipartResolver完成处理时,请求便会像其余请求同样被正常流程处理。 表单:
控制器:
异常处理 先来讲下常见的异常处理有几种方式,以下图:
Spring的处理器异常解析器HandlerExceptionResolver接口的实现负责处理各种控制器执行过程当中出现的异常。也是上面提到的,是DispatcherServlet中的特殊bean,能够自定义配置处理。 某种程度上讲,HandlerExceptionResolver与你在web应用描述符web.xml文件中能定义的异常映射(exception mapping)很相像,不过它比后者提供了更灵活的方式。好比它能提供异常被抛出时正在执行的是哪一个处理器这样的信息。 HandlerExceptionResolver 提供resolveException接口:
在BaseController中使用 @ExceptionHandler注解处理异常:
在web.xml中处理异常:
来一个问题:HandlerExceptionResolver和web.xml中配置的error-page会有冲突吗? 解答:若是resolveException返回了ModelAndView,会优先根据返回值中的页面来显示。不过,resolveException能够返回null,此时则展现web.xml中的error-page的500状态码配置的页面。 当web.xml中有相应的error-page配置,则能够在实现resolveException方法时返回null。 API文档中对返回值的解释: return a corresponding ModelAndView to forward to, or null for default processing. 若是你也想在IT行业拿高薪,能够参加咱们的训练营课程,选择最适合本身的课程学习,技术大牛亲授,7个月后,进入名企拿高薪。咱们的课程内容有:Java工程化、高性能及分布式、高性能、深刻浅出。高架构。性能调优、Spring,MyBatis,Netty源码分析和大数据等多个知识点。若是你想拿高薪的,想学习的,想就业前景好的,想跟别人竞争能取得优点的,想进阿里面试但担忧面试不过的,你均可以来,群号为: 454377428 注:加群要求 一、具备1-5工做经验的,面对目前流行的技术不知从何下手,须要突破技术瓶颈的能够加。 二、在公司待久了,过得很安逸,但跳槽时面试碰壁。须要在短期内进修、跳槽拿高薪的能够加。 三、若是没有工做经验,但基础很是扎实,对java工做机制,经常使用设计思想,经常使用java开发框架掌握熟练的,能够加。 四、以为本身很牛B,通常需求都能搞定。可是所学的知识点没有系统化,很难在技术领域继续突破的能够加。 5.阿里Java高级大牛直播讲解知识点,分享知识,多年工做经验的梳理和总结,带着你们全面、科学地创建本身的技术体系和技术认知! 6.小号或者小白之类加群一概不给过,谢谢。 目标已经有了,下面就看行动了!记住:学习永远是本身的事情,你不学时间也不会多,你学了有时候却可以使用本身学到的知识换得更多自由自在的美好时光!时间是生命的基本组成部分,也是万物存在的根本尺度,咱们的时间在那里咱们的生活就在那里!咱们价值也将在那里提高或消弭!Java程序员,加油吧