美文网首页springMVC源码分析
springMVC源码分析--ViewNameMethodRet

springMVC源码分析--ViewNameMethodRet

作者: carway | 来源:发表于2017-10-16 18:06 被阅读12次

    前两篇springMVC源码分析--HandlerMethodReturnValueHandler返回值解析器(一) springMVC源码分析--HandlerMethodReturnValueHandlerComposite返回值解析器集合(二)我们分别介绍了返回值处理器相关的东西,接下来我们选取一个简单的实现类ViewNameMethodReturnValueHandler来简单介绍一下返回值处理操作。

    1、返回值为jsp页面地址

    @RequestMapping(value = "input")  
    public String inputProduct() {  
        logger.info("inputProduct called");  
        return "jsp/ProductForm";  //对应jsp页面名称  
    }  
    

    2、ViewNameMethodReturnValueHandler中对返回值jsp/ProductForm的处理

    1.png

    handleReturnValue实现方法代码如下:

        @Override  
        public void handleReturnValue(Object returnValue, MethodParameter returnType,  
                ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception {  
            //判断是否是String类型  
            if (returnValue instanceof CharSequence) {  
                //如果是将其设置为视图名称  
                String viewName = returnValue.toString();  
                mavContainer.setViewName(viewName);  
                if (isRedirectViewName(viewName)) {  
                    mavContainer.setRedirectModelScenario(true);  
                }  
            }  
            else if (returnValue != null){  
                // should not happen  
                throw new UnsupportedOperationException("Unexpected return type: " +  
                        returnType.getParameterType().getName() + " in method: " + returnType.getMethod());  
            }  
        } 
    

    这样就把返回值jsp/ProductForm作为视图名称放到ModelAndView中,这样就完成了返回值的处理操作。
    ViewNameMethodReturnValueHandler完整源码如下,处理机制还是比较简单的。

    //HandlerMethodReturnValueHandler的子类,主要就是Controller执行后返回的视图名称  
    public class ViewNameMethodReturnValueHandler implements HandlerMethodReturnValueHandler {  
      
        private String[] redirectPatterns;  
      
        //设置跳转链接的匹配方式  
        public void setRedirectPatterns(String... redirectPatterns) {  
            this.redirectPatterns = redirectPatterns;  
        }  
      
        /** 
         * The configured redirect patterns, if any. 
         */  
        public String[] getRedirectPatterns() {  
            return this.redirectPatterns;  
        }  
      
        @Override  
        public boolean supportsReturnType(MethodParameter returnType) {  
            Class<?> paramType = returnType.getParameterType();  
            return (void.class == paramType || CharSequence.class.isAssignableFrom(paramType));  
        }  
        //实现逻辑还是比较简单的,就是设置ModelAndViewContainer的viewName视图名称  
        @Override  
        public void handleReturnValue(Object returnValue, MethodParameter returnType,  
                ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception {  
      
            if (returnValue instanceof CharSequence) {  
                String viewName = returnValue.toString();  
                mavContainer.setViewName(viewName);  
                if (isRedirectViewName(viewName)) {  
                    mavContainer.setRedirectModelScenario(true);  
                }  
            }  
            else if (returnValue != null){  
                // should not happen  
                throw new UnsupportedOperationException("Unexpected return type: " +  
                        returnType.getParameterType().getName() + " in method: " + returnType.getMethod());  
            }  
        }  
        //判断返回值是否是跳转链接,以redirect:开头  
        protected boolean isRedirectViewName(String viewName) {  
            return (PatternMatchUtils.simpleMatch(this.redirectPatterns, viewName) || viewName.startsWith("redirect:"));  
        }  
    }  
    
    转载于:http://blog.csdn.net/qq924862077/article/details/54317220

    相关文章

      网友评论

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

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