这一节是关于SpringMVC的讲解,我将以思维导图的方式给大家解析,Spring思维导图,让Spring不再难懂(mvc篇)
生活就像海洋,只有意志坚强的人才能到达彼岸。
当初的你选择程序员这一行的时候就知道,这一行就是活到老,学到老。
当然,
温故而知新,那我们今天就和小编我一起来复习一下SpringMVC的内容吧。
让大家巩固下。
首先,还是说说原理吧,有可能观看这文章的同学是首次接触SpringMVC。所以还是讲一下吧。
SpringMVC 的简介与运行原理如下:
Spring MVC 中的MVC (modal、view、controller)分别是 模型、视图、控制器
Spring的模型-视图-控制器(MVC),该框架是围绕一个DispatcherServlet来设计的,这个DispatcherServlet
就是一个我们很熟悉的Servlet,当然这个Servlet,这个Servlet会把请求分发给各个处理器,并支持可配置的处理器映射、视图渲染、本地化、时区与主题渲染等,甚至还能支持文件上传等功能。原理 如下图所示:
关于上图的一个说明:
1、首先,Http请求:将客户端请求提交到DispatcherServlet这个Servlet。
2、然后,找到处理器:由DispatcherServlet控制器查询出一个或多个HandlerMapping,并且找到处理请求的Controller(控制器类)。
3、然后,调用处理器:DispatcherServlet将请求提交到Controller(控制器类)。
4、5、然后,调用业务处理和返回结果:Controller调用业务逻辑处理后,返回了ModelAndView。
6、7、然后,处理视图映射并返回模型: DispatcherServlet查询到一个或多个ViewResoler视图解析器后,找到ModelAndView指定的视图(页面)。
8、最后,就是Http响应了:视图负责将结果显示到客户端页面上。
注解
接下来我来讲一下 ContextLoaderListener 上下文加载监听监听器
为了更好的理解ContextLoaderListener 在讲ContextLoaderListener之前,首先我们一起来了解一下web.xml的作用。
很多同学可能不知道,其实我们的web项目,不一定需要配置web文件,也就是说这个web.xml 可以不写的。但是大多数配置我们都写在web.xml里面所以就让我们觉得是必须要有的。
一个web中可以没有web.xml文件,也就是说,web.xml文件并不是web工程必须的。web.xml文件是用来初始化配置信息:比如Welcome页面、servlet、servlet-mapping、filter、listener、启动加载级别等。当你的web工程没用到这些时,你可以不用web.xml文件来配置你的Application。
context-param >> listener >> fileter >> servlet。(web.xml 加载顺序这个很重要的)
当要启动某个web项目时,服务器软件或容器如(tomcat)会第一步加载项目中的web.xml文件,通过其中的各种配置来启动项目,只有其中配置的各项均无误时,项目才能正确启动。web.xml有多项标签,在其加载的过程中顺序依次为:context-param >> listener >> fileter >> servlet。(同类多个节点以出现顺序依次加载)
web.xml加载过程
朋友们,而SpringMVC的启动过程分为两个过程:
1、ContextLoaderListener 的初始化,实例化IoC容器,并将此容器实例注册到ServletContext中。
2、DispatcherServlet初始化。
web.xml配置
在ContextLoaderListener中关联了ContextLoader这个类,所以整个加载配置过程由ContextLoader来完成。其中ContextLoaderListener监听器它实现了ServletContextListener这个接口,在web.xml配置这个监听器,启动容器时,就会默认执行它实现的方法。
ContextLoaderListener 在web.xml文件中的配置如下:
ServletContextListener 接口有两个方法:contextInitialized,contextDestroyed
DispatcherServlet
Spring MVC框架,与其他很多web的MVC框架一样:请求驱动;所有设计都围绕着一个中央Servlet来展开,它负责把所有请求分发到控制器;同时提供其他web应用开发所需要的功能。不过Spring的中央处理器,DispatcherServlet,能做的比这更多。
下图就给大家展示了Spring Web MVC的DispatcherServlet处理请求的工作流。熟悉设计模式的朋友会发现,DispatcherServlet应用的其实就是一个"前端控制器"的设计模式(其他很多优秀的web框架也都使用了这个设计模式)。
流程图
spring mvc处理请求的流程
在web.xml中的配置
其中
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的引用)
DispatcherServlet继承结构
》关注我们请点击这里《
》关注我们请点击这里《
》关注我们请点击这里《
》关注我们请点击这里《
》关注我们请点击这里《
》关注我们请点击这里《
》关注我们请点击这里《
》关注我们请点击这里《
中间我插个广告(小编还是得吃饭,希望大家别喷~谢谢):》关注我的头条号【趣IT生活】《
接下来还是继续讲我们的正事哈。DispatcherServlet继承结构
在我的发布的文章中还讲了很多其他的内容,有SQL语句,SpringAOP ,Spring IoC ,SpringMVC,HTML5,PHP,Spring Jms,线程池,还有MySQL 等等,都是作为开发者必备的东西,希望大家都持续关注,我们会持续的更新更多的优质的内容给大家。衷心的祝福大家在开发者的道路上越走越远,越走越好,达到自己想要的高度。最后祝所有的开发者们,不用多久,你们就会升职加薪、当上总经理、出任CEO、迎娶白富美、走上人生巅峰,想想还有点小激动呢是吧。
DispatcherServlet继承结构
SpringMVC
同时提供了很多特殊的注解,这些注解就是,用于处理请求和渲染视图等用途的。当我们的最终的Servlet 这个DispatcherServlet初始化的过程中会默认使用这些特殊bean进行配置。如果你想指定使用哪个特定的bean,你可以在web应用上下文WebApplicationContext中简单地配置它们。
其中,常用的ViewResolver的配置。我就以jsp作为视图为例
配置bean
配置上传文件限制MultipartResolver
配置bean如下
applicationContext.xml中的标签
applicationContext.xml配置文件标签.
控制器(controller)
直接上代码哈 (注解大家要活用哈)
@RequestMapping(path = "/form", method = RequestMethod.POST)
public String handleFormUpload(@RequestParam("names") String names, //(额外说一下,这里names 可以不一样,但是,前面一个nams必须和页面上川传的参数一致。)
页面中使用表单(form)
文件上传基本上每个项目都会用到吧,我还是说说,
使用文件上传(file upload)
之前,我们在前面说到过一个DispatcherServlet中有个特殊的Bean叫MultipartResolver,这个bean它是可用于限制文件的上传大小等的。那么我们在当解析器MultipartResolver完成处理时,请求时候便会像其他请求一样被正常流程处理了。
怎样的异常处理
先来说下常见的异常处理有几种方式,如下图:
异常处理方式
Spring当中的处理器,异常解析器HandlerExceptionResolver接口的实现负责处理各类控制器执行过程中出现的异常。也是上面提到的,是DispatcherServlet中的特殊bean,我们是可以自定义配置处理的。
当然在某种程度上来讲的话,
HandlerExceptionResolver与你在web应用描述符web.xml文件中能定义的异常映射(exception mapping) 是很很相像的哈,
但是不过它比后者提供了更灵活的方式一些。就比如说吧,比如它能提供异常被抛出时正在执行的是哪个处理器这样的信息。
HandlerExceptionResolver 提供 resolveException 的接口
public interface HandlerExceptionResolver {
在BaseController中使用 @ExceptionHandler注解来处理异常
@ExceptionHandler(Exception.class)
public Object exceptionHandler(Exception ex, HttpServletResponse response,
在web.xml中处理异常情况
这里来了一个问题, 来一个问题:就是HandlerExceptionResolver和web.xml中配置的error-page他们会有冲突吗?
The answer:如果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.
At Last