SpringMVC源码分析(4)剖析DispatcherServlet重要组件

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介:

简单介绍了一个请求的处理过程, 简略描述了调用过程,并没有涉及过多细节,如url匹配,报文解析转换等。

<SpringMVC源码分析(2)DispatcherServlet的初始化>:介绍了servlet的初始化过程,尤其initStrategies方法。

本文主要总结DispatcherServlet几个重要组件的关系。

1.类图

wKiom1hANXDwXNFcAADr2yVenq8566.png


该类图并没有全面的描述SpringMVC相关类,重点说明组件的关系。

该类图基于springmvc3.0.5版本。

很多类属性并没有完全罗列,进行了取舍。

基于DispatcherServlet,而且深度尽量适可而止,否则造成图复杂混乱。

---------------------------------------------------

2.HanlerMapping组件介绍

2.1 HanlerMapping类图

HanlerMapping是springmvc中完成url到controller映射的组件

wKiom1hAN-qx9O2QAABVckzF0Ug159.png

2.2 HanlerMappingAPI

1
2
3
4
public  interface  HandlerMapping {
     //根据选择策略,返回Handler
     HandlerExecutionChain getHandler(HttpServletRequest request)  throws  Exception;
}

3.HandlerAdapter

3.1类图

是MVC framework SPI ;负责具体干活。如调用方法,参数解析等。

wKioL1hAOZiwwAILAABTwzJnNgY903.png


3.2 API

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public  interface  HandlerAdapter {
    
    /**
             判断是否可以处理handler
     */
    boolean  supports(Object handler); 
    
    /**
     * 处理请求
     */
    ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)  throws  Exception;
 
    /**
     * getLastModified
     */
    long  getLastModified(HttpServletRequest request, Object handler);
 
}

4.HandlerExceptionResolver

4.1 HandlerExceptionResolver类图

专门处理异常情况,根据异常情况,构造ModelAndView

wKiom1hAOs6wZmFgAAAqFJ24I18260.png

4.2 HandlerExceptionResolver API

1
2
3
4
5
6
7
8
9
public  interface  HandlerExceptionResolver {
 
    /**
     * 处理异常
     */
    ModelAndView resolveException(
          HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex);
 
}

5.  ViewResolver

5.1 ViewResolver类图

作用:将string的视图名称解析为View类型的视图

wKioL1hAPDfypy6uAABb53aO86I858.png

5.2 ViewResolver API

1
2
3
4
5
6
7
8
9
public  interface  ViewResolver {
 
    /** 
     * Resolve the given view by name.
        解析视图
     */
    View resolveViewName(String viewName, Locale locale)  throws  Exception;
 
}

6.RequestToViewNameTranslator

默认实现是DefaultRequestToViewNameTranslator.主要作用是根据请求信息获取视图名称。

1
2
3
4
5
public  interface  RequestToViewNameTranslator {
 
    String getViewName(HttpServletRequest request)  throws  Exception;
 
}

7.LocaleResolver

7.1 LocaleResolver类图

从request解析Locale,实现本地化;一般使用在解析视图时使用;和使用国际化资源和主题时使用

wKioL1hAPXHwBfjlAAAmCxfE8TY403.png

7.2 LocaleResolver API

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public  interface  LocaleResolver {
 
   /**
    * Resolve the current locale via the given request.
    * Should return a default locale as fallback in any case.
    * @param request the request to resolve the locale for
    * @return the current locale (never <code>null</code>)
    */
    Locale resolveLocale(HttpServletRequest request);
 
   /**
    * Set the current locale to the given one.
    * @param request the request to be used for locale modification
    * @param response the response to be used for locale modification
    * @param locale the new locale, or <code>null</code> to clear the locale
     * @throws UnsupportedOperationException if the LocaleResolver implementation
     * does not support dynamic changing of the theme
    */
    void  setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale);
 
}

8.ThemeResolver

8.1 ThemeResolver类图

主要用来设置主题。

wKioL1hAPoezjz07AAAgK_q3Sbk816.png

