码迷,mamicode.com
首页 > 编程语言 > 详细

SpringMVC

时间:2019-03-18 21:16:24      阅读:197      评论:0      收藏:0      [点我收藏+]

标签:marker   boolean   关系   png   mda   笔记本   super   流程控制   后端   

一、首先,我们先来认识一下SpringMVC的主要组件

前端控制器(DisatcherServlet):接收请求,响应结果,返回可以是json,String等数据类型,也可以是页面(Model)。
处理器映射器(HandlerMapping):根据URL去查找处理器,一般通过xml配置或者注解进行查找。
处理器(Handler):就是我们常说的controller控制器啦,由程序员编写。
处理器适配器(HandlerAdapter):可以将处理器包装成适配器,这样就可以支持多种类型的处理器。
视图解析器(ViewResovler):进行视图解析,返回view对象(常见的有JSP,FreeMark等)。
二、SpingMVC的工作原理

下面是文字步骤说明:

1、用户发送请求到前端控制器(DispatcherServlet)。
2、前端控制器请求处理器映射器(HandlerMapping)去查找处理器(Handler)。
3、找到以后处理器映射器(HandlerMappering)向前端控制器返回执行链(HandlerExecutionChain)。
4、前端控制器(DispatcherServlet)调用处理器适配器(HandlerAdapter)去执行处理器(Handler)。
5、处理器适配器去执行Handler。
6、处理器执行完给处理器适配器返回ModelAndView。
7、处理器适配器向前端控制器返回ModelAndView。
8、前端控制器请求视图解析器(ViewResolver)去进行视图解析。
9、视图解析器向前端控制器返回View。
10、前端控制器对视图进行渲染。
11、前端控制器向用户响应结果。
---------------------
作者:小镜子W
来源:CSDN
原文:https://blog.csdn.net/wdehxiang/article/details/77619512
版权声明:本文为博主原创文章,转载请附上博文链接!

SpringMVC的工作原理图:

技术图片

SpringMVC流程

1、  用户发送请求至前端控制器DispatcherServlet。

2、  DispatcherServlet收到请求调用HandlerMapping处理器映射器。

3、  处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。

4、  DispatcherServlet调用HandlerAdapter处理器适配器。

5、  HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。

6、  Controller执行完成返回ModelAndView。

7、  HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。

8、  DispatcherServlet将ModelAndView传给ViewReslover视图解析器。

9、  ViewReslover解析后返回具体View。

10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。

11、 DispatcherServlet响应用户。

组件说明:

以下组件通常使用框架提供实现:

DispatcherServlet:作为前端控制器,整个流程控制的中心,控制其它组件执行,统一调度,降低组件之间的耦合性,提高每个组件的扩展性。

HandlerMapping:通过扩展处理器映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。 

HandlAdapter:通过扩展处理器适配器,支持更多类型的处理器。

ViewResolver:通过扩展视图解析器,支持更多类型的视图解析,例如:jsp、freemarker、pdf、excel等。

组件:
1、前端控制器DispatcherServlet(不需要工程师开发),由框架提供
作用:接收请求,响应结果,相当于转发器,中央处理器。有了dispatcherServlet减少了其它组件之间的耦合度。
用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性。

2、处理器映射器HandlerMapping(不需要工程师开发),由框架提供
作用:根据请求的url查找Handler
HandlerMapping负责根据用户请求找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。

3、处理器适配器HandlerAdapter
作用:按照特定规则(HandlerAdapter要求的规则)去执行Handler
通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。

4、处理器Handler(需要工程师开发)
注意:编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler
Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。
由于Handler涉及到具体的用户业务请求,所以一般情况需要工程师根据业务需求开发Handler。

5、视图解析器View resolver(不需要工程师开发),由框架提供
作用:进行视图解析,根据逻辑视图名解析成真正的视图(view)
View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。 springmvc框架提供了很多的View视图类型,包括:jstlView、freemarkerView、pdfView等。
一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由工程师根据业务需求开发具体的页面。

6、视图View(需要工程师开发jsp...)
View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf...)

核心架构的具体流程步骤如下:
1、首先用户发送请求——>DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制;
2、DispatcherServlet——>HandlerMapping, HandlerMapping 将会把请求映射为HandlerExecutionChain 对象(包含一个Handler 处理器(页面控制器)对象、多个HandlerInterceptor 拦截器)对象,通过这种策略模式,很容易添加新的映射策略;
3、DispatcherServlet——>HandlerAdapter,HandlerAdapter 将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器;
4、HandlerAdapter——>处理器功能处理方法的调用,HandlerAdapter 将会根据适配的结果调用真正的处理器的功能处理方法,完成功能处理;并返回一个ModelAndView 对象(包含模型数据、逻辑视图名);
5、ModelAndView的逻辑视图名——> ViewResolver, ViewResolver 将把逻辑视图名解析为具体的View,通过这种策略模式,很容易更换其他视图技术;
6、View——>渲染,View会根据传进来的Model模型数据进行渲染,此处的Model实际是一个Map数据结构,因此很容易支持其他视图技术;
7、返回控制权给DispatcherServlet,由DispatcherServlet返回响应给用户,到此一个流程结束。

