SpringMVC 中的常用注解和用法

@Controller

这个注解用于标识一个类是 SpringMVC 中的控制器。控制器负责处理用户请求并返回响应。

java 复制代码
@Controller
public class MyController {
    //...
}

@RequestMapping

@RequestMapping既可修饰类,也可以修饰⽅法,当修饰类和⽅法时,访问的地址是类路径+⽅ 法路径.

@RequestMapping标识⼀个类:设置映射请求的请求路径的初始信息

@RequestMapping标识⼀个⽅法:设置映射请求请求路径的具体信息

java 复制代码
@RequestMapping("/user")
@RestController
public class UserController {
 @RequestMapping("/sayHi")
    public String hello(){
        return "hello Spring";
    }
}

访问地址:http://127.0.0.1:8080/user/sayHi

注意:

@RequestMapping的URL路径最前⾯加不加/ (斜杠)都可以,Spring程序启动时,会进⾏判断,如果前⾯没有加/ ,Spring会拼接上⼀个/

java 复制代码
@RequestMapping("/user/m1")
@RestController
public class UserController {
    @RequestMapping("/say/hi")
    public String sayHi(){
        return "hello,Spring MVC";
    }
}

访问路径:http://127.0.0.1:8080/user/m1/say/hi

@RequestMapping是GET还是POST请求?

GET请求: 浏览器发送的请求类型都是get,通过以上案例,可以看出来 @RequestMapping ⽀持get请求.

POST请求: 我们通过form表单来构造请求: 创建test.html,html代码:

html 复制代码
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>

<body>
  <form action="/user/sayHi" method="post">
    <input type="submit" value="提交">
  </form>
</body>

</html>

前端代码放在static⽬录下,访问⽅式为:http://127.0.0.1:8080/test.html

如果有多层⽬录,访问链接从static⽬录开始写

如上图,访问链接为:http://127.0.0.1:8080/html/test.html

从运⾏结果可以看出:@RequestMapping 既⽀持Get请求,⼜⽀持Post请求.同理,也⽀持其他的请 求⽅式.

那如何指定GET或者POST类型呢?

指定GET/POST⽅法类型

我们可以显⽰的指定@RequestMapping来接收POST的情况,如下所⽰:

java 复制代码
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
@RestController
public class UserController {
    @RequestMapping(value = "/getRequest",method= RequestMethod.POST)
    public String sayHi(){
        return "get request...";
    }
}

@GetMapping

是**@GetMapping**方法的一个特定版本,用于处理 HTTP GET 请求。

java 复制代码
@Controller
@RequestMapping("/myapp")
public class MyController {

    @GetMapping("/products")
    public String getProducts() {
        return "productList";
    }
}

@PostMapping

是**@GetMapping**方法的一个特定版本,用于处理 HTTP POST 请求。

java 复制代码
@Controller
@RequestMapping("/myapp")
public class MyController {

    @PostMapping("/addProduct")
    public String addProduct(Product product) {
        // 处理添加产品的逻辑
        return "redirect:/products";
    }
}

@GetMapping与 @PostMapping与@RequestMapping

@GetMapping 和**@RequestMapping(value =<URL>,method = RequestMethod.GET)**有一些细微的区别,但在大多数情况下可以实现相同的功能。

一、语法简洁性方面

  • @**GetMapping("URL")**更加简洁直观,它专门用于处理 HTTP GET 请求的 URL 映射,减少了代码量,提高了可读性。
  • @GetMapping(value =<URL>,method = RequestMethod.GET) 相对来说更加冗长,需要明确指定请求方法为GET

二、功能方面

  • 功能上基本相同,都用于将特定的 URL 路径映射到处理 GET 请求的方法上。
java 复制代码
@Controller
public class SomeController {

    // 使用@GetMapping
    @PostMapping("/submitForm")
    public String handlePostRequest() {
        // 处理 GET 请求的逻辑
        return "successPage";
    }

    // 使用@RequestMapping 模拟 GET 请求处理
    @RequestMapping(value = "/submitForm2", method = RequestMethod.GET)
    public String handlePostRequest2() {
        // 处理 GET 请求的逻辑
        return "successPage";
    }
}

同理:

@PostMapping 在功能上等同于使用**@RequestMapping(value =<URL>,method = RequestMethod.POST)**,但它更加简洁和明确地表达了方法只处理 POST 请求这一意图,提高了代码的可读性和可维护性。

java 复制代码
@Controller
public class SomeController {

    // 使用@PostMapping
    @PostMapping("/submitForm")
    public String handlePostRequest() {
        // 处理 POST 请求的逻辑
        return "successPage";
    }

    // 使用@RequestMapping 模拟 POST 请求处理
    @RequestMapping(value = "/submitForm2", method = RequestMethod.POST)
    public String handlePostRequest2() {
        // 处理 POST 请求的逻辑
        return "successPage";
    }
}

总的来说,如果只处理特定请求方法(如 GET)的 URL 映射,推荐使用**@GetMapping** 等特定请求方法的注解,以提高代码的简洁性和可读性。如果需要更灵活地配置多个请求方法或者其他属性,可以使用**@RequestMapping**。

@PathVariable

path variable:路径变量

和字⾯表达的意思⼀样,这个注解主要作⽤在请求URL路径上的数据绑定

后端实现代码:

java 复制代码
@RequestMapping("/article/{articleId}/{name}")
public String method8(@PathVariable("articleId") String id, @PathVariable String name){
    return "articleId:" + id + ", name: " + name;
}

