携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第6天,点击查看活动详情
springmvc处理http请求的基本流程
除了jsp之外的全部请求, 发送到DispacherServlet, 因为我们写了/的映射.
dispatcherServlet要找到我们的具体handler方法,
而我们具体的处理请求的login方法一般被称为handler, 我们在springmvc过程中的handler主要是handlerMethod, 是一个方法. 我们要给handler方法添加@RequestMapping注解, 使得dispatcherServlet能找到我们的具体handler方法.
而dispatcherServlet要找到我们的具体handler方法, 需要容器中的Controller组件, 容器是可以找到所有的controller组件的, 其中包含了所有的handler方法, 具体是通过拿到controller的类, 然后找到所有方法, 找到方法上的requestMapping注解, 然后找到注解上的所有url值
/url1如何建立和handler1之间的映射关系? 就是用过拿到容器中的Controller组件的.
而Controller组件在容器中, 这个容器就是WebApplicationContext, 而DispatcherServlet中有一个成员变量就是WebApplicationContext, 即可以获得容器, 从而找到controller组件, 然后找到其中方法和注解, 以及获得注解中的value属性值.
而dispatcherServlet什么时候和WebservletContext建立联系?
在第一次访问dispatcherServlet所映射的url时, 开始执行dispatcherServlet的init方法, 属于生命周期过程, 在init方法中会创建WebApplicationContext, 并将其作为DispatcherServlet的成员变量, 放到ServletContext中. 以及将WebApplicationContext初始化为容器.
经过一系列的过程, 成功将dispatcherServlet和handler之间建立联系.
具体在两者之间经过了什么过程, 才能从dispatcherServlet到达handler?
首先, 从dispatcherServlet接收到请求, 然后传递到doGet/doPost方法, 然后调用doDispat方法, 根据请求url做请求的分发, 在doDispatch方法中使用handlerMapping映射器实例, 解析请求url, 找到对应的handler是哪个, 而handler中可能会有形参, 使用doDispatch方法中的HandlerAdapter适配器组件, 分析出形参中的参数类型, 参数名, 以从请求参数中找出对应的参数.
最后使用反射, 调用method.invoke(instance, args) 从handlerMapping中找到method和instance(在controller组件中有这个handler), 从handlerAdapter中找到args, 然后执行反射method.invoke(instance, args), 最终执行到handler方法.
而handler方法会响应两类内容, 一类会在单体应用阶段, 响应ModelAndView对象, 另一类是会在前后端分离应用阶段, 响应json数据, 会在handler中返回一个对象, 由springmvc自动转化为json.
如何处理这些返回的响应呢? 仍旧在doDispatch方法中接收返回的响应, 然后转化为json.
总结:
springmvc的dispatcherServlet通过doDispatch方法, 能够分发到Hander方法上去