
在Spring Boot的系列教程中,我们已探讨了Web相关的知识,从第1到第7部分,内容涵盖了从浏览器发送请求,如何适配后端接口,请求参数如何与接口参数绑定,到接口处理数据后,如何将返回值发送回浏览器,以及如何与浏览器的接收类型适配,最终形成一个闭环。在第7部分中,我们主要研究了使用注解@ResponseBody时,返回值是如何转换为浏览器能接收的数据类型的。本章将深入探讨视图解析的原理和流程。
在本章中,我们关注的是使用@Controller注解而不是@RestController注解的类。在第7部分中,由于使用了@ResponseBody,数据直接由ServletInvocableHandlerMethod对象的invokeAndHandle方法输出。具体来说,这是通过RequestResponseBodyMethodProcessor对象的handleReturnValue方法实现的,它将数据转换为浏览器能接受的类型,并通过方法直接写出去。
一、公共逻辑
HandlerMethodReturnValueHandlerComposite类中的handleReturnValue方法开始出现差异。
二、使用@ResponseBody注解的处理逻辑
@ResponseBody注解对应RequestResponseBodyMethodProcessor处理类型中的public boolean supportsReturnType(MethodParameter returnType)方法,用于判断是否支持解析返回值。这个方法的判断条件是有没有使用ResponseBody这个注解。通过这个类的判定方法后,接下来会调用这个类对接口返回数据的处理。
三、未使用@ResponseBody的处理逻辑
未使用@ResponseBody注解时,对应ViewNameMethodReturnValueHandler类的处理逻辑。首先会调用其判定方法,判断是否支持当前接口返回数据的处理。
当公共逻辑方法invocableMethod.invokeAndHandle(webRequest, mavContainer, new Object[0]);执行完毕后,会进入RequestMappingHandlerAdapter类中的invokeHandlerMethod方法。
在处理派发结果逻辑中,一旦获取了视图对象,就会调用自定义的render进行页面渲染工作。
总的来说:
1、返回值以forward:开头的,将会由new InternalResourceView(forwardUrl)处理,这个对象中的处理方法调用的也是request.getRequestDispatcher(path).forward(request, response),即原始的servlet转发方法。
2、返回值以redirect:开头的,将会以new RedirectView()这个对象进行处理,调用里面的reder方法,使用原始的response.sendRedirect(encodedURL)方法进行转发。
3、其他如使用Thymeleaf模板引擎的情况则不再详述。
一、视图解析原理流程
(1)在目标方法处理过程中,所有数据都会被放在ModelAndViewContainer中,包括数据和视图地址。
(2)方法的参数是一个自定义类型对象(从请求参数中确定),然后重新放在ModelAndViewContainer中。
(3)任何目标方法执行完成后都会返回ModelAndView(数据和视图地址)。
(4)processDispatchResult处理派发结果(页面如何响应)。
1、render(mv, request, response);进行页面渲染逻辑。
1、根据方法的String返回值得到View对象【定义了页面的渲染逻辑】。
1、所有的视图解析器尝试是否能根据当前返回值得到View对象。
2、得到了redirect:/main.html --> Thymeleaf new RedirectView()。
3、ContentNegotiationViewResolver内部包含了所有视图解析器,内部还是利用所有视图解析器得到视图对象,竞技宝app下载。
4、view.render(mv.getModelInternal(), request, response);视图对象调用自定义的render进行页面渲染工作,竞技宝官网网址。
a、RedirectView如何渲染【重定向到一个页面】。
b、获取目标url地址。
c、response.sendRedirect(encodedURL)。