springMVC源码分析--ViewNameMethodReturnValueHandler返回值处理器(三)

来源:互联网 发布:淘宝开学爆到 编辑:程序博客网 时间:2024/05/16 17:43

之前两篇博客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的处理


实现代码如下:

@Overridepublic 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 happenthrow 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;}@Overridepublic boolean supportsReturnType(MethodParameter returnType) {Class<?> paramType = returnType.getParameterType();return (void.class == paramType || CharSequence.class.isAssignableFrom(paramType));}//实现逻辑还是比较简单的,就是设置ModelAndViewContainer的viewName视图名称@Overridepublic 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 happenthrow 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:"));}}



1 0
原创粉丝点击