从源码角度看spring mvc的请求处理过程

当一个请求到达Spring MVC时,它将会被DispatcherServlet处理,然后将请求转发到相应的Controller中。在控制器中给出响应后,DispatcherServlet再度介入,选择合适的视图并将处理模型渲染到视图上。

下面是从源码角度看Spring MVC请求处理过程的攻略:

概述

Spring MVC负责来自客户端的请求,并通过处理器映射器(HandlerMapper)来查找和处理合适的处理战量。处理器适配器(HandlerAdapter)被用来提供通用的处理器方法规范,而视图解析器(ViewResolver)将ModelAndView对象结合特定的视图进行呈现,以便向客户端提供响应。

请求处理流程

  1. 从DispatcherServlet中获取相应的Handler
  2. 使用HandlerMapping策略来查找并选择相应的处理程序
  3. 选择适当的HandlerAdapter
  4. 处理程序执行并返回ModelAndView
  5. ModelAndView结合适当的视图并呈现给客户端

从源码角度看的请求处理过程

首先来看DispatcherServlet对象,它是Spring MVC的核心组成部分,是所有请求处理的入口点。

public class DispatcherServlet extends FrameworkServlet {
    private List<HandlerMapping> handlerMappings;
    private List<HandlerAdapter> handlerAdapters;
    private ViewResolver viewResolver;

    protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
        try {
            HandlerExecutionChain mappedHandler = getHandler(request);
            if (mappedHandler == null) {
                response.sendError(HttpServletResponse.SC_NOT_FOUND);
                return;
            }
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            ModelAndView mv = ha.handle(request, response, mappedHandler.getHandler());
            render(mv, request, response);
        } catch (Exception ex) {
            throw ex;
        }
    }
    //...其他方法
}

其实现中存在以下几个要点:

  • doDispatch方法是核心处理方法,它执行了整个请求处理流程的主要逻辑。
  • getHandler方法使用HandlerMappings决定相应的处理器,在doDispatch方法的开头进行处理。
  • getHandlerAdapter方法根据处理程序匹配适当的handler adapter,然后执行处理程序并返回ModelAndView
  • 一旦获得的ModelAndView中包含视图,render方法即可呈现视图。

示例1: RequestMappingHandlerMapping

RequestMappingHandlerMapping是Spring的默认处理器映射器,它通过分析@RequestMapping注解来管理URL。

public class RequestMappingHandlerMapping extends AbstractHandlerMethodMapping<RequestMappingInfo>{

    @Override
    protected boolean isHandler(Class<?> beanType) {
        return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) || 
                AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
    }

    @Override
    protected void registerHandlerMethod(Object handler, Method method, 
            RequestMappingInfo mapping) {
        this.handlerMethods.put(mapping, createHandlerMethod(handler, method));
    }

    @Override
    public HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
        for (RequestMappingInfo mapping : handlerMethods.keySet()) {
            if (mapping.matches(request)) {
                HandlerMethod handlerMethod = handlerMethods.get(mapping);
                return new HandlerExecutionChain(handlerMethod);
            }
        }
        return null;
    }

    //...其他方法
}

在上述示例中,把注解和类检测委托给了AnnotatedElementUtils,而Method级别的@RequestMapping注解则处理为RequestMappingInfo。同时,当HTTP请求到达时,getHandler方法将遍历请求可用的请求映射,找到一个可以处理请求的处理程序。然后将其封装成HandlerExecutionChain对象返回。

示例2:RequestMappingHandlerAdapter

DefaultAnnotationHandlerMapping类是Spring的默认处理器适配器之一,它充当了所有处理器方法公共规范的角色,并将所需的请求参数传递给方法。这是通过扫描@RequestMapping注解来实现的,@RequestParam注解则用于处理方法的参数。

public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter {

    @Override
    protected ModelAndView handleInternal(HttpServletRequest request, 
            HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
        Object[] args = getMethodArgumentValues(request, response, handlerMethod);
        Object result = handlerMethod.invoke(args);
        if (result instanceof ModelAndView) {
            return (ModelAndView) result;
        } else if (result instanceof String) {
            return new ModelAndView((String) result);
        } else {
            return null;
        }
    }

    //...其他方法
}

在上述示例中,handleInternal方法使用反射机制将请求参数传递给@RequestParam注解处理的方法,并将结果包装在ModelAndView中。注意:在基于@Autowired的依赖注入和其他检测操作已执行之后,才会执行这个方法。

总结

