Spring MVC @RequestMapping详解

Spring MVC @RequestMapping



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 下的任意方法都需要带上这个命名空间。

1. value属性

@Controller
@RequestMapping("/example")
public class ExampleController {

    @RequestMapping
    public String execute(){
        return "example_page";
    }
    
    @RequestMapping("/todo")
    public String doSomething(){
        return "example_todo_page";
    }
}

1./example.action:执行的是 execute() 方法。execute() 方法的 @RequestMapping 注解缺省 value 值,在这种情况下,当访问命名空间时默认执行的是这个方法。方法级别上的 @RequestMapping 标注是必须的,否则方法无法被正确访问。

2./example/todo.action执行的是 doSomething() 方法。类级别上的 @RequestMapping 标注不是必须的,在不写的情况下,方法上定义的 URL 都是绝对地址,否则,方法上定义的 URL 都是相对于它所在的 Controller 的。

2. 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;
}

1.可以为多个方法映射相同的 URI,不同的 http method 类型,Spring MVC 根据请求的 method 类型是可以区分开这些方法的。当 /example/register.action 是以 GET 的方式提交的时候,Spring MVC 调用 register1() 来处理请求;若是以 POST 的方式提交,则调 register2() 来处理提交的请求。

2.method 若是缺省没指定,并不是说它默认只处理 GET 方式的请求,而是它可以处理任何方式的 http method 类型的请求。指定 method 是为了细化映射 ( 缩小处理方法的映射范围 ),在 method 没有指定的情况下,它的映射范围是最大的。

3. 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还可以指定请求中属性值必须为多少

在这里插入图片描述

4. 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/…/…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GeGe&YoYo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值