ssm框架之SpringMVC:浅聊RequestMapping注解

前面聊过了SpringMVC,以及通过实例演示了SpringMVC如何搭建,如果对环境搭建不太了解的话,可以看一下前面的文章(下面演示的例子,环境都是通过上面的例子进行演示的):传送阵

在使用javaweb项目原生是servlet中,对应请求地址,返回的数据的页面之前都是在web.xml,新版本可以通过注解进行配置了。需要了解servlet可以看一下前面的文章:传送阵

RequestMapping

自然无论如何配置,spring自然需要有个配置一下路径,不然如何将地址和处理地址的方法关联起来呢。所以就需要聊一下注解RequestMapping。

前面说了环境之间使用了前面一篇文章,所以不再赘述。

在这里插入图片描述

注解位置

首先前面说下这个注解刻意放的位置,对于这个很简单的,直接看源码即可:

在这里插入图片描述

可以看出其可以放在方法和类上。

注解在方法上

在例子中,使用的是在方法上进行注解的,如下:

@Controller
public class controller {
    @RequestMapping("/a")
    public String test(){
     return "index";
    }
}

这个直接在方法上进行注解的, 会直接调用地址的时候:http://localhost:8080/testSpringMVC_war/a

直接回返回页面
在这里插入图片描述

方法上还好理解,毕竟是放在方法上而已,然后再大胆一点,再一个方法上来两个url配置

@Controller
public class controller {
   @RequestMapping({"/a","/b"})
    public String test(){
     return "index";
    }
}

访问http://localhost:8080/testSpringMVC_war/a或者http://localhost:8080/testSpringMVC_war/b可以。为什么呢看一下源码:

在这里插入图片描述

value可以省略不写,而且人家默认就是一个数组,只不过写一个时候可以不带**{}**罢了。

当然配置一个url不可以在两个方法,比如这样就会报错。

// 错误示范

   @RequestMapping("/a" )
    public String test(HttpServletRequest request){
     ......
    }

   @RequestMapping("/a" )
    public String test1(HttpServletRequest request){
     ......
 
    }

注解在类上

@Controller
@RequestMapping("/a")
public class controller {
 public String test(HttpServletRequest request){
     return "index";
    }
}    

然后访问地址http://localhost:8080/testSpringMVC_war/a

在这里插入图片描述

直接报错,其不是这样用到,仔细想一下就明白,毕竟注解在类上面,而类可能会很多方法,作用是这样:

@Controller
@RequestMapping("/test")
public class controller {
   @RequestMapping("/a")
    public String test(){
     return "index";
    }
    @RequestMapping("/b")
    public String test1(){
        return "index";
    }
}

访问地址变为:

http://localhost:8080/testSpringMVC_war/test/a

http://localhost:8080/testSpringMVC_war/test/b

在这里插入图片描述

可以看出在方法上注解,可以作为一个根url目标,让方法的配置的时候路径直接将其补充在前面。

前面配置的url对应是value属性,所以可以不写。还有几个属性简单聊一下。

name属性

简单的说就是一个方法的注释方便用户理解。

@Controller
@RequestMapping(value = "/test" )
public class controller {
    
   @RequestMapping(value = "/a",name="这个就是一个测试方法")
    public String test(){
     return "index";
    }
   
}

method 属性

除了匹配到 Path 还要 请求方式相同,取值是个枚举量。

演示一个例子:

@Controller
@RequestMapping(value = "/test" )
public class controller {
    
   @RequestMapping(value = "/a",method = RequestMethod.POST)
    public String test(){
     return "index";
    }
   
}

访问地址:http://localhost:8080/testSpringMVC_war/test/a

在这里插入图片描述

可以看出报错,请求方式是GET方法,但是注解限制只能是POST,所以无法访问到资源。

path属性

这个属性值其实与value同义,path(value)(path 和 value 互相引用,参见RequestMapping接口源码,也就是截图图片看一下,节省篇幅不再截图)
path属性,和1中的value属性使用一致,两者都是用来作为映射使用的。

@Controller
@RequestMapping(value = "/test" )
public class controller {
   @RequestMapping(path ="/a" ,name="ddd")
    public String test(){
     return "index";
    }
}

访问地址:http://localhost:8080/testSpringMVC_war/test/a 也可以得到返回请求,不再截图。

Params 属性

对参数进行限制,可以要求必须携带某些参数,或者是某些参数必须是某个值,或者是某些参数不是某个值

格式如下“

如果只有一个参数,可以不带花括号
1:必须带有某个参数  Params="必须带某参数"

2:必须不带某个参数 Params="!必须不带某参数"

3:当然还可以限定某个参数值必须是某值:Params="参数=必须等于的值" 也可以 Params="参数!=必须等于的值" 

当然可以单独用,也可以分开用,现在来一个整体用演示:

@Controller
@RequestMapping(value = "/test" )
public class controller {
   @RequestMapping(path ="/a" ,params = {"username","!password"})
    public String test(){
     return "index";
    }
}