下边两个组件通常情况下需要开发:

Handler:处理器,即后端控制器用controller表示。

View:视图,即展示给用户的界面,视图中通常需要标签语言展示模型数据。

 

在将SpringMVC之前我们先来看一下什么是MVC模式

MVC:MVC是一种设计模式

MVC的原理图:

技术图片

分析:

M-Model 模型(完成业务逻辑:有javaBean构成,service+dao+entity)

V-View 视图(做界面的展示  jsp,html……)

C-Controller 控制器(接收请求—>调用模型—>根据结果派发页面)

 

springMVC是什么: 

  springMVC是一个MVC的开源框架,springMVC=struts2+spring,springMVC就相当于是Struts2加上sring的整合,但是这里有一个疑惑就是,springMVC和spring是什么样的关系呢?这个在百度百科上有一个很好的解释:意思是说,springMVC是spring的一个后续产品,其实就是spring在原有基础上,又提供了web应用的MVC模块,可以简单的把springMVC理解为是spring的一个模块(类似AOP,IOC这样的模块),网络上经常会说springMVC和spring无缝集成,其实springMVC就是spring的一个子模块,所以根本不需要同spring进行整合。

SpringMVC的原理图:

技术图片

看到这个图大家可能会有很多的疑惑,现在我们来看一下这个图的步骤:(可以对比MVC的原理图进行理解)

第一步:用户发起请求到前端控制器(DispatcherServlet)

第二步:前端控制器请求处理器映射器(HandlerMappering)去查找处理器(Handle):通过xml配置或者注解进行查找

第三步:找到以后处理器映射器(HandlerMappering)像前端控制器返回执行链(HandlerExecutionChain)

第四步:前端控制器(DispatcherServlet)调用处理器适配器(HandlerAdapter)去执行处理器(Handler)

第五步:处理器适配器去执行Handler

第六步:Handler执行完给处理器适配器返回ModelAndView

第七步:处理器适配器向前端控制器返回ModelAndView

第八步:前端控制器请求视图解析器(ViewResolver)去进行视图解析

第九步:视图解析器像前端控制器返回View

第十步:前端控制器对视图进行渲染

第十一步:前端控制器向用户响应结果

看到这些步骤我相信大家很感觉非常的乱,这是正常的,但是这里主要是要大家理解springMVC中的几个组件:

前端控制器(DispatcherServlet):接收请求,响应结果,相当于电脑的CPU。

处理器映射器(HandlerMapping):根据URL去查找处理器

处理器(Handler):(需要程序员去写代码处理逻辑的)

处理器适配器(HandlerAdapter):会把处理器包装成适配器,这样就可以支持多种类型的处理器,类比笔记本的适配器(适配器模式的应用)

视图解析器(ViewResovler):进行视图解析,多返回的字符串,进行处理,可以解析成对应的页面

 

SpringMVC实现原理及详解

1、Spring mvc介绍

SpringMVC框架是以请求为驱动,围绕Servlet设计,将请求发给控制器,然后通过模型对象,分派器来展示请求结果视图。其中核心类是DispatcherServlet,它是一个Servlet,顶层是实现的Servlet接口。

 

2、SpringMVC使用

需要在web.xml中配置DispatcherServlet。并且需要配置spring监听器ContextLoaderListener

  1.  
            <listener>
  2.  
                <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  3.  
            </listener>       
  4.  
            <servlet>
  5.  
    <servlet-name>springmvc</servlet-name>
  6.  
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  7.  
                    <!-- 如果不设置init-param标签,则必须在/WEB-INF/下创建xxx-servlet.xml文件,其中xxx是servlet-name中配置的名称。 -->
  8.  
                    <init-param>
  9.  
    <param-name>contextConfigLocation</param-name>
  10.  
    <param-value>classpath:spring/springmvc-servlet.xml</param-value>
  11.  
    </init-param>
  12.  
    <load-on-startup>1</load-on-startup>
  13.  
    </servlet>
  14.  
    <servlet-mapping>
  15.  
    <servlet-name>springmvc</servlet-name>
  16.  
    <url-pattern>/</url-pattern>
  17.  
    </servlet-mapping>

3、SpringMVC运行原理

如图所示:

技术图片

流程说明:

(1)客户端(浏览器)发送请求,直接请求到DispatcherServlet。

