Spring Web的执行流程是一个典型的MVC(Model-View-Controller)架构的实现过程,它涉及从客户端接收请求、处理请求、访问数据库、生成响应并返回给客户端的一系列步骤。以下是Spring Web执行流程的详细解析:
(1)当用户通过浏览器发起一个HTTP请求,请求直接到前端控制器DispatcherServlet;
(2)前端控制器接收到请求以后调用处理器映射器HandlerMapping,处理器映射器根据请求的URL找到具体的Handler,并将它返回给前端控制器;
(3)前端控制器调用处理器适配器HandlerAdapter去适配调用Handler;
(4)处理器适配器会根据Handler去调用真正的处理器去处理请求,并且处理对应的业务逻辑:
HandlerAdapter 根据请求的 Handler 适配并执⾏对应的Handler(controller )
首先Controller 方法会调用相应的 Service 方法来执行业务逻辑,而Service 层通常会调用 DAO 层来实现对数据库的实际操作;其次DAO 层会使用 JDBC、Hibernate 或者其他持久化框架,执行具体的 SQL 操作。DAO 层执行完数据库操作后,将结果返回给调用它的 Service 层方法;Service 层在获得了 DAO 层返回的结果后,可能会进行一些额外的业务逻辑处理,然后将最终结果(通常是业务逻辑需要的数据或者操作结果)返回给 Controller。最后Controller 方法会收到来自 Service 层的结果, 返回⼀个 ModelAndView( 即模型和视图 ) 给HandlerAdaptor。
(5)同4.的结果当处理器处理完业务之后,会返回一个ModelAndView对象给处理器适配器,HandlerAdapter再将该对象返回给前端控制器;这里的Model是返回的数据对象,View是逻辑上的View。
(6)前端控制器DispatcherServlet将返回的ModelAndView对象传给视图解析器ViewResolver进行解析,解析完成之后就会返回一个具体的视图View给前端控制器。(ViewResolver根据逻辑的View查找具体的View)
(7)前端控制器DispatcherServlet将具体的视图进行渲染,渲染完成之后响应给用户(浏览器显示)。
一、客户端请求
- 发起请求:客户端(如浏览器)通过HTTP协议向服务器发送请求,请求中包含URL、HTTP方法(如GET、POST)、请求头和请求体等信息。
二、Spring Web处理请求
- 前端控制器(DispatcherServlet):
- 所有请求首先被前端控制器DispatcherServlet接收。DispatcherServlet是Spring MVC的核心,它作为请求的分发器,负责将请求分发给对应的处理器(Controller)。
- 处理器映射器(HandlerMapping):
- DispatcherServlet调用处理器映射器,根据请求的URL和HTTP方法等信息来查找对应的处理器(Controller)。处理器映射器可以基于XML配置、注解等方式来查找处理器。
- 处理器适配器(HandlerAdapter):
- 找到处理器后,DispatcherServlet会调用处理器适配器。处理器适配器是Spring MVC框架与处理器之间的桥梁,它按照特定的规则去执行处理器。
- 处理器(Controller):
- 处理器适配器调用具体的处理器(Controller)来处理请求。在Controller中,可以进行业务逻辑的处理,包括调用Service层的方法、读取数据库、计算等。
三、访问数据库
- 服务层(Service):
- 在Controller中,如果需要进行数据库操作,会调用服务层(Service)的相应方法。服务层负责业务逻辑的组织和封装,它可能会调用数据访问层(DAO)来访问数据库。
- 数据访问层(DAO):
- 数据访问层负责与数据库进行交互,执行SQL语句或JPA查询等操作,从数据库中读取或写入数据。
四、生成响应
- ModelAndView:
- 处理器(Controller)处理完业务逻辑后,会返回一个ModelAndView对象。ModelAndView对象包含了视图名称和模型数据,视图名称用于指定返回的页面,模型数据则用于在视图中展示。
- 视图解析器(ViewResolver):
- DispatcherServlet将ModelAndView对象传递给视图解析器。视图解析器根据视图名称解析成具体的视图对象(如JSP页面),并将模型数据填充到视图中。
- 渲染视图:
- 视图对象根据模型数据渲染成最终的HTML页面或其他格式的响应内容。
- 返回响应:
- DispatcherServlet将渲染后的视图内容通过HTTP响应返回给客户端。响应包括HTTP状态码、响应头和响应体等信息。
五、客户端处理响应
- 客户端(如浏览器)收到响应后,根据响应内容进行界面更新、数据渲染或其他操作。
过滤器(Filter)
过滤器是Servlet规范中定义的一种组件,它在请求进入Servlet容器之后、但在请求到达任何Servlet、JSP页面或Spring MVC的Controller之前执行,并在响应发送给客户端之前执行。过滤器可以执行以下操作:
- 请求进入容器后:
- 对请求进行预处理,如设置字符编码、日志记录、安全验证等。
- 决定是否将请求继续传递给下一个过滤器或目标资源(Servlet、JSP页面、Controller等)。
- 响应发送给客户端前:
- 对响应进行后处理,如修改响应头、响应体等。
过滤器在Spring Web项目中通常通过实现javax.servlet.Filter
接口并配置在web.xml文件中或使用@WebFilter
注解来注册。在Spring Boot项目中,还可以使用@Component
注解结合@Order
注解(或实现Ordered
接口)来指定过滤器的执行顺序。
拦截器(Interceptor)
拦截器是Spring框架提供的一种组件,它专门用于Spring MVC中,在请求进入Controller之前和Controller处理完请求之后执行。拦截器可以执行以下操作:
- 请求进入Controller之前:
- 进行权限检查、日志记录、预处理等。
- 如果需要,可以中断请求处理流程,并直接返回响应。
- Controller处理完请求之后:
- 对请求处理的结果进行后处理,如修改响应数据、记录性能指标等。
- 在视图渲染前后也可以执行相应的逻辑。
拦截器在Spring MVC中通过实现HandlerInterceptor
接口并注册到Spring容器中来实现。注册拦截器通常通过实现WebMvcConfigurer
接口的addInterceptors
方法来完成,并可以在该方法中指定拦截器的执行顺序和拦截的路径模式。
组件 | 执行时机 | 作用 |
---|---|---|
过滤器(Filter) | 请求进入容器后、响应发送给客户端前 | 预处理请求、后处理响应 |
拦截器(Interceptor) | 请求进入Controller之前、Controller处理完请求之后 | 权限检查、日志记录、预处理、后处理等 |