假装看源码之springmvc (四) springmvc的处理方法返回值处理

 springmvc的处理方法返回值处理

 在springmvc我们自己创建的Controller中的方法,可以返回不同的返回值,而不管是什么样的返回值,最后的请求都会被正确的处理,在前面视图解析篇中,我们主要关注点是视图解析找视图,model数据合并,渲染视图,然而在这个过程中,我们忽略了这个解析视图的名称是怎么来的,resetFul请求(responseBody)没有视图,又是怎么中断请求的,不同的返回值是怎么通用的处理成modelAndValue的,带着这些问题,为了更加深入的探究这里面的奥秘,今天我们跟着源码,一起走进returnValue的小世界。

 概述:

    springmvc的Handler可以和请求参数一样,你可以设置成void或返回null,或者返回String,以及@ResponseBody注解标注的对象。

   我们大部分人都知道当方法返回值为Null时,默认是将请求路径当做视图路径处理,String类型是解析返回值字符串, 当redirect:或forWord:会进行转发或重定向,否则就根据返回值String的路径找到对应的视图处理,如果是ResponseBody注解的对象类型,那么就会格式化json并且输出。

  返回值处理是在请求流程的那个位置执行的呢?,是在处理器适配器(HandlerAdapter)调用处理方法执行完后执行的,处理完以后,能够解析出ModelAndView。供后续渲染需要,而由于返回值有不同的类型,那么就需要用一个通用的处理接口进行处理。这个接口就是HandlerMethodReturnValueHandler,它可以通用的是否支持MethodParameter类型,而后通用的处理MethodParameter的返回值类型,而MethodParameter就是方法、类、类型、以及子类扩展了返回值及类型,这样我们所有的处理方法和返回值组装到MethodParameter中,交给HandlerMethodReturnValueHandler这个通用的接口处理,这个就是处理器方法返回值处理的核心原理。

一、主要执行类

1、核心类描述

    RequestMappingHandlerAdapter : 处理器适配器,请求主要执行类。
        
        MethodReturnValueHandler : result处理类的顶级接口
        
            + boolean supportsReturnType(MethodParameter returnType); // 是否支持
            + void handleReturnValue(Object returnValue, MethodParameter returnType, // 进行处理
            ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception; 
            
        MethodParameter: MethodParameter包装了执行方法以及各种方法参数
        
            ReturnValueMethodParameter: MethodParameter子类,扩展了returnValue变量,并且执行paramIndex=-1,
             
        ModelAndViewContainer : 包装了view和model,主要用来接收MethodReturnValueHandle的处理结果。     
        
        HandlerMethodReturnValueHandlerComposite : 组合各种result处理类。
        
        常见MethodReturnValueHandler实现
        
        1) ViewNameMethodReturnValueHandler :  用来处理String类型和void类型的返回值。
            + supportsReturnType // 判断是否支持String类型
            + handleReturnValue // 判断是否是rediect,并且将String类型的viewNmae设置到ModelAndViewContainer中
        
        2) ModelAndViewMethodReturnValueHandler : 用来处理ModelAndView类型返回值
            + supportsReturnType // 判断是否支持ModelAndView 返回值
            + handleReturnValue // 将ModelAndView的数据复制给ModelAndView

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值