以上就是从源码角度看Spring MVC请求处理过程的攻略。在Spring MVC请求处理流程中最重要的组成部分有:DispatcherServlet、HandlerMapping、HandlerAdapter和ViewResolver。在此基础上,可以通过使用注解和反射机制快速开发出具有丰富功能的Web应用程序。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:从源码角度看spring mvc的请求处理过程 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • Java利用Dijkstra和Floyd分别求取图的最短路径

    Java 利用 Dijkstra 和 Floyd 算法分别求取图的最短路径可以分为以下几个步骤: 1. 建立图的数据结构 首先需要建立用于表示图的数据结构,通常可以使用邻接矩阵或邻接表来表示图。 以邻接矩阵为例,可以定义一个二维数组来表示图,数组中的每一个元素 a[i][j] 表示从节点 i 到节点 j 的边的权值。如果不存在从节点 i 到节点 j 的边,则…

    Java 2023年5月26日
    00
  • 浅析Java中Apache BeanUtils和Spring BeanUtils的用法

    浅析Java中Apache BeanUtils和Spring BeanUtils的用法 在Java中,BeanUtils是常用的一个实用工具类库,提供了对JavaBean属性的快速读写、类型转换等操作,而在Spring框架中,也有BeanUtils提供了一些符合Spring容器特性的扩展功能,下面将会对Apache BeanUtils和Spring Bean…

    Java 2023年5月19日
    00
  • Spring Security登陆流程讲解

    关于“Spring Security登陆流程讲解”的完整攻略,我会从以下几个方面进行详细讲解。 1. 流程概述 Spring Security是一个基于Spring框架的安全框架,它提供了诸如身份认证、授权、攻击防护等基础的安全功能,并且可对这些功能进行灵活的配置和定制。下面是Spring Security的登陆流程概述: 用户在前端输入用户名和密码并提交表…

    Java 2023年5月20日
    00
  • Java策略模式的简单应用实现方法

    接下来我会详细讲解“Java策略模式的简单应用实现方法”的完整攻略。 什么是策略模式? 策略模式是一种行为型设计模式,它允许你定义一组算法,将每个算法都封装起来,并使它们之间可以互换。该模式让算法的变化独立于使用它们的客户端,即可以在不修改客户端代码的情况下更换执行算法。 策略模式的应用场景 当需要在不同情况下使用不同的算法时,可以使用策略模式,将每种算法都…

    Java 2023年5月26日
    00
  • JAVA简单链接Oracle数据库 注册和登陆功能的实现代码

    让我来给您讲解一下“JAVA简单链接Oracle数据库 注册和登陆功能的实现代码”的完整攻略。 1. 需求分析 首先,我们需要明确需求,即实现一个具有注册和登录功能的网站,并且网站需要能够链接Oracle数据库,存储用户信息。 2. 环境搭建 接下来,我们需要搭建Java开发环境和Oracle数据库环境。具体的搭建过程这里不再赘述。需要注意的是,搭建完之后,…

    Java 2023年5月20日
    00
  • JavaWeb学习笔记分享(必看篇)

    JavaWeb学习笔记分享(必看篇) 前言 JavaWeb是Java在Web领域的应用,是目前非常热门的技术之一。但是JavaWeb涉及到的技术非常广泛,初学者很容易迷失方向。本文总结了JavaWeb的基础知识,为初学者提供了一份学习笔记分享,希望能够帮助大家快速入门。 JavaWeb基础知识 1. 了解Web应用程序的组成部分 一个Web应用程序由客户端、…

    Java 2023年5月26日
    00
  • IntelliJ IDEA中ajax开发实现分页查询示例

    IntelliJ IDEA是一款优秀的Java集成开发环境,它内置了强大的插件和工具,为开发者提供了丰富的开发体验。在IntelliJ IDEA中使用Ajax实现分页查询的过程,需要按照以下步骤进行: 1. 添加相关依赖 在IntelliJ IDEA中,可以使用Maven或Gradle来管理项目依赖。因此,我们需要在pom.xml文件中添加相关依赖,如下所示…

    Java 2023年6月15日
    00
  • springboot websocket简单入门示例

    让我为你详细介绍一下“Spring Boot WebSocket简单入门示例”的攻略。 简介 Spring Boot WebSocket使得在应用程序中添加实时数据交互功能变得非常容易。WebSocket是一种在单个TCP连接上全双工通信协议,它使得服务器端和客户端之间可以双向通信。下面,我们将演示如何在Spring Boot应用程序中使用WebSocket…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部