在传统的MVC模式中,Tomcat通过读取web.XML配置文件来获取servlet和访问路径的映射关系,这样在访问tomcat就能将请求转发给对应的servlet进行处理。

自定义的servlet是需要继承HttpServlet这个类,众所周知,一个servlet的生命周期是要经历的init()、service()、destory()这几个过程,最初通过继承GenericServlet类重写上面三个方法来实现自定义的servlet,之后通常是通过继承HttpServlet这个类是实现doGet()和doPost()来实现自定义的servlet。其实HttpServlet也是继承了GenericServlet重写了生命周期方法将servletResquest和servletResponse强转成HttpServletRequset和HttpServletResponse,然后使用模板方法的设计模式,判断请求方式进行调用重写的方法。

 

 

 

接下来转回正题,查看SpringMVC的调用过程,在SpringMVC中只使用了DispatcherServlet来拦截了所有的请求,在上次将filter的调用过程中,最后执行的servlet就是dispatcherServlet,在创建ApplicationFilterChain的时候就将其给赋值进去了。

 

DispatcherServlet也是继承了HttpServlet类,可以去debug查看DispatcherServletHttpServlet之间的继承关系,在接下来的几步父类和子类之间重写方法的互相调用,重点是如何由通过映射调用到Servlet到通过路径找到对应控制器的方法。主要的执行语句是:org/springframework/web/servlet/handler/AbstractHandlerMapping.class:225

 

可以看到根据request找到相对应控制器的方法的元数据信息,即org.springframework.web.method.HandlerMethod

深入方法中可以看到org.springframework.web.servlet.handler.AbstractHandlerMethodMapping中存储控制器中路径和方法元数据的的数据结构

 

其实到这里我们可以猜出是通过反射调用的方式来请求控制器方法的了,具体的调用语句是:

org/springframework/web/method/support/InvocableHandlerMethod.class:102

剩下的就是获取HandleMethod中的Methodbeanrequest中的args,进行反射调用了。

在这其中的数据组装就不涉及了。

版权声明:本文为qizhufeitian原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/qizhufeitian/p/13968485.html