springmvc作用类似于struts,提供了一个servlet作为处理某些request的总入口,这个servlet就是dispatcherservlet,当server接到client端的request后进入后端容器的处理,比如tomcat,经过一番前期处理,通过web.xml中的mapping配置找到对应的servlet,如果用的是springmvc,则应该使用dispatcherservlet,所以就从这个servlet说起。
doService->doDispatch(最重要的一个方法),这个方法主要做了三件事,1.通过request的url、http方法等参数找到对应的handler(用于处理request)和拦截器链,2.对handler进行适配并执行handler的handle方法处理request。3.从第二步得到处理结果,根据结果创建并填充返回的文件然后返回给客户端。具体如下:
(注:springmvc里大量运用了策略模式)
第一件事的实现是首先springmvc会组织一个list来保存一些类(用于根据request的信息查找到对应的handler和拦截器链),之所以是一些而不是一个总的类是因为为了灵活, 用户可以自己定义实现了 HandlerMapping的类,加入list即可,如果用户不定义,系统默认会提供两个(BeanNameUrlHandlerMapping和RequestMappingHandlerMapping),以RequestMappingHandlerMapping为例,它维护了一个requestmapping信息和handler的一个map,在查找handler的过程中,首先是根据request里的信息找到最匹配requestmapping(有用户在定义类和方法以及参数时指定@requestmapping),然后通过requestmapping找到handler(包括要用到的类和对应的方法的信息),最后还要根据request的url信息找到对应的拦截器链,然后返回一个HandlerExecutionChain对象(包含了handler和拦截器链)。
第二件事首先是对handler进行适配,之所以用适配器是因为用户定义controller时可能会定义不止一种controller,比如实现了HttpRequestHandler的controller,实现了Controller的controller,自定义的controller,所以需要相应的适配器去适配成统一的接口(HandlerAdapter,这里以RequestMappingHandlerAdapter(用于自定义controller的适配)为例进行后续的分析),然后就开始调用handle方法处理request了,其实就是调用对应类的对应方法,调用方法第一件事就是得得到方法参数,其中包括1.request中的信息到方法参数的映射,2.他们之间类型的转换,3.格式化,4.验证。这里1是需要参数解析器的,这里的解析器可以自定义一些,如果不定义的话系统也会提供一些默认的,由argumentResolvers维护,除此之外返回值也可以进行映射,returnValueHandlers
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。