Spring MVC的静态概念

一 DispatchServlet:前端控制器

二 Controller:控制器

三 HandlerAdapter:DispatchServlet内部使用的一个类

它和DispatchServlet的关系见下面的源码:

public class DispatcherServlet extends FrameworkServlet {
    ...
        private void initHandlerAdapters(ApplicationContext context) {
        this.handlerAdapters = null;

        if (this.detectAllHandlerAdapters) {
            // Find all HandlerAdapters in the ApplicationContext, including ancestor contexts.
            Map matchingBeans =
                    BeanFactoryUtils.beansOfTypeIncludingAncestors(context, HandlerAdapter.class, true, false);
            if (!matchingBeans.isEmpty()) {
                this.handlerAdapters = new ArrayList(matchingBeans.values());
                // We keep HandlerAdapters in sorted order.
                OrderComparator.sort(this.handlerAdapters);
            }
        }
        else {
            try {
                //HandlerAdapter是DispatcherServlet内部使用的一个类
                HandlerAdapter ha = context.getBean(HANDLER_ADAPTER_BEAN_NAME, HandlerAdapter.class);
                this.handlerAdapters = Collections.singletonList(ha);
            }
            catch (NoSuchBeanDefinitionException ex) {
            }
        }

        // Ensure we have at least some HandlerAdapters, by registering
        // default HandlerAdapters if no other adapters are found.
        if (this.handlerAdapters == null) {
            this.handlerAdapters = getDefaultStrategies(context, HandlerAdapter.class);
            if (logger.isDebugEnabled()) {
                logger.debug("No HandlerAdapters found in servlet '" + getServletName() + "': using default");
            }
        }
    }
    ...
}

下图是上面三个类之间的关系

Spring MVC的静态概念_第1张图片

四 HandlerInterceptor:拦截器,它是一个接口

它的源码如下:

public interface HandlerInterceptor {
    boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
        throws Exception;

    void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
            throws Exception;

    void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception;
}

在https://docs.spring.io/spring/docs/5.1.0.RC1/javadoc-api/可以找到它的API说明

Spring MVC的静态概念_第2张图片

五 HandlerMapping:帮助DispatchServlet找到合适的Controller,用HandlerInterceptor包装Controller

它的源码如下:

public interface HandlerMapping {

    String PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE = HandlerMapping.class.getName() + ".pathWithinHandlerMapping";
    String BEST_MATCHING_PATTERN_ATTRIBUTE = HandlerMapping.class.getName() + ".bestMatchingPattern";
    String INTROSPECT_TYPE_LEVEL_MAPPING = HandlerMapping.class.getName() + ".introspectTypeLevelMapping";
    String URI_TEMPLATE_VARIABLES_ATTRIBUTE = HandlerMapping.class.getName() + ".uriTemplateVariables";
    String MATRIX_VARIABLES_ATTRIBUTE = HandlerMapping.class.getName() + ".matrixVariables";
    String PRODUCIBLE_MEDIA_TYPES_ATTRIBUTE = HandlerMapping.class.getName() + ".producibleMediaTypes";
    HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception;
}

它的作用如下图

Spring MVC的静态概念_第3张图片

六 HandlerExecutionChain

它的作用如下图

Spring MVC的静态概念_第4张图片

七 ModelAndView:Model的一个具体表现

八 ViewResolver:帮助DispatchServlet找到合适的视图页

九 View:负责页面呈现

十 小结

静态概念真不少,来个汇总。

Spring MVC的静态概念_第5张图片

 

你可能感兴趣的:(Spring,MVC)