@Controller
这个注解用于标识一个类是 SpringMVC 中的控制器。控制器负责处理用户请求并返回响应。
@Controller
public class MyController {//...
}
@RequestMapping
@RequestMapping既可修饰类,也可以修饰⽅法,当修饰类和⽅法时,访问的地址是类路径+⽅ 法路径.
@RequestMapping标识⼀个类:设置映射请求的请求路径的初始信息
@RequestMapping标识⼀个⽅法:设置映射请求请求路径的具体信息
@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会拼接上⼀个/
@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代码:
<!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的情况,如下所⽰:
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 请求。
@Controller
@RequestMapping("/myapp")
public class MyController {@GetMapping("/products")public String getProducts() {return "productList";}
}
@PostMapping
是@GetMapping方法的一个特定版本,用于处理 HTTP POST 请求。
@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 请求的方法上。
@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 请求这一意图,提高了代码的可读性和可维护性。
@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路径上的数据绑定
后端实现代码:
@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 来重命名前后端的参数值.具体⽰例如下,后端实现代码:
@Controller
@RequestMapping("/myapp")
public class MyController {@GetMapping("/search")public String searchProducts(@RequestParam("time") String createtime) {// 根据关键字进行产品搜索return "searchResults";}
}
@RequestPart
用与上传文件
后端代码实现:
@RequestMapping("/m9")
public String getfile(@RequestPart("file") MultipartFile file) throwsIOException {//获取⽂件名称String fileName = file.getOriginalFilename();//⽂件上传到指定路径file.transferTo(new File("D:/temp/" + file.getOriginalFilename()));return "接收到⽂件名称为: "+fileName;
}
使用Postman发送请求:
观察D:/temp路径下,⽂件是否上传成功
@ResponseBody
用于返回数据
@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 注解添加到对应的⽅法上即可.
@Controller
public class IndexController {@RequestMapping("/index")public Object index(){return "/index.html";}@RequestMapping("/returnData")@ResponseBodypublic String returnData(){return "该⽅法返回数据";}
}
多个注解时,没有先后顺序,先写哪个都可以
运⾏程序,浏览器响应结果如下:http://127.0.0.1:8080/returnData
如果去掉@ResponseBody 注解,程序会报404错误.
@Controller
public class IndexController {@RequestMapping("/index")public Object index(){return "/index.html";}@RequestMapping("/returnData")public String returnData(){return "该⽅法返回数据";}
}
程序会认为需要返回的是视图,根据内容去查找⽂件,但是查询不到,路径不存在,报404
返回HTML代码片段
后端返回数据时,如果数据中有HTML代码,也会被浏览器解析
@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
RequestMapping("/index2")
public Object index2(){return "/a.js";
}
@RequestMapping("/index3")
public Object index3(){return "/b.css";
}