【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring MVC 的核心组件:DispatcherServlet 的工作原理

news2025/3/27 20:23:17

 <前文回顾>

点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshare=blogcolumn&sharetype=blogcolumn&sharerId=12907601&sharerefer=PC&sharesource=FoyoDesigner&sharefrom=from_link

<今日更新>

一、DispatcherServlet:Spring MVC 的“大脑”

DispatcherServlet[1] 是 Spring MVC 的“大脑”,它负责接收所有的 HTTP 请求,并把请求分发给对应的处理器(Controller)。DispatcherServlet 的工作原理,说白了就是“接单”和“派单”的过程。它就是个前台,是个咨询处,是个导航。

对应的Servlet,就是web.xml的配置内容的执行逻辑。

1. 接单:接收 HTTP 请求

DispatcherServlet 是 Spring MVC 的前端控制器,所有的 HTTP 请求都得经过它。DispatcherServlet 接单后,会把请求交给 HandlerMapping[2] 去处理。

Java Code

public class DispatcherServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response)

        throws ServletException, IOException {

        // 处理请求

    }

}

2. 派单:分发请求

DispatcherServlet 接单后,会把请求交给 HandlerMapping 去处理。HandlerMapping 会根据请求的 URL,找到对应的 Controller。

Java Code

HandlerMapping handlerMapping = getHandlerMapping(request);

HandlerExecutionChain handler = handlerMapping.getHandler(request);

二、HandlerMapping:Spring MVC 的“导航仪”

HandlerMapping 是 Spring MVC 的“导航仪”,它负责根据请求的 URL,找到对应的 Controller。HandlerMapping 的核心思想是“路由”,它把请求的 URL 映射到对应的 Controller 上。

1. RequestMappingHandlerMapping:注解驱动的“导航仪”

RequestMappingHandlerMapping 是 Spring MVC 的默认 HandlerMapping,它支持注解驱动的路由。开发者可以用 @RequestMapping 注解,把请求的 URL 映射到 Controller 的方法上。

Java Code

@Controller

public class MyController {

    @RequestMapping("/hello")

    public String hello() {

        return "hello";

    }

}

2. BeanNameUrlHandlerMapping:Bean 名称驱动的“导航仪”

BeanNameUrlHandlerMapping 是 Spring MVC 的另一种 HandlerMapping,它支持 Bean 名称驱动的路由。开发者可以把 Controller 的 Bean 名称设成 URL,Spring MVC 会自动把请求的 URL 映射到对应的 Controller 上。

XML Code

<bean name="/hello" class="com.example.MyController" />

三、Controller:Spring MVC 的“处理器”

Controller 是 Spring MVC 的“处理器”,它负责处理请求,生成响应。Controller 的核心思想是“业务逻辑”,它把请求的数据转换成业务数据,再把业务数据转换成响应的数据。

1. @Controller:标记 Controller

@Controller 是 Spring MVC 的注解,用来标记一个类是 Controller。Controller 通常用来处理 HTTP 请求,生成 HTTP 响应。

Java Code

@Controller

public class MyController {

    @RequestMapping("/hello")

    public String hello() {

        return "hello";

    }

}

2. @RequestMapping:映射请求

@RequestMapping 是 Spring MVC 的注解,用来把请求的 URL 映射到 Controller 的方法上。@RequestMapping 支持 GET、POST、PUT、DELETE 等 HTTP 方法。

Java Code

@Controller

public class MyController {

    @RequestMapping(value = "/hello", method = RequestMethod.GET)

    public String hello() {

        return "hello";

    }

}

3. @RequestParam:获取请求参数

@RequestParam 是 Spring MVC 的注解,用来获取请求的参数。@RequestParam 支持默认值、必填等参数。

Java Code

@Controller

public class MyController {

    @RequestMapping("/hello")

    public String hello(@RequestParam(value = "name", defaultValue = "World") String name) {

        return "hello " + name;

    }

}

4. @PathVariable:获取路径变量

@PathVariable 是 Spring MVC 的注解,用来获取路径变量。路径变量是 URL 中的占位符,通常用来传递 ID 啥的。

