【Spring 篇】SpringMVC的请求:舞台上的开端

在这里插入图片描述

在Web开发的舞台上,请求就如同一场充满激情的开端,而SpringMVC是这场表演的舞台主持人,它能够优雅地接收和处理各种请求,引领我们进入一个美妙的编码之旅。在本篇博客中,我们将深入探讨SpringMVC的请求处理机制,解开其神秘的面纱,让我们一同迈出请求的第一步。

控制器方法:开启音乐会的节奏

在SpringMVC中,请求的处理始于控制器方法。控制器方法是一个普通的Java方法,负责处理特定的请求。通过@Controller注解标识一个类为控制器,而@RequestMapping注解用于映射请求路径。

@Controller
@RequestMapping("/music")
public class MusicController {

    @GetMapping("/play")
    public String playMusic() {
        // 处理播放音乐的请求
        return "music-player";
    }
}

在这个例子中,MusicController被标记为@Controller,而@RequestMapping("/music")指定了该控制器处理的请求路径前缀。playMusic方法使用@GetMapping("/play")注解表示处理/music/play路径的GET请求。当用户访问/music/play时,该方法将被调用,然后返回逻辑视图名为"music-player",告诉SpringMVC去渲染对应的视图。

请求参数:用户的表演需求

在音乐会上,观众有时候需要提出一些建议或者表达一些特殊的需求。在Web开发中,用户通过请求参数来传递信息。SpringMVC提供了多种方式来获取请求参数。

查询参数

查询参数是附加在URL中的一部分,通常以?开头,多个参数之间使用&分隔。例如,访问/music/play?song=Spring%20Symphony,其中song=Spring%20Symphony就是一个查询参数。

在控制器方法中,可以通过@RequestParam注解来获取查询参数的值。

@Controller
@RequestMapping("/music")
public class MusicController {

    @GetMapping("/play")
    public String playMusic(@RequestParam(name = "song", defaultValue = "No Song") String song) {
        // 处理播放音乐的请求
        System.out.println("Playing: " + song);
        return "music-player";
    }
}

在这个例子中,playMusic方法的参数中使用了@RequestParam(name = "song", defaultValue = "No Song")注解,表示从请求中获取名为"song"的查询参数,如果没有传递则使用默认值"No Song"。当用户访问/music/play?song=Spring%20Symphony时,将输出"Playing: Spring Symphony"。

路径变量

有时候,用户需要在路径中传递参数,而不是在查询参数中。这时可以使用路径变量。

@Controller
@RequestMapping("/music")
public class MusicController {

    @GetMapping("/play/{song}")
    public String playMusic(@PathVariable String song) {
        // 处理播放音乐的请求
        System.out.println("Playing: " + song);
        return "music-player";
    }
}

在这个例子中,playMusic方法的参数中使用了@PathVariable注解,表示从路径中获取变量值。当用户访问/music/play/Spring%20Symphony时,将输出"Playing: Spring Symphony"。

请求体:用户的深层需求

在某些情况下,用户需要通过请求体来传递更复杂的数据,比如JSON格式的数据。SpringMVC支持通过@RequestBody注解来获取请求体中的数据。

@RestController
@RequestMapping("/api")
public class ApiController {

    @PostMapping("/submitFeedback")
    public String submitFeedback(@RequestBody Map<String, String> feedback) {
        // 处理用户反馈的请求
        System.out.println("Received feedback: " + feedback);
        return "Feedback received!";
    }
}

在这个例子中,submitFeedback方法的参数中使用了@RequestBody注解,表示从请求体中获取数据。当用户发送POST请求到/api/submitFeedback时,请求体中的JSON数据将被解析为Map<String, String>,并输出"Received feedback: {key=value}"。

请求头:用户的特殊要求

在某些场景下,用户可能通过请求头传递一些特殊的要求,比如认证信息。SpringMVC提供了@RequestHeader注解来获取请求头中的信息。

@RestController
@RequestMapping("/api")
public class ApiController {

    @GetMapping("/getAuthToken")
    public String getAuthToken(@RequestHeader(name = "Authorization") String authToken) {
        // 处理获取认证令牌的请求
        System.out.println("Received Auth Token: " + authToken);
        return "Auth Token received!";
    }
}

