web应用中的http请求流程
1、使用传统servlet处理http请求
1.1、servlet请求流程
- 发送http请求
- 服务器接收http请求
- 根据web.xml文件配置的请求路径以及相应servlet信息定位到具体的servlet,在servlet中编写那些具体业务逻辑;
1.2、servlet请求的劣势
- 在servlet编写具体业务逻辑会导致程序耦合度较高,比如jdbc连接等等;
- 需要在web.xml中大量配置请求路径以及所对应的servlet信息
2、使用MVC架构结合servlet处理http请求
2.1、MVC架构
Model(模型):表示领域信息的对象,包含除了用于UI部分的所有数据和行为。可以简单理解为后端的Service层和Dao层。
View(视图):表示UI中模型的显示。可以简单理解为前端页面,包括html静态页面,jsp动态页面等。
Controller(控制器):接收用户输入,操作模型,并使视图更新。可以简单理解为后端的web交互层。
2.2、使用MVC架构结合servlet处理请求
流程:把servlet当作controller,在servlet中调用Model层的service,在service中调用dao,对于不同的请求,可以使用if else逻辑对应具体的业务逻辑(springMVC已帮助实现)
3、使用springMVC处理http请求
3.1、SpringMVC主流程的三个阶段:
1、处理器映射阶段(HandlerMapping):通过解析url中的路径来找到对应的处理器
2、处理器适配阶段(HandlerAdapter):通过解析请求中的参数来适配处理器,并执行处理器
3、视图解析阶段(ViewResolver):如果处理器返回的是逻辑视图,那么会在这个阶段绘制成可展示的视图
3.2、SpringMVC框架中处理请求的三大核心组件
HandlerMapping、HandlerMethod和HandlerAdapter是SpringMVC框架中处理请求的三大核心组件,它们之间的关系如下:
- HandlerMapping: HandlerMapping是用来确定客户端请求的URL与HandlerMethod之间的映射关系。当一个请求到达DispatcherServlet时,DispatcherServlet会调用HandlerMapping来查找该请求对应的HandlerMethod。
- HandlerMethod: HandlerMethod是真正处理请求的组件,它封装了一个具体的处理器方法,包括方法对象、方法参数、方法返回值和注解等。当DispatcherServlet找到了正确的HandlerMethod后,它会使用HandlerAdapter来调用HandlerMethod来处理请求。
- HandlerAdapter: HandlerAdapter是将HandlerMethod适配成为可执行的处理器的组件,它负责将HttpRequest转换成合适的方法参数,并将方法执行后的返回值进行包装。HandlerAdapter的作用是使得不同的HandlerMethod能够使用同一种处理方式来被SpringMVC框架执行。
前端控制器DispatcherServlet统筹整个流程,它的工作除了流程扭转之外,还有执行各种拦截器以及统一异常管理等。
3.3、springMVC的http请求流程
有个DispatcherServlet,SpringMVC的核心控制器,负责SpringMVC的流程管理,将不同的请求路径定位到不同的controller,
-
DispatcherServlet 接收到客户端发送的请求。
-
DispatcherServlet 收到请求调用HandlerMapping 处理器映射器。
-
HandlerMapping 根据请求URL 找到对应的handler 以及处理器 拦截器,返回给DispatcherServlet
-
DispatcherServlet 根据handler 调用HanderAdapter 处理器适配器。
-
HandlerAdapter 根据handler 执行处理器,也就是我们controller层写的业务逻辑,并返回一个ModeAndView
-
HandlerAdapter 返回ModeAndView 给DispatcherServlet
-
DispatcherServlet 调用 ViewResolver 视图解析器来 来解析ModeAndView
-
ViewResolve 解析ModeAndView 并返回真正的view 给DispatcherServlet
-
DispatcherServlet 将得到的视图进行渲染,填充到request域中
-
返回给客户端响应结果。
DispatcherServlet直接返回视图给用户的场景很少,目前更多的是DispatcherServlet返回数据给前端,前端渲染视图页面再给用户。
现在业界前后端分离的场景中,SpringMVC已经名存实亡,更多的是SpringMC,springMC的流程如下;
3.4、springMC的http请求流程
有个DispatcherServlet,SpringMVC的核心控制器,负责SpringMVC的流程管理,将不同的请求路径定位到不同的controller,
-
DispatcherServlet 接收到客户端发送的请求。
-
DispatcherServlet 收到请求调用HandlerMapping 处理器映射器。
-
HandlerMapping 根据请求URL 找到对应的handler 以及处理器 拦截器,返回给DispatcherServlet
-
DispatcherServlet 根据handler 调用HanderAdapter 处理器适配器。
-
HandlerAdapter 根据handler 执行处理器,也就是我们controller层写的业务逻辑,并返回一个ModeAndView
-
HandlerAdapter 返回ModeAndView 给DispatcherServlet
-
DispatcherServlet 将ModeAndView数据返回给前端,由前端进行渲染(视图解析阶段不详述)
-
DispatcherServlet 调用 ViewResolver 视图解析器来 来解析ModeAndView -
ViewResolve 解析ModeAndView 并返回真正的view 给DispatcherServlet -
DispatcherServlet 将得到的视图进行渲染,填充到request域中 -
返回给客户端响应结果。
什么是处理器?
SpringMVC中的处理器(Handler)是springMVC对控制器(即Controller)的封装,handler会调用对应的controller,controller是我们需要手动开发的业务逻辑。
什么是处理器链?
SpringMVC不仅要执行处理器中包含的方法,它自己也有许多工作,例如执行多种拦截器、异常处理等。所有这些方法都会聚合到一个处理器链当中。
所以处理器链通常包含一个处理器和多个拦截器