使用浏览器发送请求:http://127.0.0.1:8080/article/articleId/name

@RequestParam

用于获取请求参数。

某些特殊的情况下,前端传递的参数key和我们后端接收的key可以不⼀致,⽐如前端传递了⼀个time给后端,⽽后端是使⽤createtime字段来接收的,这样就会出现参数接收不到的情况,如果出现 这种情况,我们就可以使⽤@RequestParam 来重命名前后端的参数值.具体⽰例如下,后端实现代码:

java 复制代码
@Controller
@RequestMapping("/myapp")
public class MyController {

    @GetMapping("/search")
    public String searchProducts(@RequestParam("time") String createtime) {
        // 根据关键字进行产品搜索
        return "searchResults";
    }
}

@RequestPart

用与上传文件

后端代码实现:

java 复制代码
@RequestMapping("/m9")
public String getfile(@RequestPart("file") MultipartFile file) throws
        IOException {
    //获取⽂件名称
    String fileName = file.getOriginalFilename();
    //⽂件上传到指定路径
    file.transferTo(new File("D:/temp/" + file.getOriginalFilename()));
    return "接收到⽂件名称为: "+fileName;
}

使用Postman发送请求:

观察D:/temp路径下,⽂件是否上传成功

@ResponseBody

用于返回数据

java 复制代码
@Controller
@ResponseBody
public class IndexController {
    @RequestMapping("/index")
    public Object index(){
        return "/index.html";
    }
}

加上 @ResponseBody 注解,该⽅法就会把"/index.html"当做⼀个数据返回给前端.

运⾏:http://127.0.0.1:8080/index

@ResponseBody 既是类注解,⼜是⽅法注解

如果作⽤在类上,表⽰该类的所有⽅法,返回的都是数据,如果作⽤在⽅法上,表⽰该⽅法返回的是数据.

也就是说:在类上添加 @ResponseBody 就相当于在所有的⽅法上添加了 @ResponseBody 注解.

同样,如果类上有 @RestController 注解时:表⽰所有的⽅法上添加了 @ResponseBody 注解,也就是当前类下所有的⽅法返回值做为响应数据

如果⼀个类的⽅法⾥,既有返回数据的,⼜有返回⻚⾯的,就把 @ResponseBody 注解添加到对应的⽅法上即可.

java 复制代码
@Controller
public class IndexController {
    @RequestMapping("/index")
    public Object index(){
        return "/index.html";
    }
    @RequestMapping("/returnData")
    @ResponseBody
    public String returnData(){
        return "该⽅法返回数据";
    }
}

多个注解时,没有先后顺序,先写哪个都可以

运⾏程序,浏览器响应结果如下:http://127.0.0.1:8080/returnData

如果去掉@ResponseBody 注解,程序会报404错误.

java 复制代码
@Controller
public class IndexController {
    @RequestMapping("/index")
    public Object index(){
        return "/index.html";
    }
    @RequestMapping("/returnData")
    public String returnData(){
        return "该⽅法返回数据";
    }
}

程序会认为需要返回的是视图,根据内容去查找⽂件,但是查询不到,路径不存在,报404

返回HTML代码片段

后端返回数据时,如果数据中有HTML代码,也会被浏览器解析

java 复制代码
@RequestMapping("/returnHtml")
@ResponseBody
public String returnHtml() {
    return "<h1>Hello,HTML~</h1>";
}

运⾏程序,浏览器响应结果如下:http://127.0.0.1:8080/returnHtml

通过Fiddler观察响应结果, Content-Type 为 text/html

响应中的Content-Type常⻅取值有以下⼏种:

• text/html :body数据格式是HTML

• text/css :body数据格式是CSS

• application/javascript :body数据格式是JavaScript

• application/json :body数据格式是JSON

如果请求的是js⽂件,SpringMVC会⾃动设置Content-Type为 application/javascript 如果请求的是css⽂件,SpringMVC会⾃动设置Content-Type为 text/css

java 复制代码
RequestMapping("/index2")
public Object index2(){
    return "/a.js";
}
@RequestMapping("/index3")
public Object index3(){
    return "/b.css";
}
相关推荐
w_31234543 分钟前
自定义一个maven骨架 | 最佳实践
java·maven·intellij-idea
岁岁岁平安6 分钟前
spring学习(spring-DI(字符串或对象引用注入、集合注入)(XML配置))
java·学习·spring·依赖注入·集合注入·基本数据类型注入·引用数据类型注入
武昌库里写JAVA9 分钟前
Java成长之路(一)--SpringBoot基础学习--SpringBoot代码测试
java·开发语言·spring boot·学习·课程设计
Q_192849990616 分钟前
基于Spring Boot的九州美食城商户一体化系统
java·spring boot·后端
张国荣家的弟弟34 分钟前
【Yonghong 企业日常问题 06】上传的文件不在白名单,修改allow.jar.digest属性添加允许上传的文件SH256值?
java·jar·bi
ZSYP-S1 小时前
Day 15:Spring 框架基础
java·开发语言·数据结构·后端·spring
yuanbenshidiaos1 小时前
c++------------------函数
开发语言·c++
yuanbenshidiaos1 小时前
C++----------函数的调用机制
java·c++·算法
程序员_三木1 小时前
Three.js入门-Raycaster鼠标拾取详解与应用
开发语言·javascript·计算机外设·webgl·three.js
是小崔啊1 小时前
开源轮子 - EasyExcel01(核心api)
java·开发语言·开源·excel·阿里巴巴