一、访问路径设置:
@RequestMapping注解的作用就是将请求的URL地址和处理请求的方式(handler方法)关联起来,建立映射关系;SpringMVC接收到指定的请求,就会来找到在映射关系中对应的方法来处理这个请求
1.精准路径匹配:
在@RequestMapping注解指定URL地址时,不使用任何通配符,按照请求地址进行精确匹配
@Controller
public class UserController {
/**
* 精准设置访问地址 /user/login
*/
@RequestMapping(value = {"/user/login"})
@ResponseBody
public String login(){
System.out.println("UserController.login");
return "login success!!";
}
/**
* 精准设置访问地址 /user/register
*/
@RequestMapping(value = {"/user/register"})
@ResponseBody
public String register(){
System.out.println("UserController.register");
return "register success!!";
}
}
2.模糊路径匹配:
在@RequestMapping注解指定URL地址时,通过使用通配符,匹配多个类似的地址
@Controller
public class ProductController {
/**
* 路径设置为 /product/*
* /* 为单层任意字符串 /product/a /product/aaa 可以访问此handler
* /product/a/a 不可以
* 路径设置为 /product/**
* /** 为任意层任意字符串 /product/a /product/aaa 可以访问此handler
* /product/a/a 也可以访问
*/
@RequestMapping("/product/*")
@ResponseBody
public String show(){
System.out.println("ProductController.show");
return "product show!";
}
}
单层匹配和多层匹配:
/*:只能匹配URL地址中的一层,如果想准确匹配两层,那么就写“/*/*”以此类推。
/**:可以匹配URL地址中的多层。
其中所谓的一层或多层是指一个URL地址字符串被“/”划分出来的各个层次。这个知识点虽然对于@RequestMapping注解来说实用性不大,但是将来配置拦截器的时候也遵循这个规则。
3.类和方法级别区别:
@RequestMapping注解可以用于类级别和方法级别,它们之间的区别如下:
(1).设置到类级别:@RequestMapping注解可以设置在控制器类上,用于映射整个控制器的通用请求路径。这样,如果控制器中的多个方法都需要映射同一请求路径,就不需要在每个方法上都添加映射路径。
(2).设置到方法级别:@RequestMapping注解也可以单独设置在控制器方法上,用于更细粒度地映射请求路径和处理方法。当多个方法处理同一个路径的不同操作时,可以使用方法级别的 @RequestMapping注解进行更精细的映射。
//1.标记到handler方法
@RequestMapping("/user/login")
@RequestMapping("/user/register")
@RequestMapping("/user/logout")
//2.优化标记类+handler方法
//类上
@RequestMapping("/user")
//handler方法上
@RequestMapping("/login")
@RequestMapping("/register")
@RequestMapping("/logout")
4.附带请求方式限制:
HTTP协议定义了八种请求方式,在SpringMVC中封装到了下面这个枚举类:
public enum RequestMethod {
GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE
}
默认情况下:@RequestMapping("/logout")任何请求方式都可以访问
如果需要特定指定:违背请求方式,会出现405异常
@Controller
public class UserController {
/**
* 精准设置访问地址 /user/login
* method = RequestMethod.POST 可以指定单个或者多个请求方式!
* 注意:违背请求方式会出现405异常!
*/
@RequestMapping(value = {"/user/login"} , method = RequestMethod.POST)
@ResponseBody
public String login(){
System.out.println("UserController.login");
return "login success!!";
}
/**
* 精准设置访问地址 /user/register
*/
@RequestMapping(value = {"/user/register"},method = {RequestMethod.POST,RequestMethod.GET})
@ResponseBody
public String register(){
System.out.println("UserController.register");
return "register success!!";
}
}
5.进阶注解:
还有@RequestMapping的HTTP方法特定快捷方式变体:@GetMapping、@PostMapping、@PutMapping、@DeleteMapping、@PatchMapping
@RequestMapping(value="/login",method=RequestMethod.GET)
||
@GetMapping(value="/login")
进阶注解只能添加到handler方法上,无法添加到类上
6.常见配置问题:
出现原因:多个handler方法映射了同一个地址,导致SpringMVC在接收到这个地址的请求时该找哪个handler方法处理
二、接收参数:
1.param和json比较:
在HTTP请求中,可以选择不同的参数类型,如param类型和JSON类型。下面对这两种参数类型进行区别和对比:
(1).参数编码:param类型的参数会被编码为ASCII码。例如,假设name=john doe,则会被编码为 name=john%20doe。而JSON类型的参数会被编码为UTF-8。
(2).参数顺序:param类型的参数没有顺序限制。但是,JSON类型的参数是有序的。JSON采用键值对的形式进行传递,其中键值对是有序排列的。
(3).数据类型:param类型的参数仅支持字符串类型、数值类型和布尔类型等简单数据类型。而 JSON类型的参数则支持更复杂的数据类型,如数组、对象等。
(4).嵌套性:param类型的参数不支持嵌套。但是,JSON类型的参数支持嵌套,可以传递更为复杂的数据结构。
(5).可读性:param类型的参数格式比JSON类型的参数更加简单、易读。但是,JSON格式在传递嵌套数据结构时更加清晰易懂。
总的来说,param类型的参数适用于单一的数据传递,而JSON类型的参数则更适用于更复杂的数据结构传递。根据具体的业务需求,需要选择合适的参数类型。在实际开发中,常见的做法是在 GET 请求中采用param类型的参数,而在POST请求中采用JSON类型的参数传递。