从源码角度看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日

相关文章

  • 34基于Java的学生选课系统或学生课程管理系统

    本系统是基于Java的学生选课信息管理系统,可以有效的对学生选课信息、学生个人信息、教师个人信息等等进行管理。 摘要:基于java的学生课程管理系统,基于java的学生选课系统,javaWeb的学生选课系统,学生成绩管理系统,课表管理系统,学院管理系统,大学生选课系统设计与实现,网上选课系统,课程成绩打分。 项目概述 信息系统作为现代企事业单位实现信息化的一…

    Java 2023年5月11日
    00
  • java连接MySQl数据库实例代码

    Java连接MySQL数据库需要以下几个步骤: 下载MySQL的Java驱动 加载驱动 建立连接 创建Statement对象 执行SQL语句 处理结果集 关闭结果集,Statement和连接 下面是一个完整的示例代码: // 加载驱动 Class.forName("com.mysql.cj.jdbc.Driver"); // 建立连接 S…

    Java 2023年6月16日
    00
  • js实现ctrl+v粘贴上传图片(兼容chrome、firefox、ie11)

    当用户需要上传图片时,常见的方式是通过点击上传按钮或将图片拖拽到上传区域进行上传。但是,这个过程可能会比较繁琐,用户需要先将图片从电脑上选择出来或者用截图工具进行截图,然后才能进行上传操作。 为了提高用户的上传体验,我们可以通过JS实现Ctrl+V粘贴上传图片的功能。具体实现过程如下: 获取粘贴板上的图片数据 首先,需要监听网页上的粘贴事件,在用户按下Ctr…

    Java 2023年6月15日
    00
  • MybatisPlus特殊查询的实现介绍

    MybatisPlus特殊查询的实现介绍 MybatisPlus是基于Mybatis的一个增强库,其中包括了很多常用操作的封装,极大地降低了开发者的编码难度和时间成本,同时也提高了代码的可读性和可维护性。 但是有些时候,简单的CRUD操作并不能满足我们的需求。MybatisPlus提供了很多特殊查询的实现方式,本文将简单介绍其中的几种。 前置条件 在具体实现…

    Java 2023年5月20日
    00
  • Java的Struts框架报错“ModuleException”的原因与解决办法

    当使用Java的Struts框架时,可能会遇到“MappingNotFoundException”错误。这个错误通常由以下原因之一起: 配置错误:如果配置文件中没有正确配置Action,则可能会出现此。在这种情况下,需要检查配置文件以解决此问题。 URL错误:如果URL不正确,则可能出现此。在这种情况下,需要检查URL以解决此问题。 以下是两个实例: 例 1…

    Java 2023年5月5日
    00
  • 如何在IntelliJ IDEA 2018上配置Tomcat并运行第一个JavaWeb项目

    请参考以下步骤来配置Tomcat并运行第一个JavaWeb项目: 1. 下载和安装Tomcat 首先,下载Tomcat并解压缩到本地。 推荐使用Tomcat 8.0版本。 打开Tomcat/bin目录,双击startup.bat文件启动Tomcat服务器。 2. 在IntelliJ IDEA 2018中配置Tomcat服务器 打开IntelliJ IDEA,…

    Java 2023年5月19日
    00
  • JAVA实现caesar凯撒加密算法

    下面是“JAVA实现Caesar凯撒加密算法”的完整攻略: 凯撒加密算法简介 Caesar凯撒加密算法是最常见、最简单的加密算法之一,它是一种替换加密的方式,即用字母表中某个固定数目的后续字母来替换原文中的字母。例如,当加密密钥为3时,所有的字母都会向后移位三个位置,即A变为D,B变为E,以此类推。解密则是反向移动相同的位数。 Java实现Caesar凯撒加…

    Java 2023年5月19日
    00
  • SpringMvc后台接收json数据中文乱码问题详解

    下面我将详细讲解关于 SpringMvc 后台接收 JSON 数据中文乱码问题的解决方案。 问题描述 当我们使用 SpringMvc 后台接收 JSON 数据时,常常会出现中文乱码的问题。具体表现为前端使用 axios 或 jQuery.ajax 等发送中文数据时,后台接收到的数据变成了一串乱码,而且无法正常处理和显示。 原因分析 造成这个问题的原因是因为客…

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