web服务器在启动时加载和解析web.xml找到SpringMVC的前段总控制器DispatcherServlet
通过DispatcherServlet加载相关的配置文件(默认是mvc-dispatcher-servlet.xml)并创建表现层的IOC容器(也就是子容器)
通过DispatchServelet 进行分发请求,调用处理器映射器HandlerMapping返回一个HandlerExecutionChain对象(一个执行链,这个对象中包含了Handler对象和HandlerIntercepter处理器拦截器)返回给DispatchServlet。
通过处理器适配器HandlerAdapter来找到与HandlerExcutionChain中的Handler处理器对象相同类型的Handler并返回一个ModelAndView(不论是否有异常都会返回ModelAndView)。
DispatcherServlet通过配置文件选择对应的视图解析器(ViewResolver)进行视图解析返回一个View对象
DispatcherServlet通过view对象进行渲染视图(渲染视图的含义:通过解析视图中的el表达式,特定标签,特定转换等,产生html页面/片段或者JSON字符串甚至是图片、pdf文档等不同的媒体形式的过程)
最后服务器将视图结果反馈给浏览器。
关键解析:
1.配置对象(在配置文件中注册的对象)
1.1 DispatcherServlet
SpringMVC框架中的总控制器,主要是创建表现层的IOC容器,并将请求分发给具体的控制器的Handler,又被称为请求分发器
1.2 InternalResourceViewResolver
内部资源解析器 用来匹配jsp页面(当然还有其他的这就不列举了)
InternalResourceViewResolver介绍
它是URLBasedViewResolver的子类,所以URLBasedViewResolver支持的特性它都支持。在实际应用中 InternalResourceViewResolver也是使用的最广泛的一个视图解析器。
那么InternalResourceViewResolver有什么自己独有的特性呢?
单从字面意思来看,我们可以把InternalResourceViewResolver解释为内部资源视图解析器,
这就是InternalResourceViewResolver的一个特性。InternalResourceViewResolver会把返回的视图名称都解析为InternalResourceView对象,InternalResourceView会把Controller处理器方法返回的模型属性都存放到对应的request属性中,
然后通过RequestDispatcher在服务器端把请求forword或重定向到目标URL。比如在InternalResourceViewResolver中定义了prefix=/WEB-INF/,suffix=.jsp,然后请求的Controller处理器方法返回的视图名称为test,
那么这个时候InternalResourceViewResolver就会把test解析为一个InternalResourceView对象,先把返回的模型属性都存放到对应的HttpServletRequest属性中,然后利用RequestDispatcher在服务器端把请求forword到/WEB-INF/test.jsp。
这就是InternalResourceViewResolver一个非常重要的特性,我们都知道存放在/WEB-INF/下面的内容是不能直接通过request请求的方式请求到的,为了安全性考虑,我们通常会把jsp文件放在WEB-INF目录下,而InternalResourceView在服务器端跳转的方式可以很好的解决这个问题。
下面是一个InternalResourceViewResolver的定义,根据该定义当返回的逻辑视图名称是test的时候,InternalResourceViewResolver会给它加上定义好的前缀和后缀,组成“/WEB-INF/test.jsp”的形式,然后把它当做一个InternalResourceView的url新建一个InternalResourceView对象返回。
2.内置对象(SpringMVC框架内部对象)
2.1 HandlerMapping(处理器映射器)
2.1.1 SimpleUrlHandlerMapping对象:主要用来匹配静态请求(url)
2.1.2 RequestMappingHandlerMapping对象:主要用来匹配注解请求(url)
2.2 HandlerAdapter类型(处理器适配器)
2.2.1 HttpRequestHandlerAdapter匹配ResourceHttpRequestHandler对象,处理静态资源请求;
2.2.2 RequestMappingHandlerAdapter匹配具体的Handler对象,处理注解请求
HandlerMapping:请求到处理器的映射,如果映射成功返回一个HandlerExecutionChain对象(包含一个Handler处理器(页面控制器)对象、多个HandlerInterceptor拦截器)对象;如BeanNameUrlHandlerMapping将URL与Bean名字映射,映射成功的Bean就是此处的处理器;
HandlerAdapter:HandlerAdapter将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器;如SimpleControllerHandlerAdapter将对实现了Controller接口的Bean进行适配,并且调处理器的handleRequest方法进行功能处理