- Spring MVC 使用 @RequestMapping 注解为控制器指定可以处理哪些URL请求。
- 在控制器的类定义及方法定义出都可以标注@RequestMapping
- 类定义处:提供初步的请求映射信息。相当于 WEB的根目录。例如 :@RequestMapping("/rest")
public class RestController {}
为这个 RestController 控制器中的其他方法的映射信息,添加一个根目录,变为/rest/XXXX的形式
-方发处:提供进一步的细分映射信息。相当于类定义处的URL。若类定义处未标注 @RequestMapping,则方法处标记的 URL 相对于 WEB 应用的根目录 - DispatcherServlet 截获请求后,就通过控制器上 @RequestMapping 提供的映射信息确定请求所对应的处理方法。
RequestMapping参数的详解
1、Method参数
通过RequestMapp的Method参数可以指明当前这个方法只处理哪种类型的请求。默认情况下是什么请求都可以。RequestMethod有[GET],HEAD,[ POST], PUT, PATCH, DELETE, OPTIONS, TRACE这几种选择。如果发送请求的方式与规定的不一致,会报405错误
@RequestMapping(value = "/hello02", method = RequestMethod.POST) # 指定当前方法接收POST的请求
public String hello02(){
return "success";
}
param参数
通过param参数,我们可以指定请求中需要带什么参数,不需要什么参数,这些我们都可以自己指定,如果请求的url跟我们规定的不一致就会报错。param还支持表达式。
- params={“username”}:发送请求时必须带上一个名为username的参数,没带就会报404错误
- params={"!username"}:发送请求时不能携带上一个名为username的参数,带了就会报错
- param={“username=123”, “age!=123”}:前一个参数是指,发送请求时,必须带上一个参数username并且参数名字为123,后一个指发送请求时age不能为123。这个整体是,一个请求必须带上username参数,并且参数的值为123,age参数可带可不带,如果带了值一定不能是123
headers参数
可以指定请求头中的参数,比如:指定User-Agent的值,可以指定那个浏览器可以访问。例如:@RequestMapping(value = “/hello07”, headers = {“User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0”}),只能通过火狐浏览器访问。
RequestMapping的模糊匹配
?:匹配一个字符,多个或者0个都不行,只能是一个字符的匹配。
比如下方的,可以再浏览器中输入:localhost:8080/hello* 在加一个任意字符就可以访问这个方法 ,输入 hello1就可以访问,但是输入hello124就不行了
@RequestMapping("/hello*")
public String hello3(){
System.out.println("hello03............");
return "success";
}
精准和多个匹配情况下,精准的优先,下方的都可以匹配hello01,但是以第一个精准的优先。
@RequestMapping("/hello01")
public String hello01(){
System.out.println("hello01.........");
return "success";
}
@RequestMapping("/hello0?")
public String hello02(){
System.out.println("hello02.........");
return "success";
}
*:可以匹配一层路径,业可以匹配任意字符
@RequestMapping("/*") // 可以通过 /path 访问,但是只能是一层路径,不能是多层,如果是/a/b这种就不能访问
public String Hello04(){
System.out.println("hello04.............");
return "success";
}
@RequestMapping("/hello*") //这个情况下,可以使用 /hello + 任意字符,可以是一个也可以是多个或者是0个。
public String hello3(){
System.out.println("hello03............");
return "success";
}
** :可以匹配多层路径,如果再多个匹配情况下,精确的url优先。
@RequestMapping("/hello/**") // 这个情况下,可以匹配一层路径,或者多层,例如:/hello/a/a,这样的也可以访问。
public String hello06(){
System.out.println(".................hello05");
return "success";
}