SpringMVC中的@RequestMapping注解解析
作者:GeGe&YoYo
1. RequestMapping 概念
SpringMVC使用@RequestMapping注解为控制器指定可以处理哪些 URL 请求。
在控制器的类定义及方法定义处都可标注 @RequestMapping。
① 标记在类上:提供初步的请求映射信息。相对于 WEB 应用的根目录
② 标记在方法上:提供进一步的细分映射信息。相对于标记在类上的 URL。
若类上未标注 @RequestMapping,则方法处标记的 URL 相对于 WEB 应用的根目录 。
作用:DispatcherServlet 截获请求后,就通过控制器上 @RequestMapping 提供的映射信息确定请求所 对应的处理方法。
2. RequestMapping源码
package org.springframework.web.bind.annotation; @Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Mapping public @interface RequestMapping { String[] value() default {}; RequestMethod[] method() default {}; String[] params() default {}; String[] headers() default {}; String[] consumes() default {}; String[] produces() default {}; }
参数说明
- value:定义处理方法的请求的 URL 地址。(重点)
- method:定义处理方法的 http method 类型,如 GET、POST 等。(重点)
- params:定义请求的 URL 中必须包含的参数。或者不包含某些参数。(了解)
- headers:定义请求中 Request Headers 必须包含的参数。或者不包含某些参数。(了解)
3. RequestMapping 用法
@RequestMapping 有两种标注方式,一种是标注在类级别上,一种是标注在方法级别上。标注在方法上时,value 表示访问该方法的 URL 地址。标注在类上时,value 相当于一个命名空间,即访问该 Controller 下的任意方法都需要带上这个命名空间。
value属性
@Controller @RequestMapping("/example") public class ExampleController { @RequestMapping public String execute(){ return "example_page"; } @RequestMapping("/todo") public String doSomething(){ return "example_todo_page"; } }
- /example.action:执行的是 execute() 方法。execute() 方法的 @RequestMapping 注解缺省 value 值,在这种情况下,当访问命名空间时默认执行的是这个方法。方法级别上的 @RequestMapping 标注是必须的,否则方法无法被正确访问。
- /example/todo.action执行的是 doSomething() 方法。类级别上的 @RequestMapping 标注不是必须的,在不写的情况下,方法上定义的 URL 都是绝对地址,否则,方法上定义的 URL 都是相对于它所在的 Controller 的。
method属性
指定请求的method类型,可以接受GET,POST,PUT,DELETE等,默认是可以接收GET请求和POST请求
@RequestMapping(value = "/register", method = RequestMethod.GET) public String register1(){ return "example_register_get_page"; } @RequestMapping(value = "/register", method = RequestMethod.POST) public String register2(){ return "example_register_post_page"; }
@RequestMapping({"/test02_01","/test02_02"}) public ModelAndView test02(){ ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("hello", "test01"); modelAndView.setViewName("hello"); return modelAndView; }
- 可以为多个方法映射相同的 URI,不同的 http method 类型,Spring MVC 根据请求的 method 类型是可以区分开这些方法的。当 /example/register.action 是以 GET 的方式提交的时候,Spring MVC 调用 register1() 来处理请求;若是以 POST 的方式提交,则调 register2() 来处理提交的请求。
- method 若是缺省没指定,并不是说它默认只处理 GET 方式的请求,而是它可以处理任何方式的 http method 类型的请求。指定 method 是为了细化映射 ( 缩小处理方法的映射范围 ),在 method 没有指定的情况下,它的映射范围是最大的。
params属性
params:指定request中必须包含某些参数值,才让该方法处理
@RequestMapping(value = "/test04",params = "id") public ModelAndView test04(){ ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("hello", "test04"); modelAndView.setViewName("hello"); return modelAndView; }
请求路径没有id则报错
params还可以指定请求中属性值必须为多少
headers属性
headers 的作用也是用于细化映射。只有当请求的 Request Headers 中包含与 heanders 值相匹配的参数,处理方法才会被调用。
@RequestMapping(value = "/specify", headers = "accept=text/*") public String specify(){ return "example_specify_page"; }
请求的 Request Headers 中 Accept 的值必须匹配 text/* ( 如 text/html ),方法才会被调用。
4. RequestMapping支持Ant风格的通配符
通配符 | 说明 | 示例 |
? | 匹配一个任意字符 | /a/?b 可以匹配/a/ab;/a/cb。但不能匹配/a/acb之类 |
* | 匹配任意长度的字符 | /a/ *b可以匹配/a/cb;/a/acb。但不能匹配/a/cb/vb |
** | 匹配多层路径 | 可以匹配/a/ab;/a/acb;/a/ab/abc/…/… |
到此这篇关于SpringMVC中的@RequestMapping注解解析的文章就介绍到这了,更多相关@RequestMapping注解解析内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
您可能感兴趣的文章:
- SpringMVC中@RequestMapping注解的实现
- 详解SpringMVC中的@RequestMapping注解
- SpringBoot中的@RequestMapping注解的用法示例
- Spring MVC-@RequestMapping注解详解
- SpringMVC @RequestMapping注解属性详细介绍
- SpringMVC @RequestMapping注解应用方法示例讲解
- 详解SpringBoot中@PostMapping注解的用法
- SpringBoot中@GetMapping注解的使用
- SpringMVC @GetMapping注解路径冲突问题解决
- Spring中@RequestMapping、@PostMapping、@GetMapping的实现