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

news/2024/4/27 15:15:27

在这里插入图片描述

在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/playreturn "forward:/music/play";}@GetMapping("/redirectToHome")public String redirectToHome() {// 重定向到/homereturn "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 {@Overridepublic 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

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

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

相关文章

JavaScript高级(十八)---进程和线程,宏任务和微任务

进程和线程 进程&#xff08;process&#xff09;&#xff1a;计算机已经运行的程序&#xff0c;是操作系统管理程序的一种方式&#xff0c;我们可以认为&#xff0c;启动一个应用程序&#xff0c;就会默认启动一个进程&#xff08;也可能是多个进程&#xff09;。 线程&…

Java小项目--满汉楼

Java小项目–满汉楼 项目需求 项目实现 1.实现对工具包的编写 先创建libs包完成对jar包的拷贝和添加入库 德鲁伊工具包 package com.wantian.mhl.utils;import com.alibaba.druid.pool.DruidDataSourceFactory;import javax.sql.DataSource; import java.io.FileInputStream…

01mysql

登陆mysql 默认数据库 进入&#xff0c;展示&#xff0c;删除 &#xff0c;查看当前正使用的库 select version()查看版本 查看表结构desc 查询 not in不会忽略空 in会自动忽略 like模糊查询 %o%中间带o的 _A%第二个字母是A的 查名字是下划线的 %\_% 排序 order …

初识微信小程序之swiper和swiper-item的基本使用

在我还没接触到微信小程序之前&#xff0c;通常使用轮播要么手写或使用swiper插件去实现&#xff0c;当我接触到微信小程序之后&#xff0c;我看到了微信小程序的强大之处&#xff0c;让我为大家介绍一下吧&#xff01; swiper与swiper-item一起使用可以做轮播图 基本使用&…

【机器学习】无监督学习:解锁数据中的潜在结构与关系

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;机器学习 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

JetBrains全家桶激活,分享 IntelliJ IDEA 2024 激活的方案

大家好&#xff0c;欢迎来到金榜探云手&#xff01; IDEA 公司简介 JetBrains 是一家专注于开发工具的软件公司&#xff0c;总部位于捷克。他们以提供强大的集成开发环境&#xff08;IDE&#xff09;而闻名&#xff0c;如 IntelliJ IDEA、PyCharm、和 WebStorm等。这些工具被…