Java Code

@Controller

public class MyController {

    @RequestMapping("/hello/{name}")

    public String hello(@PathVariable String name) {

        return "hello " + name;

    }

}

5. @ResponseBody:返回 JSON 数据

@ResponseBody 是 Spring MVC 的注解,用来把方法的返回值转换成 JSON 数据。@ResponseBody 通常和 @RestController 一起用。

Java Code

@RestController

public class MyController {

    @RequestMapping("/hello")

    public String hello() {

        return "Hello, World!";

    }

}

四、ViewResolver:Spring MVC 的“视图解析器”

ViewResolver 是 Spring MVC 的“视图解析器”,它负责把 Controller 返回的视图名称解析成实际的视图。ViewResolver 的核心思想是“视图解析”,它把视图名称转换成视图对象。

1. InternalResourceViewResolver:JSP 的“视图解析器”

InternalResourceViewResolver 是 Spring MVC 的默认 ViewResolver,它支持 JSP 视图。开发者可以把视图名称设成 JSP 文件的路径,InternalResourceViewResolver 会自动把视图名称解析成 JSP 文件。

Java Code

@Bean

public ViewResolver viewResolver() {

    InternalResourceViewResolver resolver = new InternalResourceViewResolver();

    resolver.setPrefix("/WEB-INF/views/");

    resolver.setSuffix(".jsp");

    return resolver;

}

2. ThymeleafViewResolver:Thymeleaf 的“视图解析器”

ThymeleafViewResolver 是 Spring MVC 的另一种 ViewResolver,它支持 Thymeleaf 视图。开发者可以把视图名称设成 Thymeleaf 文件的路径,ThymeleafViewResolver 会自动把视图名称解析成 Thymeleaf 文件。(不建议使用,除非你需要动态响应视图)

Java Code

@Bean

public ViewResolver viewResolver() {

    ThymeleafViewResolver resolver = new ThymeleafViewResolver();

    resolver.setTemplateEngine(templateEngine());

    return resolver;

}

五、Spring MVC 的“历史”:从 Struts 到 Spring MVC

Spring MVC 从 Struts 的“小弟”变成了“大哥”,它的历史就是 JavaWeb 开发的“进化史”。

1. 2003 年:Spring MVC 1.0 发布

2003 年,Spring MVC 1.0 发布,它用“轻量级”和“灵活性”打败了 Struts,成为了 JavaWeb 开发的“新大哥”。

2. 2009 年:Spring MVC 3.0 发布

2009 年,Spring MVC 3.0 发布,它引入了注解驱动的开发模式,让 Spring MVC 的开发更加简单。

3. 2017 年:Spring MVC 5.0 发布

2017 年,Spring MVC 5.0 发布,它支持了 Reactive 编程模型,让 Spring MVC 的性能更加高效。

六、Spring MVC 的“骚操作”

1. 全局异常处理:从“零散”到“统一”

Spring MVC 支持全局异常处理,能用 @ControllerAdvice 和 @ExceptionHandler 统一处理异常。

Java Code

@ControllerAdvice

public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)

    public ResponseEntity<String> handleException(Exception e) {

        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage());

    }

}

2. 文件上传:从“手动”到“自动”

Spring MVC 支持文件上传,能用 MultipartFile 自动处理文件上传。

Java Code

@PostMapping("/upload")

public String upload(@RequestParam("file") MultipartFile file) {

    // 处理文件上传

    return "success";

}

3. 拦截器:从“零散”到“统一”

Spring MVC 支持拦截器,能用 HandlerInterceptor 统一处理请求的前后逻辑。

Java Code

public class MyInterceptor implements HandlerInterceptor {

    @Override

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)

        throws Exception {

        // 处理请求前的逻辑

        return true;

    }

}

