在StandardWrapperValve处理过程中,会做两件事:一件是执行ApplicationFilterChain.doFilter接口-过滤器执行;一件是执行业务逻辑接口servlet.service()。
spring下有个Servlet的子类FrameworkServlet,重写了service接口。所以当tomcat执行servlet.service()接口时,其实调用的是FrameworkServlet.service接口。
问题一:tomcat如何生成FrameworkServlet类的实例对象?
tomcat在创建Context容器(tomcat webapps下的应用,在tomcat运行期间,如果部署新的应用服务,tomcat会监控到Context容器发生了变化,会自动解压新部署的应用服务)
实例,会去找Context容器下的Wrapper容器,加载Servlet对象,通过StandardWrapper.allocate接口生成Servlet实例。
问题二:FrameworkServlet如何找到controller层的目标接口?
在FrameworkServlet.service方法里,当请求方式不等于HttpMethod.PATCH枚举类时,就会去执行DispatcherServlet.doDispatch方法。在DispatcherServlet.doDispatch方法里,
通过请求的URL,使用HandlerMapping映射关系找到对应的Handler(Controller类)以及拦截器(HandlerInterceptor),并封装成HandlerExecutionChain对象。
通过Handler找到对应的HandlerAdapter,默认controller层目标接口在RequestMappingHandlerAdapter.invokeHandlerMethod方法中执行,并返回ModelAndView对象。
InternalResourceViewResolver根据具体的前缀:/WEB-INF/view/,后缀.html,视图名:index,将ModelAndView对象解析成具体的数据填充到index.html中,返回给浏览器
展示。浏览器接收到的都是静态数据。
https://blog.csdn.net/u013212754/article/details/103490898