访问地址:http://localhost:8080/testSpringMVC_war/test/a

在这里插入图片描述

因为不含有参数username所以报错

然后访问:http://localhost:8080/testSpringMVC_war/test/a?username=jok

在这里插入图片描述

然后访问:http://localhost:8080/testSpringMVC_war/test/a?username=jok&password=111

在这里插入图片描述

因为限制不能有参数password,而url中含有了,所以报错了。

然后再来一个必须等于的值:

@Controller
@RequestMapping(value = "/test" )
public class controller {
   @RequestMapping(path ="/a" ,params = {"username=zz","!password"})
    public String test(){
     return "index";
    }
}

如果访问:http://localhost:8080/testSpringMVC_war/test/a?username=jok会报错

在这里插入图片描述

如果访问:http://localhost:8080/testSpringMVC_war/test/a?username=zz

在这里插入图片描述

headers 属性

设置请求头当中必须包含 或 必须不包含 某个键。虽然代表的意义不一样但是其用法和Param属性用法格式几乎一样。

如果只有一个参数,可以不带花括号
1:必须带有某个参数  headers ="必须带某参数"

2:必须不带某个参数 headers ="!必须不带某参数"

3:当然还可以限定某个参数值必须是某值:headers ="参数=必须等于的值" 也可以 headers ="参数!=必须等于的值" 

不再演示了,如果不了解header属性,可以看另一篇文章:传送阵

consumes 属性

指定处理请求的提交内容类型(Content-Type),例如:application/json、text/html,multipart/form-data等时,才能够让该方法处理请求。

如果只有一个参数,可以不带花括号
1:必须带有某个内容类型  consumes  ="内容类型"

2:必须不能是内容类型 headers ="!内容类型"

来一个例子:

@Controller
@RequestMapping(value = "/test" )
public class controller {
   @RequestMapping(path ="/a", method = Request.POST, consumes = "text/html")
    public String test(){
     return "index";
    }
}

produces 属性

指定返回的内容类型,返回的内容类型必须是request请求头(Accept)中所包含的类型。

来一个例子:

@Controller
@RequestMapping(value = "/test" )
public class controller {
   @RequestMapping(path ="/a", method = Request.POST, produces  = "application/json")
    public String test(){
     return "index";
    }
}

补充

路径中的占位符

参数也作为路径的一部分,其实就是 支持RESTful,如果不了解可看下:传送阵

这个会在请求路径变化如下

原始方式:/a/id=1
Restful : /a/1

这个需要用到一个注解@PathVariable,这个注解使用在方法参数中。现在演示一个:

public class controller {
    @RequestMapping("/a/{username}")
    public String test(@PathVariable("username") String username  ){
       System.out.println(" 方法1   username==="+username);
     return "index";
    }

    @RequestMapping(path ="/a/{username}/{password}" )
    public String test1(@PathVariable("username") String username ,@PathVariable("password") String password ){
        System.out.println("方法2  username==="+username+"  password==="+password);
        return "index";
    }

}

访问地址:http://localhost:8080/testSpringMVC_war/test/a/aa

在这里插入图片描述

访问地址:

http://localhost:8080/testSpringMVC_war/test/a/aa/bbb

在这里插入图片描述

有时候未来方便表示出那个url是干什么的不用@RequestMapping,而是需要@PostMapping,@GetMapping,@DeleteMapping和@PutMapping来配置url。

  • @GetMapping : 是一个组合注解, 通常用来处理get请求,常用于执行查询操作。是@RequestMapping(value=“这里写的是请求的路径”,method = RequestMethod.GET)的缩写。
  • @PostMapping:是一个组合注解, 通常用来处理post请求,常用于执行添加操作。是@RequestMapping(value=“这里写的是请求的路径”,method = RequestMethod.POST)的缩写
  • @PutMapping:是一个组合注解,通常用来处理put请求,常用于执行更新操作是@RequestMapping(value=“这里写的是请求的路径”,method = RequestMethod.PUT)的缩写
  • @DeleteMapping:是一个组合注解。通常用来处理delete请求,常用于执行删除操作。是@RequestMapping(value=“这里写的是请求的路径”,method = RequestMethod.DELETE)的缩写。

先不说其它而是看某个注解的源码就明白为什么是组合注解了:

在这里插入图片描述

其实这四种用法和@RequestMapping一样, 只不过注意请求的方法是被限定了。

Ant 风格路径

即请求路径当中可以放置一些特殊字符来表示特殊含义,其实有点像是正则表达式。

符号描述
表示单个任意字符 例子: @RequestMapping(path =“/a?a/b”) 通过路径为"/aaa/b" 或者"/aba/b"等都可以跳到这个注解的方法
*表示0或者多个字符 例子:@RequestMapping(path =“/a*a/b”)通过路径为"/aa/b" 或者"/aaa/b" 或者"/aba/b"等都可以跳到这个注解的方法
**表示任意层数的任意目录 ,不过其格式只能是: /**/url最后不同 例子:只能类似这样写 /**/a/b 或者 /**/a
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值