1 spring-webmvc概览

1.1 spring-webmvc之HandlerAdapter

写在框架之前:

tomcat 内部建立连接,组装request等信息后,servlet容器的标准最重要的开始
StandardWrapperValve#invoke(Request request, Response response)
    ApplicationFilterChain filterChain =ApplicationFilterFactory.createFilterChain(request, wrapper, servlet);
    org.apache.catalina.core.ApplicationFilterChain#doFilter
        ApplicationFilterConfig filterConfig = filters[pos++];
        Filter filter = filterConfig.getFilter();
        filter.doFilter(request, response, this);//递归调用下一个过滤器,这种方式可以实现过滤器后置
        servlet.service(request, response);//servlet对一次请求有且唯一的一个,是在filterChain的后面部分调用,但因为过滤器链的递归模式,过滤器可以做到在servlet之后执行;

正文:

1:最主要父类FrameworkServlet完成了spring和servlet的整合功能,并托管所有请求到核心类DispatcherServlet的doService方法,在该类中,完成了request和response的threadLocal绑定,后续可通过RequestContextHolder的静态方法获取当前请求的request和response。

2:核心类DispatcherServlet,此类在spring-boot未兴起之前,需要配置到web.xml中,Servlet是最短路径匹配,/匹配所有,并且会选一个最匹配的Servlet执行(只会有一个Servlet会执行,不以申明顺序未为准),过滤器是完整路径匹配,/*匹配所有,每一个过滤器按申明顺序执行,在任一过滤器中可以断路。

2.1:初始化组件

protected void initStrategies(ApplicationContext context) {
   initMultipartResolver(context);//文件处理器
   initLocaleResolver(context);//国际化处理器
   initThemeResolver(context);//主题处理器,常用在页面多主题样式
   initHandlerMappings(context);
   initHandlerAdapters(context);
   initHandlerExceptionResolvers(context);
   initRequestToViewNameTranslator(context);
   initViewResolvers(context);
   initFlashMapManager(context);
}

2.2:主要处理逻辑:

文件处理(忽略);

HandlerExecutionChain mappedHandler=getHandler(processedRequest)//RequestMappingHandlerMapping,另两种默认的从来没用到过,mappedHandler=handler(HandlerMethod)+interceptorList (拦截器为spring定义的专有概念,和servlet规范无关)
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());

RequestMappingHandlerAdapter匹配HandlerMethod(对应controller#method)

if (!mappedHandler.applyPreHandle(processedRequest, response)) {(返回false则短路)

核心方法:mv = ha.handle(processedRequest, response, mappedHandler.getHandler());

即为适配器做一个运行环境,执行controller#method

mappedHandler.applyPostHandle(processedRequest, response, mv);

将结果+异常及各个变量做response相应:

processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);

处理逻辑主要就是有异常,用initHandlerExceptionResolvers定义的异常处理器处理,主要为HandlerExceptionResolverComposite处理

以下为默认的组件:

org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver

org.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver

org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\
   org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping,\
   org.springframework.web.servlet.function.support.RouterFunctionMapping

org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\
   org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\
   org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter,\
   org.springframework.web.servlet.function.support.HandlerFunctionAdapter


org.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver,\
   org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,\
   org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver

org.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator

org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver

org.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值