赞
踩
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。