Spring MVC(2) - DispatcherServlet运行流程
再次看一下类的继承结构
http请求在Servlet的业务处理流程
// Called by the servlet container to allow the servlet to respond to a request. // javax.servlet.Servlet中定义的接口service,由 servlet container 调用 // 具体实现在HttpServlet类中 public void service(ServletRequest req, ServletResponse res) { HttpServletRequest request; HttpServletResponse response; try { request = (HttpServletRequest) req; response = (HttpServletResponse) res; } catch (ClassCastException e) { throw new ServletException("non-HTTP request or response"); } service(request, response); } // HttpServlet类 此方法会将 请求转至 doGet doPost doDelete 等 方法 protected void service(HttpServletRequest req, HttpServletResponse resp){ } // 类 FrameworkServlet protected final void doGet(HttpServletRequest request, HttpServletResponse response) { processRequest(request, response); } // 类 FrameworkServlet protected final void processRequest(HttpServletRequest request, HttpServletResponse response) { try { // 此方法的实现在子类 DispatcherServlet doService(request, response); } } // 类 DispatcherServlet protected void doService(HttpServletRequest request, HttpServletResponse response) { // 核心逻辑 doDispatch(request, response); }
下面讲 DispatcherServlet的的核心处理流程
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) { // step1, 检查是否是文件上传,如果是,则由相应的bean对request转换 processedRequest = checkMultipart(request); // step2, 根据request,获取 handler,在初始化过程中, // 会把url和对应的Controller和method映射关系存好 // 在getHandler过程中,会遍历初始化时注册 HandlerMapping 的bean, // HandlerMapping会根据自己的规则去获取hander,即Controller和对应的method // 实际上一般是会遍历映射关系表获取的,获取不到会出错返回 // 这一步还会吧所有的interceptor封装到handler中 mappedHandler = getHandler(processedRequest); if (mappedHandler == null || mappedHandler.getHandler() == null) { noHandlerFound(processedRequest, response); return; } // step3,获取支持第二步中的handler的HandlerAdapter, // 实际就是从注册HandlerAdapter中选一个支持当前handler的 HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler()); // 对 Get和Head请求,如果当前HandlerAdapter支持,则处理 last-modified // step4,应用handler的所有拦截器的preHandle方法,有一个false则返回 // 注意如果有一个拦截器false,则会保证调用所有已经执行的拦截器的afterCompletion方法 // 注意: preHandle 执行顺序 和 postHandle afterCompletion正好相反 if (!mappedHandler.applyPreHandle(processedRequest, response)) { return; } // step5, handleradapter 触发 handler的方法调用,真正的url方法处理 mv = ha.handle(processedRequest, response, mappedHandler.getHandler()); // 如果view是空,设置默认view applyDefaultViewName(processedRequest, mv); // step6, 应用拦截器的 postHandle 方法, // 注意: postHandle 方法可以处理 ModelAndView mappedHandler.applyPostHandle(processedRequest, response, mv); // step7, 对 ModelAndView 进行最后的渲染工作 processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException) { // 进行渲染工作,具体过程为 使用Servlet初始化时注册的 ViewResolver,比如 InternalResourceViewResolver // 根据viewName,生成不同的view对象(通常是AbstractUrlBasedView子类 InternalResourceView ) // 其中,会对viewName中的 “redirect:xx” 和 “forward:xx” 生成不通view类 // 然后进行view类的属性填充,比如 suffix 和 prefix 加到url并设置到view类的属性中 // View类具体处理是,最终会把Model中的属性设置到request中,根据url找到对应的RequestDispather // RequestDispather会把当前request和response关联到对应的资源,即Jsp文件 render(mv, request, response); // 进行拦截器的afterCompletion调用 mappedHandler.triggerAfterCompletion(request, response, null); } // 最外侧的catch仍然保证拦截器的afterCompletion调用 catch(Excepton e) { // 进行拦截器的afterCompletion调用 mappedHandler.triggerAfterCompletion(request, response, null); } }
相关推荐
Spring MVC 是一个强大的Java Web开发框架,用于构建高效、可维护的Web应用程序。它基于Spring框架,提供了...通过阅读和运行这个项目,你可以亲身体验Spring MVC的每个环节,加深对MVC设计模式和Spring框架的理解。
在Spring Web MVC中,DispatcherServlet是核心组件,它负责接收HTTP请求,根据请求映射找到对应的处理器(Controller),并调用处理器完成业务逻辑。然后,处理器可以通过ModelAndView对象返回视图和模型数据。 在...
Spring MVC的核心概念包括DispatcherServlet、控制器、模型-视图-控制器模式(MVC)、数据绑定、验证和国际化等。DispatcherServlet作为整个流程的起点,它是Spring MVC的前端控制器,负责接收HTTP请求,然后根据...
2. View:View负责呈现数据,Spring MVC支持多种视图技术,如JSP、FreeMarker、Thymeleaf等。视图解析器会根据ModelAndView中的视图名找到具体的视图模板。 3. ViewModel:ViewModel是Model和View的一种结合,它将...
1. web.xml:配置了DispatcherServlet,指定了Spring MVC的入口。 2. servlet-context.xml:Spring MVC的配置文件,用于配置视图解析器、HandlerMapping、HandlerAdapter等。 3. applicationContext.xml:Spring的上...
Spring MVC 是一个强大的Java web开发框架,用于构建可维护、高性能和灵活的Web应用程序。它作为Spring框架的一部分,专注于处理HTTP请求和响应,提供了一种模型-视图-控制器(MVC)架构来分离业务逻辑、数据展示和...
在本项目中,`Spring-MVC-DispatcherServlet-Example`是一个使用Maven构建的示例项目,展示了如何利用Spring MVC来开发应用程序。 ### Maven项目结构 Maven是一个项目管理和集成工具,它通过定义项目对象模型(POM...
在"Spring MVC--2.入门程序"中,我们将会探讨如何设置和运行一个基本的Spring MVC项目。首先,你需要安装并配置Java Development Kit (JDK) 和 Apache Maven,这两个是构建Spring MVC项目的基础工具。Maven是一个...
Spring MVC的核心概念包括控制器(Controller)、模型(Model)、视图(View)和调度器Servlet(DispatcherServlet)。控制器负责接收HTTP请求,模型包含了业务逻辑和数据,视图负责呈现结果,而调度器Servlet是...
2. **配置Spring MVC** 创建完成项目后,我们需要配置Spring MVC的核心组件——DispatcherServlet。在web.xml文件中,我们定义DispatcherServlet,并指定其配置文件,例如`spring-mvc-servlet.xml`。在这个配置文件...
Spring MVC允许Controller方法以异步方式执行,可以处理长时间运行的任务,提高应用性能。通过@RequestMapping的asyncSupported属性或使用@Async注解实现。 10. **模板引擎集成**: 如Thymeleaf等模板引擎可以与...
《Spring Web MVC 5.0.9:深度解析与应用》 Spring Web MVC是Spring框架的核心模块之一,专为构建Web应用程序提供模型-视图-控制器(MVC)架构支持。在Spring 5.0.9这个版本中,它延续了Spring对开发者友好、灵活且...
《Spring MVC 入门教程:步步为营》 在Java Web开发领域,Spring MVC作为Spring框架的一部分,扮演着核心的角色。本教程旨在帮助初学者逐步理解并掌握Spring MVC的使用,构建自己的Web应用程序。 一、Spring MVC...
2. **DispatcherServlet**:作为 Spring MVC 的核心组件,DispatcherServlet 负责接收 HTTP 请求,根据请求映射找到对应的处理器,并将请求和响应委托给合适的 HandlerAdapter。 3. **HandlerMapping**:该接口负责...
在 "spring-mvc-demo" 中,可能包含 `web.xml` 配置文件,用于部署 DispatcherServlet,以及一个或多个 Spring 配置文件,如 `servlet-context.xml`,用于配置 MVC 组件。此外,可能还会有 Java-based 配置,使用 `...
在Spring MVC中,每个请求都会经过DispatcherServlet,这是一个前端控制器,它会根据请求的URL和配置的映射规则将请求分发到合适的处理器。处理器可以是自定义的Controller类,Controller通过方法注解(如@...
org.springframework.web.servlet.DispatcherServlet ) spring-webmvc 是 Spring MVC 的一个实现。spriing-webmvc 依赖于 spring-web如果直接使用spring-webmvc,就会隐式地添加 spring-web。不必显示添加 spring-...
Spring MVC 是一个基于Java的轻量级Web应用框架,它为构建Web应用程序提供了一种模型-...而`tomcat`标签则表明这个环境是针对Tomcat服务器的,Tomcat是一款流行的Java Servlet容器,常用于部署和运行Spring MVC应用。
1. DispatcherServlet:作为Spring MVC的前端控制器,负责接收所有请求,并根据配置分发到相应的处理器。 2. HandlerMapping:负责映射请求到对应的处理器(Controller)。 3. HandlerAdapter:处理处理器适配,使得...