专有名词解释

  1. DispatcherServlet:Spring MVC 的前端控制器,负责接收所有的 HTTP 请求,并把请求分发给对应的处理器。
  2. HandlerMapping:Spring MVC 的组件,负责根据请求的 URL,找到对应的 Controller。
  3. @Controller:Spring MVC 的注解,用来标记一个类是 Controller。
  4. @RequestMapping:Spring MVC 的注解,用来把请求的 URL 映射到 Controller 的方法上。
  5. @RequestParam:Spring MVC 的注解,用来获取请求的参数。
  6. @PathVariable:Spring MVC 的注解,用来获取路径变量。
  7. @ResponseBody:Spring MVC 的注解,用来把方法的返回值转换成 JSON 数据。
  8. ViewResolver:Spring MVC 的组件,负责把 Controller 返回的视图名称解析成实际的视图。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2318943.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第J3周:DenseNet121算法实现01(Pytorch版)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 目标 具体实现 &#xff08;一&#xff09;环境 语言环境&#xff1a;Python 3.10 编 译 器: PyCharm 框 架: Pytorch &#xff08;二&#xff09;具体步骤…

webrtc3A算法

使用ubuntu18.04 选择webrtc_audio_processing v0.3 下载地址 https://gitlab.freedesktop.org/pulseaudio/webrtc-audio-processing/-/tree/master git clone 完 编译 # Initialise into the build/ directory, for a prefixed install into the # install/ directory meson …

让“树和二叉树”埋在记忆土壤中--性质和概念

Nice to meet your! 目录 树的介绍&#xff1a; 树的创建&#xff1a; 二叉树的概念和结构&#xff1a; 二叉树的存储结构&#xff1a; 树的介绍&#xff1a; 概念和结构&#xff1a; 不知你们是否在现实中看见过分为两个叉的枯树&#xff0c;大概长这样&#xff1a; 那…

Spring Boot整合SSE实现消息推送:跨域问题解决与前后端联调实战

摘要 本文记录了一次完整的Spring Boot整合Server-Sent Events&#xff08;SSE&#xff09;实现实时消息推送的开发过程&#xff0c;重点分析前后端联调时遇到的跨域问题及解决方案。通过CrossOrigin注解的实际应用案例&#xff0c;帮助开发者快速定位和解决类似问题。 一、项…

【工具分享】vscode+deepseek的接入与使用

目录 第一章 前言 第二章 获取Deepseek APIKEY 2.1 登录与充值 2.2 创建API key 第三章 vscode接入deepseek并使用 3.1 vscode接入deepseek 3.2 vscode使用deepseek 第一章 前言 deepseek刚出来时有一段时间余额无法充值&#xff0c;导致小编没法给大家发完整的流程&…

康谋方案 | AVM合成数据仿真验证方案

随着自动驾驶技术的快速发展&#xff0c;仿真软件在开发过程中扮演着越来越重要的角色。仿真传感器与环境不仅能够加速算法验证&#xff0c;还能在安全可控的条件下进行复杂场景的重复测试。 本文将分享如何利用自动驾驶仿真软件配置仿真传感器与搭建仿真环境&#xff0c;并对…

Linux内核IPv4路由选择子系统

一、基本知识 1.具体案例&#xff1a;直连路由 结构fib_nh表示下一跳&#xff0c;包含输出网络设备、外出接口索引等信息。 有两个以太网局域网 LAN1 和 LAN2&#xff0c;其中 LAN1 包含子网 192.168.1.0/24&#xff0c;而 LAN2 包含子网 192.168.2.0/24。在这两个 LAN 之…

NWAFU 生物统计实验二 R语言版

#1 setwd(修改为你的工作路径或桌面路径) feed_types <- c("A", "B", "C") weight_gain_means <- c(36.8, 34.9, 21.3) weight_gain_sds <- c(2.4, 2.7, 6.6) weight_gain <- rnorm(3, mean weight_gain_means, sd weight_gain_sd…

Thinkphp指纹识别

识别ThinkPHP框架(指纹) 1.ioc判断 /favicon.ico 2.报错 /1 然后使用工具梭哈

【AVRCP】蓝牙AVRCP协议中的L2CAP互操作性要求深度解析

目录 一、L2CAP互操作性要求&#xff08;针对AVRCP&#xff09; 1.1 核心概念 1.2 AVRCP对L2CAP的增强需求 1.3 关键机制解析 1.4 浏览通道优化配置 1.5 实际应用场景与解决方案 二、通道类型与配置 2.1. 通道类型限制 2.2 PSM字段规范 2.3. 实现意义 3.4. 实际应用…

