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";
}
相关推荐
liuyang-neu1 小时前
力扣 简单 70.爬楼梯
java·算法·leetcode
喵手1 小时前
Java 与 Oracle 数据泵实操:数据导入导出的全方位指南
java·开发语言·oracle
硬汉嵌入式2 小时前
H7-TOOL的LUA小程序教程第16期:脉冲测量,4路PWM,多路GPIO和波形打印(2024-10-25, 更新完毕)
开发语言·junit·小程序·lua
Wx120不知道取啥名2 小时前
C语言之长整型有符号数与短整型有符号数转换
c语言·开发语言·单片机·mcu·算法·1024程序员节
开心工作室_kaic3 小时前
ssm010基于ssm的新能源汽车在线租赁管理系统(论文+源码)_kaic
java·前端·spring boot·后端·汽车
Python私教3 小时前
Flutter颜色和主题
开发语言·javascript·flutter
代码吐槽菌3 小时前
基于SSM的汽车客运站管理系统【附源码】
java·开发语言·数据库·spring boot·后端·汽车
Ws_3 小时前
蓝桥杯 python day01 第一题
开发语言·python·蓝桥杯
zdkdchao3 小时前
jdk,openjdk,oraclejdk
java·开发语言
神雕大侠mu4 小时前
函数式接口与回调函数实践
开发语言·python