关于@RequestMapping
在Spring MVC框架中,@RequestMapping
的主要作用是:配置请求路径与处理请求的方法的映射关系。
此注解可以添加在控制类上,也可以添加在处理请求的方法上。
通常,会在控制器类和处理请求的方法上都配置此注解,例如:
@RestController
@RequestMapping("/albums")
public class AlbumController {
@RequestMapping("/add-new")
public String addNew(AlbumAddNewDTO albumAddNewDTO) {
// 暂不关心方法内部代码
}
}
以上配置的路径将是:http://主机名:端口号/类上配置路径/方法上配置的路径
,即:http://localhost:8080/albums/add-new
并且,在使用``@RequestMapping配置路径时,路径值两端多余的
/是会被自动处理的,在类上的配置值和方法上的配置值中间的
/` 也是自动处理的,例如,以下配置是等效的:
类上的配置值 | 方法上的配置值 |
---|---|
/albums | /add-new |
/albums | add-new |
/albums/ | /add-new |
/albums/ | add-new |
albums | /add-new |
albums | add-new |
albums/ | /add-new |
albums/ | add-new |
尽管以上8种组合配置是等效的,但仍推荐使用第1种。
在@RequestMapping
注解的源代码中,有:
@AliasFor("path")
String[] value() default {};
以上源代码表示在此注解中存在名为value
的属性,并且,此属性的值类型是String[]
,例如,你可以配置@RequestMapping(value = {"xxx", "zzz"})
,此属性的默认值是{}
(空数组)。
在所有注解中,value
是默认的属性,所以,如果你需要配置的注解参数是value
属性,且只配置这1个属性时,并不需要显式的指定属性名!例如:
@RequestMapping(value = {"xxx", "zzz"})
@RequestMapping({"xxx", "zzz"})
以上2种配置方式是完全等效的!
在所有注解中,如果某个属性的值是数组类型的,但是,你只提供1个值(也就是数组中只有1个元素),则这个值并不需要使用大括号框住!例如:
@RequestMapping(value = {"xxx"})
@RequestMapping(value = "xxx")
以上2种配置方式是完全等效的!
在源代码中,关于value
属性的声明上还有@AliasFor("path")
,它表示”等效于“的意思,也就是说,value
属性与另一个名为path
的属性是完全等效的!
在@RequestMapping
的源代码中,还有:
RequestMethod[] method() default {};
以上属性的作用是配置并限制请求方式,例如,配置为:
@RequestMapping(value = "/add-new", method = RequestMethod.POST)
按照以上配置,以上请求路径只允许使用POST方式提交请求!
强烈建议在正式运行的代码中,明确的配置并限制各请求路径的请求方式!
另外,在Spring MVC框架中,还定义了基于@RequestMapping
的相关注解:
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
所以,在开发实践中,通常:在控制器类上使用@RequestMapping
配置请求路径的前缀部分,在处理请求的方法上使用@GetMapping
、@PostMapping
这类限制了请求方式的注解。