美文网首页javaspringMVC源码分析
springMVC源码分析--HandlerMethodRetu

springMVC源码分析--HandlerMethodRetu

作者: carway | 来源:发表于2017-10-16 17:51 被阅读95次

    (一)springMVC源码分析--HandlerMethodReturnValueHandlerComposite返回值解析器集合(二)
    (二)springMVC源码分析--ViewNameMethodReturnValueHandler返回值处理器(三)
    HandlerMethodReturnValueHandler是用于对Controller中函数执行的返回值进行处理操作的,springMVC提供了多个HandlerMethodReturnValueHandler的实现类。

    HandlerMethodReturnValueHandler接口以及它的实现类.png

    接口HandlerMethodReturnValueHandler定义的抽象方法还是比较简单的,源码如下:
    (1)supportsReturnType用于判断是否支持对返回值的处理。
    (2)handleReturnValue实现对返回值的处理操作。

    public interface HandlerMethodReturnValueHandler {  
      
        //判断是否支持  
        boolean supportsReturnType(MethodParameter returnType);  
      
        //处理返回值操作  
        void handleReturnValue(Object returnValue, MethodParameter returnType,  
                ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception;  
      
    }
    

    springMVC中对返回值的操作流程如下:执行过程是在ServletInvocableHandlerMethod的invokeAndHandle中

    public class ServletInvocableHandlerMethod extends InvocableHandlerMethod {
        ....
        public void invokeAndHandle(ServletWebRequest webRequest,  
                ModelAndViewContainer mavContainer, Object... providedArgs) throws Exception {  
            //处理操作的返回值  
            Object returnValue = invokeForRequest(webRequest, mavContainer, providedArgs);  
            .......  
            //对返回值进行处理操作  
            this.returnValueHandlers.handleReturnValue(  
                        returnValue, getReturnValueType(returnValue), mavContainer, webRequest);  
            .........  
        } 
    }
    

    具体实现是在HandlerMethodReturnValueHandlerComposite中,HandlerMethodReturnValueHandlerComposite中包含了所有springMVC提供的返回值处理器。

    selectHandler是选取返回值处理器

    public class HandlerMethodReturnValueHandlerComposite implements AsyncHandlerMethodReturnValueHandler {
        private final List<HandlerMethodReturnValueHandler> returnValueHandlers = new ArrayList();
        ......
    
        public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, 
                                                            NativeWebRequest webRequest) throws Exception {
            //选择可以处理返回值的处理器  
            HandlerMethodReturnValueHandler handler = this.selectHandler(returnValue, returnType);
            if(handler == null) {
                throw new IllegalArgumentException("Unknown return value type: " + returnType.getParameterType().getName());
            } else {
                //处理返回值,具体实现是在HandlerMethodReturnValueHandler的实现类中  
                handler.handleReturnValue(returnValue, returnType, mavContainer, webRequest);
            }
        }
    
    
        //选择获取可以处理返回值的处理器
        private HandlerMethodReturnValueHandler selectHandler(Object value, MethodParameter returnType) {  
            boolean isAsyncValue = isAsyncReturnValue(value, returnType);  
            for (HandlerMethodReturnValueHandler handler : this.returnValueHandlers) {  
                if (isAsyncValue && !(handler instanceof AsyncHandlerMethodReturnValueHandler)) {  
                    continue;  
                }  
                if (handler.supportsReturnType(returnType)) {  
                    return handler;  
                }  
            }  
            return null;  
        }  
        .....
    }
    

    以上代码就完成了执行Controller函数之后对返回值的处理操作过程。

    转载于:http://blog.csdn.net/qq924862077/article/details/54177447

    相关文章

      网友评论

        本文标题:springMVC源码分析--HandlerMethodRetu

        本文链接:https://www.haomeiwen.com/subject/zscluxtx.html