剑指 Offer II 111. 计算除法

comments: true edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20111.%20%E8%AE%A1%E7%AE%97%E9%99%A4%E6%B3%95/README.md 剑指 Offer II 111. 计算除法 题目描述 给定一个变量对数组 equations 和一个实数值数组 values 作…

掌握 WRF/Chem 模式:突破大气环境研究技术瓶颈的关键

技术点目录 第一部分、WRF-Chem模式应用案例和理论基础第二部分、Linux环境配置及WRF-CHEM第三部分、WRF-Chem模式编译&#xff0c;排放源制作第四部分、WRF-Chem数据准备&#xff08;气象、排放、初边界条件等&#xff09;&#xff0c;案例实践第五部分、模拟结果提取、数据可…

linux性能监控的分布式集群 prometheus + grafana 监控体系搭建

prometheusgrafana分布式集群资源监控体系搭建 前言一、安装 prometheus二、在要监控的服务器上安装监听器三、prometheus服务器配置四、grafana配置大屏五、创建Linux监控看板五、监控windows服务器注意事项 前言 Prometheus 是一个开源的 ​分布式监控系统 和 ​时间序列数据…

数字化转型 2.0:AI、低代码与智能分析如何重塑企业竞争力?

引言&#xff1a;数字化转型进入2.0时代 在过去的十几年里&#xff0c;企业的数字化转型&#xff08;1.0&#xff09;主要围绕信息化和自动化展开&#xff0c;例如引入ERP、CRM等系统&#xff0c;提高办公效率&#xff0c;减少人为失误。然而&#xff0c;随着市场竞争加剧&…

基于SpringBoot的“校园招聘网站”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“校园招聘网站”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统整体功能图 局部E-R图 系统首页界面 系统注册…

由LAC自动建立L2TP实验

一、实验拓扑: 二、实验配置 1.LAC的配置 基础配置: [LAC]int g 0/0/0 [LAC-GigabitEthernet1/0/0]ip address 192.168.0.1 24 [LAC]int g 1/0/0 [LAC-GigabitEthernet1/0/0]ip address 10.1.1.254 24 [LAC-GigabitEthernet1/0/0]int g1/0/1 [LAC-GigabitEthernet1/0/1]ip ad…

内网渗透(CSMSF) 构建内网代理的全面指南:Cobalt Strike 与 Metasploit Framework 深度解析

目录 1. Cobalt Strike 在什么情况下会构建内网代理&#xff1f; 2. Cobalt Strike 构建内网代理的主要作用和目的是什么&#xff1f; 3. Cobalt Strike 如何构建内网代理&#xff1f;需要什么条件和参数&#xff1f; 条件 步骤 参数 4. Cobalt Strike 内网代理能获取什…

SAP FAGLL03 追加并显示描述字段

目录 1、新建一个结构2、操作FAGLPOSX结构3、新建一个BADI 1、新建一个结构 1.1、先在SE11中新建一个结构&#xff1a;ZZADD_FIELDS_FAGL&#xff0c;把我们要显示的描述字段放在这个结构中 2、操作FAGLPOSX结构 2.1、在FAGLPOSX结构中选择Append Structure&#xff0c;把我…

Linux Vim 寄存器 | 从基础分类到高级应用

注&#xff1a;本文为 “vim 寄存器” 相关文章合辑。 英文引文&#xff0c;机翻未校。 中文引文&#xff0c;略作重排。 未整理去重&#xff0c;如有内容异常&#xff0c;请看原文。 Registers 寄存器 Learning Vim registers is like learning algebra for the first ti…

Ubuntu版免翻墙搭建BatteryHistorian

摘要 昨天安装了一个翻墙版本的很不好用&#xff0c;主要是网络不稳定&#xff0c;故于是换了一个免翻墙的docker镜像。但是发现还是很难用。又安装了一个window版本的免翻墙的BatteryHistorian。明天再分享下Windows的免翻墙的BatteryHistorian步骤。 安装好Docker了就直接d…