文章目录
@RequestMapper
注解
1.@RequestMapping
注解的作用就是将URL
路径,将http
请求地址映射到控制器controller
类的处理方法上
2.@RequestMapping
注解可以作用在控制器类上面,就是第一级的访问目录
3.@RequestMapping
注解可以作用在控制器类中的方法上面,就是第二级的访问目录
4./
:表示是虚拟目录【就是项目的根目录】
从注解名称上我们可以看到,@RequestMapper
注解的作用就是将请求【就是浏览器请求】和处理请求的控制器方法关联起来,建立映射关系。
SpringMVC
接收到指定的请求,就会来找到在映射关系中对应的控制器方法来处理这个请求
注意是:一个请求和一个映射关系是一一对应或都多个请求对应一个处理,否则会出现报错,不能一个请求对应多个映射,否则服务器不知使用那个映射处理
@RequestMapping
标识一个类:设置映射请求的请求路径的初始信息
@RequestMapping
标识一个方法:设置映射请求的请求路径的具体信息
案例
@Controller
@RequestMapping("/mapping")
public class MyController {
// RequestMapping中的Value属性
@RequestMapping(value = {"/value"})
public String value(){
// 返回跳转的视图名称
return "/requestMapping/RequestMapping";
}
}
1.@RequestMapping
注解中的value
属性
@RequestMapping
注解中的value
是一个字符串数组,源码如下
@AliasFor("path")
String[] value() default {};
由于value
属性是一个字符串数组,表示该请求映射能够匹配多个请求地址所对应的请求
注意是:@RequestMapping
注解的Value
属性必须设置的,至少通过请求地址匹配请求映射
案例
@Controller
@RequestMapping("/mapping")
public class MyController {
// RequestMapping中的Value属性
@RequestMapping(value = {"/value","value2"})
public String value(){
// 返回跳转的视图名称
return "/requestMapping/RequestMapping";
}
}
就是通过http://localhost:8080/SpringMVC01_war_exploded/mapping/value
和http://localhost:8080/SpringMVC01_war_exploded/mapping/value2
都可以映射到控制器中的处理方法
,说明一个映射方法可以处理多个请求地址所对应的请求
2.@RequestMapping
注解中的method
属性
@RequestMapping
注解的method
属性通过请求的请求方式get
或post
匹配请求映射
@RequestMapping
注解的method
属性是一个RequstMethod
类型的数组,表示该请求映射能匹配多种请求方式的请求
注意是:如果该属性不设置,默认是支持7
请求方式【就是不以请求方式】,如果设置了RequestMethod.GET,RequestMethod.POST
表示只能匹配是GET
请求或POST
请求的方式
若当前请求的请求地址满足请求映射的value
属性,但是请求方式不满足method
属性,则浏览器报错405
:表示不支持该请求:Request method 'POST' not supported
【说明地址匹配,请求方式不对】
源码 :表示是一个映射可以处理多种请求
RequestMethod[] method() default {};
例如:案例
@RequestMapping(value = "/success",
method = {RequestMethod.GET,RequestMethod.POST})
一定要在`/success`资源路径匹配的情况,还要满足是`GET`请求或`POST`请求
案例
// RequestMapping注解中的method属性
// `/value`资源路径匹配的前提下, RequestMethod.POST,RequestMethod.GET表示只能是Post或Get请求才能访问到该处理方法
@RequestMapping(value = {"/method"},method = {RequestMethod.POST,RequestMethod.GET})
public String method(){
System.out.println("Post请求方式");
return "/requestMapping/success";
}
3.@RequestMapping
注解的Params
属性
@RequestMapping
注解的params
属性通过请求的请求参数匹配请求映射
@RequestMapping
注解的params
属性是一个字符串类型的数组,可以通过四种表达式设置语法参数和请求映射的匹配关系【注意是:如果params
属性有多个值,必须同时满足才能映射,否则会报400
错误】
`param`:要求请求映射所匹配的请求必须携带`param`请求参数
`!param`:要求请求映射所匹配的请求必须不能携带`param`请求参数
`param=value`:要求请求映射所匹配的请求必须携带`param`请求参数并且参数为`value`
`param!=value`:要求请求映射所匹配的请求必须携带`param`请求参数但是`param!=value`
案例:
@RequestMapping(value = "/param",params = {"param=admin"})
必须满足`/param`后,又同时满足参数必须有`param`属性并且值为`admin`
案例:
<!--传参方式:使用`?`-->
<a th:href="@{/param?param=admin}">测试param属性:必须要携带参数!</a>
<!--传参方式二:使用`()`在开发中推荐使用-->
<a th:href="@{/param(param=admin)}">测试param属性:必须要携带参数!</a>
// 说明资源路径必须是`/param`,同时还必须携带`param`参数并且值为`admin`
// 没有指明默认是转发
@RequestMapping(value = "/param",params = {"param=admin"})
public String params(){
return "success";
}
注:
若当前请求满足@RequestMapping注解的value和method属性,但是不满足params属性,此时页面回报错`400`:Parameter conditions "username, password!=123456" not met for actual request parameters: username={admin}, password={123456}
注意是:如果资源路径匹配
,但是参数不匹配则会报400
4.@RequestMapping
注解的headers
属性
@RequestMapping
注解的headers
属性通过请求的请求头信息匹配请求映射
@RequestMapping
注解的headers
属性是一个字符串类型的数组,可以通过四种表达式设置请求头信息和请求映射的匹配关系
"header"
:要求请求映射所匹配的请求必须携带header请求头信息
"!header"
:要求请求映射所匹配的请求必须不能携带header请求头信息
"header=value"
:要求请求映射所匹配的请求必须携带header请求头信息且header=value
"header!=value"
:要求请求映射所匹配的请求必须携带header请求头信息且header!=value
案例:
@RequestMapping(value = "/header",headers = {"Connection=keep-alive"})
说明请求的头必须有`Connection`属性,值为`keep-alive`,如果有多个请求头,多个请求头都必须都满足,使用和`method`一样
代码:
<!--测试请求头-->
<a th:href="@{/header}">测试header请求头,必须携带该请求头</a>
// 说明资源路径必须是`/header`,同时还必须满足请求的头为:"Connection=keep-alive"
// 没有指明默认是转发
@RequestMapping(value = "/header",headers = {"Connection=keep-alive"})
public String headers(){
return "success";
}
若当前请求满足@RequestMapping注解的value和method属性,但是不满足headers属性,此时页面显示404
错误,即资源未找到
注意是:如果请求头有多个,则必须同时满足才能找到对应映射关系,否则报错404
,和params
的使用一样
5SpringMVC
支持ant
风格的路径【重点】
作用是:相当于模糊匹配一样
`?`:表示任意的单个字符
`*`:表示任意的`0`个或多个字符
`**`:表示任意的一层或多层目录【注意是:一定要写成`/**/XXX方式`,不能写成`/x**/XXX`否则会将`/**/`当成整体】
注意是:在使用**
时,只能使用/**/xxx
方式
案例:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>SpringMVCNet风格</title>
</head>
<body>
<a th:href="@{/success}">测试Net风格中的`?`</a>
</body>
</html>
// 测试net风格中的`?`
@RequestMapping("/a?a/success")
public String net1(){
return "springmvcNet";
}
// 测试net风格中的`*`
@RequestMapping("/a*a/success")
public String net2(){
return "springmvcNet";
}
// 测试net风格中的`/**/`
@RequestMapping("/**/success")
public String net3(){
return "springmvcNet";
}
6.SpringMVC
支持路径中的占位符(非常重要)
没有使用占位符方式:/user?id=1
使用占位符方式:/user/1
SpringMVC
路径中的占位符常用于RESTful
风格中,当请求路径中将某些数据通过路径的方式传输到服务器中,就可以在相应的@RequestMapping
注解的value
属性中通过占位符{XXX}
表示传输的数据,在通过@PathVariable
注解,将占位符所表示的数据赋值给控制器的方法形参【意思是:将传输占位符中的值赋值给形参】
例如:
例如 路径为:`/testRest/1/海康`
会将`1`传入`{id}`
会将`海康`传入`{username}`
最终将:`id`中的值赋值给`@PathVariable("id") String id`
最终将:`username`中的值`@PathVariable("username"`
@RequestMapping("/testRest/{id}/{username}")
public String testRest(@PathVariable("id") String id, @PathVariable("username") String username){}
案例:
传入地址栏是:
// 测试占位符
@RequestMapping("/testRest/{id}/{username}")
public String rest(@PathVariable("id")Integer id,@PathVariable("username")String username){
System.out.println("id"+id+"\tusername"+username);
return "success";
}
注意是:form
表单只能提交post
和get
请求,如果自己写成put
或delete
将会不起为作用,将会使用form
表单默认的方式get
方式提交
RequestMapping
注解源码
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {
String name() default "";
@AliasFor("path")// 别名是path
String[] value() default {}; 方法处理的访问资源路径
@AliasFor("value")// 别名是 value
String[] path() default {}; 方法处理的访问资源路径
RequestMethod[] method() default {}; 请求映射的方法,例如post或get
String[] params() default {}; 请求访问必须携带的参数
String[] headers() default {}; 请求访问必须携带的请求头
String[] consumes() default {};
String[] produces() default {};
}