大学生一枚,本章代码部分借鉴与官方文档以及尚硅谷Spring教学篇,侵删
文章目录
1.@RequestMapping将map 映射到整个 class 或特定的处理程序方法
@RequestMapping 注解为控制器指定可 以处理哪些 URL 请求
- 类定义处:提供初步的请求映射信息。相对于 WEB 应用的根目录
- 方法处:提供进一步的细分映射信息。相对于类定义处的 URL。若 类定义处未标注 @RequestMapping,则方法处标记的 URL 相对于 WEB 应用的根目录
@RequestMapping支持Ant 风格资源地址 3 种匹配符:
- ?:匹配文件名中的一个字符
- *:匹配文件名中的任意字符
- : 匹配多层路径
2.1 设定映射请求参数与请求头:
您可以通过请求参数条件params或headers来缩小请求匹配
eg:只匹配URL为testParamsAndHeaders的超链接,并且带有username 与 age 的参数 并且age不等于10
,加上http请求中"Accept-Language=en-US,zh;q=0.8的请求。
如果不满足,则404
@RequestMapping(
value = "testParamsAndHeaders",
params = { "username","age!=10" },
headers = { "Accept-Language=en-US,zh;q=0.8" }
){
//......
}
2.2 指定请求方法:
@RequestMapping 可以使用method = RequestMethod 来指定请求的方式 有:GET POST DELETE PUT
@RequestMapping("/appointments")
public class AppointmentsController {
@RequestMapping(method = RequestMethod.GET/POST/DELETE/PUT)
public Map<String, Appointment> get() {
return appointmentBook.getAppointmentsForToday();
}
}
Spring Framework 4.3 引入了以下 method-level 组成的@RequestMapping annotation 变体,它们有助于简化 common HTTP 方法的映射,更好地表达带注释的处理程序方法的语义。例
- @GetMapping
- @PostMapping
- @PutMapping
- @DeleteMapping
- @PatchMapping
@GetMapping("/{day}")
public Map<String, Appointment> getForDay(@PathVariable @DateTimeFormat(iso=ISO.DATE) Date day, Model model){
return appointmentBook.getAppointmentsForDay(day);
}
2.3@PathVariable映射URL绑定占位符
(有了@PathVariable使得Spinrg MVC 更加靠近了REST风格的URL)
在 Spring MVC 中,可以在方法参数上使用@PathVariable annotation 将其绑定到 URI 模板变量的 value:
@PathVariable参数可以是任何简单类型,例如int,long,Date等.Spring 会自动转换为适当的类型
可以获取到方法{xxx}的属性
@GetMapping("/owners/{ownerId}")
public String findOwner(@PathVariable String ownerId, Model model) {
Owner owner = ownerService.findOwner(ownerId);
model.addAttribute("owner", owner);
return "displayOwner";
}
也可以获取到类上有{xxx}的属性
@Controller
@RequestMapping("/owners/{ownerId}")
public class RelativePathUriTemplateController {
@RequestMapping("/pets/{petId}")
public void findPet(@PathVariable String ownerId, @PathVariable String petId, Model model) {
//.......
}
}
2.4 使用 @RequestParam 绑定请求参数值:
使用@RequestParam 将请求参数绑定到控制器中的方法参数。
默认情况下,使用此 annotation 的参数是必需的,但您可以通过将@RequestParam的required属性设置为false,eg
@RequestMapping(value = "/testRequestParam")
public String testRequestParam(
@RequestParam(value = "username") String un,
@RequestParam(value = "age", required = false, defaultValue = "0") int age
) {
System.out.println("testRequestParam, username: " + un + ", age: "+ age);
return SUCCESS;
}
2.5 使用 @RequestHeader 绑定请求报头的属性值
请求头包含了若干个属性,服务器可据此获知客户端的信 息,通过 @RequestHeader 即可将http请求头中的属性值绑 定到处理方法的入参中
@RequestMapping("/testRequestHeader")
public String testRequestHeader(@RequestHeader(value = "Accept-Language") String al) {
System.out.println("testRequestHeader, Accept-Language: " + al);
return SUCCESS;
}
2.6 使用 @CookieValue 绑定请求中的 Cookie 值
@CookieValue 允许将方法参数绑定到 HTTP cookie 的 value。
@RequestMapping("/displayHeaderInfo.do")
public void displayHeaderInfo(@CookieValue("JSESSIONID") String cookie) {
//....
}
2.7@RequestMapping 可以接受的参数
可以Spring MVC 会按请求参数名和 POJO 属性名进行自动匹配, 自动为该对象填充属性值。支持级联属性。
前端数据如下:
<form action="springmvc/testPojo" method="post">
<!-- id: <input type="text" name="id"/>
<br> -->
username: <input type="text" name="username"/>
<br>
password: <input type="password" name="password"/>
<br>
email: <input type="text" name="email"/>
<br>
age: <input type="text" name="age"/>
<br>
city: <input type="text" name="address.city"/>
<br>
province: <input type="text" name="address.province"/>
<br>
<input type="submit" value="Submit"/>
</form>
后台java代码如下
public String testPojo(User user) {
//.................
}
也可以 可以使用 Serlvet 原生的 API 作为目标方法的参数 具体支持以下类型
- HttpServletRequest
- HttpServletResponse
- HttpSession
- java.security.Principal
- Locale
- InputStream
- OutputStream
- Reader Writer
public void testServletAPI(
HttpServletRequest request,HttpServletResponse response, Writer out
) throws IOException {
//......
}
可以在Sping源码 AnnotationMethodHandlerAdapter类中resolveStandardArgument()找到答案