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

这篇具有很好参考价值的文章主要介绍了【老王读SpringMVC-6】Controller method 的正常返回值处理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

返回值对象的处理

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

具体的调用过程如下:
【老王读SpringMVC-6】Controller method 的正常返回值处理

ServletInvocableHandlerMethod#invokeAndHandle() 的处理过程如下:
【老王读SpringMVC-6】Controller method 的正常返回值处理

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

HandlerMethodReturnValueHandler

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

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

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

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

StreamingResponseBodyReturnValueHandler
CallableMethodReturnValueHandler
AsyncTaskMethodReturnValueHandler

视图的渲染

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

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

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

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

可以看到,视图渲染的过程如下:
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() 渲染视图,呈现给用户。文章来源地址https://www.toymoban.com/news/detail-458186.html

到了这里,关于【老王读SpringMVC-6】Controller method 的正常返回值处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringMVC之JSON数据返回与异常处理机制

    目录 一.SpringMVC的JSON数据返回 1.导入Maven依赖 2.配置spring-mvc.xml 3.@ResponseBody注解的使用 3.1案例演示 1.List集合转JSON  2.Map集合转JSON  3.返回指定格式String 4. @ResponseBody用法  5.Jackson 5.1介绍 5.2常用注解 二.异常处理机制  1.为什么要全局异常处理 2.异常处理思路 3.SpringMVC异常分类

    2024年02月08日
    浏览(42)
  • “深入理解SpringMVC的JSON数据返回和异常处理机制“

    在现代Web开发中,SpringMVC是一个广泛使用的框架,它提供了丰富的功能和灵活的配置选项。本文将深入探讨两个重要的主题:SpringMVC中的JSON数据返回和异常处理机制。我们将逐步介绍相关的配置和使用方法,并通过案例和综合实例来加深理解。 1.1 导入依赖 1.2 配置弹簧-MVC

    2024年02月08日
    浏览(34)
  • SpringMVC之JSON数据返回与异常处理机制---全方面讲解

         在Spring MVC中,当需要将数据 以JSON格式返回给客户端时 ,可以使用 @ResponseBody注解或@RestController注解将Controller方法的返回值直接转化为JSON格式并返回 。这使得开发者可以方便地将Java对象转换为JSON,并通过HTTP响应返回给客户端。Spring MVC框架会自动地处理这一转换过程

    2024年02月07日
    浏览(41)
  • SpringMVC如何保证Controller的并发安全

    【文章序言】:hello你好我是辰兮,很高兴你能来阅读,昵称是希望自己能不断精进,向着优秀程序员前行! 博客来源于项目以及编程中遇到的问题总结,偶尔会有读书分享,我会陆续更新Java前端、后台、数据库、项目案例等相关知识点总结,感谢你的阅读和关注,希望我的

    2024年04月25日
    浏览(51)
  • SpringMVC原理分析 | Controller配置、RestFul风格

    💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! 控制器Controller 控制器复杂提供访问应用程序的行为,通常通过 接口定义 或 注释定义 的两种方法实现 控制器负责解析用户的请求并将其转换为一个模型 SpringMVC中一个控制器可以包含多个方法 实现Controller接口 Contro

    2024年02月11日
    浏览(45)
  • kube-controller-manager和kube-scheduler不能正常启动

     kube-controller-manager-k8s-worker01和kube-scheduler-k8s-worker01没有启动起来 原因: 解决:进入/etc/kubernetes/manifests 编辑 将镜像地址修改为 然后重启kubelet:systemctl restart kubelet.service

    2024年02月07日
    浏览(35)
  • SpringMVC中Controller层获取前端请求参数的几种方式

    在controller层方法中定义形参,若请求时参数名、参数类型相同,则SpringMVC会自动绑定。 下面使用PostMan进行测试发现,无论是将参数直接拼接到URL还是写在form-data里;只要参数类型和参数名与方法形参相同,则会自动绑定 当controller层中的方法形参名与请求参数名不同时,可

    2024年02月11日
    浏览(55)
  • java controller 根据权限控制返回前端字段

    该方案通过 AOP切面 + 注解 处理控制返回字段信息 该注解在controller层方法上使用,用于需要进行字段过滤的接口 该注解在字段Field上使用,用于需要进行权限控制的字段 AOP切面对标有注解的方法及字段进行过滤,在切面内自定义业务逻辑对返回字段进行处理 功能设计参考:

    2024年02月10日
    浏览(39)
  • Spring MVC 的controller方法返回值

    说明:controller方法中定义ModelAndView对象并返回,对象中可添加model数据、指定view 逻辑视图名 说明:controller方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址。 返回字符串 在index.jsp里面定义超链接 Redirect重定向 说明: Contrller方法返回结果重定向到

    2024年01月16日
    浏览(53)
  • Spring MVC学习之——Controller类中方法的返回值

    2.1逻辑视图名 说明:controller方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址。 返回字符串 2.2Redirect重定向 说明: Contrller方法返回结果重定向到一个url地址,如下商品修改提交后重定向到商品查询方法,参数无法带到商品查询方法中。 redirect方式

    2024年01月18日
    浏览(66)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包