在这个例子中,getAuthToken方法的参数中使用了@RequestHeader(name = "Authorization")注解,表示从请求头中获取名为"Authorization"的信息。当用户发送GET请求到/api/getAuthToken时,请求头中的"Authorization"信息将被获取,并输出"Received Auth Token: {authToken}"。

请求方法:用户的行为指南

HTTP协议定义了多种请求方法,常见的有GET、POST、PUT、DELETE等。SpringMVC通过@RequestMapping注解来指定控制器方法处理的请求方法。

@Controller
@RequestMapping("/music")
public class MusicController {

    @GetMapping("/play")
    public String playMusic() {
        // 处理播放音乐的GET请求
        return "music-player";
    }

    @PostMapping("/addFavorite")
    public String addFavorite() {
        // 处理添加到收藏的POST请求
        return "favorite-added";
    }
}

在这个例子中,playMusic方法处理的是/music/play路径的GET请求,而addFavorite方法处理的是/music/addFavorite路径的POST请求。通过@GetMapping@PostMapping注解,可以分别指定GET和POST请求的处理方法。

请求参数验证:用户的合法要求

为了确保接收到的数据是合法的,SpringMVC提供了数据验证的机制。通过@ValidBindingResult实现对请求参数的验证。

@RestController
@RequestMapping("/api")
public class ApiController {

    @PostMapping("/register")
    public String registerUser(@Valid @RequestBody User user, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            // 处理验证失败的情况
            return "Registration failed. Please check your data.";
        }
        // 处理用户注册的请求
        System.out.println("User registered: " + user);
        return "Registration successful!";
    }
}

在这个例子中,registerUser方法接收一个@Valid注解的User对象,表示需要对其进行数据验证。BindingResult用于接收验证的结果。如果数据验证失败,将返回"Registration failed. Please check your data.“;如果验证成功,将输出"User registered: {user}”。

请求转发和重定向:用户的导演要求

有时候,用户的需求可能需要将请求转发到另一个控制器方法或者重定向到另一个URL。SpringMVC提供了forward:redirect:前缀来实现这两种需求。

@Controller
@RequestMapping("/director")
public class DirectorController {

    @GetMapping("/forwardToPlay")
    public String forwardToPlay() {
        // 请求转发到/music/play
        return "forward:/music/play";
    }

    @GetMapping("/redirectToHome")
    public String redirectToHome() {
        // 重定向到/home
        return "redirect:/home";
    }
}

在这个例子中,forwardToPlay方法使用return "forward:/music/play";将请求转发到/music/play;而redirectToHome方法使用return "redirect:/home";将请求重定向到/home

文件上传:用户的创意表达

有时候,用户可能需要通过文件上传来表达更多的创意。SpringMVC通过@RequestParam注解和MultipartFile类来支持文件上传。

@Controller
@RequestMapping("/creative")
public class CreativeController {

    @PostMapping("/uploadFile")
    public String uploadFile(@RequestParam("file") MultipartFile file) {
        // 处理文件上传的请求
        System.out.println("Received file: " + file.getOriginalFilename());
        return "file-uploaded";
    }
}

在这个例子中,uploadFile方法接收一个名为"file"的文件,并通过MultipartFile类来处理。当用户通过表单上传文件时,请求将被映射到/creative/uploadFile,文件将被处理并输出"Received file: {filename}"。

拦截器:用户的安保官员

有时候,我们需要在请求处理前或处理后执行一些额外的逻辑,比如身份验证、日志记录等。这时候,可以使用拦截器。

public class AuthenticationInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 在请求处理前执行身份验证逻辑
        String authToken = request.getHeader("Authorization");
        if (authToken == null || !authToken.equals("ValidToken")) {
            response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Invalid authorization token.");
            return false;
        }
        return true;
    }

    // 其他拦截器方法可以根据需求实现
}

