【老王读SpringMVC-6】Controller method 的正常返回值处理

news/2024/10/30 21:27:13/

handler method 的返回值处理包含两个方面:
一是:返回值对象的处理;
二是:视图的渲染。

返回值对象的处理

通过前面的分析,我们知道, 被 @RequestMapping 标记 handler method 的执行是通过调用 RequestMappingHandlerAdapter#handle()
其中,参数解析、handler method 的执行 和 对返回值的处理,最终是通过 ServletInvocableHandlerMethod#invokeAndHandle() 来处理的。

具体的调用过程如下:
RequestMappingHandlerAdapter2

ServletInvocableHandlerMethod#invokeAndHandle() 的处理过程如下:
ServletInvocableHandlerMethod

所以,handler method 返回的值对象会被 HandlerMethodReturnValueHandler 来处理。

HandlerMethodReturnValueHandler

HandlerMethodReturnValueHandler 是处理 handler method 返回值的策略接口。

HandlerMethodReturnValueHandler

其中,RequestResponseBodyMethodProcessor 是用来处理 @ResponseBody 类型的返回值的;
ModelAndViewResolverMethodReturnValueHandler 是一个最终兜底的返回值处理类,它是在所有其他的处理器之后执行的。

此处略去了跟异步请求相关的 ReturnValueHandler :

StreamingResponseBodyReturnValueHandler
CallableMethodReturnValueHandler
AsyncTaskMethodReturnValueHandler

视图的渲染

视图的渲染过程是在 DispatcherServlet 中进行处理的,具体的处理代码如下:

processDispatchResult

DispatcherServlet#render() 会将 ModelAndView 进行渲染。 这是处理请求的最后一个阶段。

render

可以看到,视图渲染的过程如下:
1、通过 ViewResolver 解析 viewName 对应的 View 对象
2、调用 View#render() 渲染视图,呈现给用户

@ResponseBody 标记的方法会经过视图解析吗?

先说结论:@ResponseBody 标记的方法不会经过视图解析。
原因分析:
@ResponseBody 类型的返回值是通过 RequestResponseBodyMethodProcessor 来处理的。
RequestResponseBodyMethodProcessor#handleReturnValue 会设置标志位 requestHandled=true,标记请求已被直接处理,不需要视图解析。
这样的话,RequestMappingHandlerAdapter#invokeHandlerMethod() 返回的 ModelAndView 就是 null,DispatcherServlet 就不会进行视图解析。

RequestResponseBodyMethodProcessor 的处理过程如下:

// RequestResponseBodyMethodProcessor#handleReturnValue
public void handleReturnValue(Object returnValue, MethodParameter returnType,ModelAndViewContainer mavContainer, NativeWebRequest webRequest)throws IOException, HttpMediaTypeNotAcceptableException, HttpMessageNotWritableException {// 标记标记请求已被直接处理,不需要视图解析mavContainer.setRequestHandled(true);ServletServerHttpRequest inputMessage = createInputMessage(webRequest);ServletServerHttpResponse outputMessage = createOutputMessage(webRequest);writeWithMessageConverters(returnValue, returnType, inputMessage, outputMessage);
}

小结

返回值的处理包括返回值对象的处理和视图的渲染。
其中,handler method 的返回值对象会通过 HandlerMethodReturnValueHandler 来处理。
如果需要视图渲染的话,就会在 DispatcherServlet#processDispatchResult() 中进行统一处理,通过 ViewResolver 解析出相应的 View 视图,最终调用 View#render() 渲染视图,呈现给用户。


http://www.ppmy.cn/news/78464.html

相关文章

Pytest模式执行python脚本不生成allure测试报告

1.安装allure 下载allure的zip安装包将allure.zip解压到python的lib目录中将allure的bin路径添加到环境变量path中(注意:配置环境变量后,一定要重启电脑。因为环境变量没生效,我搞了半天在pycharm不能生成报告,在cmd中可以生成报…

Linux中的 loop设备

loop设备是一种伪设备(pseudo-device),或者说是仿真设备。它可以使我们在类UNIX系统上像块设备一样访问一个文件。loop设备必须与一个文件进行连接,才能被使用。通过这种方式,文件可以被mount为块设备,并像…

C/C++ 数据结构设计与应用(四):C++数据压缩与传输:从理论到实践的全景解析

C数据压缩与传输:从理论到实践的全景解析 一、数据压缩的策略与方法 (Strategies and Methods of Data Compression)1.1 数据压缩的基本概念与原理 (Basic Concepts and Principles of Data Compression)1.2 C中的数据压缩技术 (Data Compression Techniques in C)1…

【无标题】ELISA-3(加装跟踪装置)—让群体协作更智能!

群体智能是近年来发展迅速的一个人工智能学科领域,通过对蚂蚁、蜜蜂等为代表的社会性昆虫群体行为的研究,实现分布式等智能行为。作为新一代人工智能的重要方向,群体智能通常用于无人机、机器人集群的协同作业。目前,群体智能在基…

2023年国内CDGA/CDGP数据治理认证考试报名入口

DAMA认证为数据管理专业人士提供职业目标晋升规划,彰显了职业发展里程碑及发展阶梯定义,帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力,促进开展工作实践应用及实际问题解决,形成企业所需的新数字经济下的核心职业…

学习经验分享【28】目标检测硕士大论文写作模板初稿【持续更新】

前言 结合本人读研的经验,后续会持续分享目标检测类硕士大论文的写作技巧以及写作方法,形成写作模板,跟考研英语要背写作套路模板一样,只要按照写作模板进行更新内容完善研究内容的话,就能达到至少良好的盲省成绩&…

pix2pixHD代码---数据集处理

在train文件中:其中dataset是dataloader的方法,而dataloader等于CreateDataLoader。 所以我们跳到CreateDataLoader: 在CreateDataLoader中返回的是dataset_loader,是来自于CustomDatasetDataLoader。切调用了initialize。因为C…

python 文件操作 , 异常处理 , 模块和包

文件操作 1.写数据 # open(name, mode) # name:是要打开的目标文件名的字符串(可以包含文件所在的具体路径)。 # mode:设置打开文件的模式(访问模式):只读、写入、追加等。 #1.打开文件---通道建立--申请资源 # w 模式会清空之前的内…