@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";
}