在这个例子中,AuthenticationInterceptor实现了HandlerInterceptor接口,其中的preHandle方法用于在请求处理前执行身份验证逻辑。如果身份验证失败,将返回HTTP 401 Unauthorized响应。

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/secure/**" />
        <bean class="com.example.interceptor.AuthenticationInterceptor" />
    </mvc:interceptor>
</mvc:interceptors>

spring-mvc.xml中配置拦截器,表示只对路径为"/secure/**"的请求进行拦截,使用AuthenticationInterceptor进行处理。

结语

SpringMVC的请求处理,就如同一场充满激情的音乐会,通过控制器方法、请求参数、请求体、请求头、请求方法、请求参数验证、请求转发和重定向、文件上传、拦截器等组件,为开发者提供了丰富而灵活的请求处理方式。在这个美妙的开端中,每个组件都有其独特的角色,共同为Web开发的旅程奏响了动人的序曲。愿你在编写代码的过程中,能够更好地驾驭这些乐谱,创造出属于自己的编码之美。在请求的律动中,与SpringMVC一同起舞,开启一段充满创意的编程旅程。

作者信息

作者 : 繁依Fanyi
CSDN: https://techfanyi.blog.csdn.net
掘金:https://juejin.cn/user/4154386571867191

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

oracle 19c打补丁到19.14

oracle 19c打补丁到19.14 oracle 19.3打补丁到19.14 查看oracle的版本&#xff1a; SQL> column product format A30 SQL> column version format A15 SQL> column version_full format A20 SQL> column status format A15 SQL> select * from product_compo…

鸿蒙开发之MPChart图表开发

一、简介 随着移动应用的不断发展,数据可视化成为提高用户体验和数据交流的重要手段之一,因此需要经常使用图表,如折线图、柱形图等。OpenHarmony提供了一个强大而灵活的图表库是实现这一目标的关键。 在 ohpm 中心仓(https://ohpm.openharmony.cn/)中,汇聚了众多开发者…

3月报价:腾讯云服务器2024年优惠价格表,5元1个月

腾讯云服务器今日价格&#xff1a;轻量应用服务器2核2G3M价格61元一年、2核2G4M价格99元一年&#xff0c;540元三年、2核4G5M带宽165元一年&#xff0c;2核4G5M带宽756元三年、轻量4核8G12M服务器646元15个月&#xff1b;云服务器CVM S5实例2核2G配置280.8元一年、2核4G、4核8G…

常用芯片学习——DS3231M芯片

DS3231M RTC实时时钟 芯片介绍 DS3231M是一款低成本、极其精确的 I2C 实时时钟 &#xff08;RTC&#xff09;。该设备集成了电池输入&#xff0c;并在设备主电源中断时保持准确的计时。微型电子机械系统 &#xff08;MEMS&#xff09; 谐振器的集成提高了器件的长期精度&…

CesiumJS 沙盒

CesiumJS 沙盒 通过CesiumJS 沙盒快速测试CesiumJS的一些功能&#xff0c;免去安装开发环境的困恼。 Hello World https://sandcastle.cesium.com/index.html 简单修改&#xff08;F8运行&#xff09;&#xff1a;去掉界面上UI const viewer new Cesium.Viewer("cesi…

HBase在表操作--显示中文

启动HBase后&#xff0c;Master和RegionServer两个服务器&#xff0c;分别对应进程为HMaster和HRegionServe。&#xff08;可通过jps查看&#xff09; 1.进入表操作 hbase shell 2.查看当前库中存在的表 list 3.查看表中数据&#xff08;注&#xff1a;学习期间可用&#…

ve-list 列表

ve-list 列表 功能描述 最基础的列表展示&#xff0c;可承载文字、列表、图片、段落&#xff0c;常用于后台数据展示页面。 Api 效果图 <ve-list v-for"(item, index) in _list" :key"index" :data"item" type"list3"><t…

谷歌(edge)浏览器过滤,只查看后端发送的请求

打开F12 调试工具 选择Network 这是我们会发现 什么图片 文件 接口的请求很多很多&#xff0c;我们只需要查看我们后端发送的请求是否成功就好了 正常情况我们需要的都是只看接口 先点击这里这个 过滤 我们只需要点击 Fetch/XHR 即可过滤掉其他请求信息的展示 这样烦恼的问题就…

HDFS EXERCISES

bash: hdfs: command not found...这可能是因为hdfs命令不在系统环境变量中 whereis hadoop 找到hadoop的位置 一旦找到Hadoop安装目录&#xff0c;您需要将其 bin 目录添加到PATH环境变量中。 vi ~/.bashrc .bashrc 是一个在Linux和Unix系统中用于Bash shell的配置文件。当…

Python图像处理指南:PIL与OpenCV的比较【第136篇—PIL】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Python图像处理指南&#xff1a;PIL与OpenCV的比较 图像处理在计算机视觉和图像识别等领域…

[氮化镓]GaN中质子反冲离子的LET和射程特性

这篇文件是一篇关于氮化镓&#xff08;GaN&#xff09;中质子反冲离子的线性能量转移&#xff08;LET&#xff09;和射程特性的研究论文&#xff0c;发表在《IEEE Transactions on Nuclear Science》2021年5月的期刊上。论文的主要内容包括&#xff1a; 研究背景&#xff1a;氮…

Python的网络爬虫介绍与实战

Python的网络爬虫基础介绍与实战 定义流程包和函数静动态网页爬虫实战红牛分公司&#xff1f;二手房数据&#xff08;静态网页&#xff09;豆瓣读书&#xff08;动态网页&#xff09; 定义 网络爬虫是按照一定的规则&#xff0c;自动地抓取万维网&#xff08;www&#xff09;信…

Java代码审计安全篇-XXE(XML外部实体注入)漏洞

前言&#xff1a; 堕落了三个月&#xff0c;现在因为被找实习而困扰&#xff0c;着实自己能力不足&#xff0c;从今天开始 每天沉淀一点点 &#xff0c;准备秋招 加油 注意&#xff1a; 本文章参考qax的网络安全java代码审计&#xff0c;记录自己的学习过程&#xff0c;还希望各…

sql join

-- 创建事实表 CREATE TABLE product_facts (id INT AUTO_INCREMENT PRIMARY KEY,product_name VARCHAR(255),price DECIMAL(10, 2) );-- 插入数据 INSERT INTO product_facts (product_name, price) VALUES (Product A, 100.00); INSERT INTO product_facts (product_name, pr…

【MySQL】MySQL事务

文章目录 一、CURD不加控制&#xff0c;会有什么问题&#xff1f;二、事务的概念三、事务出现的原因四、事务的版本支持五、事务提交方式六、事务常见操作方式七、事务隔离级别1.理解隔离性12.隔离级别3.查看与设置隔离性4.读未提交【Read Uncommitted】5.读提交【Read Committ…

OpenCV-Java 开发简介

返回目录&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;如何在“Microsoft Visual Studio”中使用OpenCV编译应用程序 下一篇&#xff1a;如何将OpenCV Java 与Eclipse结合使用 警告&#xff1a; 本教程可能包含过时的信息。 …

OLAP与数据仓库和数据湖

OLAP与数据仓库和数据湖 本文阐述了OLAP、数据仓库和数据湖方面的基础知识以及相关论文。同时记录了我如何通过ChatGPT以及类似产品&#xff08;通义千问、文心一言&#xff09;来学习知识的。通过这个过程让我对于用AI科技提升学习和工作效率有了实践经验和切身感受。 预热 …

长连接技术

个人学习记录&#xff0c;欢迎指正 1.轮询 1.1 轮询的形式 短连接轮询 前端每隔一段时间向服务端发起一次Http请求来获取数据。 const shortPolling () > { const intervalHandler setInterval(() > {fetch(/xxx/yyy).then(response > response.json()).then(respo…

Python图像处理【23】分布式图像处理

分布式图像处理 0. 前言1. Dask 简介2. 使用 Dask 进行分布式图像处理2.1 将 RGB 图像块转换为灰度图像块2.2 使用分布式 Sobel 滤波器检测图像边缘 小结系列链接 0. 前言 Python 已逐渐成为数据分析/处理领域中的主要语言&#xff0c;这得益于 Python 丰富的第三方库&#xf…

浅谈RPC的理解

浅谈RPC的理解 前言RPC体系Dubbo架构最后 前言 本文中部分知识涉及Dubbo&#xff0c;需要对Dubbo有一定的理解&#xff0c;且对源码有一定了解 如果不了解&#xff0c;可以参考学习我之前的文章&#xff1a; 浅谈Spring整合Dubbo源码&#xff08;Service和Reference注解部分&am…