@RequestMapping详细用法以及部分原理

@RequestMapping

大学生一枚,本章代码部分借鉴与官方文档以及尚硅谷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()找到答案
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SpringBoot 是基于 Spring 框架开发的快速开发框架。其中 `@Controller` 注解是使用 Spring 框架开发 web 应用的重要组成部分之一。它主要功能是定义控制器,处理 http 请求和响应。下面是 `@Controller` 注解的原理: 1. `@Controller` 注解的作用 `@Controller` 是 Spring 框架的一个注解,用于标识一个类是控制器组件。它的作用是将一个普通的 Java 类标记为 Spring MVC 的控制器组件,告诉 Spring 框架它应该被作为一个控制器来处理请求。 2. Spring MVC 控制器原理 Spring MVC 框架的核心是前端控制器 DispatcherServlet。当请求进入 DispatcherServlet 后,它会根据请求的 URL 去寻找匹配的控制器映射,然后再将请求转发到对应控制器的处理方法。控制器接收到请求后进行处理,然后返回 ModelAndView 对象,将数据和视图返回给 DispatcherServlet。 3. `@Controller` 注解的实现 `@Controller` 注解的实现是基于 Spring IoC 容器。在 Spring IoC 容器启动后,用 `@Controller` 注解注解的类会被自动扫描并注册到 Spring 容器中。然后在 DispatcherServlet 中,通过调用 Spring 容器中的 Bean 执行对应的控制器操作。 4. `@Controller` 注解与其他注解的区别 `@Controller` 注解是 SpringMVC 中最为重要的注解之一。相比其他注解,如 `@RestController`、`@RequestMapping` 等,`@Controller` 更为普遍。它不仅可以用在基于 SpringBoot 的项目中,也可以应用在基于 Spring 框架的其他 Web 项目中。 5. 总结 总之,`@Controller` 注解是 SpringMVC 框架中定义控制器组件的关键注解。它的使用需要基于 Spring IoC 容器的构建和调用,同时与 DispatcherServlet 紧密关联,共同构建了一个完整的 SpringMVC 框架来处理请求和响应。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值