spring webmvc请求处理流程中返回值处理是什么


这期内容当中小编将会给大家带来有关spring webmvc请求处理流程中返回值处理是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。讲解3.2.x版本之后使用的RequestMappingHandlerAdapter,该类替换了AnnotationMethodHandlerAdapter。自3.2之后的版本,引入了RequestMappingHandlerAdapter来替换了AnnotationMethodHandlerAdapter的处理。这里也来分析一下这个玩意儿。因为也是一个HandlerAdapter,所以,前面的处理流程都是一样的,servlet的getHandlerAdapter这个时候就返回了RequestMappingHandlerAdapter,而不是AnnotationMethodHandlerAdapter了。拿到HandlerAdapter之后,我们就直接冲ha.handle()方法开始分析吧。直接跟进去。来到RequestMappingHAndlerAdapter的handleInternal()方法,不要惊慌,按照spring的一贯风格,这TM当然不是核心方法,他只是做了一些检查。方法最后调用了invokeHandleMethod()。在该方法中,做了一些所需参数的获取,比如请求的controller层方法,参数。然后调用ServletInvocableHandlerMethod对象invokeAndHandle方法。从注释中可于了解到,首先调用业务逻辑获得返回结果,然后对返回值做一定的判断并简单处理。通过returnValueHandlers对象来进一步处理返回结果。这是个HandlerMethodReturnValueHandlerComposite类型的对象,继续跟进。来,看一下所有的默认注册的处理器。看到了RequestResponseBodyMethodProcessor是不是很亲切呢,对咯,他就是处理@ResponseBody注解的。喜欢的朋友可以去看哈这个类的supportsReturnType()方法就明白了。到这里就不继续跟了,我们熟悉的RequestResponseBodyMethodProcessor处理器处理结果的时候会设置mavContainer.setRequestHandled(true);表示处理已经完毕。处理完之后,回到RequestMappingHandlerAdapter的invokeHandleMethod()方法。这个方法最终返回了getModelAndView();从该方法中,我们可以看到,如果当前请求已经处理完成(mavContainer.isRequestHandled()值为true),则不进行后续的处理没直接返回 香港云主机null,否则spring会继续处理当前请求,并试图返回一个ModelAndView。既然上面提到了自定义的返回值处理器,那这个自定义是在哪里的呢?这个返回值处理器就是在哪里注册的呢?精彩马上回来!返回值处理器需要实现HandlerMethodReturnValueHandlercontroller,我这里注解和返回值类型都符合上面处理器的要求,事实上只要一种就好了。springmvc.xml从xml中可以看到是自定义标签mvc:return-value-handlers,跟踪MvcNamespaceHandler。进入AnnotationDrivenBeanDefinitionParser的parse方法,自定义的就是在这里处理的,我们来看一下。直接看注释了,不解释了。到这里自定义的返回值处理器就已经注册完了,已经是spring的一个bean了。现在我们来看看RequestMappingHandlerAdapter。这个家伙实现了InitializingBean,我们来看afterPropertiesSet方法。从上可以看出,我们虽然我们的自定义返回值处理器放进去了,但是一定会用到嘛?那不一定哦。可以看到对所有的返回值处理器,并没有进行排序,因此我们不能控制这个顺序。先给一个调试的图:从图中我们可看到,我们自定义的handler确实是加载进去了,但是由于spring在处理这个handlers的时候并没有进行排序,所以我们自定义被放在了后面,我们不能够控制这个顺序(其他骚方法可以实现,这里不考虑这种情况)。所以存在一种情况,我们的返回值能够被前面的11个处理器中的某一个处理,那么就轮不到我们自定义的返回值处理器了。举个简单的例子,比如你返回值类型是String,那么就会别ViewNameMethodReturnValueHandler处理;如果返回的类型是Map,那么就会被MapMethodProcessor处理,可以自行测试。因此我们的返回值其实也很重要。所以要使用到我们自定义的处理器,那么首先我们就得让前面的处理器无法处理我们的返回结果。通常可以实现一个通用的返回结果实体,或者某个标记接口(空接口),这样其他的返回值处理器无法处理返回的值类型,这样就轮到我们自己的返回值处理器了。也可以返回喜欢的实体类型,像示例中一样使用注解也可以。但是因为通常一个项目来讲返回值都是有定义的,返回的类型都是有同一种格式的,所以这类比较偏向使用通用相同的返回实体,或者使用某个接口标记。over …上述就是小编为大家分享的spring webmvc请求处理流程中返回值处理是什么了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注开发云行业资讯频道。

相关推荐: 如何解决笔记本电脑开机显示未能连接一个windows服务的问题

小编给大家分享一下如何解决笔记本电脑开机显示未能连接一个windows服务的问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1.调出运行窗口,开始在界面中输入cmd后回车打开命令提…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 08/12 14:23
下一篇 08/12 14:23

相关推荐