1、发送请求,请求到达DispatcherServlet的doService方法
2、doService方法调用doDispatch进行请求处理
3、doDispatch方法处理流程:
processedRequest = this.checkMultipart(request); multipartRequestParsed = processedRequest != request; mappedHandler = this.getHandler(processedRequest); if (mappedHandler == null) { this.noHandlerFound(processedRequest, response); return; } HandlerAdapter ha = this.getHandlerAdapter(mappedHandler.getHandler());
封装请求对象,通过getHandler方法获取请求对应的handler对象,根据handler通过getHandlerAdapter方法获取处理handler的HandlerAdapter对象
调用对应HanlderAdapter的handler方法处理请求
handler方法中调用handleInternal方法
在handlerInternal方法中调用invokeHandlerMethod方法执行请求的目标方法并返回一个ModelAndView对象
invokeHandlerMethod方法中将参数解析器和返回处理器设置到invocableMethod对象中,然后调用invocableMethod对象的invokeAndHandler方法处理请求
invokeAndHandler方法中调用invokeForRequest方法通过反射执行请求方法并返回结果
将返回结果进行处理
调用返回结果处理器的处理返回值方法,在handlerReturnValue方法中调用selectHandler方法返回处理当前返回结果的handler
selectHandler方法通过判断返回结果处理器集合中每个返回结果处理器是否支持处理当前返回结果
调用返回的返回结果处理handler的handlerReturnValue方法返回结果转换
handlerReturnValue方法中调用writeWithMessageConverters方法对返回结果处理
writeWithMessageConverters方法中获取客户端(发送请求)支持的媒体类型,获取服务端能处理当前返回数据类型的媒体类型(根据消息转换器匹配是否支持转换此返回类型),并对两边的媒体类型进行匹配并根据权重进行排序等操作
取出第一个媒体类型,并在所有消息转换器中寻找支持此媒体类型和返回类型的消息转换器,找到之后跳出循环层到label159标记处
调用messageConverter的write方法写出数据
以上就是返回数据的大概流程。
原文:https://www.cnblogs.com/kjs-bk/p/14640899.html