springMVC源码分析

springMVC源码分析--ViewNameMethodRet

2017-10-16  本文已影响12人  carway

前两篇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
上一篇下一篇

猜你喜欢

热点阅读