8.2 API

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public  interface  ThemeResolver {
 
   /**
    * Resolve the current theme name via the given request.
    * Should return a default theme as fallback in any case.
    * @param request request to be used for resolution
    * @return the current theme name
    */
    String resolveThemeName(HttpServletRequest request);
 
   /**
    * Set the current theme name to the given one.
    * @param request request to be used for theme name modification
    * @param response response to be used for theme name modification
    * @param themeName the new theme name
     * @throws UnsupportedOperationException if the ThemeResolver implementation
     * does not support dynamic changing of the theme
    */
    void  setThemeName(HttpServletRequest request, HttpServletResponse response, String themeName);
 
}

9.MultipartResolver 

默认实现为CommonsMultipartResolver,处理文件上传请求。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public  interface  MultipartResolver {
 
    /**
     * Determine if the given request contains multipart content.
     */
    boolean  isMultipart(HttpServletRequest request);
 
    /**
     * Parse the given HTTP request into multipart files and parameters,
     * and wrap the request inside a
     */
    MultipartHttpServletRequest resolveMultipart(HttpServletRequest request)  throws  MultipartException;
 
    /**
     * Cleanup any resources used for the multipart handling,
     */
    void  cleanupMultipart(MultipartHttpServletRequest request);
 
}

10 总结。

简单介绍了下各个组件,每个组件都各司其职,互相配合。才有了强大的SpringMVC功能。在以后的文章里,针对每个组件,会结合具体例子,由浅入深式的进行剖析。

另外一个重要的核心部分是HandlerMethodInvoker,涉及的东西比较多,非常有看头。




本文转自 randy_shandong 51CTO博客,原文链接:http://blog.51cto.com/dba10g/1878735,如需转载请自行联系原作者
相关文章
|
XML 前端开发 Java
源码分析系列教程(05) - 手写SpringMVC
源码分析系列教程(05) - 手写SpringMVC
37 0
|
18天前
|
前端开发 Java Spring
Spring MVC源码分析之DispatcherServlet#getHandlerAdapter方法
`DispatcherServlet`的 `getHandlerAdapter`方法是Spring MVC处理请求的核心部分之一。它通过遍历预定义的 `HandlerAdapter`列表,找到适用于当前处理器的适配器,并调用适配器执行具体的处理逻辑。理解这个方法有助于深入了解Spring MVC的工作机制和扩展点。
28 1
|
19天前
|
前端开发 Java Spring
Spring MVC源码分析之DispatcherServlet#getHandlerAdapter方法
`DispatcherServlet`的 `getHandlerAdapter`方法是Spring MVC处理请求的核心部分之一。它通过遍历预定义的 `HandlerAdapter`列表,找到适用于当前处理器的适配器,并调用适配器执行具体的处理逻辑。理解这个方法有助于深入了解Spring MVC的工作机制和扩展点。
25 1
|
16天前
|
前端开发 Java Spring
Spring MVC源码分析之DispatcherServlet#getHandlerAdapter方法
`DispatcherServlet`的 `getHandlerAdapter`方法是Spring MVC处理请求的核心部分之一。它通过遍历预定义的 `HandlerAdapter`列表,找到适用于当前处理器的适配器,并调用适配器执行具体的处理逻辑。理解这个方法有助于深入了解Spring MVC的工作机制和扩展点。
21 0
|
缓存 容器
从源码分析SpringMVC核心处理流程
从源码分析SpringMVC核心处理流程
109 0
从源码分析SpringMVC核心处理流程
|
XML 设计模式 JSON
图文源码分析Spring MVC请求映射原理、执行流程
图文源码分析Spring MVC请求映射原理、执行流程
254 0
图文源码分析Spring MVC请求映射原理、执行流程
|
存储 Java 应用服务中间件
SpringMVC源码分析 DispatcherServlet源码分析
SpringMVC源码分析 DispatcherServlet源码分析
SpringMVC源码分析 DispatcherServlet源码分析
|
设计模式 缓存 前端开发
web九大组件之---HandlerAdapter适配器模式实践源码分析【享学Spring MVC】
web九大组件之---HandlerAdapter适配器模式实践源码分析【享学Spring MVC】
web九大组件之---HandlerAdapter适配器模式实践源码分析【享学Spring MVC】
|
Web App开发 前端开发 Java
SpringMVC源码分析2:SpringMVC设计理念与DispatcherServlet
转自:https://my.oschina.net/lichhao/blog SpringMVC作为Struts2之后异军突起的一个表现层框架,正越来越流行,相信javaee的开发者们就算没使用过SpringMVC,也应该对其略有耳闻。