RequestMapping注解
目录
1. @RequestMapping注解的功能
2. @RequestMapping注解的位置
3. @RequestMapping注解的value属性
4. @RequestMapping注解的method属性
5.SpringMVC支持路径中的占位符(重点)
1. @RequestMapping注解的功能
从注解名称上我们可以看到,@RequestMapping注解的作用就是将请求和处理请求的控制器方法关联起来,建立映射关系。
SpringMVC接收到指定的请求,就会来找到在映射关系中对应的控制器方法来处理这个请求。
2. @RequestMapping注解的位置
首页index.html有了,我们就要去控制器写一个控制器方法,访问首页,请求路径就是"/",返回一个String。
当我们的浏览器发送请求到服务器,DispatcherServlet来接收到请求,就会将请求地址和控制器方法所使用的注解@RequestMapping()的value属性值进行匹配,如果能匹配成功,那么这个方法就是处理请求的方法,而在这个方法里返回的字符串是视图名称,这个可以由视图解析器解析,加上视图前缀和后缀找到相对应的页面,然后通过thymeleaf解析之后,响应到浏览器。
@RequestMapping("/")
public String index(){
return "index";
}
浏览器所解析的路径少了上下文路径,用thymeleaf里的@{/testRequestMapping}所包括的路径,会自动添加上下文路径。
<a th:href="@{/testRequestMapping}">测试RequestMapping注解的位置</a><br>
此时去跳转是没有问题的
但是此时我们在类上面也去添加一个@RequestMapping,会发生什么?
此时报了404错误,因为在类上面加了个@RequestMapping注解:
@RequestMapping标识一个类:设置映射请求的请求路径的初始信息
@RequestMapping标识一个方法:设置映射请求请求路径的具体信息
既然有初始信息和具体信息,那么类上有注解,类的方法上也有注解,那我们就需要先访问初始信息,才能访问具体信息,此时请求路径就变为:
这里说明一下为什么要在类上面添加一个RequestMapping
举个例子:当有用户模块和订单模块都是list的时候,我们的控制器@RequestMapping重名了,此时只能换个名字,但是只有这个名字可以更好的表示我们整个方法的意思,此时只需要在类上面加个RequestMapping用来表示一个类,下面的方法就不会与其他控制器发生命名冲突。
3. @RequestMapping注解的value属性
@RequestMapping注解的value属性通过请求的请求地址匹配请求映射
@RequestMapping注解的value属性是一个字符串类型的数组,表示该请求映射能够匹配多个请求地址所对应的请求
@RequestMapping注解的value属性必须设置,至少通过请求地址匹配请求映射
那么我们用Ctrl+鼠标左键点击@RequestMapping这个注解,进去看一看,按ALT+7查看类中的所有方法列表
可以看到value()是个数组,那么也就是说我们在顶上配置value注解的时候可以设置一个数组
@Controller
public class RequestMappingController {
@RequestMapping({"/testRequestMapping","/test"})
public String success(){
return "success";
}
}
<a th:href="@{/testRequestMapping}">测试RequestMapping注解的value属性-->/testRequestMapping</a><br>
<a th:href="@{/test}">测试RequestMapping注解的位置-->/test</a><br>
此时"/testRequestMapping","/test"这两个都可以跳转到success页面,也就是说前端发送过来的请求,只要是这两个中的其中一个就可以跳转到响应的页面
也就是说,这里所表示的不是一个请求有2个地址,而是说当前的RequestMapping能够匹配的地址可以有多个,只要满足数组中的任意一个,就可以被当前请求映射所处理。
4. @RequestMapping注解的method属性
在之前的学习中,method属性在表单提交的时候有出现过,就是请求方式。
@RequestMapping注解的method属性通过请求的请求方式(get或post)匹配请求映射。
@RequestMapping注解的method属性是一个RequestMethod类型的数组,表示该请求映射能够匹配多种请求方式的请求。
我们在之前的前端页面中修改一下
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>首页</h1>
<a th:href="@{/hello/testRequestMapping}">测试RequestMapping注解的位置</a><br>
<a th:href="@{/testRequestMapping}">测试RequestMapping注解的value属性-->/testRequestMapping</a><br>
<a th:href="@{/test}">测试RequestMapping注解的value属性-->/test</a><br>
<a th:href="@{/test}">测试RequestMapping注解的method属性-->/GET</a><br>
<form th:action="@{/test}" method="post">
<input type="submit" value="测试RequestMapping注解的mathod属性-->POST">
</form>
</body>
</html>
此时Controller中没有配置是POST请求还是GET请求,这时候去访问,会发现这两个请求都可以。
当我们去@RequestMapping中的注解写method这个属性,这也是一个数组形式,请求的请求方式满足请求映射的method属性,就可以。
@Controller
public class RequestMappingController {
@RequestMapping(
value={"/testRequestMapping","/test"},
method={RequestMethod.GET}
)
public String success(){
return "success";
}
}
此时将method换成GET请求,去点击POST的请求方式,那么会报405错误。
如果想让请求映射支持POST请求和GET请求,那么就可以这样写。
注:
1、对于处理指定请求方式的控制器方法,SpringMVC中提供了@RequestMapping的派生注解
处理get请求的映射-->@GetMapping
处理post请求的映射-->@PostMapping
处理put请求的映射-->@PutMapping
处理delete请求的映射-->@DeleteMapping
2、常用的请求方式有get,post,put,delete
但是目前浏览器只支持get和post,若在form表单提交时,为method设置了其他请求方式的字符串(put或delete),则按照默认的请求方式get处理,若要发送put和delete请求,则需要通过spring提供的过滤器HiddenHttpMethodFilter,在RESTful部分会讲到
5.SpringMVC支持路径中的占位符(重点)
原始方式:/deleteUser?id=1
rest方式:/deleteUser/1
SpringMVC路径中的占位符常用于RESTful风格中,当请求路径中将某些数据通过路径的方式传输到服务器中,就可以在相应的@RequestMapping注解的value属性中通过占位符{xxx}表示传输的数据,再通过@PathVariable注解,将占位符所表示的数据赋值给控制器方法的形参。
<a th:href="@{/testRest/1/admin}">测试路径中的占位符-->/testRest</a><br>
@RequestMapping("/testRest/{id}/{username}")
public String testRest(@PathVariable("id") String id, @PathVariable("username") String username){
System.out.println("id:"+id+",username:"+username);
return "success";
}
//最终输出的内容为-->id:1,username:admin
也就是说,这种问号携带参数的风格,被替换为另一种风格,特别是在后期的RESTful里面,这种风格是很常见的,只要前端传过来值,在Controller中的@RequestMapping注解里都用/{xxx}/{xxx}这种方式,并且参数还要用@PathVariable来进行修饰。