(2)DispatcherServlet根据请求信息调用HandlerMapping,解析请求对应的Handler。

(3)解析到对应的Handler后,开始由HandlerAdapter适配器处理。

(4)HandlerAdapter会根据Handler来调用真正的处理器开处理请求,并处理相应的业务逻辑。

(5)处理器处理完业务后,会返回一个ModelAndView对象,Model是返回的数据对象,View是个逻辑上的View。

(6)ViewResolver会根据逻辑View查找实际的View。

(7)DispaterServlet把返回的Model传给View。

(8)通过View返回给请求者(浏览器)

4、DispatcherServlet详细解析

首先看下源码:

  1.  
    package org.springframework.web.servlet;
  2.  
     
  3.  
    @SuppressWarnings("serial")
  4.  
    public class DispatcherServlet extends FrameworkServlet {
  5.  
     
  6.  
    public static final String MULTIPART_RESOLVER_BEAN_NAME = "multipartResolver";
  7.  
    public static final String LOCALE_RESOLVER_BEAN_NAME = "localeResolver";
  8.  
    public static final String THEME_RESOLVER_BEAN_NAME = "themeResolver";
  9.  
    public static final String HANDLER_MAPPING_BEAN_NAME = "handlerMapping";
  10.  
    public static final String HANDLER_ADAPTER_BEAN_NAME = "handlerAdapter";
  11.  
    public static final String HANDLER_EXCEPTION_RESOLVER_BEAN_NAME = "handlerExceptionResolver";
  12.  
    public static final String REQUEST_TO_VIEW_NAME_TRANSLATOR_BEAN_NAME = "viewNameTranslator";
  13.  
    public static final String VIEW_RESOLVER_BEAN_NAME = "viewResolver";
  14.  
    public static final String FLASH_MAP_MANAGER_BEAN_NAME = "flashMapManager";
  15.  
    public static final String WEB_APPLICATION_CONTEXT_ATTRIBUTE = DispatcherServlet.class.getName() + ".CONTEXT";
  16.  
    public static final String LOCALE_RESOLVER_ATTRIBUTE = DispatcherServlet.class.getName() + ".LOCALE_RESOLVER";
  17.  
    public static final String THEME_RESOLVER_ATTRIBUTE = DispatcherServlet.class.getName() + ".THEME_RESOLVER";
  18.  
    public static final String THEME_SOURCE_ATTRIBUTE = DispatcherServlet.class.getName() + ".THEME_SOURCE";
  19.  
    public static final String INPUT_FLASH_MAP_ATTRIBUTE = DispatcherServlet.class.getName() + ".INPUT_FLASH_MAP";
  20.  
    public static final String OUTPUT_FLASH_MAP_ATTRIBUTE = DispatcherServlet.class.getName() + ".OUTPUT_FLASH_MAP";
  21.  
    public static final String FLASH_MAP_MANAGER_ATTRIBUTE = DispatcherServlet.class.getName() + ".FLASH_MAP_MANAGER";
  22.  
    public static final String EXCEPTION_ATTRIBUTE = DispatcherServlet.class.getName() + ".EXCEPTION";
  23.  
    public static final String PAGE_NOT_FOUND_LOG_CATEGORY = "org.springframework.web.servlet.PageNotFound";
  24.  
    private static final String DEFAULT_STRATEGIES_PATH = "DispatcherServlet.properties";
  25.  
    protected static final Log pageNotFoundLogger = LogFactory.getLog(PAGE_NOT_FOUND_LOG_CATEGORY);
  26.  
    private static final Properties defaultStrategies;
  27.  
    static {
  28.  
    try {
  29.  
    ClassPathResource resource = new ClassPathResource(DEFAULT_STRATEGIES_PATH, DispatcherServlet.class);
  30.  
    defaultStrategies = PropertiesLoaderUtils.loadProperties(resource);
  31.  
    }
  32.  
    catch (IOException ex) {
  33.  
    throw new IllegalStateException("Could not load ‘DispatcherServlet.properties‘: " + ex.getMessage());
  34.  
    }
  35.  
    }
  36.  
     
  37.  
    /** Detect all HandlerMappings or just expect "handlerMapping" bean? */
  38.  
    private boolean detectAllHandlerMappings = true;
  39.  
     
  40.  
    /** Detect all HandlerAdapters or just expect "handlerAdapter" bean? */
  41.  
    private boolean detectAllHandlerAdapters = true;
  42.  
     
  43.  
    /** Detect all HandlerExceptionResolvers or just expect "handlerExceptionResolver" bean? */
  44.  
    private boolean detectAllHandlerExceptionResolvers = true;
  45.  
     
  46.  
    /** Detect all ViewResolvers or just expect "viewResolver" bean? */
  47.  
    private boolean detectAllViewResolvers = true;
  48.  
     
  49.  
    /** Throw a NoHandlerFoundException if no Handler was found to process this request? **/
  50.  
    private boolean throwExceptionIfNoHandlerFound = false;
  51.  
     
  52.  
    /** Perform cleanup of request attributes after include request? */
  53.  
    private boolean cleanupAfterInclude = true;
  54.  
     
  55.  
    /** MultipartResolver used by this servlet */
  56.  
    private MultipartResolver multipartResolver;
  57.  
     
  58.  
    /** LocaleResolver used by this servlet */
  59.  
    private LocaleResolver localeResolver;
  60.  
     
  61.  
    /** ThemeResolver used by this servlet */
  62.  
    private ThemeResolver themeResolver;
  63.  
     
  64.  
    /** List of HandlerMappings used by this servlet */
  65.  
    private List<HandlerMapping> handlerMappings;
  66.  
     
  67.  
    /** List of HandlerAdapters used by this servlet */
  68.  
    private List<HandlerAdapter> handlerAdapters;
  69.  
     
  70.  
    /** List of HandlerExceptionResolvers used by this servlet */
  71.  
    private List<HandlerExceptionResolver> handlerExceptionResolvers;
  72.  
     
  73.  
    /** RequestToViewNameTranslator used by this servlet */
  74.  
    private RequestToViewNameTranslator viewNameTranslator;
  75.  
     
  76.  
    private FlashMapManager flashMapManager;
  77.  
     
  78.  
    /** List of ViewResolvers used by this servlet */
  79.  
    private List<ViewResolver> viewResolvers;
  80.  
     
  81.  
    public DispatcherServlet() {
  82.  
    super();
  83.  
    }
  84.  
     
  85.  
    public DispatcherServlet(WebApplicationContext webApplicationContext) {
  86.  
    super(webApplicationContext);
  87.  
    }
  88.  
     
  89.  
    @Override
  90.  
    protected void onRefresh(ApplicationContext context) {
  91.  
    initStrategies(context);
  92.  
    }
  93.  
     
  94.  
    protected void initStrategies(ApplicationContext context) {
  95.  
    initMultipartResolver(context);
  96.  
    initLocaleResolver(context);
  97.  
    initThemeResolver(context);
  98.  
    initHandlerMappings(context);
  99.  
    initHandlerAdapters(context);
  100.  
    initHandlerExceptionResolvers(context);
  101.  
    initRequestToViewNameTranslator(context);
  102.  
    initViewResolvers(context);
  103.  
    initFlashMapManager(context);
  104.  
    }
  105.  
    }

