`

Spring MVC(2) - DispatcherServlet运行

 
阅读更多

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);
    }
    
}

 

 

  • 大小: 108.9 KB
分享到:
评论

相关推荐

    Spring MVC step-by-step 源码

    Spring MVC 是一个强大的Java Web开发框架,用于构建高效、可维护的Web应用程序。它基于Spring框架,提供了...通过阅读和运行这个项目,你可以亲身体验Spring MVC的每个环节,加深对MVC设计模式和Spring框架的理解。

    spring-web-5.2.3.RELEASE和spring-webmvc-5.2.3.RELEASE

    在Spring Web MVC中,DispatcherServlet是核心组件,它负责接收HTTP请求,根据请求映射找到对应的处理器(Controller),并调用处理器完成业务逻辑。然后,处理器可以通过ModelAndView对象返回视图和模型数据。 在...

    translation-spring-mvc-4-documentation, Spring MVC 4.2.4 RELEASE 中文文档完整翻译稿.zip

    Spring MVC的核心概念包括DispatcherServlet、控制器、模型-视图-控制器模式(MVC)、数据绑定、验证和国际化等。DispatcherServlet作为整个流程的起点,它是Spring MVC的前端控制器,负责接收HTTP请求,然后根据...

    spring-mvc-showcase

    2. View:View负责呈现数据,Spring MVC支持多种视图技术,如JSP、FreeMarker、Thymeleaf等。视图解析器会根据ModelAndView中的视图名找到具体的视图模板。 3. ViewModel:ViewModel是Model和View的一种结合,它将...

    spring-mvc-study.zip

    1. web.xml:配置了DispatcherServlet,指定了Spring MVC的入口。 2. servlet-context.xml:Spring MVC的配置文件,用于配置视图解析器、HandlerMapping、HandlerAdapter等。 3. applicationContext.xml:Spring的上...

    spring-mvc-test-sample-master.zip_spring mvc_springmvc-test

    Spring MVC 是一个强大的Java web开发框架,用于构建可维护、高性能和灵活的Web应用程序。它作为Spring框架的一部分,专注于处理HTTP请求和响应,提供了一种模型-视图-控制器(MVC)架构来分离业务逻辑、数据展示和...

    Spring-MVC-DispatcherServlet-Example:Maven项目

    在本项目中,`Spring-MVC-DispatcherServlet-Example`是一个使用Maven构建的示例项目,展示了如何利用Spring MVC来开发应用程序。 ### Maven项目结构 Maven是一个项目管理和集成工具,它通过定义项目对象模型(POM...

    Spring MVC--2.入门程序

    在"Spring MVC--2.入门程序"中,我们将会探讨如何设置和运行一个基本的Spring MVC项目。首先,你需要安装并配置Java Development Kit (JDK) 和 Apache Maven,这两个是构建Spring MVC项目的基础工具。Maven是一个...

    spring MVC step-by-step

    Spring MVC的核心概念包括控制器(Controller)、模型(Model)、视图(View)和调度器Servlet(DispatcherServlet)。控制器负责接收HTTP请求,模型包含了业务逻辑和数据,视图负责呈现结果,而调度器Servlet是...

    spring mvc工程-初学者helloworld

    2. **配置Spring MVC** 创建完成项目后,我们需要配置Spring MVC的核心组件——DispatcherServlet。在web.xml文件中,我们定义DispatcherServlet,并指定其配置文件,例如`spring-mvc-servlet.xml`。在这个配置文件...

    Spring MVC--------我在创智软件的面试

    Spring MVC允许Controller方法以异步方式执行,可以处理长时间运行的任务,提高应用性能。通过@RequestMapping的asyncSupported属性或使用@Async注解实现。 10. **模板引擎集成**: 如Thymeleaf等模板引擎可以与...

    spring-webmvc-5.0.9 jar包、源码和javadoc

    《Spring Web MVC 5.0.9:深度解析与应用》 Spring Web MVC是Spring框架的核心模块之一,专为构建Web应用程序提供模型-视图-控制器(MVC)架构支持。在Spring 5.0.9这个版本中,它延续了Spring对开发者友好、灵活且...

    Spring-MVC-step-by-step.zip_Java MVC spring_Java spring mvc_sp

    《Spring MVC 入门教程:步步为营》 在Java Web开发领域,Spring MVC作为Spring框架的一部分,扮演着核心的角色。本教程旨在帮助初学者逐步理解并掌握Spring MVC的使用,构建自己的Web应用程序。 一、Spring MVC...

    spring-mvc-官方中文文档

    2. **DispatcherServlet**:作为 Spring MVC 的核心组件,DispatcherServlet 负责接收 HTTP 请求,根据请求映射找到对应的处理器,并将请求和响应委托给合适的 HandlerAdapter。 3. **HandlerMapping**:该接口负责...

    spring-mvc-demo

    在 "spring-mvc-demo" 中,可能包含 `web.xml` 配置文件,用于部署 DispatcherServlet,以及一个或多个 Spring 配置文件,如 `servlet-context.xml`,用于配置 MVC 组件。此外,可能还会有 Java-based 配置,使用 `...

    Spring.MVC-A.Tutorial-Spring.MVC学习指南 高清可复制版PDF

    在Spring MVC中,每个请求都会经过DispatcherServlet,这是一个前端控制器,它会根据请求的URL和配置的映射规则将请求分发到合适的处理器。处理器可以是自定义的Controller类,Controller通过方法注解(如@...

    spring-webmvc5.3.6 jar包.rar

    org.springframework.web.servlet.DispatcherServlet ) spring-webmvc 是 Spring MVC 的一个实现。spriing-webmvc 依赖于 spring-web如果直接使用spring-webmvc,就会隐式地添加 spring-web。不必显示添加 spring-...

    spring-mvc开发所有jar包【4.3.4】

    Spring MVC 是一个基于Java的轻量级Web应用框架,它为构建Web应用程序提供了一种模型-...而`tomcat`标签则表明这个环境是针对Tomcat服务器的,Tomcat是一款流行的Java Servlet容器,常用于部署和运行Spring MVC应用。

    spring-mvc-04-master.zip

    1. DispatcherServlet:作为Spring MVC的前端控制器,负责接收所有请求,并根据配置分发到相应的处理器。 2. HandlerMapping:负责映射请求到对应的处理器(Controller)。 3. HandlerAdapter:处理处理器适配,使得...

Global site tag (gtag.js) - Google Analytics