SpringMVC请求过程
2021-07-06 21:07:14 1 举报
SpringMVC完成一次请求的具体过程
作者其他创作
大纲/内容
是
AbstractHandlerMapping的getHandler(request)方法中调用了getHandlerInternal(request),该方法的具体实现在子类AbstractHandlerMethodMapping中
AbstractHandlerMethodMapping中的getHandlerInternal(request)中根据请求在已经注册的controller请求中(mappingRegistry包含了所有controller的请求路径以及方法)进行查找匹配,如果匹配到直接返回一个handler对象,该对象包含了匹配到的controller方法,否则返回null
对请求的相关处理
否
返回得到的handler对象:Object handler = getHandlerInternal(request);
根据handler获取处理器适配器HandlerAdapter:HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
返回获取到的HandlerExecutionChain对象,该对象既包含请求的controller方法,又包含方法请求前后执行的拦截器,这些对象可以供后续调用
返回
DispatcherServlet的getHandlerAdapter(handler)通过循环遍历来获取相应的适配器:adapter.supports(handler)
返回结果,可以是字符串(视图名称),或者任意的数据类型。这几个步骤都是循环处理。
RequestMappingHandlerAdapter中的invokeHandlerMethod方法:1、将request和response对象整体封装为一个新的对象span style=\"font-size: inherit;\
根据handler获取适配器// Determine handler adapter for the current request.HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
web.xml中的servlet如果配置了<load-on-startup>1</load-on-startup>,则在tomcat容器启动时就实例化该servlet对象并调用HttpServletBean中的init()。当有外部请求时就继续往下执行:
3
InvocableHandlerMethod的invokeForRequest方法:1、先获取目标方法(controller方法)的参数集合 MethodParameter[] parameters = this.getMethodParameters();参数分为两种类型:默认的参数类型直接获取到值;Model、ModelMap、Map类型会从ModelAndViewContainer中获取默认的BindingAwareModelMap2、根据目标方法的参数去寻找对应的请求处理器this.resolvers.supportsParameter(parameter)3、获取到请求处理器后,利用处理器将请求中的参数获取到并赋值到目标方法的形参中4、如果需要类型的转换就进行参数类型的转换并赋值给目标方法的形参中5、执行目标方法的业务逻辑
2
1
释放资源
根据请求request来获取handler:mappedHandler = getHandler(processedRequest);
从该方法传进去的dispatchException值进行判断,如果上述执行过程中发生异常操作,此时会把所有异常进行处理,比如跳转到某一个自定义的错误视图中。
检查当前请求是否是上传请求processedRequest = checkMultipart(request); multipartRequestParsed = (processedRequest != request);
返回对应的适配器
通过之前找到的处理器适配器对象来处理controller中你的具体方法:AbstractHandlerMethodAdapter类中的handle方法
无异常
DispatcherServlet初始化时,已经为HandlerAdapter初始化了三个适配器:HttpRequestHandlerAdapter:如果controller类的实现方式是通过实现HttpRequestHandler接口的话,那么就能匹配刀到该适配器。SimpleControllerHandlerAdapter:如果controller类的实现方式是通过实现Controller接口的话,那么就能匹配刀到该适配器。RequestMappingHandlerAdapter:如果controller中的方法上加了@RequestMapping注解的话就能匹配到该适配器。但在实际判断的时候的判断依据是是否实现了HandlerMethod类。
span style=\"font-size: inherit;\
5
DispatcherServlet初始化时,已经为HandlerMapping初始化了三个处理器:SimpleUrlHandlerMapping:不满足上述两个处理器的条件就使用该处理器。BeanNameUrlHandlerMapping:根据spring的xml文件中的bean的id做判断。RequestMappingHandlerMapping:所有controller中标注了@RequestMapping注解的方法都会被扫描到。
根据request(request中包含了web.xml中定义的filter)获取handler,该handler中包含了请求的controller方法、拦截器以及beanFactory,beanFactory中包含了springmvc容器中实例化的bean。// Determine handler for the current request. mappedHandler = getHandler(processedRequest);
额外异常的处理
是否是异步处理if (asyncManager.isConcurrentHandlingStarted()) {\t\t\t\t\treturn;\t\t\t\t}
对视图的相关处理
DispatchServlet类中的processDispatchResult方法处理返回的结果
FrameworkServlet中具体实现doGet()/doPost(),这两个方法中调用processRequest(),该方法调用doService(),doService()在子类DispatcherServlet中具体实现
4
DisapatcherServlet的getHandler(request)通过循环遍历来获取请求对应的处理器映射器:HandlerExecutionChain handler = mapping.getHandler(request);该方法的具体实现中调用了AbstractHandlerMapping的getHandler(request)
执行拦截器的afterCompletion方法
有异常
调用
HttpServlet中执行service()判断是doGet()或者doPost(),这两个方法在子类FrameworkServlet中具体实现
返回需要的ModelAndView对象,通过此处可以看到,无论方法处理返回的结果值是什么,最后都会返回一个ModelAndView对象
DispatcherServlet中具体实现doService(),该方法调用核心方法doDispatch():
将完成SpringMVC九大内置对象的初始化。包括为HandlerMapping初始化了三个处理器以及为HandlerAdapter初始化了三个适配器
supports(handler)的实现逻辑:循环遍历判断controller的实现方式public boolean supports(Object handler) { return (handler instanceof HttpRequestHandler); }public boolean supports(Object handler) { return (handler instanceof Controller); }return (handler instanceof HandlerMethod && supportsInternal((HandlerMethod) handler));
直接返回
0 条评论
下一页