@RequestMapping注解的作用
@RequestMapping是给个方法配置一个访问地址。就比如web学习的Servlet程序,在web.xml中配置了访问地址之后,它们之间就有一个访问映射关系。
- value 属性:用于配置方法对应的访问地址.
- @RequestMapping 可以配置一个请求地址给当前方法
- / 表示请求地址为: http://ip:port/工程路径/ 映射 到web目录
- /hello 表示地址为: http://ip:port/工程路径/hello
@RequestMapping(value = “/hello”)
- params属性: 是要求此请求的参数匹配
params=“username”
表示请求地址必须带有username参数
params=“username=abc”
表示请求参数中必须要有username,而且值还必须是abc
params=“username!=abc”
表示: 1、请求参数中不能有username参数。
2、有username参数,但值不能等于abc
params="!username"
表示 请求地址不能带有username参数
params= {“username!=abc”,"!password"}
params可以有多个值,每个值之间是&&关系,
必须同时满足所有的要求才能允许访问。
以上条件表示要求:
请求地址中能有username参数 || username参数值不能等于 abc &&不能有password参数
代码示例:
@Controller
public class ParamController {
/**
* params = "username" 表示必须要有username请求参数
* @return
*/
@RequestMapping(value="/param1",params = "username")
public String param1(){
System.out.println("param1 调用了");
return "ok";
}
/**
* params = "username=wzg168" 表示必须要有请求参数username而且值必须还要是wzg168
* @return
*/
@RequestMapping(value="/param2",params = "username=wzg168")
public String param2(){
System.out.println("param2 调用了");
return "ok";
}
/**
* params = "username!=abc168" 表示两种情况: <br/>
* 1 username参数没有 <br/>
* 2 如果有username参数,值不能是abc168 <br/>
* @return
*/
@RequestMapping(value="/param3",params = "username!=abc168")
public String param3(){
System.out.println("param3 调用了");
return "ok";
}
/**
* params = "!username" 表示请求中不能有参数username
* @return
*/
@RequestMapping(value="/param4",params = "!username")
public String param4(){
System.out.println("param4 调用了");
return "ok";
}
/**
* params = {"username","password=123456"} 表示两个条件都要同时满足
* 必须要有username参数,还要有password参数.密码值还是123456
*
* @return
*/
@RequestMapping(value="/param5",params = {"username","password=123456"})
public String param5(){
System.out.println("param5 调用了");
return "ok";
}
}
- headers 属性是:要求请求头匹配 , 它的使用规则跟 params 一样.
代码示例:
/**
* headers = "User-Agent" 要求请求头中要有User-Agent请求头 <br/>
* User-Agent是 浏览器的信息 <br/>
* @return
*/
@RequestMapping(value = "/headers1",headers = "User-Agent")
public String headers1(){
System.out.println("headers1 方法调用了");
return "ok";
}
/**
* headers = "User-Agent" 要求请求头中要有User-Agent请求头,且请求头中的信息一定要一致才可以。
* 一般不同浏览器不用版本请求头中的信息都有区别。
* User-Agent是 浏览器的信息 <br/>
* @return
*/
@RequestMapping(value = "/headers2",headers = "User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36")
public String headers2(){
System.out.println("headers2 方法调用了");
return "ok";
}
- method 属性:可以对当前方法的请求方式进行限定 . 不写表示不限定.
GET请求演示:
/**
* method = RequestMethod.GET 可以限定请求的方式 . <br/>
* RequestMethod.GET 表示只能是GET请求
*/
@RequestMapping(value="/getMethod" , method = RequestMethod.GET)
public String getMethod(){
System.out.println("GET请求");
return "ok";
}
POST请求演示:
/**
* method = RequestMethod.POST 可以限定请求的方式 .
* RequestMethod.POST 表示只能是 POST 请求
*/
@RequestMapping(value="/postMethod" , method = RequestMethod.POST)
public String postMethod(){
System.out.println(" post 请求");
return "ok";
}
-
@RequestMapping标注在Controller类上
一般在开发的时候 , 一个模块对应一个 Controller 控制器, 所以需要在类上添加路径和方法上都添加路径, 这样就能够唯一定位到该方法!!! ![在这里插入图片描述](https://img-blog.csdnimg.cn/2020082418454664.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80OTkyMDMxOA==,size_16,color_FFFFFF,t_70#pic_center)对比示例:
6. 配符在@RequestMapping中的使用(了解内容)
这种通配符的方式 又叫 Ant 模式匹配
1、绝对匹配
@RequestMapping(value = "/headers1")
以上的路径,表示请求地址必须为: http://ip:port/工程路径/headers1 才会调用方法
2、? 问号 匹配资源路径
? 问号表示一个任意字符,比如匹配fu[0-9a-zA-Z]
代码示例:
/**
* value="/fu?" 中的问号,表示任意一个字符,只能加一个!!!
* @return
*/
@RequestMapping(value="/fu?")
public String fun1(){
System.out.println("fun1() /fu? 方法被调用了");
return "ok";
}
** * 星号 :可以匹配任意个字符 **
/**
* value="/fu*" 路径中的星表示任意多个字符,多少个都可以!!!
* @return
*/
@RequestMapping(value="/fu*")
public String fun2(){
System.out.println("fun2() /fu* 方法被调用了");
return "ok";
}
注:当一个路径同时匹配多个规则的时候,调用方法的优先顺序是:
绝对匹配 —>>>> ?问号匹配 ---->>>> *星号匹配
4、? 问号 : 表示 匹配一个字符的一层目录,都是一个!!!
/**
* value = "/?/fun" 路径中的?问号,表示一个字符的一层目录 <br/>
* @return
*/
@RequestMapping(value = "/?/fun")
public String fun3(){
System.out.println("fun3() /?/fun 方法被调用了! ");
return "ok";
}
5. * 星号:表示 匹配任意多个字加粗样式符的一层目录。
/**
* value = "/*/fun" 路径中的* 表示,表示任意个字符的一层目录 <br/>
* @return
*/
@RequestMapping(value = "/*/fun")
public String fun4(){
System.out.println("fun4() /*/fun 方法被调用了! ");
return "ok";
}
6. ** 表示任意个字符的任何多层目录
/**
* value = "/**/fun" 路径中的** 两个星号 表示,
* 表示任意个字符的任意层目录
* @return
*/
@RequestMapping(value = "/**/fun")
public String fun5(){
System.out.println("fun5() /**/fun 方法被调用了! ");
return "ok";
}