@RequestMapping注解详解
@RequestMapping是给个方法配置一个访问地址。就比如web学习的Servlet程序,在web.xml中配置了访问地址之后,它们之间就有一个访问映射关系。
1、value属性
value 属性用于配置方法对应的访问地址.
/**
* @RequestMapping 可以配置一个请求地址给当前方法 <br/>
* / 表示请求地址为: http://ip:port/工程路径/ *映射* 到web目录 <br/>
* /hello 表示地址为: http://ip:port/工程路径/hello <br/>
*/
@RequestMapping(value = "/hello")
2、params属性
params属性是要求此请求的参数匹配
params="username" 表示 请求地址必须带有username参数
params="username=abc" 表示 请求参数中必须要有username,而且值还必须是abc
params="username!=abc" 表示 有username参数,但值不能等于abc
params="!username" 表示 请求地址不能带有username参数
params= {"username!=abc","!password"} params可以有多个值,每个值之间是&&关系
以上条件表示要求:
(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 <br/>
* @return
*/
@RequestMapping(value="/param4",params = "!username")
public String param4(){
System.out.println("param4 调用了");
return "ok";
}
/**
* params = {"username","password=123456"} 表示两个条件都要同时满足<br/>
* 必须要有username参数,还要有password参数.密码值还是123456 <br/>
*
* @return
*/
@RequestMapping(value="/param5",params = {"username","password=123456"})
public String param5(){
System.out.println("param5 调用了");
return "ok";
}
}
3、headers属性
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请求头 <br/>
* 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";
}
4、method属性
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 可以限定请求的方式 . <br/>
* RequestMethod.POST 表示只能是 POST 请求
*/
@RequestMapping(value="/postMethod" , method = RequestMethod.POST)
public String postMethod(){
System.out.println(" post 请求");
return "ok";
}
5、@RequestMapping标注在Controller类上
一般在开发的时候 , 一个模块一个 Controller 控制器
6、通配符在@RequestMapping中的使用
1、绝对匹配
@RequestMapping(value = "/headers1")
以上的路径,表示请求地址必须为: http://ip:port/工程路径/headers1 才会调用方法
2、? 问号 匹配资源路径
? 问号表示一个任意字符,比如匹配fu[0-9a-zA-Z]
/**
* value="/fu?" 中的问号,表示任意一个字符<br/>
* @return
*/
@RequestMapping(value="/fu?")
public String fun1(){
System.out.println("fun1() /fu? 方法被调用了");
return "ok";
}
3、* 星号 匹配资源路径
* 星号 可以匹配任意个字符
/**
* value="/fu*" 路径中的星表示任意多个字符 <br/>
* @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" 路径中的** 表示,表示任意个字符的任意层目录 <br/>
* @return
*/
@RequestMapping(value = "/**/fun")
public String fun5(){
System.out.println("fun5() /**/fun 方法被调用了! ");
return "ok";
}
以上这种通配符的方式 又叫 Ant 模式匹配