DispatcherServlet类中的属性beans:

HandlerMapping:用于handlers映射请求和一系列的对于拦截器的前处理和后处理,大部分用@Controller注解。

HandlerAdapter:帮助DispatcherServlet处理映射请求处理程序的适配器,而不用考虑实际调用的是 哪个处理程序。

HandlerExceptionResolver:处理映射异常。

ViewResolver:根据实际配置解析实际的View类型。

LocaleResolver:解决客户正在使用的区域设置以及可能的时区,以便能够提供国际化视野。

ThemeResolver:解决Web应用程序可以使用的主题,例如提供个性化布局。

MultipartResolver:解析多部分请求,以支持从HTML表单上传文件。

FlashMapManager:存储并检索可用于将一个请求属性传递到另一个请求的input和output的FlashMap,通常用于重定向。

在Web MVC框架中,每个DispatcherServlet都拥自己的WebApplicationContext,它继承了ApplicationContext。WebApplicationContext包含了其上下文和Servlet实例之间共享的所有的基础框架beans。

 

  • HandlerMapping:

技术图片

HandlerMapping接口处理请求的映射

HandlerMapping接口的实现类:

SimpleUrlHandlerMapping类通过配置文件把URL映射到Controller类。

DefaultAnnotationHandlerMapping类通过注解把URL映射到Controller类。

 

  • HandlerAdapter:

技术图片

HandlerAdapter接口-处理请求映射

AnnotationMethodHandlerAdapter:通过注解,把请求URL映射到Controller类的方法上。

  • HandlerExceptionResolver:

技术图片

HandlerExceptionResolver接口-异常处理接口

SimpleMappingExceptionResolver通过配置文件进行异常处理。

AnnotationMethodHandlerExceptionResolver:通过注解进行异常处理。

  • ViewResolver:

技术图片

ViewResolver接口解析View视图。

UrlBasedViewResolver类 通过配置文件,把一个视图名交给到一个View来处理。

 

SpringMVC

标签:marker   boolean   关系   png   mda   笔记本   super   流程控制   后端   

原文地址:https://www.cnblogs.com/gavin-yao/p/10550524.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!